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 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
288 fail(code, errorMessage); | 288 fail(code, errorMessage); |
289 } | 289 } |
290 | 290 |
291 DEFINE_TRACE(SetMediaKeysHandler) | 291 DEFINE_TRACE(SetMediaKeysHandler) |
292 { | 292 { |
293 visitor->trace(m_element); | 293 visitor->trace(m_element); |
294 visitor->trace(m_newMediaKeys); | 294 visitor->trace(m_newMediaKeys); |
295 ScriptPromiseResolver::trace(visitor); | 295 ScriptPromiseResolver::trace(visitor); |
296 } | 296 } |
297 | 297 |
298 HTMLMediaElementEncryptedMedia::HTMLMediaElementEncryptedMedia() | 298 HTMLMediaElementEncryptedMedia::HTMLMediaElementEncryptedMedia(HTMLMediaElement& element) |
299 : m_emeMode(EmeModeNotSelected) | 299 : m_mediaElement(element) |
300 , m_emeMode(EmeModeNotSelected) | |
300 , m_isWaitingForKey(false) | 301 , m_isWaitingForKey(false) |
301 { | 302 { |
302 } | 303 } |
303 | 304 |
304 #if !ENABLE(OILPAN) | 305 #if !ENABLE(OILPAN) |
305 HTMLMediaElementEncryptedMedia::~HTMLMediaElementEncryptedMedia() | 306 HTMLMediaElementEncryptedMedia::~HTMLMediaElementEncryptedMedia() |
306 { | 307 { |
307 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::~HTMLMediaElementEncryptedMe dia"); | 308 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::~HTMLMediaElementEncryptedMe dia"); |
308 if (m_mediaKeys) | 309 if (m_mediaKeys) |
309 m_mediaKeys->clearMediaElement(); | 310 m_mediaKeys->clearMediaElement(); |
310 } | 311 } |
311 #endif | 312 #endif |
312 | 313 |
313 const char* HTMLMediaElementEncryptedMedia::supplementName() | 314 const char* HTMLMediaElementEncryptedMedia::supplementName() |
314 { | 315 { |
315 return "HTMLMediaElementEncryptedMedia"; | 316 return "HTMLMediaElementEncryptedMedia"; |
316 } | 317 } |
317 | 318 |
318 HTMLMediaElementEncryptedMedia& HTMLMediaElementEncryptedMedia::from(HTMLMediaEl ement& element) | 319 HTMLMediaElementEncryptedMedia& HTMLMediaElementEncryptedMedia::from(HTMLMediaEl ement& element) |
319 { | 320 { |
320 HTMLMediaElementEncryptedMedia* supplement = static_cast<HTMLMediaElementEnc ryptedMedia*>(WillBeHeapSupplement<HTMLMediaElement>::from(element, supplementNa me())); | 321 HTMLMediaElementEncryptedMedia* supplement = static_cast<HTMLMediaElementEnc ryptedMedia*>(WillBeHeapSupplement<HTMLMediaElement>::from(element, supplementNa me())); |
321 if (!supplement) { | 322 if (!supplement) { |
322 supplement = new HTMLMediaElementEncryptedMedia(); | 323 supplement = new HTMLMediaElementEncryptedMedia(element); |
323 provideTo(element, supplementName(), adoptPtrWillBeNoop(supplement)); | 324 provideTo(element, supplementName(), adoptPtrWillBeNoop(supplement)); |
324 } | 325 } |
325 return *supplement; | 326 return *supplement; |
326 } | 327 } |
327 | 328 |
328 bool HTMLMediaElementEncryptedMedia::setEmeMode(EmeMode emeMode) | 329 bool HTMLMediaElementEncryptedMedia::setEmeMode(EmeMode emeMode) |
329 { | 330 { |
330 if (m_emeMode != EmeModeNotSelected && m_emeMode != emeMode) | 331 if (m_emeMode != EmeModeNotSelected && m_emeMode != emeMode) |
331 return false; | 332 return false; |
332 | 333 |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
494 | 495 |
495 if (!webMediaPlayer) { | 496 if (!webMediaPlayer) { |
496 exceptionState.throwDOMException(InvalidStateError, "No media has been l oaded."); | 497 exceptionState.throwDOMException(InvalidStateError, "No media has been l oaded."); |
497 return; | 498 return; |
498 } | 499 } |
499 | 500 |
500 WebMediaPlayer::MediaKeyException result = webMediaPlayer->cancelKeyRequest( keySystem, sessionId); | 501 WebMediaPlayer::MediaKeyException result = webMediaPlayer->cancelKeyRequest( keySystem, sessionId); |
501 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState); | 502 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState); |
502 } | 503 } |
503 | 504 |
504 void HTMLMediaElementEncryptedMedia::keyAdded(HTMLMediaElement& element, const S tring& keySystem, const String& sessionId) | 505 void HTMLMediaElementEncryptedMedia::keyAdded(const WebString& keySystem, const WebString& sessionId) |
505 { | 506 { |
506 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyAdded"); | 507 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyAdded"); |
507 | 508 |
508 MediaKeyEventInit initializer; | 509 MediaKeyEventInit initializer; |
509 initializer.setKeySystem(keySystem); | 510 initializer.setKeySystem(keySystem); |
510 initializer.setSessionId(sessionId); | 511 initializer.setSessionId(sessionId); |
511 | 512 |
512 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyadded, initializer); | 513 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyadded, initializer); |
513 event->setTarget(&element); | 514 event->setTarget(&m_mediaElement); |
514 element.scheduleEvent(event.release()); | 515 m_mediaElement.scheduleEvent(event.release()); |
515 } | 516 } |
516 | 517 |
517 void HTMLMediaElementEncryptedMedia::keyError(HTMLMediaElement& element, const S tring& keySystem, const String& sessionId, WebMediaPlayerClient::MediaKeyErrorCo de errorCode, unsigned short systemCode) | 518 void HTMLMediaElementEncryptedMedia::keyError(const WebString& keySystem, const WebString& sessionId, WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCode erro rCode, unsigned short systemCode) |
518 { | 519 { |
519 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyError: session ID=%s, errorCode=%d, systemCode=%d", sessionId.utf8().data(), errorCode, systemC ode); | 520 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyError: session ID=%s, errorCode=%d, systemCode=%d", sessionId.utf8().data(), errorCode, systemC ode); |
520 | 521 |
521 MediaKeyError::Code mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; | 522 MediaKeyError::Code mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; |
522 switch (errorCode) { | 523 switch (errorCode) { |
523 case WebMediaPlayerClient::MediaKeyErrorCodeUnknown: | 524 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeUnknown: |
524 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; | 525 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; |
525 break; | 526 break; |
526 case WebMediaPlayerClient::MediaKeyErrorCodeClient: | 527 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeClient: |
527 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_CLIENT; | 528 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_CLIENT; |
528 break; | 529 break; |
529 case WebMediaPlayerClient::MediaKeyErrorCodeService: | 530 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeService: |
530 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_SERVICE; | 531 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_SERVICE; |
531 break; | 532 break; |
532 case WebMediaPlayerClient::MediaKeyErrorCodeOutput: | 533 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeOutput: |
533 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_OUTPUT; | 534 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_OUTPUT; |
534 break; | 535 break; |
535 case WebMediaPlayerClient::MediaKeyErrorCodeHardwareChange: | 536 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeHardwareChange: |
536 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_HARDWARECHANGE; | 537 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_HARDWARECHANGE; |
537 break; | 538 break; |
538 case WebMediaPlayerClient::MediaKeyErrorCodeDomain: | 539 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeDomain: |
539 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_DOMAIN; | 540 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_DOMAIN; |
540 break; | 541 break; |
541 } | 542 } |
542 | 543 |
543 MediaKeyEventInit initializer; | 544 MediaKeyEventInit initializer; |
544 initializer.setKeySystem(keySystem); | 545 initializer.setKeySystem(keySystem); |
545 initializer.setSessionId(sessionId); | 546 initializer.setSessionId(sessionId); |
546 initializer.setErrorCode(MediaKeyError::create(mediaKeyErrorCode)); | 547 initializer.setErrorCode(MediaKeyError::create(mediaKeyErrorCode)); |
547 initializer.setSystemCode(systemCode); | 548 initializer.setSystemCode(systemCode); |
548 | 549 |
549 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyerror, initializer); | 550 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyerror, initializer); |
550 event->setTarget(&element); | 551 event->setTarget(&m_mediaElement); |
551 element.scheduleEvent(event.release()); | 552 m_mediaElement.scheduleEvent(event.release()); |
552 } | 553 } |
553 | 554 |
554 void HTMLMediaElementEncryptedMedia::keyMessage(HTMLMediaElement& element, const String& keySystem, const String& sessionId, const unsigned char* message, unsig ned messageLength, const WebURL& defaultURL) | 555 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons t WebString& sessionId, const unsigned char* message, unsigned messageLength, co nst WebURL& defaultURL) |
555 { | 556 { |
556 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data()); | 557 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data()); |
557 | 558 |
558 MediaKeyEventInit initializer; | 559 MediaKeyEventInit initializer; |
559 initializer.setKeySystem(keySystem); | 560 initializer.setKeySystem(keySystem); |
560 initializer.setSessionId(sessionId); | 561 initializer.setSessionId(sessionId); |
561 initializer.setMessage(DOMUint8Array::create(message, messageLength)); | 562 initializer.setMessage(DOMUint8Array::create(message, messageLength)); |
562 initializer.setDefaultURL(KURL(defaultURL)); | 563 initializer.setDefaultURL(KURL(defaultURL)); |
563 | 564 |
564 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer); | 565 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer); |
565 event->setTarget(&element); | 566 event->setTarget(&m_mediaElement); |
566 element.scheduleEvent(event.release()); | 567 m_mediaElement.scheduleEvent(event.release()); |
567 } | 568 } |
568 | 569 |
569 void HTMLMediaElementEncryptedMedia::encrypted(HTMLMediaElement& element, WebEnc ryptedMediaInitDataType initDataType, const unsigned char* initData, unsigned in itDataLength) | 570 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini tDataType, const unsigned char* initData, unsigned initDataLength) |
570 { | 571 { |
571 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); | 572 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); |
572 | 573 |
573 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { | 574 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { |
574 // Send event for WD EME. | 575 // Send event for WD EME. |
575 RefPtrWillBeRawPtr<Event> event; | 576 RefPtrWillBeRawPtr<Event> event; |
576 if (element.isMediaDataCORSSameOrigin(element.executionContext()->securi tyOrigin())) { | 577 if (m_mediaElement.isMediaDataCORSSameOrigin(m_mediaElement.executionCon text()->securityOrigin())) { |
577 event = createEncryptedEvent(initDataType, initData, initDataLength) ; | 578 event = createEncryptedEvent(initDataType, initData, initDataLength) ; |
578 } else { | 579 } else { |
579 // Current page is not allowed to see content from the media file, | 580 // Current page is not allowed to see content from the media file, |
580 // so don't return the initData. However, they still get an event. | 581 // so don't return the initData. However, they still get an event. |
581 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0); | 582 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0); |
582 } | 583 } |
583 | 584 |
584 event->setTarget(&element); | 585 event->setTarget(&m_mediaElement); |
585 element.scheduleEvent(event.release()); | 586 m_mediaElement.scheduleEvent(event.release()); |
586 } | 587 } |
587 | 588 |
588 if (RuntimeEnabledFeatures::prefixedEncryptedMediaEnabled()) { | 589 if (RuntimeEnabledFeatures::prefixedEncryptedMediaEnabled()) { |
589 // Send event for v0.1b EME. | 590 // Send event for v0.1b EME. |
590 RefPtrWillBeRawPtr<Event> event = createWebkitNeedKeyEvent(initData, ini tDataLength); | 591 RefPtrWillBeRawPtr<Event> event = createWebkitNeedKeyEvent(initData, ini tDataLength); |
591 event->setTarget(&element); | 592 event->setTarget(&m_mediaElement); |
592 element.scheduleEvent(event.release()); | 593 m_mediaElement.scheduleEvent(event.release()); |
593 } | 594 } |
594 } | 595 } |
595 | 596 |
596 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey(HTMLMediaElem ent& element) | 597 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey() |
597 { | 598 { |
598 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe y"); | 599 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe y"); |
599 | 600 |
600 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey: | 601 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey: |
601 // It should only be called when the HTMLMediaElement object is potentially | 602 // It should only be called when the HTMLMediaElement object is potentially |
602 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater. | 603 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater. |
603 // FIXME: Is this really required? | 604 // FIXME: Is this really required? |
604 | 605 |
605 // 1. Let the media element be the specified HTMLMediaElement object. | 606 // 1. Let the media element be the specified HTMLMediaElement object. |
606 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); | 607 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(m_mediaElement); |
ddorwin
2015/05/19 17:01:49
|thisElement| is just |this|. Access members direc
| |
607 | 608 |
608 // 2. If the media element's waiting for key value is false, queue a task | 609 // 2. If the media element's waiting for key value is false, queue a task |
609 // to fire a simple event named waitingforkey at the media element. | 610 // to fire a simple event named waitingforkey at the media element. |
610 if (!thisElement.m_isWaitingForKey) { | 611 if (!thisElement.m_isWaitingForKey) { |
611 RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::waitingf orkey); | 612 RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::waitingf orkey); |
612 event->setTarget(&element); | 613 event->setTarget(&m_mediaElement); |
613 element.scheduleEvent(event.release()); | 614 m_mediaElement.scheduleEvent(event.release()); |
614 } | 615 } |
615 | 616 |
616 // 3. Set the media element's waiting for key value to true. | 617 // 3. Set the media element's waiting for key value to true. |
617 thisElement.m_isWaitingForKey = true; | 618 thisElement.m_isWaitingForKey = true; |
618 | 619 |
619 // 4. Suspend playback. | 620 // 4. Suspend playback. |
620 // (Already done on the Chromium side by the decryptors.) | 621 // (Already done on the Chromium side by the decryptors.) |
621 } | 622 } |
622 | 623 |
623 void HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForKey(HTMLMediaEle ment& element) | 624 void HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForKey() |
624 { | 625 { |
625 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForK ey"); | 626 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForK ey"); |
626 | 627 |
627 // Logic is on the Chromium side to attempt to resume playback when a new | 628 // Logic is on the Chromium side to attempt to resume playback when a new |
628 // key is available. However, |m_isWaitingForKey| needs to be cleared so | 629 // key is available. However, |m_isWaitingForKey| needs to be cleared so |
629 // that a later waitingForKey() call can generate the event. | 630 // that a later waitingForKey() call can generate the event. |
630 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); | 631 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(m_mediaElement); |
ddorwin
2015/05/19 17:01:49
ditto
| |
631 thisElement.m_isWaitingForKey = false; | 632 thisElement.m_isWaitingForKey = false; |
632 } | 633 } |
633 | 634 |
634 WebContentDecryptionModule* HTMLMediaElementEncryptedMedia::contentDecryptionMod ule(HTMLMediaElement& element) | 635 WebContentDecryptionModule* HTMLMediaElementEncryptedMedia::contentDecryptionMod ule(HTMLMediaElement& element) |
635 { | 636 { |
636 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); | 637 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); |
637 return thisElement.contentDecryptionModule(); | 638 return thisElement.contentDecryptionModule(); |
638 } | 639 } |
639 | 640 |
640 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) | 641 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) |
641 { | 642 { |
642 visitor->trace(m_mediaKeys); | 643 visitor->trace(m_mediaKeys); |
643 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); | 644 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); |
644 } | 645 } |
645 | 646 |
646 } // namespace blink | 647 } // namespace blink |
OLD | NEW |