Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(10)

Side by Side Diff: Source/modules/encryptedmedia/HTMLMediaElementEncryptedMedia.cpp

Issue 1055503002: Eliminate MediaPlayer & MediaPlayerClient abstractions (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Patch cleanup and review comments fix Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698