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

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

Powered by Google App Engine
This is Rietveld 408576698