Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(912)

Unified Diff: third_party/WebKit/Source/modules/mediasession/MediaSession.cpp

Issue 2367393002: Migrating MediaSession messages to mojo (Closed)
Patch Set: better type mapping (experimental, should move to a separate CL) Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698