Chromium Code Reviews| Index: Source/modules/encryptedmedia/MediaKeySession.cpp |
| diff --git a/Source/modules/encryptedmedia/MediaKeySession.cpp b/Source/modules/encryptedmedia/MediaKeySession.cpp |
| index 4f87ddffae37fbc6ac5aef63264ac81d17ca5425..7f34fbecc7e05967562dedf0430ffedb9b2d8f54 100644 |
| --- a/Source/modules/encryptedmedia/MediaKeySession.cpp |
| +++ b/Source/modules/encryptedmedia/MediaKeySession.cpp |
| @@ -45,7 +45,8 @@ |
| #include "public/platform/WebContentDecryptionModuleSession.h" |
| #include "public/platform/WebString.h" |
| #include "public/platform/WebURL.h" |
| -#include "wtf/Uint8Array.h" |
| +#include "wtf/ArrayBuffer.h" |
| +#include "wtf/ArrayBufferView.h" |
| namespace WebCore { |
| @@ -60,9 +61,9 @@ public: |
| Type type() const { return m_type; } |
| const Persistent<ContentDecryptionModuleResult> result() const { return m_result; } |
| // |data| is only valid for Update types. |
| - const RefPtr<Uint8Array> data() const { return m_data; } |
| + const RefPtr<ArrayBuffer> data() const { return m_data; } |
| - static PendingAction* CreatePendingUpdate(ContentDecryptionModuleResult* result, PassRefPtr<Uint8Array> data) |
| + static PendingAction* CreatePendingUpdate(ContentDecryptionModuleResult* result, PassRefPtr<ArrayBuffer> data) |
| { |
| ASSERT(result); |
| ASSERT(data); |
| @@ -72,7 +73,7 @@ public: |
| static PendingAction* CreatePendingRelease(ContentDecryptionModuleResult* result) |
| { |
| ASSERT(result); |
| - return new PendingAction(Release, result, PassRefPtr<Uint8Array>()); |
| + return new PendingAction(Release, result, PassRefPtr<ArrayBuffer>()); |
| } |
| ~PendingAction() |
| @@ -85,7 +86,7 @@ public: |
| } |
| private: |
| - PendingAction(Type type, ContentDecryptionModuleResult* result, PassRefPtr<Uint8Array> data) |
| + PendingAction(Type type, ContentDecryptionModuleResult* result, PassRefPtr<ArrayBuffer> data) |
| : m_type(type) |
| , m_result(result) |
| , m_data(data) |
| @@ -94,7 +95,7 @@ private: |
| const Type m_type; |
| const Member<ContentDecryptionModuleResult> m_result; |
| - const RefPtr<Uint8Array> m_data; |
| + const RefPtr<ArrayBuffer> m_data; |
| }; |
| // This class allows a MediaKeySession object to be created asynchronously. |
| @@ -102,14 +103,14 @@ class MediaKeySessionInitializer : public ScriptPromiseResolver { |
| WTF_MAKE_NONCOPYABLE(MediaKeySessionInitializer); |
| public: |
| - static ScriptPromise create(ScriptState*, MediaKeys*, const String& initDataType, PassRefPtr<Uint8Array> initData, const String& sessionType); |
| + static ScriptPromise create(ScriptState*, MediaKeys*, const String& initDataType, PassRefPtr<ArrayBuffer> initData, const String& sessionType); |
| virtual ~MediaKeySessionInitializer(); |
| void completeWithSession(blink::WebContentDecryptionModuleResult::SessionStatus); |
| void completeWithDOMException(ExceptionCode, const String& errorMessage); |
| private: |
| - MediaKeySessionInitializer(ScriptState*, MediaKeys*, const String& initDataType, PassRefPtr<Uint8Array> initData, const String& sessionType); |
| + MediaKeySessionInitializer(ScriptState*, MediaKeys*, const String& initDataType, PassRefPtr<ArrayBuffer> initData, const String& sessionType); |
| void timerFired(Timer<MediaKeySessionInitializer>*); |
| Persistent<MediaKeys> m_mediaKeys; |
| @@ -119,7 +120,7 @@ private: |
| // The next 3 values are simply the initialization data saved so that the |
| // asynchronous creation has the data needed. |
| String m_initDataType; |
| - RefPtr<Uint8Array> m_initData; |
| + RefPtr<ArrayBuffer> m_initData; |
| String m_sessionType; |
| Timer<MediaKeySessionInitializer> m_timer; |
| @@ -156,7 +157,7 @@ private: |
| MediaKeySessionInitializer* m_initializer; |
| }; |
| -ScriptPromise MediaKeySessionInitializer::create(ScriptState* scriptState, MediaKeys* mediaKeys, const String& initDataType, PassRefPtr<Uint8Array> initData, const String& sessionType) |
| +ScriptPromise MediaKeySessionInitializer::create(ScriptState* scriptState, MediaKeys* mediaKeys, const String& initDataType, PassRefPtr<ArrayBuffer> initData, const String& sessionType) |
| { |
| RefPtr<MediaKeySessionInitializer> initializer = adoptRef(new MediaKeySessionInitializer(scriptState, mediaKeys, initDataType, initData, sessionType)); |
| initializer->suspendIfNeeded(); |
| @@ -164,7 +165,7 @@ ScriptPromise MediaKeySessionInitializer::create(ScriptState* scriptState, Media |
| return initializer->promise(); |
| } |
| -MediaKeySessionInitializer::MediaKeySessionInitializer(ScriptState* scriptState, MediaKeys* mediaKeys, const String& initDataType, PassRefPtr<Uint8Array> initData, const String& sessionType) |
| +MediaKeySessionInitializer::MediaKeySessionInitializer(ScriptState* scriptState, MediaKeys* mediaKeys, const String& initDataType, PassRefPtr<ArrayBuffer> initData, const String& sessionType) |
| : ScriptPromiseResolver(scriptState) |
| , m_mediaKeys(mediaKeys) |
| , m_initDataType(initDataType) |
| @@ -218,7 +219,7 @@ void MediaKeySessionInitializer::timerFired(Timer<MediaKeySessionInitializer>*) |
| m_cdmSession = adoptPtr(cdm->createSession(m_session)); |
| NewMediaKeySessionResult* result = new NewMediaKeySessionResult(this); |
| - m_cdmSession->initializeNewSession(m_initDataType, m_initData->data(), m_initData->length(), m_sessionType, result->result()); |
| + m_cdmSession->initializeNewSession(m_initDataType, static_cast<unsigned char*>(m_initData->data()), m_initData->byteLength(), m_sessionType, result->result()); |
| WTF_LOG(Media, "MediaKeySessionInitializer::timerFired done"); |
| // Note: As soon as the promise is resolved (or rejected), the |
| @@ -280,7 +281,7 @@ void MediaKeySessionInitializer::completeWithDOMException(ExceptionCode code, co |
| reject(DOMException::create(code, errorMessage)); |
| } |
| -ScriptPromise MediaKeySession::create(ScriptState* scriptState, MediaKeys* mediaKeys, const String& initDataType, PassRefPtr<Uint8Array> initData, const String& sessionType) |
| +ScriptPromise MediaKeySession::create(ScriptState* scriptState, MediaKeys* mediaKeys, const String& initDataType, PassRefPtr<ArrayBuffer> initData, const String& sessionType) |
| { |
| // Since creation is done asynchronously, use MediaKeySessionInitializer |
| // to do it. |
| @@ -321,7 +322,19 @@ String MediaKeySession::sessionId() const |
| return m_session->sessionId(); |
| } |
| -ScriptPromise MediaKeySession::update(ScriptState* scriptState, Uint8Array* response) |
| +ScriptPromise MediaKeySession::update(ScriptState* scriptState, ArrayBuffer* response) |
| +{ |
| + RefPtr<ArrayBuffer> responseCopy = ArrayBuffer::create(response->data(), response->byteLength()); |
| + return updateInternal(scriptState, responseCopy.release()); |
| +} |
| + |
| +ScriptPromise MediaKeySession::update(ScriptState* scriptState, ArrayBufferView* response) |
| +{ |
| + RefPtr<ArrayBuffer> responseCopy = ArrayBuffer::create(response->baseAddress(), response->byteLength()); |
| + return updateInternal(scriptState, responseCopy.release()); |
| +} |
| + |
| +ScriptPromise MediaKeySession::updateInternal(ScriptState* scriptState, PassRefPtr<ArrayBuffer> response) |
| { |
| WTF_LOG(Media, "MediaKeySession(%p)::update", this); |
| ASSERT(!m_isClosed); |
| @@ -333,13 +346,13 @@ ScriptPromise MediaKeySession::update(ScriptState* scriptState, Uint8Array* resp |
| // 1. If response is an empty array, return a promise rejected with a new |
| // DOMException whose name is "InvalidAccessError" and that has the |
| // message "The response parameter is empty." |
| - if (!response->length()) { |
| + if (!response->byteLength()) { |
| return ScriptPromise::rejectWithDOMException( |
| scriptState, DOMException::create(InvalidAccessError, "The response parameter is empty.")); |
| } |
| // 2. Let message be a copy of the contents of the response parameter. |
| - RefPtr<Uint8Array> responseCopy = Uint8Array::create(response->data(), response->length()); |
| + // (Copied in the caller.) |
| // 3. Let promise be a new promise. |
| SimpleContentDecryptionModuleResult* result = new SimpleContentDecryptionModuleResult(scriptState); |
| @@ -347,7 +360,7 @@ ScriptPromise MediaKeySession::update(ScriptState* scriptState, Uint8Array* resp |
| // 4. Run the following steps asynchronously (documented in |
| // actionTimerFired()) |
| - m_pendingActions.append(PendingAction::CreatePendingUpdate(result, responseCopy.release())); |
| + m_pendingActions.append(PendingAction::CreatePendingUpdate(result, response)); |
|
ddorwin
2014/07/16 22:34:57
Does PassRefPtr make the release implicit or are y
jrummell
2014/07/18 21:56:00
ArrayBuffer::create() returns a RefPtr, so I don't
|
| if (!m_actionTimer.isActive()) |
| m_actionTimer.startOneShot(0, FROM_HERE); |
| @@ -407,7 +420,7 @@ void MediaKeySession::actionTimerFired(Timer<MediaKeySession>*) |
| // NOTE: Continued from step 4 of MediaKeySession::update(). |
| // Continue the update call by passing message to the cdm. Once |
| // completed, it will resolve/reject the promise. |
| - m_session->update(action->data()->data(), action->data()->length(), action->result()->result()); |
| + m_session->update(static_cast<unsigned char*>(action->data()->data()), action->data()->byteLength(), action->result()->result()); |
| break; |
| case PendingAction::Release: |
| WTF_LOG(Media, "MediaKeySession(%p)::actionTimerFired: Release", this); |
| @@ -450,7 +463,7 @@ void MediaKeySession::message(const unsigned char* message, size_t messageLength |
| MediaKeyMessageEventInit init; |
| init.bubbles = false; |
| init.cancelable = false; |
| - init.message = Uint8Array::create(message, messageLength); |
| + init.message = ArrayBuffer::create(static_cast<const void*>(message), messageLength); |
| init.destinationURL = destinationURL.string(); |
| RefPtrWillBeRawPtr<MediaKeyMessageEvent> event = MediaKeyMessageEvent::create(EventTypeNames::message, init); |