Chromium Code Reviews| 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 246 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 257 | 257 |
| 258 const char* HTMLMediaElementEncryptedMedia::supplementName() | 258 const char* HTMLMediaElementEncryptedMedia::supplementName() |
| 259 { | 259 { |
| 260 return "HTMLMediaElementEncryptedMedia"; | 260 return "HTMLMediaElementEncryptedMedia"; |
| 261 } | 261 } |
| 262 | 262 |
| 263 HTMLMediaElementEncryptedMedia& HTMLMediaElementEncryptedMedia::from(HTMLMediaEl ement& element) | 263 HTMLMediaElementEncryptedMedia& HTMLMediaElementEncryptedMedia::from(HTMLMediaEl ement& element) |
| 264 { | 264 { |
| 265 HTMLMediaElementEncryptedMedia* supplement = static_cast<HTMLMediaElementEnc ryptedMedia*>(WillBeHeapSupplement<HTMLMediaElement>::from(element, supplementNa me())); | 265 HTMLMediaElementEncryptedMedia* supplement = static_cast<HTMLMediaElementEnc ryptedMedia*>(WillBeHeapSupplement<HTMLMediaElement>::from(element, supplementNa me())); |
| 266 if (!supplement) { | 266 if (!supplement) { |
| 267 supplement = new HTMLMediaElementEncryptedMedia(); | 267 supplement = new HTMLMediaElementEncryptedMedia(); |
|
ddorwin
2015/05/08 17:49:41
Can we pass the element here and store it as a mem
Srirama
2015/05/19 10:39:47
Done.
| |
| 268 provideTo(element, supplementName(), adoptPtrWillBeNoop(supplement)); | 268 provideTo(element, supplementName(), adoptPtrWillBeNoop(supplement)); |
| 269 } | 269 } |
| 270 return *supplement; | 270 return *supplement; |
| 271 } | 271 } |
| 272 | 272 |
| 273 bool HTMLMediaElementEncryptedMedia::setEmeMode(EmeMode emeMode) | 273 bool HTMLMediaElementEncryptedMedia::setEmeMode(EmeMode emeMode) |
| 274 { | 274 { |
| 275 if (m_emeMode != EmeModeNotSelected && m_emeMode != emeMode) | 275 if (m_emeMode != EmeModeNotSelected && m_emeMode != emeMode) |
| 276 return false; | 276 return false; |
| 277 | 277 |
| (...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 439 | 439 |
| 440 if (!webMediaPlayer) { | 440 if (!webMediaPlayer) { |
| 441 exceptionState.throwDOMException(InvalidStateError, "No media has been l oaded."); | 441 exceptionState.throwDOMException(InvalidStateError, "No media has been l oaded."); |
| 442 return; | 442 return; |
| 443 } | 443 } |
| 444 | 444 |
| 445 WebMediaPlayer::MediaKeyException result = webMediaPlayer->cancelKeyRequest( keySystem, sessionId); | 445 WebMediaPlayer::MediaKeyException result = webMediaPlayer->cancelKeyRequest( keySystem, sessionId); |
| 446 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState); | 446 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState); |
| 447 } | 447 } |
| 448 | 448 |
| 449 void HTMLMediaElementEncryptedMedia::keyAdded(HTMLMediaElement& element, const S tring& keySystem, const String& sessionId) | 449 void HTMLMediaElementEncryptedMedia::keyAdded(WebMediaPlayerClient* client, cons t WebString& keySystem, const WebString& sessionId) |
| 450 { | 450 { |
| 451 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyAdded"); | 451 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyAdded"); |
| 452 | 452 |
| 453 HTMLMediaElement& element = *(static_cast<HTMLMediaElement*>(client)); | |
|
ddorwin
2015/05/08 17:49:41
Hopefully we can avoid this. See above.
Srirama
2015/05/19 10:39:47
Done.
| |
| 453 MediaKeyEventInit initializer; | 454 MediaKeyEventInit initializer; |
| 454 initializer.setKeySystem(keySystem); | 455 initializer.setKeySystem(keySystem); |
| 455 initializer.setSessionId(sessionId); | 456 initializer.setSessionId(sessionId); |
| 456 | 457 |
| 457 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyadded, initializer); | 458 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyadded, initializer); |
| 458 event->setTarget(&element); | 459 event->setTarget(&element); |
| 459 element.scheduleEvent(event.release()); | 460 element.scheduleEvent(event.release()); |
| 460 } | 461 } |
| 461 | 462 |
| 462 void HTMLMediaElementEncryptedMedia::keyError(HTMLMediaElement& element, const S tring& keySystem, const String& sessionId, WebMediaPlayerClient::MediaKeyErrorCo de errorCode, unsigned short systemCode) | 463 void HTMLMediaElementEncryptedMedia::keyError(WebMediaPlayerClient* client, cons t WebString& keySystem, const WebString& sessionId, WebMediaPlayerEncryptedMedia Client::MediaKeyErrorCode errorCode, unsigned short systemCode) |
| 463 { | 464 { |
| 464 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyError: session ID=%s, errorCode=%d, systemCode=%d", sessionId.utf8().data(), errorCode, systemC ode); | 465 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyError: session ID=%s, errorCode=%d, systemCode=%d", sessionId.utf8().data(), errorCode, systemC ode); |
| 465 | 466 |
| 466 MediaKeyError::Code mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; | 467 MediaKeyError::Code mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; |
| 467 switch (errorCode) { | 468 switch (errorCode) { |
| 468 case WebMediaPlayerClient::MediaKeyErrorCodeUnknown: | 469 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeUnknown: |
| 469 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; | 470 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; |
| 470 break; | 471 break; |
| 471 case WebMediaPlayerClient::MediaKeyErrorCodeClient: | 472 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeClient: |
| 472 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_CLIENT; | 473 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_CLIENT; |
| 473 break; | 474 break; |
| 474 case WebMediaPlayerClient::MediaKeyErrorCodeService: | 475 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeService: |
| 475 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_SERVICE; | 476 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_SERVICE; |
| 476 break; | 477 break; |
| 477 case WebMediaPlayerClient::MediaKeyErrorCodeOutput: | 478 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeOutput: |
| 478 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_OUTPUT; | 479 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_OUTPUT; |
| 479 break; | 480 break; |
| 480 case WebMediaPlayerClient::MediaKeyErrorCodeHardwareChange: | 481 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeHardwareChange: |
| 481 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_HARDWARECHANGE; | 482 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_HARDWARECHANGE; |
| 482 break; | 483 break; |
| 483 case WebMediaPlayerClient::MediaKeyErrorCodeDomain: | 484 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeDomain: |
| 484 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_DOMAIN; | 485 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_DOMAIN; |
| 485 break; | 486 break; |
| 486 } | 487 } |
| 487 | 488 |
| 488 MediaKeyEventInit initializer; | 489 MediaKeyEventInit initializer; |
| 489 initializer.setKeySystem(keySystem); | 490 initializer.setKeySystem(keySystem); |
| 490 initializer.setSessionId(sessionId); | 491 initializer.setSessionId(sessionId); |
| 491 initializer.setErrorCode(MediaKeyError::create(mediaKeyErrorCode)); | 492 initializer.setErrorCode(MediaKeyError::create(mediaKeyErrorCode)); |
| 492 initializer.setSystemCode(systemCode); | 493 initializer.setSystemCode(systemCode); |
| 493 | 494 |
| 495 HTMLMediaElement& element = *(static_cast<HTMLMediaElement*>(client)); | |
| 494 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyerror, initializer); | 496 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyerror, initializer); |
| 495 event->setTarget(&element); | 497 event->setTarget(&element); |
| 496 element.scheduleEvent(event.release()); | 498 element.scheduleEvent(event.release()); |
| 497 } | 499 } |
| 498 | 500 |
| 499 void HTMLMediaElementEncryptedMedia::keyMessage(HTMLMediaElement& element, const String& keySystem, const String& sessionId, const unsigned char* message, unsig ned messageLength, const WebURL& defaultURL) | 501 void HTMLMediaElementEncryptedMedia::keyMessage(WebMediaPlayerClient* client, co nst WebString& keySystem, const WebString& sessionId, const unsigned char* messa ge, unsigned messageLength, const WebURL& defaultURL) |
| 500 { | 502 { |
| 501 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data()); | 503 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data()); |
| 502 | 504 |
| 503 MediaKeyEventInit initializer; | 505 MediaKeyEventInit initializer; |
| 504 initializer.setKeySystem(keySystem); | 506 initializer.setKeySystem(keySystem); |
| 505 initializer.setSessionId(sessionId); | 507 initializer.setSessionId(sessionId); |
| 506 initializer.setMessage(DOMUint8Array::create(message, messageLength)); | 508 initializer.setMessage(DOMUint8Array::create(message, messageLength)); |
| 507 initializer.setDefaultURL(KURL(defaultURL)); | 509 initializer.setDefaultURL(KURL(defaultURL)); |
| 508 | 510 |
| 511 HTMLMediaElement& element = *(static_cast<HTMLMediaElement*>(client)); | |
| 509 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer); | 512 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer); |
| 510 event->setTarget(&element); | 513 event->setTarget(&element); |
| 511 element.scheduleEvent(event.release()); | 514 element.scheduleEvent(event.release()); |
| 512 } | 515 } |
| 513 | 516 |
| 514 void HTMLMediaElementEncryptedMedia::encrypted(HTMLMediaElement& element, WebEnc ryptedMediaInitDataType initDataType, const unsigned char* initData, unsigned in itDataLength) | 517 void HTMLMediaElementEncryptedMedia::encrypted(WebMediaPlayerClient* client, Web EncryptedMediaInitDataType initDataType, const unsigned char* initData, unsigned initDataLength) |
| 515 { | 518 { |
| 516 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); | 519 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); |
| 517 | 520 |
| 521 HTMLMediaElement& element = *(static_cast<HTMLMediaElement*>(client)); | |
| 518 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { | 522 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { |
| 519 // Send event for WD EME. | 523 // Send event for WD EME. |
| 520 RefPtrWillBeRawPtr<Event> event; | 524 RefPtrWillBeRawPtr<Event> event; |
| 521 if (element.isMediaDataCORSSameOrigin(element.executionContext()->securi tyOrigin())) { | 525 if (element.isMediaDataCORSSameOrigin(element.executionContext()->securi tyOrigin())) { |
| 522 event = createEncryptedEvent(initDataType, initData, initDataLength) ; | 526 event = createEncryptedEvent(initDataType, initData, initDataLength) ; |
| 523 } else { | 527 } else { |
| 524 // Current page is not allowed to see content from the media file, | 528 // Current page is not allowed to see content from the media file, |
| 525 // so don't return the initData. However, they still get an event. | 529 // so don't return the initData. However, they still get an event. |
| 526 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0); | 530 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0); |
| 527 } | 531 } |
| 528 | 532 |
| 529 event->setTarget(&element); | 533 event->setTarget(&element); |
| 530 element.scheduleEvent(event.release()); | 534 element.scheduleEvent(event.release()); |
| 531 } | 535 } |
| 532 | 536 |
| 533 if (RuntimeEnabledFeatures::prefixedEncryptedMediaEnabled()) { | 537 if (RuntimeEnabledFeatures::prefixedEncryptedMediaEnabled()) { |
| 534 // Send event for v0.1b EME. | 538 // Send event for v0.1b EME. |
| 535 RefPtrWillBeRawPtr<Event> event = createWebkitNeedKeyEvent(initData, ini tDataLength); | 539 RefPtrWillBeRawPtr<Event> event = createWebkitNeedKeyEvent(initData, ini tDataLength); |
| 536 event->setTarget(&element); | 540 event->setTarget(&element); |
| 537 element.scheduleEvent(event.release()); | 541 element.scheduleEvent(event.release()); |
| 538 } | 542 } |
| 539 } | 543 } |
| 540 | 544 |
| 541 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey(HTMLMediaElem ent& element) | 545 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey(WebMediaPlaye rClient* client) |
|
ddorwin
2015/05/08 17:49:41
Don't need this parameter.
Srirama
2015/05/19 10:39:47
Done.
| |
| 542 { | 546 { |
| 543 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe y"); | 547 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe y"); |
| 544 | 548 |
| 545 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey: | 549 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey: |
| 546 // It should only be called when the HTMLMediaElement object is potentially | 550 // It should only be called when the HTMLMediaElement object is potentially |
| 547 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater. | 551 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater. |
| 548 // FIXME: Is this really required? | 552 // FIXME: Is this really required? |
| 549 | 553 |
| 554 HTMLMediaElement& element = *(static_cast<HTMLMediaElement*>(client)); | |
|
ddorwin
2015/05/08 17:49:41
We don't need any of this because this is no longe
Srirama
2015/05/19 10:39:47
Done.
| |
| 550 // 1. Let the media element be the specified HTMLMediaElement object. | 555 // 1. Let the media element be the specified HTMLMediaElement object. |
| 551 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); | 556 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); |
| 552 | 557 |
| 553 // 2. If the media element's waiting for key value is false, queue a task | 558 // 2. If the media element's waiting for key value is false, queue a task |
| 554 // to fire a simple event named waitingforkey at the media element. | 559 // to fire a simple event named waitingforkey at the media element. |
| 555 if (!thisElement.m_isWaitingForKey) { | 560 if (!thisElement.m_isWaitingForKey) { |
| 556 RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::waitingf orkey); | 561 RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::waitingf orkey); |
| 557 event->setTarget(&element); | 562 event->setTarget(&element); |
| 558 element.scheduleEvent(event.release()); | 563 element.scheduleEvent(event.release()); |
| 559 } | 564 } |
| 560 | 565 |
| 561 // 3. Set the media element's waiting for key value to true. | 566 // 3. Set the media element's waiting for key value to true. |
| 562 thisElement.m_isWaitingForKey = true; | 567 thisElement.m_isWaitingForKey = true; |
| 563 | 568 |
| 564 // 4. Suspend playback. | 569 // 4. Suspend playback. |
| 565 // (Already done on the Chromium side by the decryptors.) | 570 // (Already done on the Chromium side by the decryptors.) |
| 566 } | 571 } |
| 567 | 572 |
| 568 void HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForKey(HTMLMediaEle ment& element) | 573 void HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForKey(WebMediaPlay erClient* client) |
|
ddorwin
2015/05/08 17:49:41
ditto
Srirama
2015/05/19 10:39:47
Done.
| |
| 569 { | 574 { |
| 570 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForK ey"); | 575 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForK ey"); |
| 571 | 576 |
| 572 // Logic is on the Chromium side to attempt to resume playback when a new | 577 // Logic is on the Chromium side to attempt to resume playback when a new |
| 573 // key is available. However, |m_isWaitingForKey| needs to be cleared so | 578 // key is available. However, |m_isWaitingForKey| needs to be cleared so |
| 574 // that a later waitingForKey() call can generate the event. | 579 // that a later waitingForKey() call can generate the event. |
| 575 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); | 580 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(*(static_cast<HTMLMediaElement*>(client))); |
| 576 thisElement.m_isWaitingForKey = false; | 581 thisElement.m_isWaitingForKey = false; |
| 577 } | 582 } |
| 578 | 583 |
| 579 WebContentDecryptionModule* HTMLMediaElementEncryptedMedia::contentDecryptionMod ule(HTMLMediaElement& element) | 584 WebContentDecryptionModule* HTMLMediaElementEncryptedMedia::contentDecryptionMod ule(HTMLMediaElement& element) |
| 580 { | 585 { |
| 581 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); | 586 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); |
| 582 return thisElement.contentDecryptionModule(); | 587 return thisElement.contentDecryptionModule(); |
| 583 } | 588 } |
| 584 | 589 |
| 585 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) | 590 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) |
| 586 { | 591 { |
| 587 visitor->trace(m_mediaKeys); | 592 visitor->trace(m_mediaKeys); |
| 588 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); | 593 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); |
| 589 } | 594 } |
| 590 | 595 |
| 591 } // namespace blink | 596 } // namespace blink |
| OLD | NEW |