Commit e179a324 authored by Becca Hughes's avatar Becca Hughes Committed by Commit Bot

[Media Session] Add AudioFocus debug API

Add a separate AudioFocusManagerDebug API to isolate the
privileged GetDebugInfoForRequest method.

BUG=875004

Change-Id: I587a73a78edf7aba3fce3f8dc722d2914098013f
Reviewed-on: https://chromium-review.googlesource.com/c/1242036
Commit-Queue: Becca Hughes <beccahughes@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Cr-Commit-Position: refs/heads/master@{#596414}
parent d2d3ac45
...@@ -223,10 +223,17 @@ void AudioFocusManager::BindToInterface( ...@@ -223,10 +223,17 @@ void AudioFocusManager::BindToInterface(
bindings_.AddBinding(this, std::move(request)); bindings_.AddBinding(this, std::move(request));
} }
void AudioFocusManager::BindToDebugInterface(
mojom::AudioFocusManagerDebugRequest request) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
debug_bindings_.AddBinding(this, std::move(request));
}
void AudioFocusManager::CloseAllMojoObjects() { void AudioFocusManager::CloseAllMojoObjects() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
observers_.CloseAll(); observers_.CloseAll();
bindings_.CloseAllBindings(); bindings_.CloseAllBindings();
debug_bindings_.CloseAllBindings();
} }
void AudioFocusManager::RequestAudioFocusInternal( void AudioFocusManager::RequestAudioFocusInternal(
...@@ -285,6 +292,7 @@ AudioFocusManager::AudioFocusManager() { ...@@ -285,6 +292,7 @@ AudioFocusManager::AudioFocusManager() {
AudioFocusManager::~AudioFocusManager() { AudioFocusManager::~AudioFocusManager() {
DCHECK(observers_.empty()); DCHECK(observers_.empty());
DCHECK(bindings_.empty()); DCHECK(bindings_.empty());
DCHECK(debug_bindings_.empty());
} }
std::unique_ptr<AudioFocusManager::StackRow> std::unique_ptr<AudioFocusManager::StackRow>
......
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
namespace media_session { namespace media_session {
class AudioFocusManager : public mojom::AudioFocusManager { class AudioFocusManager : public mojom::AudioFocusManager,
public mojom::AudioFocusManagerDebug {
public: public:
using RequestId = uint64_t; using RequestId = uint64_t;
...@@ -32,13 +33,18 @@ class AudioFocusManager : public mojom::AudioFocusManager { ...@@ -32,13 +33,18 @@ class AudioFocusManager : public mojom::AudioFocusManager {
mojom::AudioFocusType type, mojom::AudioFocusType type,
RequestAudioFocusCallback callback) override; RequestAudioFocusCallback callback) override;
void GetFocusRequests(GetFocusRequestsCallback callback) override; void GetFocusRequests(GetFocusRequestsCallback callback) override;
void AddObserver(mojom::AudioFocusObserverPtr observer) override;
// mojom::AudioFocusManagerDebug.
void GetDebugInfoForRequest(uint64_t request_id, void GetDebugInfoForRequest(uint64_t request_id,
GetDebugInfoForRequestCallback callback) override; GetDebugInfoForRequestCallback callback) override;
void AddObserver(mojom::AudioFocusObserverPtr observer) override;
// Bind to a mojom::AudioFocusManagerRequest. // Bind to a mojom::AudioFocusManagerRequest.
void BindToInterface(mojom::AudioFocusManagerRequest request); void BindToInterface(mojom::AudioFocusManagerRequest request);
// Bind to a mojom::AudioFocusManagerDebugRequest.
void BindToDebugInterface(mojom::AudioFocusManagerDebugRequest request);
// This will close all Mojo bindings and interface pointers. This should be // This will close all Mojo bindings and interface pointers. This should be
// called by the MediaSession service before it is destroyed. // called by the MediaSession service before it is destroyed.
void CloseAllMojoObjects(); void CloseAllMojoObjects();
...@@ -73,6 +79,9 @@ class AudioFocusManager : public mojom::AudioFocusManager { ...@@ -73,6 +79,9 @@ class AudioFocusManager : public mojom::AudioFocusManager {
// Holds mojo bindings for the Audio Focus Manager API. // Holds mojo bindings for the Audio Focus Manager API.
mojo::BindingSet<mojom::AudioFocusManager> bindings_; mojo::BindingSet<mojom::AudioFocusManager> bindings_;
// Holds mojo bindings for the Audio Focus Manager Debug API.
mojo::BindingSet<mojom::AudioFocusManagerDebug> debug_bindings_;
// Weak reference of managed observers. Observers are expected to remove // Weak reference of managed observers. Observers are expected to remove
// themselves before being destroyed. // themselves before being destroyed.
mojo::InterfacePtrSet<mojom::AudioFocusObserver> observers_; mojo::InterfacePtrSet<mojom::AudioFocusObserver> observers_;
......
...@@ -140,6 +140,10 @@ class AudioFocusManagerTest : public testing::Test { ...@@ -140,6 +140,10 @@ class AudioFocusManagerTest : public testing::Test {
// Bind |audio_focus_ptr_| to AudioFocusManager. // Bind |audio_focus_ptr_| to AudioFocusManager.
connector_->BindInterface("test", mojo::MakeRequest(&audio_focus_ptr_)); connector_->BindInterface("test", mojo::MakeRequest(&audio_focus_ptr_));
// Bind |audio_focus_debug_ptr_| to AudioFocusManagerDebug.
connector_->BindInterface("test",
mojo::MakeRequest(&audio_focus_debug_ptr_));
// AudioFocusManager is a singleton so we should make sure we reset any // AudioFocusManager is a singleton so we should make sure we reset any
// state in between tests. // state in between tests.
AudioFocusManager::GetInstance()->ResetForTesting(); AudioFocusManager::GetInstance()->ResetForTesting();
...@@ -239,8 +243,10 @@ class AudioFocusManagerTest : public testing::Test { ...@@ -239,8 +243,10 @@ class AudioFocusManagerTest : public testing::Test {
}, },
&result); &result);
GetService()->GetDebugInfoForRequest(request_id, std::move(callback)); GetDebugService()->GetDebugInfoForRequest(request_id, std::move(callback));
FlushForTesting(); FlushForTesting();
audio_focus_debug_ptr_.FlushForTesting();
return result; return result;
} }
...@@ -296,6 +302,10 @@ class AudioFocusManagerTest : public testing::Test { ...@@ -296,6 +302,10 @@ class AudioFocusManagerTest : public testing::Test {
return audio_focus_ptr_.get(); return audio_focus_ptr_.get();
} }
mojom::AudioFocusManagerDebug* GetDebugService() const {
return audio_focus_debug_ptr_.get();
}
void FlushForTesting() { void FlushForTesting() {
audio_focus_ptr_.FlushForTesting(); audio_focus_ptr_.FlushForTesting();
AudioFocusManager::GetInstance()->FlushForTesting(); AudioFocusManager::GetInstance()->FlushForTesting();
...@@ -305,6 +315,7 @@ class AudioFocusManagerTest : public testing::Test { ...@@ -305,6 +315,7 @@ class AudioFocusManagerTest : public testing::Test {
std::unique_ptr<service_manager::TestConnectorFactory> connector_factory_; std::unique_ptr<service_manager::TestConnectorFactory> connector_factory_;
std::unique_ptr<service_manager::Connector> connector_; std::unique_ptr<service_manager::Connector> connector_;
mojom::AudioFocusManagerPtr audio_focus_ptr_; mojom::AudioFocusManagerPtr audio_focus_ptr_;
mojom::AudioFocusManagerDebugPtr audio_focus_debug_ptr_;
DISALLOW_COPY_AND_ASSIGN(AudioFocusManagerTest); DISALLOW_COPY_AND_ASSIGN(AudioFocusManagerTest);
}; };
......
...@@ -8,7 +8,8 @@ ...@@ -8,7 +8,8 @@
"service_manager:connector": { "service_manager:connector": {
"provides": { "provides": {
"app": [ "app": [
"media_session.mojom.AudioFocusManager" "media_session.mojom.AudioFocusManager",
"media_session.mojom.AudioFocusManagerDebug"
], ],
"tests": [ "*" ] "tests": [ "*" ]
} }
......
...@@ -27,6 +27,10 @@ void MediaSessionService::OnStart() { ...@@ -27,6 +27,10 @@ void MediaSessionService::OnStart() {
registry_.AddInterface( registry_.AddInterface(
base::BindRepeating(&AudioFocusManager::BindToInterface, base::BindRepeating(&AudioFocusManager::BindToInterface,
base::Unretained(AudioFocusManager::GetInstance()))); base::Unretained(AudioFocusManager::GetInstance())));
registry_.AddInterface(
base::BindRepeating(&AudioFocusManager::BindToDebugInterface,
base::Unretained(AudioFocusManager::GetInstance())));
} }
void MediaSessionService::OnBindInterface( void MediaSessionService::OnBindInterface(
......
...@@ -66,10 +66,13 @@ interface AudioFocusManager { ...@@ -66,10 +66,13 @@ interface AudioFocusManager {
// audio focus and their current requested type. // audio focus and their current requested type.
GetFocusRequests() => (array<AudioFocusRequestState> requests); GetFocusRequests() => (array<AudioFocusRequestState> requests);
// Adds observers that receive audio focus events.
AddObserver(AudioFocusObserver observer);
};
// Provides debug information about audio focus requests.
interface AudioFocusManagerDebug {
// Gets debugging information for a |MediaSession| with |request_id|. // Gets debugging information for a |MediaSession| with |request_id|.
GetDebugInfoForRequest(uint64 request_id) GetDebugInfoForRequest(uint64 request_id)
=> (MediaSessionDebugInfo debug_info); => (MediaSessionDebugInfo debug_info);
// Adds observers that receive audio focus events.
AddObserver(AudioFocusObserver observer);
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment