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

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: Added separate interface for EncryptedMedia 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 246 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698