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',