Title: [210552] trunk
Revision
210552
Author
[email protected]
Date
2017-01-10 10:41:31 -0800 (Tue, 10 Jan 2017)

Log Message

Add support for MediaKeys.createSession().
https://bugs.webkit.org/show_bug.cgi?id=166796

Reviewed by Eric Carlson.

Source/WebCore:

Test: media/encrypted-media/mock-MediaKeys-createSession.html

Implement MediaKeys::createSession(). This requires some additions to
CDM, CDMPrivate, and CDMInstance to support platform adoption and to
implement mock support for testing. Because the CDMInstance will now
be shared between MediaKeys and MediaKeySession, it cannot be a unique_ptr.
Make CDMInterface ref-counted and store it as a Ref.

* Modules/encryptedmedia/CDM.cpp:
(WebCore::CDM::createInstance):
(WebCore::CDM::supportsSessions):
* Modules/encryptedmedia/CDM.h:
* Modules/encryptedmedia/CDMInstance.h:
* Modules/encryptedmedia/CDMPrivate.h:
* Modules/encryptedmedia/MediaKeySession.cpp:
(WebCore::MediaKeySession::create):
(WebCore::MediaKeySession::MediaKeySession):
(WebCore::MediaKeySession::sessionId):
(WebCore::MediaKeySession::expiration):
(WebCore::MediaKeySession::keyStatuses):
* Modules/encryptedmedia/MediaKeySession.h:
* Modules/encryptedmedia/MediaKeySessionType.idl:
* Modules/encryptedmedia/MediaKeySystemAccess.cpp:
(WebCore::MediaKeySystemAccess::createMediaKeys):
* Modules/encryptedmedia/MediaKeys.cpp:
(WebCore::MediaKeys::MediaKeys):
(WebCore::MediaKeys::createSession):
* Modules/encryptedmedia/MediaKeys.h:
(WebCore::MediaKeys::create):
* Modules/encryptedmedia/MediaKeys.idl:

LayoutTests:

* media/encrypted-media/mock-MediaKeys-createSession-expected.txt: Added.
* media/encrypted-media/mock-MediaKeys-createSession.html: Added.
* platform/mac/TestExpectations:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (210551 => 210552)


--- trunk/LayoutTests/ChangeLog	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/LayoutTests/ChangeLog	2017-01-10 18:41:31 UTC (rev 210552)
@@ -1,5 +1,16 @@
 2017-01-10  Jer Noble  <[email protected]>
 
+        Add support for MediaKeys.createSession().
+        https://bugs.webkit.org/show_bug.cgi?id=166796
+
+        Reviewed by Eric Carlson.
+
+        * media/encrypted-media/mock-MediaKeys-createSession-expected.txt: Added.
+        * media/encrypted-media/mock-MediaKeys-createSession.html: Added.
+        * platform/mac/TestExpectations:
+
+2017-01-10  Jer Noble  <[email protected]>
+
         Add support for MediaKeys.setServerCertificate()
         https://bugs.webkit.org/show_bug.cgi?id=166772
 

Added: trunk/LayoutTests/media/encrypted-media/mock-MediaKeys-createSession-expected.txt (0 => 210552)


--- trunk/LayoutTests/media/encrypted-media/mock-MediaKeys-createSession-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/media/encrypted-media/mock-MediaKeys-createSession-expected.txt	2017-01-10 18:41:31 UTC (rev 210552)
@@ -0,0 +1,21 @@
+RUN(internals.initializeMockMediaSource())
+RUN(mock = internals.registerMockCDM())
+RUN(mock.supportedDataTypes = ["mock"])
+RUN(capabilities.initDataTypes = ["mock"])
+RUN(capabilities.videoCapabilities = [{ contentType: 'video/mock; codecs="mock"' }] )
+RUN(promise = navigator.requestMediaKeySystemAccess("org.webkit.mock", [capabilities]))
+Promise resolved OK
+
+RUN(promise = mediaKeySystemAccess.createMediaKeys())
+Promise resolved OK
+
+RUN(mediaKeySession = mediaKeys.createSession("temporary"))
+EXPECTED (typeof mediaKeySession == 'object') OK
+
+RUN(mock.supportedSessionTypes = ["temporary"])
+TEST(mediaKeySession = mediaKeys.createSession("persistent-license")) THROWS(DOMException.NOT_SUPPORTED_ERR) OK
+
+RUN(mock.supportsSessions = false)
+TEST(mediaKeySession = mediaKeys.createSession("temporary")) THROWS(DOMException.INVALID_STATE_ERR) OK
+END OF TEST
+

Added: trunk/LayoutTests/media/encrypted-media/mock-MediaKeys-createSession.html (0 => 210552)


--- trunk/LayoutTests/media/encrypted-media/mock-MediaKeys-createSession.html	                        (rev 0)
+++ trunk/LayoutTests/media/encrypted-media/mock-MediaKeys-createSession.html	2017-01-10 18:41:31 UTC (rev 210552)
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <script src=""
+    <script type="text/_javascript_">
+    var mock;
+    var promise;
+    var mediaKeySystemAccess;
+    var mediaKeys;
+    var mediaKeySession;
+    var capabilities = {};
+
+    function doTest()
+    {
+        if (!window.internals) {
+            failTest("Internals is required for this test.")
+            return;
+        }
+
+        run('internals.initializeMockMediaSource()');
+        run('mock = internals.registerMockCDM()');
+        run('mock.supportedDataTypes = ["mock"]');
+        run('capabilities.initDataTypes = ["mock"]');
+        run(`capabilities.videoCapabilities = [{ contentType: 'video/mock; codecs="mock"' }] `);
+        run('promise = navigator.requestMediaKeySystemAccess("org.webkit.mock", [capabilities])');
+        promise.then(gotMediaKeySystemAccess).catch(failTest);
+    }
+
+    function next() {
+        if (!tests.length) {
+            mock.unregister();
+            endTest()
+            return;
+        }
+
+        var nextTest = tests.shift();
+        consoleWrite('');
+        nextTest();
+    }
+
+    function shouldResolve(promise) {
+        promise.then(mediaKeySystemAccess => {
+            logResult(Success, 'Promise resolved');
+            next();
+        }, () => {
+            logResult(Failed, 'Promise rejected');
+            next();
+        });
+    }
+
+    function shouldReject(promise) {
+        promise.then(() => {
+            logResult(Failed, 'Promise resolved incorrectly');
+            next();
+        }, exceptionCode => {
+            logResult(Success, 'Promise rejected correctly');
+            next();
+        });
+    }
+
+    function gotMediaKeySystemAccess(result) {
+        logResult(Success, 'Promise resolved');
+        mediaKeySystemAccess = result;
+        next();
+    }
+
+    function gotMediaKeys(result) {
+        logResult(Success, 'Promise resolved');
+        mediaKeys = result;
+        next();
+    }
+
+    function stringToUInt8Array(str)
+    {
+       var array = new Uint8Array(str.length);
+       for (var i=0; i<str.length; i++)
+            array[i] = str.charCodeAt(i);
+       return array;
+    }
+
+    tests = [
+        function() {
+            run('promise = mediaKeySystemAccess.createMediaKeys()');
+            promise.then(gotMediaKeys).catch(failTest);
+        },
+
+        function() {
+            run('mediaKeySession = mediaKeys.createSession("temporary")');
+            testExpected('typeof mediaKeySession', 'object')
+            next();
+        },
+
+        function() {
+            run('mock.supportedSessionTypes = ["temporary"]');
+            testDOMException('mediaKeySession = mediaKeys.createSession("persistent-license")', 'DOMException.NOT_SUPPORTED_ERR');
+            next();
+        },
+
+        function() {
+            run('mock.supportsSessions = false');
+            testDOMException('mediaKeySession = mediaKeys.createSession("temporary")', 'DOMException.INVALID_STATE_ERR');
+            next();
+        }
+    ];
+    </script>
+</head>
+<body _onload_="doTest()">
+</body>
+</html>

Modified: trunk/LayoutTests/platform/mac/TestExpectations (210551 => 210552)


--- trunk/LayoutTests/platform/mac/TestExpectations	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/LayoutTests/platform/mac/TestExpectations	2017-01-10 18:41:31 UTC (rev 210552)
@@ -1468,6 +1468,7 @@
 media/encrypted-media/mock-navigator-requestMediaKeySystemAccess.html [ Skip ]
 media/encrypted-media/mock-MediaKeySystemAccess.html [ Skip ]
 media/encrypted-media/mock-MediaKeys-setServerCertificate.html [ Skip ]
+media/encrypted-media/mock-MediaKeys-createSession.html [ Skip ]
 
 webkit.org/b/166025 http/tests/fetch/fetching-same-resource-with-diffferent-options.html [ Pass Failure ]
 

Modified: trunk/Source/WebCore/ChangeLog (210551 => 210552)


--- trunk/Source/WebCore/ChangeLog	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/ChangeLog	2017-01-10 18:41:31 UTC (rev 210552)
@@ -1,5 +1,43 @@
 2017-01-10  Jer Noble  <[email protected]>
 
+        Add support for MediaKeys.createSession().
+        https://bugs.webkit.org/show_bug.cgi?id=166796
+
+        Reviewed by Eric Carlson.
+
+        Test: media/encrypted-media/mock-MediaKeys-createSession.html
+
+        Implement MediaKeys::createSession(). This requires some additions to
+        CDM, CDMPrivate, and CDMInstance to support platform adoption and to
+        implement mock support for testing. Because the CDMInstance will now
+        be shared between MediaKeys and MediaKeySession, it cannot be a unique_ptr.
+        Make CDMInterface ref-counted and store it as a Ref.
+
+        * Modules/encryptedmedia/CDM.cpp:
+        (WebCore::CDM::createInstance):
+        (WebCore::CDM::supportsSessions):
+        * Modules/encryptedmedia/CDM.h:
+        * Modules/encryptedmedia/CDMInstance.h:
+        * Modules/encryptedmedia/CDMPrivate.h:
+        * Modules/encryptedmedia/MediaKeySession.cpp:
+        (WebCore::MediaKeySession::create):
+        (WebCore::MediaKeySession::MediaKeySession):
+        (WebCore::MediaKeySession::sessionId):
+        (WebCore::MediaKeySession::expiration):
+        (WebCore::MediaKeySession::keyStatuses):
+        * Modules/encryptedmedia/MediaKeySession.h:
+        * Modules/encryptedmedia/MediaKeySessionType.idl:
+        * Modules/encryptedmedia/MediaKeySystemAccess.cpp:
+        (WebCore::MediaKeySystemAccess::createMediaKeys):
+        * Modules/encryptedmedia/MediaKeys.cpp:
+        (WebCore::MediaKeys::MediaKeys):
+        (WebCore::MediaKeys::createSession):
+        * Modules/encryptedmedia/MediaKeys.h:
+        (WebCore::MediaKeys::create):
+        * Modules/encryptedmedia/MediaKeys.idl:
+
+2017-01-10  Jer Noble  <[email protected]>
+
         Add support for MediaKeys.setServerCertificate()
         https://bugs.webkit.org/show_bug.cgi?id=166772
 

Modified: trunk/Source/WebCore/Modules/encryptedmedia/CDM.cpp (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/CDM.cpp	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/CDM.cpp	2017-01-10 18:41:31 UTC (rev 210552)
@@ -617,7 +617,7 @@
         m_private->loadAndInitialize();
 }
 
-std::unique_ptr<CDMInstance> CDM::createInstance()
+RefPtr<CDMInstance> CDM::createInstance()
 {
     if (!m_private)
         return nullptr;
@@ -629,6 +629,11 @@
     return m_private && m_private->supportsServerCertificates();
 }
 
+bool CDM::supportsSessions() const
+{
+    return m_private && m_private->supportsSessions();
 }
 
+}
+
 #endif

Modified: trunk/Source/WebCore/Modules/encryptedmedia/CDM.h (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/CDM.h	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/CDM.h	2017-01-10 18:41:31 UTC (rev 210552)
@@ -70,8 +70,9 @@
     const String& keySystem() const { return m_keySystem; }
 
     void loadAndInitialize();
-    std::unique_ptr<CDMInstance> createInstance();
+    RefPtr<CDMInstance> createInstance();
     bool supportsServerCertificates() const;
+    bool supportsSessions() const;
 
 private:
     CDM(Document&, const String& keySystem);

Modified: trunk/Source/WebCore/Modules/encryptedmedia/CDMInstance.h (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/CDMInstance.h	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/CDMInstance.h	2017-01-10 18:41:31 UTC (rev 210552)
@@ -28,6 +28,7 @@
 #if ENABLE(ENCRYPTED_MEDIA)
 
 #include <wtf/Forward.h>
+#include <wtf/RefCounted.h>
 
 namespace JSC {
 class ArrayBuffer;
@@ -37,7 +38,7 @@
 
 struct MediaKeySystemConfiguration;
 
-class CDMInstance {
+class CDMInstance : public RefCounted<CDMInstance> {
 public:
     virtual ~CDMInstance() { }
 

Modified: trunk/Source/WebCore/Modules/encryptedmedia/CDMPrivate.h (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/CDMPrivate.h	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/CDMPrivate.h	2017-01-10 18:41:31 UTC (rev 210552)
@@ -49,9 +49,10 @@
     virtual MediaKeysRequirement distinctiveIdentifiersRequirement(const MediaKeySystemConfiguration&, const MediaKeysRestrictions&) = 0;
     virtual MediaKeysRequirement persistentStateRequirement(const MediaKeySystemConfiguration&, const MediaKeysRestrictions&) = 0;
     virtual bool distinctiveIdentifiersAreUniquePerOriginAndClearable(const MediaKeySystemConfiguration&) = 0;
-    virtual std::unique_ptr<CDMInstance> createInstance() = 0;
+    virtual RefPtr<CDMInstance> createInstance() = 0;
     virtual void loadAndInitialize() = 0;
     virtual bool supportsServerCertificates() const = 0;
+    virtual bool supportsSessions() const = 0;
 };
 
 }

Modified: trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp	2017-01-10 18:41:31 UTC (rev 210552)
@@ -31,21 +31,50 @@
 
 #if ENABLE(ENCRYPTED_MEDIA)
 
+#include "CDM.h"
+#include "CDMInstance.h"
 #include "MediaKeyStatusMap.h"
 #include "NotImplemented.h"
 
 namespace WebCore {
 
-Ref<MediaKeySession> MediaKeySession::create(ScriptExecutionContext& context)
+Ref<MediaKeySession> MediaKeySession::create(ScriptExecutionContext& context, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
 {
-    auto session = adoptRef(*new MediaKeySession(context));
+    auto session = adoptRef(*new MediaKeySession(context, sessionType, useDistinctiveIdentifier, WTFMove(implementation), WTFMove(instance)));
     session->suspendIfNeeded();
     return session;
 }
 
-MediaKeySession::MediaKeySession(ScriptExecutionContext& context)
+MediaKeySession::MediaKeySession(ScriptExecutionContext& context, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
     : ActiveDOMObject(&context)
+    , m_expiration(std::numeric_limits<double>::quiet_NaN())
+    , m_keyStatuses(MediaKeyStatusMap::create())
+    , m_useDistinctiveIdentifier(useDistinctiveIdentifier)
+    , m_sessionType(sessionType)
+    , m_implementation(WTFMove(implementation))
+    , m_instance(WTFMove(instance))
 {
+    // https://w3c.github.io/encrypted-media/#dom-mediakeys-setservercertificate
+    // W3C Editor's Draft 09 November 2016
+    // createSession(), ctd.
+
+    // 3.1. Let the sessionId attribute be the empty string.
+    // 3.2. Let the expiration attribute be NaN.
+    // 3.3. Let the closed attribute be a new promise.
+    // 3.4. Let key status be a new empty MediaKeyStatusMap object, and initialize it as follows:
+    // 3.4.1. Let the size attribute be 0.
+    // 3.5. Let the session type value be sessionType.
+    // 3.6. Let the uninitialized value be true.
+    // 3.7. Let the callable value be false.
+    // 3.8. Let the use distinctive identifier value be this object's use distinctive identifier value.
+    // 3.9. Let the cdm implementation value be this object's cdm implementation.
+    // 3.10. Let the cdm instance value be this object's cdm instance.
+
+    UNUSED_PARAM(m_callable);
+    UNUSED_PARAM(m_sessionType);
+    UNUSED_PARAM(m_useDistinctiveIdentifier);
+    UNUSED_PARAM(m_closed);
+    UNUSED_PARAM(m_uninitialized);
 }
 
 MediaKeySession::~MediaKeySession() = default;
@@ -52,20 +81,17 @@
 
 const String& MediaKeySession::sessionId() const
 {
-    notImplemented();
-    return emptyString();
+    return m_sessionId;
 }
 
 double MediaKeySession::expiration() const
 {
-    notImplemented();
-    return 0;
+    return m_expiration;
 }
 
-RefPtr<MediaKeyStatusMap> MediaKeySession::keyStatuses() const
+Ref<MediaKeyStatusMap> MediaKeySession::keyStatuses() const
 {
-    notImplemented();
-    return nullptr;
+    return m_keyStatuses.copyRef();
 }
 
 void MediaKeySession::generateRequest(const String&, const BufferSource&, Ref<DeferredPromise>&&)

Modified: trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.h (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.h	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.h	2017-01-10 18:41:31 UTC (rev 210552)
@@ -41,12 +41,14 @@
 namespace WebCore {
 
 class BufferSource;
+class CDM;
+class CDMInstance;
 class MediaKeyStatusMap;
 class MediaKeys;
 
 class MediaKeySession final : public RefCounted<MediaKeySession>, public EventTargetWithInlineData, public ActiveDOMObject {
 public:
-    static Ref<MediaKeySession> create(ScriptExecutionContext&);
+    static Ref<MediaKeySession> create(ScriptExecutionContext&, MediaKeySessionType, bool useDistinctiveIdentifier, Ref<CDM>&&, Ref<CDMInstance>&&);
     virtual ~MediaKeySession();
 
     using RefCounted<MediaKeySession>::ref;
@@ -54,7 +56,7 @@
 
     const String& sessionId() const;
     double expiration() const;
-    RefPtr<MediaKeyStatusMap> keyStatuses() const;
+    Ref<MediaKeyStatusMap> keyStatuses() const;
 
     void generateRequest(const String&, const BufferSource&, Ref<DeferredPromise>&&);
     void load(const String&, Ref<DeferredPromise>&&);
@@ -63,7 +65,7 @@
     void remove(Ref<DeferredPromise>&&);
 
 private:
-    MediaKeySession(ScriptExecutionContext&);
+    MediaKeySession(ScriptExecutionContext&, MediaKeySessionType, bool useDistinctiveIdentifier, Ref<CDM>&&, Ref<CDMInstance>&&);
 
     // EventTarget
     EventTargetInterface eventTargetInterface() const override { return MediaKeySessionEventTargetInterfaceType; }
@@ -76,6 +78,17 @@
     const char* activeDOMObjectName() const override;
     bool canSuspendForDocumentSuspension() const override;
     void stop() override;
+
+    String m_sessionId;
+    double m_expiration;
+    Ref<MediaKeyStatusMap> m_keyStatuses;
+    bool m_closed { false };
+    bool m_uninitialized { true };
+    bool m_callable { false };
+    bool m_useDistinctiveIdentifier;
+    MediaKeySessionType m_sessionType;
+    Ref<CDM> m_implementation;
+    Ref<CDMInstance> m_instance;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySessionType.idl (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySessionType.idl	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySessionType.idl	2017-01-10 18:41:31 UTC (rev 210552)
@@ -25,7 +25,8 @@
 
 [
     Conditional=ENCRYPTED_MEDIA,
-    ImplementedAs=MediaKeySessionType
+    ImplementedAs=MediaKeySessionType,
+    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT
 ]
 enum MediaKeySessionType {
     "temporary",

Modified: trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySystemAccess.cpp (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySystemAccess.cpp	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySystemAccess.cpp	2017-01-10 18:41:31 UTC (rev 210552)
@@ -105,7 +105,7 @@
         // 2.10.3. Let the supported session types value be be the value of configuration's sessionTypes member.
         // 2.10.4. Let the cdm implementation value be this object's cdm implementation value.
         // 2.10.5. Let the cdm instance value be instance.
-        auto mediaKeys = MediaKeys::create(useDistinctiveIdentifier, persistentStateAllowed, m_configuration->sessionTypes, m_implementation.copyRef(), WTFMove(instance));
+        auto mediaKeys = MediaKeys::create(useDistinctiveIdentifier, persistentStateAllowed, m_configuration->sessionTypes, m_implementation.copyRef(), instance.releaseNonNull());
 
         // 2.11. Resolve promise with media keys.
         promise->resolveWithNewlyCreated<IDLInterface<MediaKeys>>(WTFMove(mediaKeys));

Modified: trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp	2017-01-10 18:41:31 UTC (rev 210552)
@@ -39,7 +39,7 @@
 
 namespace WebCore {
 
-MediaKeys::MediaKeys(bool useDistinctiveIdentifier, bool persistentStateAllowed, const Vector<MediaKeySessionType>& supportedSessionTypes, Ref<CDM>&& implementation, std::unique_ptr<CDMInstance>&& instance)
+MediaKeys::MediaKeys(bool useDistinctiveIdentifier, bool persistentStateAllowed, const Vector<MediaKeySessionType>& supportedSessionTypes, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
     : m_useDistinctiveIdentifier(useDistinctiveIdentifier)
     , m_persistentStateAllowed(persistentStateAllowed)
     , m_supportedSessionTypes(supportedSessionTypes)
@@ -50,10 +50,24 @@
 
 MediaKeys::~MediaKeys() = default;
 
-ExceptionOr<Ref<MediaKeySession>> MediaKeys::createSession(MediaKeySessionType)
+ExceptionOr<Ref<MediaKeySession>> MediaKeys::createSession(ScriptExecutionContext& context, MediaKeySessionType sessionType)
 {
-    notImplemented();
-    return Exception { NOT_SUPPORTED_ERR };
+    // https://w3c.github.io/encrypted-media/#dom-mediakeys-setservercertificate
+    // W3C Editor's Draft 09 November 2016
+
+    // When this method is invoked, the user agent must run the following steps:
+    // 1. If this object's supported session types value does not contain sessionType, throw [WebIDL] a NotSupportedError.
+    if (!m_supportedSessionTypes.contains(sessionType))
+        return Exception(NOT_SUPPORTED_ERR);
+
+    // 2. If the implementation does not support MediaKeySession operations in the current state, throw [WebIDL] an InvalidStateError.
+    if (!m_implementation->supportsSessions())
+        return Exception(INVALID_STATE_ERR);
+
+    // 3. Let session be a new MediaKeySession object, and initialize it as follows:
+    // NOTE: Continued in MediaKeySession.
+    // 4. Return session.
+    return MediaKeySession::create(context, sessionType, m_useDistinctiveIdentifier, m_implementation.copyRef(), m_instance.copyRef());
 }
 
 void MediaKeys::setServerCertificate(const BufferSource& serverCertificate, Ref<DeferredPromise>&& promise)

Modified: trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.h (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.h	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.h	2017-01-10 18:41:31 UTC (rev 210552)
@@ -48,7 +48,7 @@
 public:
     using KeySessionType = MediaKeySessionType;
 
-    static Ref<MediaKeys> create(bool useDistinctiveIdentifier, bool persistentStateAllowed, const Vector<MediaKeySessionType>& supportedSessionTypes, Ref<CDM>&& implementation, std::unique_ptr<CDMInstance>&& instance)
+    static Ref<MediaKeys> create(bool useDistinctiveIdentifier, bool persistentStateAllowed, const Vector<MediaKeySessionType>& supportedSessionTypes, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
     {
         return adoptRef(*new MediaKeys(useDistinctiveIdentifier, persistentStateAllowed, supportedSessionTypes, WTFMove(implementation), WTFMove(instance)));
     }
@@ -55,18 +55,18 @@
 
     ~MediaKeys();
 
-    ExceptionOr<Ref<MediaKeySession>> createSession(MediaKeySessionType);
+    ExceptionOr<Ref<MediaKeySession>> createSession(ScriptExecutionContext&, MediaKeySessionType);
 
     void setServerCertificate(const BufferSource&, Ref<DeferredPromise>&&);
 
 protected:
-    MediaKeys(bool useDistinctiveIdentifier, bool persistentStateAllowed, const Vector<MediaKeySessionType>&, Ref<CDM>&&, std::unique_ptr<CDMInstance>&&);
+    MediaKeys(bool useDistinctiveIdentifier, bool persistentStateAllowed, const Vector<MediaKeySessionType>&, Ref<CDM>&&, Ref<CDMInstance>&&);
 
     bool m_useDistinctiveIdentifier;
     bool m_persistentStateAllowed;
     Vector<MediaKeySessionType> m_supportedSessionTypes;
     Ref<CDM> m_implementation;
-    std::unique_ptr<CDMInstance> m_instance;
+    Ref<CDMInstance> m_instance;
     GenericTaskQueue<Timer> m_taskQueue;
 };
 

Modified: trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.idl (210551 => 210552)


--- trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.idl	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.idl	2017-01-10 18:41:31 UTC (rev 210552)
@@ -31,6 +31,6 @@
     EnabledAtRuntime=EncryptedMediaAPI,
     ImplementationLacksVTable,
 ] interface MediaKeys {
-    [MayThrowException] MediaKeySession createSession(optional MediaKeySessionType sessionType = "temporary");
+    [CallWith=ScriptExecutionContext, MayThrowException] MediaKeySession createSession(optional MediaKeySessionType sessionType = "temporary");
     Promise<bool> setServerCertificate(BufferSource serverCertificate);
 };

Modified: trunk/Source/WebCore/testing/MockCDMFactory.cpp (210551 => 210552)


--- trunk/Source/WebCore/testing/MockCDMFactory.cpp	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/testing/MockCDMFactory.cpp	2017-01-10 18:41:31 UTC (rev 210552)
@@ -34,7 +34,8 @@
 namespace WebCore {
 
 MockCDMFactory::MockCDMFactory()
-    : m_weakPtrFactory(this)
+    : m_supportedSessionTypes({ MediaKeySessionType::Temporary, MediaKeySessionType::PersistentUsageRecord, MediaKeySessionType::PersistentLicense })
+    , m_weakPtrFactory(this)
 {
     CDM::registerCDMFactory(*this);
 }
@@ -88,9 +89,12 @@
     return true;
 }
 
-bool MockCDM::supportsSessionTypeWithConfiguration(MediaKeySessionType&, const MediaKeySystemConfiguration&)
+bool MockCDM::supportsSessionTypeWithConfiguration(MediaKeySessionType& sessionType, const MediaKeySystemConfiguration&)
 {
-    // NOTE: Implement;
+    if (!m_factory || !m_factory->supportedSessionTypes().contains(sessionType))
+        return false;
+
+    // NOTE: Implement configuration checking;
     return true;
 }
 
@@ -121,11 +125,11 @@
     return true;
 }
 
-std::unique_ptr<CDMInstance> MockCDM::createInstance()
+RefPtr<CDMInstance> MockCDM::createInstance()
 {
     if (m_factory && !m_factory->canCreateInstances())
         return nullptr;
-    return std::unique_ptr<CDMInstance>(new MockCDMInstance(m_weakPtrFactory.createWeakPtr()));
+    return adoptRef(new MockCDMInstance(m_weakPtrFactory.createWeakPtr()));
 }
 
 void MockCDM::loadAndInitialize()
@@ -138,6 +142,11 @@
     return m_factory && m_factory->supportsServerCertificates();
 }
 
+bool MockCDM::supportsSessions() const
+{
+    return m_factory && m_factory->supportsSessions();
+}
+
 MockCDMInstance::MockCDMInstance(WeakPtr<MockCDM> cdm)
     : m_cdm(cdm)
 {

Modified: trunk/Source/WebCore/testing/MockCDMFactory.h (210551 => 210552)


--- trunk/Source/WebCore/testing/MockCDMFactory.h	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/testing/MockCDMFactory.h	2017-01-10 18:41:31 UTC (rev 210552)
@@ -45,6 +45,9 @@
     const Vector<String>& supportedDataTypes() const { return m_supportedDataTypes; }
     void setSupportedDataTypes(Vector<String>&& types) { m_supportedDataTypes = WTFMove(types); }
 
+    const Vector<MediaKeySessionType>& supportedSessionTypes() const { return m_supportedSessionTypes; }
+    void setSupportedSessionTypes(Vector<MediaKeySessionType>&& types) { m_supportedSessionTypes = WTFMove(types); }
+
     const Vector<String>& supportedRobustness() const { return m_supportedRobustness; }
     void setSupportedRobustness(Vector<String>&& robustness) { m_supportedRobustness = WTFMove(robustness); }
 
@@ -60,6 +63,9 @@
     bool supportsServerCertificates() const { return m_supportsServerCertificates; }
     void setSupportsServerCertificates(bool flag) { m_supportsServerCertificates = flag; }
 
+    bool supportsSessions() const { return m_supportsSessions; }
+    void setSupportsSessions(bool flag) { m_supportsSessions = flag; }
+
     void unregister();
 
 private:
@@ -70,10 +76,12 @@
     MediaKeysRequirement m_distinctiveIdentifiersRequirement { MediaKeysRequirement::Optional };
     MediaKeysRequirement m_persistentStateRequirement { MediaKeysRequirement::Optional };
     Vector<String> m_supportedDataTypes;
+    Vector<MediaKeySessionType> m_supportedSessionTypes;
     Vector<String> m_supportedRobustness;
     bool m_registered { true };
     bool m_canCreateInstances { true };
     bool m_supportsServerCertificates { true };
+    bool m_supportsSessions { true };
     WeakPtrFactory<MockCDMFactory> m_weakPtrFactory;
 };
 
@@ -94,9 +102,10 @@
     MediaKeysRequirement distinctiveIdentifiersRequirement(const MediaKeySystemConfiguration&, const MediaKeysRestrictions&) final;
     MediaKeysRequirement persistentStateRequirement(const MediaKeySystemConfiguration&, const MediaKeysRestrictions&) final;
     bool distinctiveIdentifiersAreUniquePerOriginAndClearable(const MediaKeySystemConfiguration&) final;
-    std::unique_ptr<CDMInstance> createInstance() final;
+    RefPtr<CDMInstance> createInstance() final;
     void loadAndInitialize() final;
     bool supportsServerCertificates() const final;
+    bool supportsSessions() const final;
 
     WeakPtr<MockCDMFactory> m_factory;
     WeakPtrFactory<MockCDM> m_weakPtrFactory;

Modified: trunk/Source/WebCore/testing/MockCDMFactory.idl (210551 => 210552)


--- trunk/Source/WebCore/testing/MockCDMFactory.idl	2017-01-10 18:05:07 UTC (rev 210551)
+++ trunk/Source/WebCore/testing/MockCDMFactory.idl	2017-01-10 18:41:31 UTC (rev 210552)
@@ -30,10 +30,12 @@
 ] interface MockCDMFactory {
     attribute sequence<DOMString> supportedDataTypes;
     attribute sequence<DOMString> supportedRobustness;
+    attribute sequence<MediaKeySessionType> supportedSessionTypes;
     attribute MediaKeysRequirement distinctiveIdentifiersRequirement;
     attribute MediaKeysRequirement persistentStateRequirement;
     attribute boolean canCreateInstances;
     attribute boolean supportsServerCertificates;
+    attribute boolean supportsSessions;
 
     void unregister();
 };
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to