Add stub for assigning media session to media elements
Introduces a partial IDL interface for HTMLMediaElement containing an
optional media session attribute implemented as a supplement to media
elements.
BUG=497735
Review URL: https://codereview.chromium.org/1217743003
git-svn-id: svn://svn.chromium.org/blink/trunk@198272 bbb929c8-8fbe-4397-9dbb-9b2b20218538
diff --git a/third_party/WebKit/LayoutTests/media/mediasession/htmlmediaelement-set-session-expected.txt b/third_party/WebKit/LayoutTests/media/mediasession/htmlmediaelement-set-session-expected.txt
new file mode 100644
index 0000000..f4ad239
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/mediasession/htmlmediaelement-set-session-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL HTMLMediaElement set session assert_true: Run either manually by passing the MediaSession flag or as part of the virtual mediasession testsuite. expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/media/mediasession/htmlmediaelement-set-session.html b/third_party/WebKit/LayoutTests/media/mediasession/htmlmediaelement-set-session.html
new file mode 100644
index 0000000..7a2dfff
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/media/mediasession/htmlmediaelement-set-session.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<title>HTMLMediaElement set session</title>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script>
+ test(function() {
+ assert_true(!window.internals || window.internals.runtimeFlags.mediaSessionEnabled,
+ "Run either manually by passing the MediaSession flag or as part of the virtual mediasession testsuite.");
+ console.warn("dummy log entry to avoid an empty -expected.txt in virtual/");
+
+ var mediaElement = document.createElement('audio');
+ assert_true(mediaElement instanceof HTMLMediaElement);
+
+ var mediaSession = new MediaSession();
+ mediaElement.session = mediaSession;
+ assert_equals(mediaElement.session, mediaSession);
+
+ assert_throws(new TypeError, function() { mediaElement.session = document; });
+ assert_throws(new TypeError, function() { mediaElement.session = "string"; });
+ assert_throws(new TypeError, function() { mediaElement.session = 42; });
+ assert_equals(mediaElement.session, mediaSession);
+
+ mediaElement.session = null;
+ assert_equals(mediaElement.session, null);
+ });
+</script>
diff --git a/third_party/WebKit/LayoutTests/media/mediasession/mediasession-constructor.html b/third_party/WebKit/LayoutTests/media/mediasession/mediasession-constructor.html
index 38dba22..116a9854 100644
--- a/third_party/WebKit/LayoutTests/media/mediasession/mediasession-constructor.html
+++ b/third_party/WebKit/LayoutTests/media/mediasession/mediasession-constructor.html
@@ -2,7 +2,6 @@
<title>MediaSession() constructor</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
-<div id="log"></div>
<script>
test(function() {
assert_true(!window.internals || window.internals.runtimeFlags.mediaSessionEnabled,
diff --git a/third_party/WebKit/LayoutTests/virtual/mediasession/media/mediasession/htmlmediaelement-set-session-expected.txt b/third_party/WebKit/LayoutTests/virtual/mediasession/media/mediasession/htmlmediaelement-set-session-expected.txt
new file mode 100644
index 0000000..653accb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/mediasession/media/mediasession/htmlmediaelement-set-session-expected.txt
@@ -0,0 +1,5 @@
+CONSOLE WARNING: line 9: dummy log entry to avoid an empty -expected.txt in virtual/
+This is a testharness.js-based test.
+PASS HTMLMediaElement set session
+Harness: the test ran to completion.
+
diff --git a/third_party/WebKit/LayoutTests/virtual/mediasession/media/mediasession/mediasession-constructor-expected.txt b/third_party/WebKit/LayoutTests/virtual/mediasession/media/mediasession/mediasession-constructor-expected.txt
index 817ebb6..871fdbc 100644
--- a/third_party/WebKit/LayoutTests/virtual/mediasession/media/mediasession/mediasession-constructor-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/mediasession/media/mediasession/mediasession-constructor-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 10: dummy log entry to avoid an empty -expected.txt in virtual/
+CONSOLE WARNING: line 9: dummy log entry to avoid an empty -expected.txt in virtual/
This is a testharness.js-based test.
PASS MediaSession() constructor
Harness: the test ran to completion.
diff --git a/third_party/WebKit/Source/modules/mediasession/DEPS b/third_party/WebKit/Source/modules/mediasession/DEPS
index 9bc1b429..158b1f8 100644
--- a/third_party/WebKit/Source/modules/mediasession/DEPS
+++ b/third_party/WebKit/Source/modules/mediasession/DEPS
@@ -1,6 +1,7 @@
include_rules = [
"+bindings",
"-modules",
+ "+modules/ModulesExport.h",
"+modules/mediasession",
"+platform",
]
diff --git a/third_party/WebKit/Source/modules/mediasession/HTMLMediaElementMediaSession.cpp b/third_party/WebKit/Source/modules/mediasession/HTMLMediaElementMediaSession.cpp
new file mode 100644
index 0000000..ddcde17
--- /dev/null
+++ b/third_party/WebKit/Source/modules/mediasession/HTMLMediaElementMediaSession.cpp
@@ -0,0 +1,49 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "config.h"
+#include "modules/mediasession/HTMLMediaElementMediaSession.h"
+
+namespace blink {
+
+MediaSession* HTMLMediaElementMediaSession::session(HTMLMediaElement& mediaElement)
+{
+ if (HTMLMediaElementMediaSession* supplement = fromIfExists(mediaElement))
+ return supplement->m_session.get();
+ return nullptr;
+}
+
+void HTMLMediaElementMediaSession::setSession(HTMLMediaElement& mediaElement, MediaSession* session)
+{
+ from(mediaElement).m_session = session;
+}
+
+const char* HTMLMediaElementMediaSession::supplementName()
+{
+ return "HTMLMediaElementMediaSession";
+}
+
+HTMLMediaElementMediaSession& HTMLMediaElementMediaSession::from(HTMLMediaElement& element)
+{
+ HTMLMediaElementMediaSession* supplement = fromIfExists(element);
+ if (!supplement) {
+ supplement = new HTMLMediaElementMediaSession();
+ provideTo(element, supplementName(), adoptPtrWillBeNoop(supplement));
+ }
+ return *supplement;
+}
+
+HTMLMediaElementMediaSession* HTMLMediaElementMediaSession::fromIfExists(HTMLMediaElement& element)
+{
+ return static_cast<HTMLMediaElementMediaSession*>(WillBeHeapSupplement<HTMLMediaElement>::from(element, supplementName()));
+}
+
+DEFINE_TRACE(HTMLMediaElementMediaSession)
+{
+ visitor->trace(m_session);
+ WillBeHeapSupplement<HTMLMediaElement>::trace(visitor);
+}
+
+}
+
diff --git a/third_party/WebKit/Source/modules/mediasession/HTMLMediaElementMediaSession.h b/third_party/WebKit/Source/modules/mediasession/HTMLMediaElementMediaSession.h
new file mode 100644
index 0000000..228287d6
--- /dev/null
+++ b/third_party/WebKit/Source/modules/mediasession/HTMLMediaElementMediaSession.h
@@ -0,0 +1,36 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef HTMLMediaElementMediaSession_h
+#define HTMLMediaElementMediaSession_h
+
+#include "core/html/HTMLMediaElement.h"
+#include "modules/ModulesExport.h"
+#include "modules/mediasession/MediaSession.h"
+#include "platform/Supplementable.h"
+#include "platform/heap/Handle.h"
+
+namespace blink {
+
+// A supplement to HTMLMediaElement responsible for the integration of
+// MediaSession with HTMLMediaElement.
+class HTMLMediaElementMediaSession final : public NoBaseWillBeGarbageCollected<HTMLMediaElementMediaSession>, public WillBeHeapSupplement<HTMLMediaElement> {
+ WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(HTMLMediaElementMediaSession);
+public:
+ static MediaSession* session(HTMLMediaElement&);
+ static void setSession(HTMLMediaElement&, MediaSession*);
+
+ DECLARE_VIRTUAL_TRACE();
+
+private:
+ static HTMLMediaElementMediaSession& from(HTMLMediaElement&);
+ static HTMLMediaElementMediaSession* fromIfExists(HTMLMediaElement&);
+ static const char* supplementName();
+
+ PersistentWillBeMember<MediaSession> m_session;
+};
+
+} // namespace blink
+
+#endif // HTMLMediaElementMediaSession_h
diff --git a/third_party/WebKit/Source/modules/mediasession/HTMLMediaElementMediaSession.idl b/third_party/WebKit/Source/modules/mediasession/HTMLMediaElementMediaSession.idl
new file mode 100644
index 0000000..14b2fe5
--- /dev/null
+++ b/third_party/WebKit/Source/modules/mediasession/HTMLMediaElementMediaSession.idl
@@ -0,0 +1,12 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// https://mediasession.spec.whatwg.org/#extensions-to-the-htmlmediaelement-interface
+
+[
+ TypeChecking=Interface,
+ RuntimeEnabled=MediaSession,
+] partial interface HTMLMediaElement {
+ attribute MediaSession? session;
+};
diff --git a/third_party/WebKit/Source/modules/mediasession/MediaSession.idl b/third_party/WebKit/Source/modules/mediasession/MediaSession.idl
index 1fbf628..235604b3 100644
--- a/third_party/WebKit/Source/modules/mediasession/MediaSession.idl
+++ b/third_party/WebKit/Source/modules/mediasession/MediaSession.idl
@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+// https://mediasession.spec.whatwg.org/#the-mediasession-interface
+
[
Constructor(),
GarbageCollected,
diff --git a/third_party/WebKit/Source/modules/modules.gypi b/third_party/WebKit/Source/modules/modules.gypi
index 935ef1d..7cea68f 100644
--- a/third_party/WebKit/Source/modules/modules.gypi
+++ b/third_party/WebKit/Source/modules/modules.gypi
@@ -277,6 +277,7 @@
'geolocation/NavigatorGeolocation.idl',
'indexeddb/WindowIndexedDatabase.idl',
'indexeddb/WorkerGlobalScopeIndexedDatabase.idl',
+ 'mediasession/HTMLMediaElementMediaSession.idl',
'mediasource/HTMLVideoElementMediaSource.idl',
'mediasource/URLMediaSource.idl',
'mediastream/NavigatorMediaStream.idl',
@@ -941,8 +942,10 @@
'indexeddb/WebIDBDatabaseCallbacksImpl.h',
'indexeddb/WorkerGlobalScopeIndexedDatabase.cpp',
'indexeddb/WorkerGlobalScopeIndexedDatabase.h',
- 'mediasession/MediaSession.h',
+ 'mediasession/HTMLMediaElementMediaSession.cpp',
+ 'mediasession/HTMLMediaElementMediaSession.h',
'mediasession/MediaSession.cpp',
+ 'mediasession/MediaSession.h',
'mediasource/HTMLVideoElementMediaSource.cpp',
'mediasource/HTMLVideoElementMediaSource.h',
'mediasource/MediaSource.cpp',