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(
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() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
observers_.CloseAll();
bindings_.CloseAllBindings();
debug_bindings_.CloseAllBindings();
}
void AudioFocusManager::RequestAudioFocusInternal(
......@@ -285,6 +292,7 @@ AudioFocusManager::AudioFocusManager() {
AudioFocusManager::~AudioFocusManager() {
DCHECK(observers_.empty());
DCHECK(bindings_.empty());
DCHECK(debug_bindings_.empty());
}
std::unique_ptr<AudioFocusManager::StackRow>
......
......@@ -18,7 +18,8 @@
namespace media_session {
class AudioFocusManager : public mojom::AudioFocusManager {
class AudioFocusManager : public mojom::AudioFocusManager,
public mojom::AudioFocusManagerDebug {
public:
using RequestId = uint64_t;
......@@ -32,13 +33,18 @@ class AudioFocusManager : public mojom::AudioFocusManager {
mojom::AudioFocusType type,
RequestAudioFocusCallback callback) override;
void GetFocusRequests(GetFocusRequestsCallback callback) override;
void AddObserver(mojom::AudioFocusObserverPtr observer) override;
// mojom::AudioFocusManagerDebug.
void GetDebugInfoForRequest(uint64_t request_id,
GetDebugInfoForRequestCallback callback) override;
void AddObserver(mojom::AudioFocusObserverPtr observer) override;
// Bind to a mojom::AudioFocusManagerRequest.
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
// called by the MediaSession service before it is destroyed.
void CloseAllMojoObjects();
......@@ -73,6 +79,9 @@ class AudioFocusManager : public mojom::AudioFocusManager {
// Holds mojo bindings for the Audio Focus Manager API.
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
// themselves before being destroyed.
mojo::InterfacePtrSet<mojom::AudioFocusObserver> observers_;
......
......@@ -140,6 +140,10 @@ class AudioFocusManagerTest : public testing::Test {
// Bind |audio_focus_ptr_| to AudioFocusManager.
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
// state in between tests.
AudioFocusManager::GetInstance()->ResetForTesting();
......@@ -239,8 +243,10 @@ class AudioFocusManagerTest : public testing::Test {
},
&result);
GetService()->GetDebugInfoForRequest(request_id, std::move(callback));
GetDebugService()->GetDebugInfoForRequest(request_id, std::move(callback));
FlushForTesting();
audio_focus_debug_ptr_.FlushForTesting();
return result;
}
......@@ -296,6 +302,10 @@ class AudioFocusManagerTest : public testing::Test {
return audio_focus_ptr_.get();
}
mojom::AudioFocusManagerDebug* GetDebugService() const {
return audio_focus_debug_ptr_.get();
}
void FlushForTesting() {
audio_focus_ptr_.FlushForTesting();
AudioFocusManager::GetInstance()->FlushForTesting();
......@@ -305,6 +315,7 @@ class AudioFocusManagerTest : public testing::Test {
std::unique_ptr<service_manager::TestConnectorFactory> connector_factory_;
std::unique_ptr<service_manager::Connector> connector_;
mojom::AudioFocusManagerPtr audio_focus_ptr_;
mojom::AudioFocusManagerDebugPtr audio_focus_debug_ptr_;
DISALLOW_COPY_AND_ASSIGN(AudioFocusManagerTest);
};
......
......@@ -8,7 +8,8 @@
"service_manager:connector": {
"provides": {
"app": [
"media_session.mojom.AudioFocusManager"
"media_session.mojom.AudioFocusManager",
"media_session.mojom.AudioFocusManagerDebug"
],
"tests": [ "*" ]
}
......
......@@ -27,6 +27,10 @@ void MediaSessionService::OnStart() {
registry_.AddInterface(
base::BindRepeating(&AudioFocusManager::BindToInterface,
base::Unretained(AudioFocusManager::GetInstance())));
registry_.AddInterface(
base::BindRepeating(&AudioFocusManager::BindToDebugInterface,
base::Unretained(AudioFocusManager::GetInstance())));
}
void MediaSessionService::OnBindInterface(
......
......@@ -66,10 +66,13 @@ interface AudioFocusManager {
// audio focus and their current requested type.
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|.
GetDebugInfoForRequest(uint64 request_id)
=> (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