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