Skip to content

Commit ea96f4c

Browse files
fix: MediaMetadata not working properly (#31535)
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
1 parent d085de4 commit ea96f4c

File tree

2 files changed

+106
-31
lines changed

2 files changed

+106
-31
lines changed

patches/chromium/fix_media_key_usage_with_globalshortcuts.patch

Lines changed: 78 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,94 @@ receive remote control events until it begins playing audio. This runs
1010
counter to the design of globalShortcuts, and so we need to instead
1111
use `ui::MediaKeysListener`.
1212

13+
diff --git a/chrome/browser/extensions/global_shortcut_listener.cc b/chrome/browser/extensions/global_shortcut_listener.cc
14+
index bc009606d01469125052e68a9cdc82aaa697c764..ff18043cb07d748a49adea9874517fb29e3e7f9f 100644
15+
--- a/chrome/browser/extensions/global_shortcut_listener.cc
16+
+++ b/chrome/browser/extensions/global_shortcut_listener.cc
17+
@@ -7,6 +7,7 @@
18+
#include "base/check.h"
19+
#include "base/notreached.h"
20+
#include "content/public/browser/browser_thread.h"
21+
+#include "content/public/browser/media_keys_listener_manager.h"
22+
#include "ui/base/accelerators/accelerator.h"
23+
24+
using content::BrowserThread;
25+
@@ -66,6 +67,22 @@ void GlobalShortcutListener::UnregisterAccelerator(
26+
StopListening();
27+
}
28+
29+
+// static
30+
+void GlobalShortcutListener::SetShouldUseInternalMediaKeyHandling(bool should_use) {
31+
+ if (content::MediaKeysListenerManager::
32+
+ IsMediaKeysListenerManagerEnabled()) {
33+
+ content::MediaKeysListenerManager* media_keys_listener_manager =
34+
+ content::MediaKeysListenerManager::GetInstance();
35+
+ DCHECK(media_keys_listener_manager);
36+
+
37+
+ if (should_use) {
38+
+ media_keys_listener_manager->EnableInternalMediaKeyHandling();
39+
+ } else {
40+
+ media_keys_listener_manager->DisableInternalMediaKeyHandling();
41+
+ }
42+
+ }
43+
+}
44+
+
45+
void GlobalShortcutListener::UnregisterAccelerators(Observer* observer) {
46+
CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
47+
if (IsShortcutHandlingSuspended())
48+
diff --git a/chrome/browser/extensions/global_shortcut_listener.h b/chrome/browser/extensions/global_shortcut_listener.h
49+
index 554930bc33d87ee88a9bcc5f0cf17cef09c27ef0..8df4f91d3db453afb9f73bcaeb82c919ca8d1841 100644
50+
--- a/chrome/browser/extensions/global_shortcut_listener.h
51+
+++ b/chrome/browser/extensions/global_shortcut_listener.h
52+
@@ -34,6 +34,8 @@ class GlobalShortcutListener {
53+
54+
static GlobalShortcutListener* GetInstance();
55+
56+
+ static void SetShouldUseInternalMediaKeyHandling(bool should_use);
57+
+
58+
// Register an observer for when a certain |accelerator| is struck. Returns
59+
// true if register successfully, or false if 1) the specificied |accelerator|
60+
// has been registered by another caller or other native applications, or
1361
diff --git a/content/browser/media/media_keys_listener_manager_impl.cc b/content/browser/media/media_keys_listener_manager_impl.cc
14-
index 5938f75742b793868638e693a9a8c8dc686dfc46..bf8782c23095a09dec62c68d7d902df24abcb13e 100644
62+
index 5938f75742b793868638e693a9a8c8dc686dfc46..1263d679a5174beb960265989c370dd4a58ae7b4 100644
1563
--- a/content/browser/media/media_keys_listener_manager_impl.cc
1664
+++ b/content/browser/media/media_keys_listener_manager_impl.cc
17-
@@ -231,7 +231,7 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
65+
@@ -231,18 +231,24 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
1866
media::AudioManager::GetGlobalAppName());
1967
#endif
2068

2169
- if (system_media_controls_) {
22-
+ if (/* DISABLES CODE */ (0)) {
23-
system_media_controls_->AddObserver(this);
24-
system_media_controls_notifier_ =
25-
std::make_unique<SystemMediaControlsNotifier>(
26-
@@ -239,8 +239,13 @@ void MediaKeysListenerManagerImpl::StartListeningForMediaKeysIfNecessary() {
27-
} else {
28-
// If we can't access system media controls, then directly listen for media
29-
// key keypresses instead.
30-
+#if defined(OS_MAC)
31-
+ media_keys_listener_ = ui::MediaKeysListener::Create(
32-
+ this, ui::MediaKeysListener::Scope::kGlobalRequiresAccessibility);
33-
+#else
70+
- system_media_controls_->AddObserver(this);
71+
- system_media_controls_notifier_ =
72+
- std::make_unique<SystemMediaControlsNotifier>(
73+
- system_media_controls_.get());
74+
- } else {
75+
- // If we can't access system media controls, then directly listen for media
76+
- // key keypresses instead.
77+
+ // This is required for proper functioning of MediaMetadata.
78+
+ system_media_controls_->AddObserver(this);
79+
+ system_media_controls_notifier_ =
80+
+ std::make_unique<SystemMediaControlsNotifier>(
81+
+ system_media_controls_.get());
82+
+
83+
+ // Directly listen for media key keypresses when using GlobalShortcuts.
84+
+#if defined(OS_MACOS)
85+
+ auto scope = media_key_handling_enabled_ ?
86+
+ ui::MediaKeysListener::Scope::kGlobal :
87+
+ ui::MediaKeysListener::Scope::kGlobalRequiresAccessibility;
3488
media_keys_listener_ = ui::MediaKeysListener::Create(
35-
this, ui::MediaKeysListener::Scope::kGlobal);
89+
- this, ui::MediaKeysListener::Scope::kGlobal);
90+
- DCHECK(media_keys_listener_);
91+
- }
92+
+ this, scope);
93+
+#else
94+
+ media_keys_listener_ = ui::MediaKeysListener::Create(
95+
+ this, ui::MediaKeysListener::Scope::kGlobal);
3696
+#endif
37-
DCHECK(media_keys_listener_);
38-
}
97+
+ DCHECK(media_keys_listener_);
3998

99+
EnsureAuxiliaryServices();
100+
}
40101
diff --git a/ui/base/accelerators/media_keys_listener.h b/ui/base/accelerators/media_keys_listener.h
41102
index c2b03328c0e508995bdc135031500783f500ceba..1b6b14dc2999c99445cef6ffc04d49a7c1728a54 100644
42103
--- a/ui/base/accelerators/media_keys_listener.h

shell/browser/api/electron_api_global_shortcut.cc

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "base/containers/contains.h"
1010
#include "base/stl_util.h"
1111
#include "base/strings/utf_string_conversions.h"
12+
#include "chrome/common/extensions/command.h"
1213
#include "gin/dictionary.h"
1314
#include "gin/object_template_builder.h"
1415
#include "shell/browser/api/electron_api_system_preferences.h"
@@ -21,29 +22,31 @@
2122
#include "base/mac/mac_util.h"
2223
#endif
2324

25+
using extensions::Command;
2426
using extensions::GlobalShortcutListener;
2527

2628
namespace {
2729

2830
#if defined(OS_MAC)
2931
bool RegisteringMediaKeyForUntrustedClient(const ui::Accelerator& accelerator) {
3032
if (base::mac::IsAtLeastOS10_14()) {
31-
constexpr ui::KeyboardCode mediaKeys[] = {
32-
ui::VKEY_MEDIA_PLAY_PAUSE, ui::VKEY_MEDIA_NEXT_TRACK,
33-
ui::VKEY_MEDIA_PREV_TRACK, ui::VKEY_MEDIA_STOP,
34-
ui::VKEY_VOLUME_UP, ui::VKEY_VOLUME_DOWN,
35-
ui::VKEY_VOLUME_MUTE};
36-
37-
if (std::find(std::begin(mediaKeys), std::end(mediaKeys),
38-
accelerator.key_code()) != std::end(mediaKeys)) {
39-
bool trusted =
40-
electron::api::SystemPreferences::IsTrustedAccessibilityClient(false);
41-
if (!trusted)
33+
if (Command::IsMediaKey(accelerator)) {
34+
if (!electron::api::SystemPreferences::IsTrustedAccessibilityClient(
35+
false))
4236
return true;
4337
}
4438
}
4539
return false;
4640
}
41+
42+
bool MapHasMediaKeys(
43+
const std::map<ui::Accelerator, base::RepeatingClosure>& accelerator_map) {
44+
auto media_key = std::find_if(
45+
accelerator_map.begin(), accelerator_map.end(),
46+
[](const auto& ac) { return Command::IsMediaKey(ac.first); });
47+
48+
return media_key != accelerator_map.end();
49+
}
4750
#endif
4851

4952
} // namespace
@@ -83,7 +86,7 @@ bool GlobalShortcut::RegisterAll(
8386

8487
for (auto& accelerator : accelerators) {
8588
if (!Register(accelerator, callback)) {
86-
// unregister all shortcuts if any failed
89+
// Unregister all shortcuts if any failed.
8790
UnregisterSome(registered);
8891
return false;
8992
}
@@ -101,8 +104,12 @@ bool GlobalShortcut::Register(const ui::Accelerator& accelerator,
101104
return false;
102105
}
103106
#if defined(OS_MAC)
104-
if (RegisteringMediaKeyForUntrustedClient(accelerator))
105-
return false;
107+
if (Command::IsMediaKey(accelerator)) {
108+
if (RegisteringMediaKeyForUntrustedClient(accelerator))
109+
return false;
110+
111+
GlobalShortcutListener::SetShouldUseInternalMediaKeyHandling(false);
112+
}
106113
#endif
107114

108115
if (!GlobalShortcutListener::GetInstance()->RegisterAccelerator(accelerator,
@@ -123,6 +130,13 @@ void GlobalShortcut::Unregister(const ui::Accelerator& accelerator) {
123130
if (accelerator_callback_map_.erase(accelerator) == 0)
124131
return;
125132

133+
#if defined(OS_MAC)
134+
if (Command::IsMediaKey(accelerator) &&
135+
!MapHasMediaKeys(accelerator_callback_map_)) {
136+
GlobalShortcutListener::SetShouldUseInternalMediaKeyHandling(true);
137+
}
138+
#endif
139+
126140
GlobalShortcutListener::GetInstance()->UnregisterAccelerator(accelerator,
127141
this);
128142
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy