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

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: Fixed review comments Created 5 years, 6 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
333 m_emeMode = emeMode; 334 m_emeMode = emeMode;
334 return true; 335 return true;
335 } 336 }
336 337
337 WebContentDecryptionModule* HTMLMediaElementEncryptedMedia::contentDecryptionMod ule()
338 {
339 return m_mediaKeys ? m_mediaKeys->contentDecryptionModule() : 0;
340 }
341
342 MediaKeys* HTMLMediaElementEncryptedMedia::mediaKeys(HTMLMediaElement& element) 338 MediaKeys* HTMLMediaElementEncryptedMedia::mediaKeys(HTMLMediaElement& element)
343 { 339 {
344 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); 340 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element);
345 return thisElement.m_mediaKeys.get(); 341 return thisElement.m_mediaKeys.get();
346 } 342 }
347 343
348 ScriptPromise HTMLMediaElementEncryptedMedia::setMediaKeys(ScriptState* scriptSt ate, HTMLMediaElement& element, MediaKeys* mediaKeys) 344 ScriptPromise HTMLMediaElementEncryptedMedia::setMediaKeys(ScriptState* scriptSt ate, HTMLMediaElement& element, MediaKeys* mediaKeys)
349 { 345 {
350 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); 346 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element);
351 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::setMediaKeys current(%p), ne w(%p)", thisElement.m_mediaKeys.get(), mediaKeys); 347 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::setMediaKeys current(%p), ne w(%p)", thisElement.m_mediaKeys.get(), mediaKeys);
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 490
495 if (!webMediaPlayer) { 491 if (!webMediaPlayer) {
496 exceptionState.throwDOMException(InvalidStateError, "No media has been l oaded."); 492 exceptionState.throwDOMException(InvalidStateError, "No media has been l oaded.");
497 return; 493 return;
498 } 494 }
499 495
500 WebMediaPlayer::MediaKeyException result = webMediaPlayer->cancelKeyRequest( keySystem, sessionId); 496 WebMediaPlayer::MediaKeyException result = webMediaPlayer->cancelKeyRequest( keySystem, sessionId);
501 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState); 497 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState);
502 } 498 }
503 499
504 void HTMLMediaElementEncryptedMedia::keyAdded(HTMLMediaElement& element, const S tring& keySystem, const String& sessionId) 500 void HTMLMediaElementEncryptedMedia::keyAdded(const WebString& keySystem, const WebString& sessionId)
505 { 501 {
506 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyAdded"); 502 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyAdded");
507 503
508 MediaKeyEventInit initializer; 504 MediaKeyEventInit initializer;
509 initializer.setKeySystem(keySystem); 505 initializer.setKeySystem(keySystem);
510 initializer.setSessionId(sessionId); 506 initializer.setSessionId(sessionId);
511 507
512 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyadded, initializer); 508 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyadded, initializer);
513 event->setTarget(&element); 509 event->setTarget(&m_mediaElement);
514 element.scheduleEvent(event.release()); 510 m_mediaElement.scheduleEvent(event.release());
515 } 511 }
516 512
517 void HTMLMediaElementEncryptedMedia::keyError(HTMLMediaElement& element, const S tring& keySystem, const String& sessionId, WebMediaPlayerClient::MediaKeyErrorCo de errorCode, unsigned short systemCode) 513 void HTMLMediaElementEncryptedMedia::keyError(const WebString& keySystem, const WebString& sessionId, WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCode erro rCode, unsigned short systemCode)
518 { 514 {
519 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyError: session ID=%s, errorCode=%d, systemCode=%d", sessionId.utf8().data(), errorCode, systemC ode); 515 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyError: session ID=%s, errorCode=%d, systemCode=%d", sessionId.utf8().data(), errorCode, systemC ode);
520 516
521 MediaKeyError::Code mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; 517 MediaKeyError::Code mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN;
522 switch (errorCode) { 518 switch (errorCode) {
523 case WebMediaPlayerClient::MediaKeyErrorCodeUnknown: 519 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeUnknown:
524 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; 520 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN;
525 break; 521 break;
526 case WebMediaPlayerClient::MediaKeyErrorCodeClient: 522 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeClient:
527 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_CLIENT; 523 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_CLIENT;
528 break; 524 break;
529 case WebMediaPlayerClient::MediaKeyErrorCodeService: 525 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeService:
530 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_SERVICE; 526 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_SERVICE;
531 break; 527 break;
532 case WebMediaPlayerClient::MediaKeyErrorCodeOutput: 528 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeOutput:
533 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_OUTPUT; 529 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_OUTPUT;
534 break; 530 break;
535 case WebMediaPlayerClient::MediaKeyErrorCodeHardwareChange: 531 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeHardwareChange:
536 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_HARDWARECHANGE; 532 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_HARDWARECHANGE;
537 break; 533 break;
538 case WebMediaPlayerClient::MediaKeyErrorCodeDomain: 534 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeDomain:
539 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_DOMAIN; 535 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_DOMAIN;
540 break; 536 break;
541 } 537 }
542 538
543 MediaKeyEventInit initializer; 539 MediaKeyEventInit initializer;
544 initializer.setKeySystem(keySystem); 540 initializer.setKeySystem(keySystem);
545 initializer.setSessionId(sessionId); 541 initializer.setSessionId(sessionId);
546 initializer.setErrorCode(MediaKeyError::create(mediaKeyErrorCode)); 542 initializer.setErrorCode(MediaKeyError::create(mediaKeyErrorCode));
547 initializer.setSystemCode(systemCode); 543 initializer.setSystemCode(systemCode);
548 544
549 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyerror, initializer); 545 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeyerror, initializer);
550 event->setTarget(&element); 546 event->setTarget(&m_mediaElement);
551 element.scheduleEvent(event.release()); 547 m_mediaElement.scheduleEvent(event.release());
552 } 548 }
553 549
554 void HTMLMediaElementEncryptedMedia::keyMessage(HTMLMediaElement& element, const String& keySystem, const String& sessionId, const unsigned char* message, unsig ned messageLength, const WebURL& defaultURL) 550 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons t WebString& sessionId, const unsigned char* message, unsigned messageLength, co nst WebURL& defaultURL)
555 { 551 {
556 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data()); 552 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data());
557 553
558 MediaKeyEventInit initializer; 554 MediaKeyEventInit initializer;
559 initializer.setKeySystem(keySystem); 555 initializer.setKeySystem(keySystem);
560 initializer.setSessionId(sessionId); 556 initializer.setSessionId(sessionId);
561 initializer.setMessage(DOMUint8Array::create(message, messageLength)); 557 initializer.setMessage(DOMUint8Array::create(message, messageLength));
562 initializer.setDefaultURL(KURL(defaultURL)); 558 initializer.setDefaultURL(KURL(defaultURL));
563 559
564 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer); 560 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer);
565 event->setTarget(&element); 561 event->setTarget(&m_mediaElement);
566 element.scheduleEvent(event.release()); 562 m_mediaElement.scheduleEvent(event.release());
567 } 563 }
568 564
569 void HTMLMediaElementEncryptedMedia::encrypted(HTMLMediaElement& element, WebEnc ryptedMediaInitDataType initDataType, const unsigned char* initData, unsigned in itDataLength) 565 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini tDataType, const unsigned char* initData, unsigned initDataLength)
570 { 566 {
571 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); 567 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted");
572 568
573 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { 569 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) {
574 // Send event for WD EME. 570 // Send event for WD EME.
575 RefPtrWillBeRawPtr<Event> event; 571 RefPtrWillBeRawPtr<Event> event;
576 if (element.isMediaDataCORSSameOrigin(element.executionContext()->securi tyOrigin())) { 572 if (m_mediaElement.isMediaDataCORSSameOrigin(m_mediaElement.executionCon text()->securityOrigin())) {
577 event = createEncryptedEvent(initDataType, initData, initDataLength) ; 573 event = createEncryptedEvent(initDataType, initData, initDataLength) ;
578 } else { 574 } else {
579 // Current page is not allowed to see content from the media file, 575 // 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. 576 // so don't return the initData. However, they still get an event.
581 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0); 577 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0);
582 } 578 }
583 579
584 event->setTarget(&element); 580 event->setTarget(&m_mediaElement);
585 element.scheduleEvent(event.release()); 581 m_mediaElement.scheduleEvent(event.release());
586 } 582 }
587 583
588 if (RuntimeEnabledFeatures::prefixedEncryptedMediaEnabled()) { 584 if (RuntimeEnabledFeatures::prefixedEncryptedMediaEnabled()) {
589 // Send event for v0.1b EME. 585 // Send event for v0.1b EME.
590 RefPtrWillBeRawPtr<Event> event = createWebkitNeedKeyEvent(initData, ini tDataLength); 586 RefPtrWillBeRawPtr<Event> event = createWebkitNeedKeyEvent(initData, ini tDataLength);
591 event->setTarget(&element); 587 event->setTarget(&m_mediaElement);
592 element.scheduleEvent(event.release()); 588 m_mediaElement.scheduleEvent(event.release());
593 } 589 }
594 } 590 }
595 591
596 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey(HTMLMediaElem ent& element) 592 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey()
597 { 593 {
598 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe y"); 594 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe y");
599 595
600 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey: 596 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey:
601 // It should only be called when the HTMLMediaElement object is potentially 597 // It should only be called when the HTMLMediaElement object is potentially
602 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater. 598 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater.
603 // FIXME: Is this really required? 599 // FIXME: Is this really required?
604 600
605 // 1. Let the media element be the specified HTMLMediaElement object. 601 // 1. Let the media element be the specified HTMLMediaElement object.
606 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); 602 // This is nothing but |this| element.
607 603
608 // 2. If the media element's waiting for key value is false, queue a task 604 // 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. 605 // to fire a simple event named waitingforkey at the media element.
610 if (!thisElement.m_isWaitingForKey) { 606 if (!m_isWaitingForKey) {
611 RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::waitingf orkey); 607 RefPtrWillBeRawPtr<Event> event = Event::create(EventTypeNames::waitingf orkey);
612 event->setTarget(&element); 608 event->setTarget(&m_mediaElement);
613 element.scheduleEvent(event.release()); 609 m_mediaElement.scheduleEvent(event.release());
614 } 610 }
615 611
616 // 3. Set the media element's waiting for key value to true. 612 // 3. Set the media element's waiting for key value to true.
617 thisElement.m_isWaitingForKey = true; 613 m_isWaitingForKey = true;
618 614
619 // 4. Suspend playback. 615 // 4. Suspend playback.
620 // (Already done on the Chromium side by the decryptors.) 616 // (Already done on the Chromium side by the decryptors.)
621 } 617 }
622 618
623 void HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForKey(HTMLMediaEle ment& element) 619 void HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForKey()
624 { 620 {
625 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForK ey"); 621 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didResumePlaybackBlockedForK ey");
626 622
627 // Logic is on the Chromium side to attempt to resume playback when a new 623 // 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 624 // key is available. However, |m_isWaitingForKey| needs to be cleared so
629 // that a later waitingForKey() call can generate the event. 625 // that a later waitingForKey() call can generate the event.
630 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); 626 m_isWaitingForKey = false;
631 thisElement.m_isWaitingForKey = false;
632 } 627 }
633 628
634 WebContentDecryptionModule* HTMLMediaElementEncryptedMedia::contentDecryptionMod ule(HTMLMediaElement& element) 629 WebContentDecryptionModule* HTMLMediaElementEncryptedMedia::contentDecryptionMod ule()
635 { 630 {
636 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia ::from(element); 631 return m_mediaKeys ? m_mediaKeys->contentDecryptionModule() : 0;
637 return thisElement.contentDecryptionModule();
638 } 632 }
639 633
640 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) 634 DEFINE_TRACE(HTMLMediaElementEncryptedMedia)
641 { 635 {
642 visitor->trace(m_mediaKeys); 636 visitor->trace(m_mediaKeys);
643 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); 637 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor);
644 } 638 }
645 639
646 } // namespace blink 640 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698