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 // TODO(junov): crbug.com/536816 |
| 363 // We should use createOrNull instead of deprecatedCreateOrCrash to |
| 364 // fail gracefully instead of crashing the process when allocation fails. |
| 365 // Need to investigate how this should be handled in the spec. |
| 366 // Would it make sense to throw a RangeError exception from here? Would |
| 367 // it be okay pass a nullptr to setInitData? |
| 368 initializer.setInitData(DOMArrayBuffer::deprecatedCreateOrCrash(initData, in
itDataLength)); |
363 initializer.setBubbles(false); | 369 initializer.setBubbles(false); |
364 initializer.setCancelable(false); | 370 initializer.setCancelable(false); |
365 | 371 |
366 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); | 372 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); |
367 } | 373 } |
368 | 374 |
369 // Create a 'needkey' MediaKeyEvent for v0.1b EME. | 375 // Create a 'needkey' MediaKeyEvent for v0.1b EME. |
370 static PassRefPtrWillBeRawPtr<Event> createWebkitNeedKeyEvent(const unsigned cha
r* initData, unsigned initDataLength) | 376 static PassRefPtrWillBeRawPtr<Event> createWebkitNeedKeyEvent(const unsigned cha
r* initData, unsigned initDataLength) |
371 { | 377 { |
372 MediaKeyEventInit webkitInitializer; | 378 MediaKeyEventInit webkitInitializer; |
373 webkitInitializer.setInitData(DOMUint8Array::create(initData, initDataLength
)); | 379 // TODO(junov): crbug.com/536816 |
| 380 // We should use createOrNull instead of deprecatedCreateOrCrash to |
| 381 // fail gracefully instead of crashing the process when allocation fails. |
| 382 // Need to investigate how this should be handled in the spec. |
| 383 // Would it make sense to throw a RangeError exception from here? Would |
| 384 // it be okay pass a nullptr to setInitData? |
| 385 webkitInitializer.setInitData(DOMUint8Array::createOrNull(initData, initData
Length)); |
374 | 386 |
375 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize
r); | 387 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize
r); |
376 } | 388 } |
377 | 389 |
378 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
element, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionS
tate& exceptionState) | 390 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
element, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionS
tate& exceptionState) |
379 { | 391 { |
380 HTMLMediaElementEncryptedMedia::from(element).generateKeyRequest(element.web
MediaPlayer(), keySystem, initData, exceptionState); | 392 HTMLMediaElementEncryptedMedia::from(element).generateKeyRequest(element.web
MediaPlayer(), keySystem, initData, exceptionState); |
381 } | 393 } |
382 | 394 |
383 void HTMLMediaElementEncryptedMedia::generateKeyRequest(WebMediaPlayer* webMedia
Player, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionSt
ate& exceptionState) | 395 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(); | 417 initDataPointer = initData->data(); |
406 initDataLength = initData->length(); | 418 initDataLength = initData->length(); |
407 } | 419 } |
408 | 420 |
409 WebMediaPlayer::MediaKeyException result = webMediaPlayer->generateKeyReques
t(keySystem, initDataPointer, initDataLength); | 421 WebMediaPlayer::MediaKeyException result = webMediaPlayer->generateKeyReques
t(keySystem, initDataPointer, initDataLength); |
410 throwExceptionIfMediaKeyExceptionOccurred(keySystem, String(), result, excep
tionState); | 422 throwExceptionIfMediaKeyExceptionOccurred(keySystem, String(), result, excep
tionState); |
411 } | 423 } |
412 | 424 |
413 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
mediaElement, const String& keySystem, ExceptionState& exceptionState) | 425 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
mediaElement, const String& keySystem, ExceptionState& exceptionState) |
414 { | 426 { |
415 webkitGenerateKeyRequest(mediaElement, keySystem, DOMUint8Array::create(0),
exceptionState); | 427 RefPtr<DOMUint8Array> emptyArray = DOMUint8Array::deprecatedCreateOrCrash(nu
llptr, 0); |
| 428 webkitGenerateKeyRequest(mediaElement, keySystem, emptyArray.release(), exce
ptionState); |
416 } | 429 } |
417 | 430 |
418 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& element, con
st String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> i
nitData, const String& sessionId, ExceptionState& exceptionState) | 431 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& element, con
st String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> i
nitData, const String& sessionId, ExceptionState& exceptionState) |
419 { | 432 { |
420 HTMLMediaElementEncryptedMedia::from(element).addKey(element.webMediaPlayer(
), keySystem, key, initData, sessionId, exceptionState); | 433 HTMLMediaElementEncryptedMedia::from(element).addKey(element.webMediaPlayer(
), keySystem, key, initData, sessionId, exceptionState); |
421 } | 434 } |
422 | 435 |
423 void HTMLMediaElementEncryptedMedia::addKey(WebMediaPlayer* webMediaPlayer, cons
t String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> in
itData, const String& sessionId, ExceptionState& exceptionState) | 436 void HTMLMediaElementEncryptedMedia::addKey(WebMediaPlayer* webMediaPlayer, cons
t String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> in
itData, const String& sessionId, ExceptionState& exceptionState) |
424 { | 437 { |
425 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitAddKey"); | 438 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitAddKey"); |
(...skipping 29 matching lines...) Expand all Loading... |
455 initDataPointer = initData->data(); | 468 initDataPointer = initData->data(); |
456 initDataLength = initData->length(); | 469 initDataLength = initData->length(); |
457 } | 470 } |
458 | 471 |
459 WebMediaPlayer::MediaKeyException result = webMediaPlayer->addKey(keySystem,
key->data(), key->length(), initDataPointer, initDataLength, sessionId); | 472 WebMediaPlayer::MediaKeyException result = webMediaPlayer->addKey(keySystem,
key->data(), key->length(), initDataPointer, initDataLength, sessionId); |
460 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce
ptionState); | 473 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce
ptionState); |
461 } | 474 } |
462 | 475 |
463 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& mediaElement
, const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState& except
ionState) | 476 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& mediaElement
, const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState& except
ionState) |
464 { | 477 { |
465 webkitAddKey(mediaElement, keySystem, key, DOMUint8Array::create(0), String(
), exceptionState); | 478 webkitAddKey(mediaElement, keySystem, key, DOMUint8Array::deprecatedCreateOr
Crash(nullptr, 0), String(), exceptionState); |
466 } | 479 } |
467 | 480 |
468 void HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest(HTMLMediaElement& el
ement, const String& keySystem, const String& sessionId, ExceptionState& excepti
onState) | 481 void HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest(HTMLMediaElement& el
ement, const String& keySystem, const String& sessionId, ExceptionState& excepti
onState) |
469 { | 482 { |
470 HTMLMediaElementEncryptedMedia::from(element).cancelKeyRequest(element.webMe
diaPlayer(), keySystem, sessionId, exceptionState); | 483 HTMLMediaElementEncryptedMedia::from(element).cancelKeyRequest(element.webMe
diaPlayer(), keySystem, sessionId, exceptionState); |
471 } | 484 } |
472 | 485 |
473 void HTMLMediaElementEncryptedMedia::cancelKeyRequest(WebMediaPlayer* webMediaPl
ayer, const String& keySystem, const String& sessionId, ExceptionState& exceptio
nState) | 486 void HTMLMediaElementEncryptedMedia::cancelKeyRequest(WebMediaPlayer* webMediaPl
ayer, const String& keySystem, const String& sessionId, ExceptionState& exceptio
nState) |
474 { | 487 { |
475 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest"); | 488 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest"); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 m_mediaElement->scheduleEvent(event.release()); | 556 m_mediaElement->scheduleEvent(event.release()); |
544 } | 557 } |
545 | 558 |
546 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons
t WebString& sessionId, const unsigned char* message, unsigned messageLength, co
nst WebURL& defaultURL) | 559 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons
t WebString& sessionId, const unsigned char* message, unsigned messageLength, co
nst WebURL& defaultURL) |
547 { | 560 { |
548 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi
onID=%s", sessionId.utf8().data()); | 561 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi
onID=%s", sessionId.utf8().data()); |
549 | 562 |
550 MediaKeyEventInit initializer; | 563 MediaKeyEventInit initializer; |
551 initializer.setKeySystem(keySystem); | 564 initializer.setKeySystem(keySystem); |
552 initializer.setSessionId(sessionId); | 565 initializer.setSessionId(sessionId); |
553 initializer.setMessage(DOMUint8Array::create(message, messageLength)); | 566 // TODO(junov): crbug.com/536816 |
| 567 // Should use createOrNull instead of deprecatedCreateOrCrash. |
| 568 // Need to find an acceptable way to fail gracefully when allocation |
| 569 // fails. Possible solutions: throw a RangeError exception, pass |
| 570 // a null message |
| 571 initializer.setMessage(DOMUint8Array::deprecatedCreateOrCrash(message, messa
geLength)); |
554 initializer.setDefaultURL(KURL(defaultURL)); | 572 initializer.setDefaultURL(KURL(defaultURL)); |
555 | 573 |
556 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk
itkeymessage, initializer); | 574 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk
itkeymessage, initializer); |
557 event->setTarget(m_mediaElement); | 575 event->setTarget(m_mediaElement); |
558 m_mediaElement->scheduleEvent(event.release()); | 576 m_mediaElement->scheduleEvent(event.release()); |
559 } | 577 } |
560 | 578 |
561 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini
tDataType, const unsigned char* initData, unsigned initDataLength) | 579 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini
tDataType, const unsigned char* initData, unsigned initDataLength) |
562 { | 580 { |
563 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); | 581 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); |
564 | 582 |
565 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { | 583 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { |
566 // Send event for WD EME. | 584 // Send event for WD EME. |
567 RefPtrWillBeRawPtr<Event> event; | 585 RefPtrWillBeRawPtr<Event> event; |
568 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC
ontext()->securityOrigin())) { | 586 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC
ontext()->securityOrigin())) { |
| 587 // TODO(junov): crbug.com/536816 |
| 588 // This creates an event with no data if the allocation of the array
buffer fails. |
| 589 // Should we be aborting when that happens? |
569 event = createEncryptedEvent(initDataType, initData, initDataLength)
; | 590 event = createEncryptedEvent(initDataType, initData, initDataLength)
; |
570 } else { | 591 } else { |
571 // Current page is not allowed to see content from the media file, | 592 // 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. | 593 // so don't return the initData. However, they still get an event. |
573 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown,
nullptr, 0); | 594 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown,
nullptr, 0); |
574 } | 595 } |
575 | 596 |
576 event->setTarget(m_mediaElement); | 597 event->setTarget(m_mediaElement); |
577 m_mediaElement->scheduleEvent(event.release()); | 598 m_mediaElement->scheduleEvent(event.release()); |
578 } | 599 } |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 } | 647 } |
627 | 648 |
628 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) | 649 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) |
629 { | 650 { |
630 visitor->trace(m_mediaElement); | 651 visitor->trace(m_mediaElement); |
631 visitor->trace(m_mediaKeys); | 652 visitor->trace(m_mediaKeys); |
632 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); | 653 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); |
633 } | 654 } |
634 | 655 |
635 } // namespace blink | 656 } // namespace blink |
OLD | NEW |