Chromium Code Reviews| Index: third_party/WebKit/Source/modules/mediasession/MediaSession.cpp |
| diff --git a/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp b/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp |
| index 5f47c82ef3f575561dc51bb84d86787eb00be185..e23527a9544b24eb56103f5d30bf2b9c2bffbbfe 100644 |
| --- a/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp |
| +++ b/third_party/WebKit/Source/modules/mediasession/MediaSession.cpp |
| @@ -13,64 +13,84 @@ |
| #include "core/frame/LocalFrame.h" |
| #include "core/loader/FrameLoaderClient.h" |
| #include "modules/mediasession/MediaMetadata.h" |
| -#include "modules/mediasession/MediaSessionError.h" |
| +#include "modules/mediasession/MediaArtwork.h" |
| +#include "public/platform/WebIconSizesParser.h" |
| +#include "public/platform/InterfaceProvider.h" |
| #include <memory> |
| namespace blink { |
| -MediaSession::MediaSession(std::unique_ptr<WebMediaSession> webMediaSession) |
| - : m_webMediaSession(std::move(webMediaSession)) |
| -{ |
| - DCHECK(m_webMediaSession); |
| +namespace { |
| + |
| +mojom::blink::MediaMetadataIconPtr ToMojoMediaMetadataIcon( |
| + const MediaArtwork* icon) { |
| + DCHECK(icon); |
| + mojom::blink::MediaMetadataIconPtr mojo_icon |
| + = mojom::blink::MediaMetadataIcon::New(); |
| + mojo_icon->src = KURL(ParsedURLString, icon->src()); |
| + mojo_icon->type = icon->type(); |
| + WebVector<WebSize> web_sizes = WebIconSizesParser::parseIconSizes(icon->sizes()); |
| + mojo_icon->sizes.resize(web_sizes.size()); |
| + memcpy(mojo_icon->sizes.data(), web_sizes.data(), web_sizes.size() * sizeof(WebSize)); |
| + return mojo_icon; |
| } |
| -MediaSession* MediaSession::create(ExecutionContext* context, ExceptionState& exceptionState) |
| -{ |
| - Document* document = toDocument(context); |
| - LocalFrame* frame = document->frame(); |
| - FrameLoaderClient* client = frame->loader().client(); |
| - std::unique_ptr<WebMediaSession> webMediaSession = client->createWebMediaSession(); |
| - if (!webMediaSession) { |
| - exceptionState.throwDOMException(NotSupportedError, "Missing platform implementation."); |
| - return nullptr; |
| +mojom::blink::MediaMetadataPtr ToMojoMediaMetadata( |
| + const MediaMetadata* metadata) { |
| + mojom::blink::MediaMetadataPtr mojo_metadata; |
| + if (!metadata) |
| + return mojo_metadata; |
| + mojo_metadata = mojom::blink::MediaMetadata::New(); |
| + mojo_metadata->title = metadata->title(); |
| + mojo_metadata->artist = metadata->artist(); |
| + mojo_metadata->album = metadata->album(); |
| + for (const auto& icon : metadata->artwork()) { |
| + // TODO(zqzhang): do sanitization |
|
mlamouri (slow - plz ping)
2016/09/29 10:26:40
It would be better if you could do this in this CL
Zhiqiang Zhang (Slow)
2016/10/03 20:21:00
Done.
|
| + mojo_metadata->artwork.append(ToMojoMediaMetadataIcon(icon.get())); |
| } |
| - return new MediaSession(std::move(webMediaSession)); |
| + return mojo_metadata; |
| } |
| -ScriptPromise MediaSession::activate(ScriptState* scriptState) |
| -{ |
| - ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| - ScriptPromise promise = resolver->promise(); |
| +} // anonymous namespace |
| - m_webMediaSession->activate(new CallbackPromiseAdapter<void, MediaSessionError>(resolver)); |
| - return promise; |
| +MediaSession::MediaSession() |
| +{ |
| } |
| -ScriptPromise MediaSession::deactivate(ScriptState* scriptState) |
| +MediaSession* MediaSession::create() |
| { |
| - ScriptPromiseResolver* resolver = ScriptPromiseResolver::create(scriptState); |
| - ScriptPromise promise = resolver->promise(); |
| - |
| - m_webMediaSession->deactivate(new CallbackPromiseAdapter<void, void>(resolver)); |
| - return promise; |
| + return new MediaSession(); |
| } |
| -void MediaSession::setMetadata(MediaMetadata* metadata) |
| +void MediaSession::setMetadata(ScriptState* scriptState, MediaMetadata* metadata) |
| { |
| - m_metadata = metadata; |
| - if (metadata) { |
| - WebMediaMetadata webMetadata = (WebMediaMetadata) *metadata; |
| - m_webMediaSession->setMetadata(&webMetadata); |
| - } else { |
| - m_webMediaSession->setMetadata(nullptr); |
| - } |
| + if (getService(scriptState)) |
| + getService(scriptState)->SetMetadata(ToMojoMediaMetadata(metadata)); |
| } |
| -MediaMetadata* MediaSession::metadata() const |
| +MediaMetadata* MediaSession::metadata(ScriptState*) const |
| { |
| return m_metadata; |
| } |
| +mojom::blink::MediaSessionService* MediaSession::getService(ScriptState* scriptState) |
| +{ |
| + if (!m_service) { |
| + InterfaceProvider* interfaceProvider = nullptr; |
| + if (scriptState->getExecutionContext()->isDocument()) { |
| + Document* document = toDocument(scriptState->getExecutionContext()); |
| + if (document->frame()) |
| + interfaceProvider = document->frame()->interfaceProvider(); |
| + } else { |
| + // Can only getService from a frame!!! |
|
mlamouri (slow - plz ping)
2016/09/29 10:26:40
I think a DCHECK would be better.
Zhiqiang Zhang (Slow)
2016/09/30 19:56:15
Done.
|
| + } |
| + |
| + if (interfaceProvider) |
| + interfaceProvider->getInterface(mojo::GetProxy(&m_service)); |
| + } |
| + return m_service.get(); |
| +} |
| + |
| DEFINE_TRACE(MediaSession) |
| { |
| visitor->trace(m_metadata); |