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); |