Skip to content

Commit d9a25cf

Browse files
trop[bot]codebyterepatchup[bot]
authored
fix: MediaMetadata not working properly (#31533)
* fix: MediaMetadata not working properly * chore: update patches Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com> Co-authored-by: PatchUp <73610968+patchup[bot]@users.noreply.github.com>
1 parent 018bee3 commit d9a25cf

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 9aec54a3263d24491d24013a80b719dfc834ecd4..001a6cb2a5eb701351fa924109b43fab6f30748d 100644
50+
--- a/chrome/browser/extensions/global_shortcut_listener.h
51+
+++ b/chrome/browser/extensions/global_shortcut_listener.h
52+
@@ -31,6 +31,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
@@ -10,6 +10,7 @@
1010
#include "base/containers/contains.h"
1111
#include "base/stl_util.h"
1212
#include "base/strings/utf_string_conversions.h"
13+
#include "chrome/common/extensions/command.h"
1314
#include "gin/dictionary.h"
1415
#include "gin/object_template_builder.h"
1516
#include "shell/browser/api/electron_api_system_preferences.h"
@@ -22,29 +23,31 @@
2223
#include "base/mac/mac_util.h"
2324
#endif
2425

26+
using extensions::Command;
2527
using extensions::GlobalShortcutListener;
2628

2729
namespace {
2830

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

5053
} // namespace
@@ -84,7 +87,7 @@ bool GlobalShortcut::RegisterAll(
8487

8588
for (auto& accelerator : accelerators) {
8689
if (!Register(accelerator, callback)) {
87-
// unregister all shortcuts if any failed
90+
// Unregister all shortcuts if any failed.
8891
UnregisterSome(registered);
8992
return false;
9093
}
@@ -102,8 +105,12 @@ bool GlobalShortcut::Register(const ui::Accelerator& accelerator,
102105
return false;
103106
}
104107
#if defined(OS_MAC)
105-
if (RegisteringMediaKeyForUntrustedClient(accelerator))
106-
return false;
108+
if (Command::IsMediaKey(accelerator)) {
109+
if (RegisteringMediaKeyForUntrustedClient(accelerator))
110+
return false;
111+
112+
GlobalShortcutListener::SetShouldUseInternalMediaKeyHandling(false);
113+
}
107114
#endif
108115

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

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

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