Chromium Code Reviews| Index: content/renderer/media/android/renderer_media_session_manager.cc |
| diff --git a/content/renderer/media/android/renderer_media_session_manager.cc b/content/renderer/media/android/renderer_media_session_manager.cc |
| index 3d53c5d13416d57d3464c3d393d032642b9743f0..c0cd47908e6547e8e85e5f1ae0cacb70e4449c37 100644 |
| --- a/content/renderer/media/android/renderer_media_session_manager.cc |
| +++ b/content/renderer/media/android/renderer_media_session_manager.cc |
| @@ -6,14 +6,44 @@ |
| #include "base/logging.h" |
| #include "base/optional.h" |
| +#include "base/strings/utf_string_conversions.h" |
| #include "content/common/media/media_metadata_sanitizer.h" |
| -#include "content/common/media/media_session_messages_android.h" |
| #include "content/public/common/media_metadata.h" |
| -#include "content/public/renderer/render_thread.h" |
| +#include "content/public/renderer/render_frame.h" |
| #include "content/renderer/media/android/webmediasession_android.h" |
| +#include "services/shell/public/cpp/interface_provider.h" |
| namespace content { |
| +namespace { |
| + |
| +blink::mojom::MediaMetadataIconPtr ToMojoMediaMetadataIcon( |
| + const MediaMetadata::Artwork& icon) { |
| + blink::mojom::MediaMetadataIconPtr mojo_icon |
| + = blink::mojom::MediaMetadataIcon::New(); |
| + mojo_icon->src = icon.src; |
| + mojo_icon->type = icon.type; |
| + mojo_icon->sizes = icon.sizes; |
| + |
| + return mojo_icon; |
| +} |
| + |
| +blink::mojom::MediaMetadataPtr ToMojoMediaMetadata( |
| + const base::Optional<MediaMetadata>& metadata) { |
| + blink::mojom::MediaMetadataPtr mojo_metadata; |
| + if (!metadata.has_value()) |
| + return mojo_metadata; |
| + mojo_metadata = blink::mojom::MediaMetadata::New(); |
| + mojo_metadata->title = metadata->title; |
| + mojo_metadata->artist = metadata->artist; |
| + mojo_metadata->album = metadata->album; |
| + for (const auto& icon : metadata->artwork) |
| + mojo_metadata->artwork.push_back(ToMojoMediaMetadataIcon(icon)); |
| + return mojo_metadata; |
| +} |
| + |
| +} // anonymous namespace |
| + |
| RendererMediaSessionManager::RendererMediaSessionManager( |
| RenderFrame* render_frame) |
| : RenderFrameObserver(render_frame), |
| @@ -25,16 +55,6 @@ RendererMediaSessionManager::~RendererMediaSessionManager() { |
| "destroyed only after all media sessions are destroyed."; |
| } |
| -bool RendererMediaSessionManager::OnMessageReceived(const IPC::Message& msg) { |
| - bool handled = true; |
| - IPC_BEGIN_MESSAGE_MAP(RendererMediaSessionManager, msg) |
| - IPC_MESSAGE_HANDLER(MediaSessionMsg_DidActivate, OnDidActivate) |
| - IPC_MESSAGE_HANDLER(MediaSessionMsg_DidDeactivate, OnDidDeactivate) |
| - IPC_MESSAGE_UNHANDLED(handled = false) |
| - IPC_END_MESSAGE_MAP() |
| - return handled; |
| -} |
| - |
| void RendererMediaSessionManager::OnDestruct() { |
| delete this; |
| } |
| @@ -52,48 +72,63 @@ void RendererMediaSessionManager::UnregisterMediaSession(int session_id) { |
| void RendererMediaSessionManager::Activate( |
| int session_id, |
| std::unique_ptr<blink::WebMediaSessionActivateCallback> callback) { |
| - int request_id = pending_activation_requests_.Add(callback.release()); |
| - Send(new MediaSessionHostMsg_Activate(routing_id(), session_id, request_id)); |
| + if (GetMediaSessionService()) { |
| + GetMediaSessionService()->Activate( |
| + session_id, |
| + base::Bind(&RendererMediaSessionManager::OnDidActivate, |
| + base::Unretained(this), base::Passed(&callback))); |
| + } |
| } |
| void RendererMediaSessionManager::Deactivate( |
| int session_id, |
| std::unique_ptr<blink::WebMediaSessionDeactivateCallback> callback) { |
| - int request_id = pending_deactivation_requests_.Add(callback.release()); |
| - Send( |
| - new MediaSessionHostMsg_Deactivate(routing_id(), session_id, request_id)); |
| + if (GetMediaSessionService()) { |
| + GetMediaSessionService()->Deactivate( |
| + session_id, |
| + base::Bind(&RendererMediaSessionManager::OnDidDeactivate, |
| + base::Unretained(this), base::Passed(&callback))); |
| + } |
| } |
| void RendererMediaSessionManager::SetMetadata( |
| int session_id, const base::Optional<MediaMetadata>& metadata) { |
| - |
| - // TODO(zqzhang): print a console warning when metadata is dirty. See |
| - // https://crbug.com/625244. |
| - Send(new MediaSessionHostMsg_SetMetadata( |
| - routing_id(), session_id, |
| + base::Optional<MediaMetadata> sanitized_metadata = |
| (!metadata.has_value() || |
| MediaMetadataSanitizer::CheckSanity(metadata.value())) |
| ? metadata |
| - : MediaMetadataSanitizer::Sanitize(metadata.value()))); |
| + : MediaMetadataSanitizer::Sanitize(metadata.value()); |
| + // TODO(zqzhang): print a console warning when metadata is dirty. See |
| + // https://crbug.com/625244. |
| + if (GetMediaSessionService()) { |
| + GetMediaSessionService()->SetMetadata( |
| + session_id, ToMojoMediaMetadata(sanitized_metadata)); |
|
mlamouri (slow - plz ping)
2016/09/27 08:33:11
Could this call and the other mojo calls happen fr
|
| + } |
| } |
| -void RendererMediaSessionManager::OnDidActivate(int request_id, bool success) { |
| - DCHECK(pending_activation_requests_.Lookup(request_id)) << request_id; |
| - blink::WebMediaSessionActivateCallback* callback = |
| - pending_activation_requests_.Lookup(request_id); |
| +blink::mojom::MediaSessionServicePtr& |
| +RendererMediaSessionManager::GetMediaSessionService() { |
| + if (render_frame() && !media_session_service_.get()) { |
| + render_frame()->GetRemoteInterfaces() |
| + ->GetInterface(&media_session_service_); |
| + } |
| + return media_session_service_; |
| +} |
| + |
| +void RendererMediaSessionManager::OnDidActivate( |
| + std::unique_ptr<blink::WebMediaSessionActivateCallback> callback, |
| + bool success) { |
| if (success) { |
| callback->onSuccess(); |
| } else { |
| callback->onError( |
| blink::WebMediaSessionError(blink::WebMediaSessionError::Activate)); |
| } |
| - pending_activation_requests_.Remove(request_id); |
| } |
| -void RendererMediaSessionManager::OnDidDeactivate(int request_id) { |
| - DCHECK(pending_deactivation_requests_.Lookup(request_id)) << request_id; |
| - pending_deactivation_requests_.Lookup(request_id)->onSuccess(); |
| - pending_deactivation_requests_.Remove(request_id); |
| +void RendererMediaSessionManager::OnDidDeactivate( |
| + std::unique_ptr<blink::WebMediaSessionDeactivateCallback> callback) { |
| + callback->onSuccess(); |
| } |
| } // namespace content |