| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h" | 5 #include "modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h" |
| 6 | 6 |
| 7 #include "bindings/core/v8/ExceptionState.h" | 7 #include "bindings/core/v8/ExceptionState.h" |
| 8 #include "bindings/core/v8/ScriptPromise.h" | 8 #include "bindings/core/v8/ScriptPromise.h" |
| 9 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
| 10 #include "bindings/core/v8/ScriptState.h" | 10 #include "bindings/core/v8/ScriptState.h" |
| (...skipping 28 matching lines...) Expand all Loading... |
| 39 void clearExistingMediaKeys(); | 39 void clearExistingMediaKeys(); |
| 40 void setNewMediaKeys(); | 40 void setNewMediaKeys(); |
| 41 | 41 |
| 42 void finish(); | 42 void finish(); |
| 43 void fail(ExceptionCode, const String& errorMessage); | 43 void fail(ExceptionCode, const String& errorMessage); |
| 44 | 44 |
| 45 void clearFailed(ExceptionCode, const String& errorMessage); | 45 void clearFailed(ExceptionCode, const String& errorMessage); |
| 46 void setFailed(ExceptionCode, const String& errorMessage); | 46 void setFailed(ExceptionCode, const String& errorMessage); |
| 47 | 47 |
| 48 // Keep media element alive until promise is fulfilled | 48 // Keep media element alive until promise is fulfilled |
| 49 RefPtrWillBeMember<HTMLMediaElement> m_element; | 49 Member<HTMLMediaElement> m_element; |
| 50 Member<MediaKeys> m_newMediaKeys; | 50 Member<MediaKeys> m_newMediaKeys; |
| 51 bool m_madeReservation; | 51 bool m_madeReservation; |
| 52 Timer<SetMediaKeysHandler> m_timer; | 52 Timer<SetMediaKeysHandler> m_timer; |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 typedef Function<void()> SuccessCallback; | 55 typedef Function<void()> SuccessCallback; |
| 56 typedef Function<void(ExceptionCode, const String&)> FailureCallback; | 56 typedef Function<void(ExceptionCode, const String&)> FailureCallback; |
| 57 | 57 |
| 58 // Represents the result used when setContentDecryptionModule() is called. | 58 // Represents the result used when setContentDecryptionModule() is called. |
| 59 // Calls |success| if result is resolved, |failure| is result is rejected. | 59 // Calls |success| if result is resolved, |failure| is result is rejected. |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 #endif | 293 #endif |
| 294 } | 294 } |
| 295 | 295 |
| 296 const char* HTMLMediaElementEncryptedMedia::supplementName() | 296 const char* HTMLMediaElementEncryptedMedia::supplementName() |
| 297 { | 297 { |
| 298 return "HTMLMediaElementEncryptedMedia"; | 298 return "HTMLMediaElementEncryptedMedia"; |
| 299 } | 299 } |
| 300 | 300 |
| 301 HTMLMediaElementEncryptedMedia& HTMLMediaElementEncryptedMedia::from(HTMLMediaEl
ement& element) | 301 HTMLMediaElementEncryptedMedia& HTMLMediaElementEncryptedMedia::from(HTMLMediaEl
ement& element) |
| 302 { | 302 { |
| 303 HTMLMediaElementEncryptedMedia* supplement = static_cast<HTMLMediaElementEnc
ryptedMedia*>(WillBeHeapSupplement<HTMLMediaElement>::from(element, supplementNa
me())); | 303 HTMLMediaElementEncryptedMedia* supplement = static_cast<HTMLMediaElementEnc
ryptedMedia*>(HeapSupplement<HTMLMediaElement>::from(element, supplementName()))
; |
| 304 if (!supplement) { | 304 if (!supplement) { |
| 305 supplement = new HTMLMediaElementEncryptedMedia(element); | 305 supplement = new HTMLMediaElementEncryptedMedia(element); |
| 306 provideTo(element, supplementName(), adoptPtrWillBeNoop(supplement)); | 306 provideTo(element, supplementName(), adoptPtrWillBeNoop(supplement)); |
| 307 } | 307 } |
| 308 return *supplement; | 308 return *supplement; |
| 309 } | 309 } |
| 310 | 310 |
| 311 MediaKeys* HTMLMediaElementEncryptedMedia::mediaKeys(HTMLMediaElement& element) | 311 MediaKeys* HTMLMediaElementEncryptedMedia::mediaKeys(HTMLMediaElement& element) |
| 312 { | 312 { |
| 313 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia
::from(element); | 313 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia
::from(element); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 334 } | 334 } |
| 335 | 335 |
| 336 // 3. Let this object's attaching media keys value be true. | 336 // 3. Let this object's attaching media keys value be true. |
| 337 thisElement.m_isAttachingMediaKeys = true; | 337 thisElement.m_isAttachingMediaKeys = true; |
| 338 | 338 |
| 339 // 4. Let promise be a new promise. Remaining steps done in handler. | 339 // 4. Let promise be a new promise. Remaining steps done in handler. |
| 340 return SetMediaKeysHandler::create(scriptState, element, mediaKeys); | 340 return SetMediaKeysHandler::create(scriptState, element, mediaKeys); |
| 341 } | 341 } |
| 342 | 342 |
| 343 // Create a MediaEncryptedEvent for WD EME. | 343 // Create a MediaEncryptedEvent for WD EME. |
| 344 static PassRefPtrWillBeRawPtr<Event> createEncryptedEvent(WebEncryptedMediaInitD
ataType initDataType, const unsigned char* initData, unsigned initDataLength) | 344 static RawPtr<Event> createEncryptedEvent(WebEncryptedMediaInitDataType initData
Type, const unsigned char* initData, unsigned initDataLength) |
| 345 { | 345 { |
| 346 MediaEncryptedEventInit initializer; | 346 MediaEncryptedEventInit initializer; |
| 347 initializer.setInitDataType(EncryptedMediaUtils::convertFromInitDataType(ini
tDataType)); | 347 initializer.setInitDataType(EncryptedMediaUtils::convertFromInitDataType(ini
tDataType)); |
| 348 initializer.setInitData(DOMArrayBuffer::create(initData, initDataLength)); | 348 initializer.setInitData(DOMArrayBuffer::create(initData, initDataLength)); |
| 349 initializer.setBubbles(false); | 349 initializer.setBubbles(false); |
| 350 initializer.setCancelable(false); | 350 initializer.setCancelable(false); |
| 351 | 351 |
| 352 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); | 352 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); |
| 353 } | 353 } |
| 354 | 354 |
| 355 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini
tDataType, const unsigned char* initData, unsigned initDataLength) | 355 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini
tDataType, const unsigned char* initData, unsigned initDataLength) |
| 356 { | 356 { |
| 357 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); | 357 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); |
| 358 | 358 |
| 359 RefPtrWillBeRawPtr<Event> event; | 359 RawPtr<Event> event; |
| 360 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->getExecutionCo
ntext()->getSecurityOrigin())) { | 360 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->getExecutionCo
ntext()->getSecurityOrigin())) { |
| 361 event = createEncryptedEvent(initDataType, initData, initDataLength); | 361 event = createEncryptedEvent(initDataType, initData, initDataLength); |
| 362 } else { | 362 } else { |
| 363 // Current page is not allowed to see content from the media file, | 363 // Current page is not allowed to see content from the media file, |
| 364 // so don't return the initData. However, they still get an event. | 364 // so don't return the initData. However, they still get an event. |
| 365 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nul
lptr, 0); | 365 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nul
lptr, 0); |
| 366 } | 366 } |
| 367 | 367 |
| 368 event->setTarget(m_mediaElement); | 368 event->setTarget(m_mediaElement); |
| 369 m_mediaElement->scheduleEvent(event.release()); | 369 m_mediaElement->scheduleEvent(event.release()); |
| 370 } | 370 } |
| 371 | 371 |
| 372 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey() | 372 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey() |
| 373 { | 373 { |
| 374 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe
y"); | 374 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe
y"); |
| 375 | 375 |
| 376 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey: | 376 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey: |
| 377 // It should only be called when the HTMLMediaElement object is potentially | 377 // It should only be called when the HTMLMediaElement object is potentially |
| 378 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater. | 378 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater. |
| 379 // FIXME: Is this really required? | 379 // FIXME: Is this really required? |
| 380 | 380 |
| 381 // 1. Let the media element be the specified HTMLMediaElement object. | 381 // 1. Let the media element be the specified HTMLMediaElement object. |
| 382 // 2. If the media element's waiting for key value is false, queue a task | 382 // 2. If the media element's waiting for key value is false, queue a task |
| 383 // to fire a simple event named waitingforkey at the media element. | 383 // to fire a simple event named waitingforkey at the media element. |
| 384 if (!m_isWaitingForKey) { | 384 if (!m_isWaitingForKey) { |
| 385 RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::waitingf
orkey); | 385 RawPtr<Event> event = Event::create(EventTypeNames::waitingforkey); |
| 386 event->setTarget(m_mediaElement); | 386 event->setTarget(m_mediaElement); |
| 387 m_mediaElement->scheduleEvent(event.release()); | 387 m_mediaElement->scheduleEvent(event.release()); |
| 388 } | 388 } |
| 389 | 389 |
| 390 // 3. Set the media element's waiting for key value to true. | 390 // 3. Set the media element's waiting for key value to true. |
| 391 m_isWaitingForKey = true; | 391 m_isWaitingForKey = true; |
| 392 | 392 |
| 393 // 4. Suspend playback. | 393 // 4. Suspend playback. |
| 394 // (Already done on the Chromium side by the decryptors.) | 394 // (Already done on the Chromium side by the decryptors.) |
| 395 } | 395 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 406 | 406 |
| 407 WebContentDecryptionModule* HTMLMediaElementEncryptedMedia::contentDecryptionMod
ule() | 407 WebContentDecryptionModule* HTMLMediaElementEncryptedMedia::contentDecryptionMod
ule() |
| 408 { | 408 { |
| 409 return m_mediaKeys ? m_mediaKeys->contentDecryptionModule() : 0; | 409 return m_mediaKeys ? m_mediaKeys->contentDecryptionModule() : 0; |
| 410 } | 410 } |
| 411 | 411 |
| 412 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) | 412 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) |
| 413 { | 413 { |
| 414 visitor->trace(m_mediaElement); | 414 visitor->trace(m_mediaElement); |
| 415 visitor->trace(m_mediaKeys); | 415 visitor->trace(m_mediaKeys); |
| 416 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); | 416 HeapSupplement<HTMLMediaElement>::trace(visitor); |
| 417 } | 417 } |
| 418 | 418 |
| 419 } // namespace blink | 419 } // namespace blink |
| OLD | NEW |