Index: Source/core/html/HTMLMediaElement.cpp |
diff --git a/Source/core/html/HTMLMediaElement.cpp b/Source/core/html/HTMLMediaElement.cpp |
index d8361a395c34273f6407ec24491fcdf1767273fb..06e5668f45506a3174e5dae3f8b8e821285d7801 100644 |
--- a/Source/core/html/HTMLMediaElement.cpp |
+++ b/Source/core/html/HTMLMediaElement.cpp |
@@ -50,8 +50,6 @@ |
#include "core/html/MediaController.h" |
#include "core/html/MediaError.h" |
#include "core/html/MediaFragmentURIParser.h" |
-#include "core/html/MediaKeyError.h" |
-#include "core/html/MediaKeyEvent.h" |
#include "core/html/TimeRanges.h" |
#include "core/html/shadow/MediaControls.h" |
#include "core/html/track/InbandTextTrack.h" |
@@ -61,9 +59,6 @@ |
#include "core/rendering/RenderVideo.h" |
#include "core/rendering/RenderView.h" |
#include "core/rendering/compositing/RenderLayerCompositor.h" |
-// FIXME: Remove dependency on modules/encryptedmedia (http://crbug.com/242754). |
-#include "modules/encryptedmedia/MediaKeyNeededEvent.h" |
-#include "modules/encryptedmedia/MediaKeys.h" |
#include "platform/ContentType.h" |
#include "platform/Language.h" |
#include "platform/Logging.h" |
@@ -151,26 +146,6 @@ static void removeElementFromDocumentMap(HTMLMediaElement* element, Document* do |
map.add(document, set); |
} |
-static void throwExceptionForMediaKeyException(const String& keySystem, const String& sessionId, MediaPlayer::MediaKeyException exception, ExceptionState& exceptionState) |
-{ |
- switch (exception) { |
- case MediaPlayer::NoError: |
- return; |
- case MediaPlayer::InvalidPlayerState: |
- exceptionState.throwDOMException(InvalidStateError, "The player is in an invalid state."); |
- return; |
- case MediaPlayer::KeySystemNotSupported: |
- exceptionState.throwDOMException(NotSupportedError, "The key system provided ('" + keySystem +"') is not supported."); |
- return; |
- case MediaPlayer::InvalidAccess: |
- exceptionState.throwDOMException(InvalidAccessError, "The session ID provided ('" + sessionId + "') is invalid."); |
- return; |
- } |
- |
- ASSERT_NOT_REACHED(); |
- return; |
-} |
- |
class TrackDisplayUpdateScope { |
public: |
TrackDisplayUpdateScope(HTMLMediaElement* mediaElement) |
@@ -307,7 +282,6 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document& docum |
#if ENABLE(WEB_AUDIO) |
, m_audioSourceNode(0) |
#endif |
- , m_emeMode(EmeModeNotSelected) |
{ |
ASSERT(RuntimeEnabledFeatures::mediaEnabled()); |
@@ -342,8 +316,6 @@ HTMLMediaElement::~HTMLMediaElement() |
closeMediaSource(); |
- setMediaKeysInternal(0); |
- |
removeElementFromDocumentMap(this, &document()); |
// Destroying the player may cause a resource load to be canceled, |
@@ -545,10 +517,15 @@ void HTMLMediaElement::scheduleNextSourceChild() |
void HTMLMediaElement::scheduleEvent(const AtomicString& eventName) |
{ |
+ scheduleEvent(Event::createCancelable(eventName)); |
+} |
+ |
+void HTMLMediaElement::scheduleEvent(PassRefPtr<Event> event) |
+{ |
#if LOG_MEDIA_EVENTS |
- WTF_LOG(Media, "HTMLMediaElement::scheduleEvent - scheduling '%s'", eventName.ascii().data()); |
+ WTF_LOG(Media, "HTMLMediaElement::scheduleEvent - scheduling '%s'", event->type().ascii().data()); |
#endif |
- m_asyncEventQueue->enqueueEvent(Event::createCancelable(eventName)); |
+ m_asyncEventQueue->enqueueEvent(event); |
} |
void HTMLMediaElement::loadTimerFired(Timer<HTMLMediaElement>*) |
@@ -1665,165 +1642,6 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) |
updateActiveTextTrackCues(currentTime()); |
} |
-void HTMLMediaElement::mediaPlayerKeyAdded(const String& keySystem, const String& sessionId) |
-{ |
- WTF_LOG(Media, "HTMLMediaElement::mediaPlayerKeyAdded"); |
- |
- MediaKeyEventInit initializer; |
- initializer.keySystem = keySystem; |
- initializer.sessionId = sessionId; |
- initializer.bubbles = false; |
- initializer.cancelable = false; |
- |
- RefPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webkitkeyadded, initializer); |
- event->setTarget(this); |
- m_asyncEventQueue->enqueueEvent(event.release()); |
-} |
- |
-void HTMLMediaElement::mediaPlayerKeyError(const String& keySystem, const String& sessionId, MediaPlayerClient::MediaKeyErrorCode errorCode, unsigned short systemCode) |
-{ |
- WTF_LOG(Media, "HTMLMediaElement::mediaPlayerKeyError: sessionID=%s, errorCode=%d, systemCode=%d", sessionId.utf8().data(), errorCode, systemCode); |
- |
- MediaKeyError::Code mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; |
- switch (errorCode) { |
- case MediaPlayerClient::UnknownError: |
- mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; |
- break; |
- case MediaPlayerClient::ClientError: |
- mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_CLIENT; |
- break; |
- case MediaPlayerClient::ServiceError: |
- mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_SERVICE; |
- break; |
- case MediaPlayerClient::OutputError: |
- mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_OUTPUT; |
- break; |
- case MediaPlayerClient::HardwareChangeError: |
- mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_HARDWARECHANGE; |
- break; |
- case MediaPlayerClient::DomainError: |
- mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_DOMAIN; |
- break; |
- } |
- |
- MediaKeyEventInit initializer; |
- initializer.keySystem = keySystem; |
- initializer.sessionId = sessionId; |
- initializer.errorCode = MediaKeyError::create(mediaKeyErrorCode); |
- initializer.systemCode = systemCode; |
- initializer.bubbles = false; |
- initializer.cancelable = false; |
- |
- RefPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webkitkeyerror, initializer); |
- event->setTarget(this); |
- m_asyncEventQueue->enqueueEvent(event.release()); |
-} |
- |
-void HTMLMediaElement::mediaPlayerKeyMessage(const String& keySystem, const String& sessionId, const unsigned char* message, unsigned messageLength, const KURL& defaultURL) |
-{ |
- WTF_LOG(Media, "HTMLMediaElement::mediaPlayerKeyMessage: sessionID=%s", sessionId.utf8().data()); |
- |
- MediaKeyEventInit initializer; |
- initializer.keySystem = keySystem; |
- initializer.sessionId = sessionId; |
- initializer.message = Uint8Array::create(message, messageLength); |
- initializer.defaultURL = defaultURL; |
- initializer.bubbles = false; |
- initializer.cancelable = false; |
- |
- RefPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webkitkeymessage, initializer); |
- event->setTarget(this); |
- m_asyncEventQueue->enqueueEvent(event.release()); |
-} |
- |
-// Create a MediaKeyNeededEvent for WD EME. |
-static PassRefPtr<Event> createNeedKeyEvent(const String& contentType, const unsigned char* initData, unsigned initDataLength) |
-{ |
- MediaKeyNeededEventInit initializer; |
- initializer.contentType = contentType; |
- initializer.initData = Uint8Array::create(initData, initDataLength); |
- initializer.bubbles = false; |
- initializer.cancelable = false; |
- |
- return MediaKeyNeededEvent::create(EventTypeNames::needkey, initializer); |
-} |
- |
-// Create a 'needkey' MediaKeyEvent for v0.1b EME. |
-static PassRefPtr<Event> createWebkitNeedKeyEvent(const String& contentType, const unsigned char* initData, unsigned initDataLength) |
-{ |
- MediaKeyEventInit webkitInitializer; |
- webkitInitializer.keySystem = String(); |
- webkitInitializer.sessionId = String(); |
- webkitInitializer.initData = Uint8Array::create(initData, initDataLength); |
- webkitInitializer.bubbles = false; |
- webkitInitializer.cancelable = false; |
- |
- return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitializer); |
-} |
- |
-bool HTMLMediaElement::mediaPlayerKeyNeeded(const String& contentType, const unsigned char* initData, unsigned initDataLength) |
-{ |
- WTF_LOG(Media, "HTMLMediaElement::mediaPlayerKeyNeeded: contentType=%s", contentType.utf8().data()); |
- |
- if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { |
- // Send event for WD EME. |
- RefPtr<Event> event = createNeedKeyEvent(contentType, initData, initDataLength); |
- event->setTarget(this); |
- m_asyncEventQueue->enqueueEvent(event.release()); |
- } |
- |
- if (RuntimeEnabledFeatures::prefixedEncryptedMediaEnabled()) { |
- // Send event for v0.1b EME. |
- RefPtr<Event> event = createWebkitNeedKeyEvent(contentType, initData, initDataLength); |
- event->setTarget(this); |
- m_asyncEventQueue->enqueueEvent(event.release()); |
- } |
- |
- return true; |
-} |
- |
-bool HTMLMediaElement::setEmeMode(EmeMode emeMode, ExceptionState& exceptionState) |
-{ |
- if (m_emeMode != EmeModeNotSelected && m_emeMode != emeMode) { |
- exceptionState.throwDOMException(InvalidStateError, "Mixed use of EME prefixed and unprefixed API not allowed."); |
- return false; |
- } |
- m_emeMode = emeMode; |
- return true; |
-} |
- |
-blink::WebContentDecryptionModule* HTMLMediaElement::contentDecryptionModule() |
-{ |
- return m_mediaKeys ? m_mediaKeys->contentDecryptionModule() : 0; |
-} |
- |
-void HTMLMediaElement::setMediaKeysInternal(MediaKeys* mediaKeys) |
-{ |
- WTF_LOG(Media, "HTMLMediaElement::setMediaKeys"); |
- if (m_mediaKeys == mediaKeys) |
- return; |
- |
- ASSERT(m_emeMode = EmeModeUnprefixed); |
- |
- if (m_mediaKeys) |
- m_mediaKeys->setMediaElement(0); |
- m_mediaKeys = mediaKeys; |
- if (m_mediaKeys) |
- m_mediaKeys->setMediaElement(this); |
- |
- // If a player is connected, tell it that the CDM has changed. |
- if (m_player) |
- m_player->setContentDecryptionModule(contentDecryptionModule()); |
-} |
- |
-void HTMLMediaElement::setMediaKeys(MediaKeys* mediaKeys, ExceptionState& exceptionState) |
-{ |
- if (!setEmeMode(EmeModeUnprefixed, exceptionState)) |
- return; |
- |
- setMediaKeysInternal(mediaKeys); |
-} |
- |
void HTMLMediaElement::progressEventTimerFired(Timer<HTMLMediaElement>*) |
{ |
ASSERT(m_player); |
@@ -2224,103 +2042,6 @@ void HTMLMediaElement::closeMediaSource() |
m_mediaSource = nullptr; |
} |
-void HTMLMediaElement::webkitGenerateKeyRequest(const String& keySystem, PassRefPtr<Uint8Array> initData, ExceptionState& exceptionState) |
-{ |
- WTF_LOG(Media, "HTMLMediaElement::webkitGenerateKeyRequest"); |
- |
- if (!setEmeMode(EmeModePrefixed, exceptionState)) |
- return; |
- |
- if (keySystem.isEmpty()) { |
- exceptionState.throwDOMException(SyntaxError, "The key system provided is empty."); |
- return; |
- } |
- |
- if (!m_player) { |
- exceptionState.throwDOMException(InvalidStateError, "No media has been loaded."); |
- return; |
- } |
- |
- const unsigned char* initDataPointer = 0; |
- unsigned initDataLength = 0; |
- if (initData) { |
- initDataPointer = initData->data(); |
- initDataLength = initData->length(); |
- } |
- |
- MediaPlayer::MediaKeyException result = m_player->generateKeyRequest(keySystem, initDataPointer, initDataLength); |
- throwExceptionForMediaKeyException(keySystem, String(), result, exceptionState); |
-} |
- |
-void HTMLMediaElement::webkitGenerateKeyRequest(const String& keySystem, ExceptionState& exceptionState) |
-{ |
- webkitGenerateKeyRequest(keySystem, Uint8Array::create(0), exceptionState); |
-} |
- |
-void HTMLMediaElement::webkitAddKey(const String& keySystem, PassRefPtr<Uint8Array> key, PassRefPtr<Uint8Array> initData, const String& sessionId, ExceptionState& exceptionState) |
-{ |
- WTF_LOG(Media, "HTMLMediaElement::webkitAddKey"); |
- |
- if (!setEmeMode(EmeModePrefixed, exceptionState)) |
- return; |
- |
- if (keySystem.isEmpty()) { |
- exceptionState.throwDOMException(SyntaxError, "The key system provided is empty."); |
- return; |
- } |
- |
- if (!key) { |
- exceptionState.throwDOMException(SyntaxError, "The key provided is invalid."); |
- return; |
- } |
- |
- if (!key->length()) { |
- exceptionState.throwDOMException(TypeMismatchError, "The key provided is invalid."); |
- return; |
- } |
- |
- if (!m_player) { |
- exceptionState.throwDOMException(InvalidStateError, "No media has been loaded."); |
- return; |
- } |
- |
- const unsigned char* initDataPointer = 0; |
- unsigned initDataLength = 0; |
- if (initData) { |
- initDataPointer = initData->data(); |
- initDataLength = initData->length(); |
- } |
- |
- MediaPlayer::MediaKeyException result = m_player->addKey(keySystem, key->data(), key->length(), initDataPointer, initDataLength, sessionId); |
- throwExceptionForMediaKeyException(keySystem, sessionId, result, exceptionState); |
-} |
- |
-void HTMLMediaElement::webkitAddKey(const String& keySystem, PassRefPtr<Uint8Array> key, ExceptionState& exceptionState) |
-{ |
- webkitAddKey(keySystem, key, Uint8Array::create(0), String(), exceptionState); |
-} |
- |
-void HTMLMediaElement::webkitCancelKeyRequest(const String& keySystem, const String& sessionId, ExceptionState& exceptionState) |
-{ |
- WTF_LOG(Media, "HTMLMediaElement::webkitCancelKeyRequest"); |
- |
- if (!setEmeMode(EmeModePrefixed, exceptionState)) |
- return; |
- |
- if (keySystem.isEmpty()) { |
- exceptionState.throwDOMException(SyntaxError, "The key system provided is empty."); |
- return; |
- } |
- |
- if (!m_player) { |
- exceptionState.throwDOMException(InvalidStateError, "No media has been loaded."); |
- return; |
- } |
- |
- MediaPlayer::MediaKeyException result = m_player->cancelKeyRequest(keySystem, sessionId); |
- throwExceptionForMediaKeyException(keySystem, sessionId, result, exceptionState); |
-} |
- |
bool HTMLMediaElement::loop() const |
{ |
return fastHasAttribute(loopAttr); |
@@ -3422,8 +3143,6 @@ void HTMLMediaElement::clearMediaPlayer(int flags) |
closeMediaSource(); |
- setMediaKeysInternal(0); |
- |
clearMediaPlayerAndAudioSourceProviderClient(); |
stopPeriodicTimers(); |
@@ -3714,9 +3433,6 @@ void HTMLMediaElement::createMediaPlayer() |
m_player = MediaPlayer::create(this); |
- if (m_emeMode == EmeModeUnprefixed && m_player) |
- m_player->setContentDecryptionModule(contentDecryptionModule()); |
- |
#if ENABLE(WEB_AUDIO) |
if (m_audioSourceNode) { |
// When creating the player, make sure its AudioSourceProvider knows about the MediaElementAudioSourceNode. |