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 "config.h" | 5 #include "config.h" |
6 #include "modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h" | 6 #include "modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h" |
7 | 7 |
8 #include "bindings/core/v8/ExceptionState.h" | 8 #include "bindings/core/v8/ExceptionState.h" |
9 #include "bindings/core/v8/ScriptPromise.h" | 9 #include "bindings/core/v8/ScriptPromise.h" |
10 #include "bindings/core/v8/ScriptPromiseResolver.h" | 10 #include "bindings/core/v8/ScriptPromiseResolver.h" |
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
352 | 352 |
353 // 2. Let promise be a new promise. Remaining steps done in handler. | 353 // 2. Let promise be a new promise. Remaining steps done in handler. |
354 return SetMediaKeysHandler::create(scriptState, element, mediaKeys); | 354 return SetMediaKeysHandler::create(scriptState, element, mediaKeys); |
355 } | 355 } |
356 | 356 |
357 // Create a MediaEncryptedEvent for WD EME. | 357 // Create a MediaEncryptedEvent for WD EME. |
358 static PassRefPtrWillBeRawPtr<Event> createEncryptedEvent(WebEncryptedMediaInitD
ataType initDataType, const unsigned char* initData, unsigned initDataLength) | 358 static PassRefPtrWillBeRawPtr<Event> createEncryptedEvent(WebEncryptedMediaInitD
ataType initDataType, const unsigned char* initData, unsigned initDataLength) |
359 { | 359 { |
360 MediaEncryptedEventInit initializer; | 360 MediaEncryptedEventInit initializer; |
361 initializer.setInitDataType(EncryptedMediaUtils::convertFromInitDataType(ini
tDataType)); | 361 initializer.setInitDataType(EncryptedMediaUtils::convertFromInitDataType(ini
tDataType)); |
362 initializer.setInitData(DOMArrayBuffer::create(initData, initDataLength)); | 362 initializer.setInitData(DOMArrayBuffer::createOrNull(initData, initDataLengt
h)); |
363 initializer.setBubbles(false); | 363 initializer.setBubbles(false); |
364 initializer.setCancelable(false); | 364 initializer.setCancelable(false); |
365 | 365 |
366 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); | 366 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); |
367 } | 367 } |
368 | 368 |
369 // Create a 'needkey' MediaKeyEvent for v0.1b EME. | 369 // Create a 'needkey' MediaKeyEvent for v0.1b EME. |
370 static PassRefPtrWillBeRawPtr<Event> createWebkitNeedKeyEvent(const unsigned cha
r* initData, unsigned initDataLength) | 370 static PassRefPtrWillBeRawPtr<Event> createWebkitNeedKeyEvent(const unsigned cha
r* initData, unsigned initDataLength) |
371 { | 371 { |
372 MediaKeyEventInit webkitInitializer; | 372 MediaKeyEventInit webkitInitializer; |
373 webkitInitializer.setInitData(DOMUint8Array::create(initData, initDataLength
)); | 373 webkitInitializer.setInitData(DOMUint8Array::createOrNull(initData, initData
Length)); |
374 | 374 |
375 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize
r); | 375 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize
r); |
376 } | 376 } |
377 | 377 |
378 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
element, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionS
tate& exceptionState) | 378 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
element, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionS
tate& exceptionState) |
379 { | 379 { |
380 HTMLMediaElementEncryptedMedia::from(element).generateKeyRequest(element.web
MediaPlayer(), keySystem, initData, exceptionState); | 380 HTMLMediaElementEncryptedMedia::from(element).generateKeyRequest(element.web
MediaPlayer(), keySystem, initData, exceptionState); |
381 } | 381 } |
382 | 382 |
383 void HTMLMediaElementEncryptedMedia::generateKeyRequest(WebMediaPlayer* webMedia
Player, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionSt
ate& exceptionState) | 383 void HTMLMediaElementEncryptedMedia::generateKeyRequest(WebMediaPlayer* webMedia
Player, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionSt
ate& exceptionState) |
(...skipping 21 matching lines...) Expand all Loading... |
405 initDataPointer = initData->data(); | 405 initDataPointer = initData->data(); |
406 initDataLength = initData->length(); | 406 initDataLength = initData->length(); |
407 } | 407 } |
408 | 408 |
409 WebMediaPlayer::MediaKeyException result = webMediaPlayer->generateKeyReques
t(keySystem, initDataPointer, initDataLength); | 409 WebMediaPlayer::MediaKeyException result = webMediaPlayer->generateKeyReques
t(keySystem, initDataPointer, initDataLength); |
410 throwExceptionIfMediaKeyExceptionOccurred(keySystem, String(), result, excep
tionState); | 410 throwExceptionIfMediaKeyExceptionOccurred(keySystem, String(), result, excep
tionState); |
411 } | 411 } |
412 | 412 |
413 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
mediaElement, const String& keySystem, ExceptionState& exceptionState) | 413 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
mediaElement, const String& keySystem, ExceptionState& exceptionState) |
414 { | 414 { |
415 webkitGenerateKeyRequest(mediaElement, keySystem, DOMUint8Array::create(0),
exceptionState); | 415 RefPtr<DOMUint8Array> emptyArray = DOMUint8Array::deprecatedCreateOrCrash(nu
llptr, 0); |
| 416 webkitGenerateKeyRequest(mediaElement, keySystem, emptyArray.release(), exce
ptionState); |
416 } | 417 } |
417 | 418 |
418 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& element, con
st String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> i
nitData, const String& sessionId, ExceptionState& exceptionState) | 419 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& element, con
st String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> i
nitData, const String& sessionId, ExceptionState& exceptionState) |
419 { | 420 { |
420 HTMLMediaElementEncryptedMedia::from(element).addKey(element.webMediaPlayer(
), keySystem, key, initData, sessionId, exceptionState); | 421 HTMLMediaElementEncryptedMedia::from(element).addKey(element.webMediaPlayer(
), keySystem, key, initData, sessionId, exceptionState); |
421 } | 422 } |
422 | 423 |
423 void HTMLMediaElementEncryptedMedia::addKey(WebMediaPlayer* webMediaPlayer, cons
t String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> in
itData, const String& sessionId, ExceptionState& exceptionState) | 424 void HTMLMediaElementEncryptedMedia::addKey(WebMediaPlayer* webMediaPlayer, cons
t String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> in
itData, const String& sessionId, ExceptionState& exceptionState) |
424 { | 425 { |
425 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitAddKey"); | 426 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitAddKey"); |
(...skipping 29 matching lines...) Expand all Loading... |
455 initDataPointer = initData->data(); | 456 initDataPointer = initData->data(); |
456 initDataLength = initData->length(); | 457 initDataLength = initData->length(); |
457 } | 458 } |
458 | 459 |
459 WebMediaPlayer::MediaKeyException result = webMediaPlayer->addKey(keySystem,
key->data(), key->length(), initDataPointer, initDataLength, sessionId); | 460 WebMediaPlayer::MediaKeyException result = webMediaPlayer->addKey(keySystem,
key->data(), key->length(), initDataPointer, initDataLength, sessionId); |
460 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce
ptionState); | 461 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce
ptionState); |
461 } | 462 } |
462 | 463 |
463 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& mediaElement
, const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState& except
ionState) | 464 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& mediaElement
, const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState& except
ionState) |
464 { | 465 { |
465 webkitAddKey(mediaElement, keySystem, key, DOMUint8Array::create(0), String(
), exceptionState); | 466 webkitAddKey(mediaElement, keySystem, key, DOMUint8Array::deprecatedCreateOr
Crash(nullptr, 0), String(), exceptionState); |
466 } | 467 } |
467 | 468 |
468 void HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest(HTMLMediaElement& el
ement, const String& keySystem, const String& sessionId, ExceptionState& excepti
onState) | 469 void HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest(HTMLMediaElement& el
ement, const String& keySystem, const String& sessionId, ExceptionState& excepti
onState) |
469 { | 470 { |
470 HTMLMediaElementEncryptedMedia::from(element).cancelKeyRequest(element.webMe
diaPlayer(), keySystem, sessionId, exceptionState); | 471 HTMLMediaElementEncryptedMedia::from(element).cancelKeyRequest(element.webMe
diaPlayer(), keySystem, sessionId, exceptionState); |
471 } | 472 } |
472 | 473 |
473 void HTMLMediaElementEncryptedMedia::cancelKeyRequest(WebMediaPlayer* webMediaPl
ayer, const String& keySystem, const String& sessionId, ExceptionState& exceptio
nState) | 474 void HTMLMediaElementEncryptedMedia::cancelKeyRequest(WebMediaPlayer* webMediaPl
ayer, const String& keySystem, const String& sessionId, ExceptionState& exceptio
nState) |
474 { | 475 { |
475 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest"); | 476 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest"); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 m_mediaElement->scheduleEvent(event.release()); | 544 m_mediaElement->scheduleEvent(event.release()); |
544 } | 545 } |
545 | 546 |
546 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons
t WebString& sessionId, const unsigned char* message, unsigned messageLength, co
nst WebURL& defaultURL) | 547 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons
t WebString& sessionId, const unsigned char* message, unsigned messageLength, co
nst WebURL& defaultURL) |
547 { | 548 { |
548 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi
onID=%s", sessionId.utf8().data()); | 549 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi
onID=%s", sessionId.utf8().data()); |
549 | 550 |
550 MediaKeyEventInit initializer; | 551 MediaKeyEventInit initializer; |
551 initializer.setKeySystem(keySystem); | 552 initializer.setKeySystem(keySystem); |
552 initializer.setSessionId(sessionId); | 553 initializer.setSessionId(sessionId); |
553 initializer.setMessage(DOMUint8Array::create(message, messageLength)); | 554 // FIXME: We currently ignore the problem if allocating the message array fa
ils. |
| 555 // Should we be aborting when that happens? |
| 556 initializer.setMessage(DOMUint8Array::createOrNull(message, messageLength)); |
554 initializer.setDefaultURL(KURL(defaultURL)); | 557 initializer.setDefaultURL(KURL(defaultURL)); |
555 | 558 |
556 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk
itkeymessage, initializer); | 559 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk
itkeymessage, initializer); |
557 event->setTarget(m_mediaElement); | 560 event->setTarget(m_mediaElement); |
558 m_mediaElement->scheduleEvent(event.release()); | 561 m_mediaElement->scheduleEvent(event.release()); |
559 } | 562 } |
560 | 563 |
561 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini
tDataType, const unsigned char* initData, unsigned initDataLength) | 564 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini
tDataType, const unsigned char* initData, unsigned initDataLength) |
562 { | 565 { |
563 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); | 566 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); |
564 | 567 |
565 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { | 568 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { |
566 // Send event for WD EME. | 569 // Send event for WD EME. |
567 RefPtrWillBeRawPtr<Event> event; | 570 RefPtrWillBeRawPtr<Event> event; |
568 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC
ontext()->securityOrigin())) { | 571 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC
ontext()->securityOrigin())) { |
| 572 // FIXME: This creates an event with no data if the allocation of th
e array buffer fails. |
| 573 // Should we be aborting when that happens? |
569 event = createEncryptedEvent(initDataType, initData, initDataLength)
; | 574 event = createEncryptedEvent(initDataType, initData, initDataLength)
; |
570 } else { | 575 } else { |
571 // Current page is not allowed to see content from the media file, | 576 // Current page is not allowed to see content from the media file, |
572 // so don't return the initData. However, they still get an event. | 577 // so don't return the initData. However, they still get an event. |
573 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown,
nullptr, 0); | 578 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown,
nullptr, 0); |
574 } | 579 } |
575 | 580 |
576 event->setTarget(m_mediaElement); | 581 event->setTarget(m_mediaElement); |
577 m_mediaElement->scheduleEvent(event.release()); | 582 m_mediaElement->scheduleEvent(event.release()); |
578 } | 583 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 } | 631 } |
627 | 632 |
628 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) | 633 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) |
629 { | 634 { |
630 visitor->trace(m_mediaElement); | 635 visitor->trace(m_mediaElement); |
631 visitor->trace(m_mediaKeys); | 636 visitor->trace(m_mediaKeys); |
632 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); | 637 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); |
633 } | 638 } |
634 | 639 |
635 } // namespace blink | 640 } // namespace blink |
OLD | NEW |