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 |