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 "modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h" | 5 #include "modules/encryptedmedia/HTMLMediaElementEncryptedMedia.h" |
6 | 6 |
7 #include "bindings/core/v8/ExceptionState.h" | 7 #include "bindings/core/v8/ExceptionState.h" |
8 #include "bindings/core/v8/ScriptPromise.h" | 8 #include "bindings/core/v8/ScriptPromise.h" |
9 #include "bindings/core/v8/ScriptPromiseResolver.h" | 9 #include "bindings/core/v8/ScriptPromiseResolver.h" |
10 #include "bindings/core/v8/ScriptState.h" | 10 #include "bindings/core/v8/ScriptState.h" |
11 #include "bindings/core/v8/V8Binding.h" | 11 #include "bindings/core/v8/V8Binding.h" |
12 #include "core/dom/DOMException.h" | 12 #include "core/dom/DOMException.h" |
13 #include "core/dom/DOMTypedArray.h" | 13 #include "core/dom/DOMTypedArray.h" |
14 #include "core/dom/ExceptionCode.h" | 14 #include "core/dom/ExceptionCode.h" |
15 #include "core/html/HTMLMediaElement.h" | 15 #include "core/html/HTMLMediaElement.h" |
16 #include "core/html/MediaKeyError.h" | |
17 #include "core/html/MediaKeyEvent.h" | |
18 #include "modules/encryptedmedia/ContentDecryptionModuleResultPromise.h" | 16 #include "modules/encryptedmedia/ContentDecryptionModuleResultPromise.h" |
19 #include "modules/encryptedmedia/EncryptedMediaUtils.h" | 17 #include "modules/encryptedmedia/EncryptedMediaUtils.h" |
20 #include "modules/encryptedmedia/MediaEncryptedEvent.h" | 18 #include "modules/encryptedmedia/MediaEncryptedEvent.h" |
21 #include "modules/encryptedmedia/MediaKeys.h" | 19 #include "modules/encryptedmedia/MediaKeys.h" |
22 #include "platform/ContentDecryptionModuleResult.h" | 20 #include "platform/ContentDecryptionModuleResult.h" |
23 #include "platform/Logging.h" | 21 #include "platform/Logging.h" |
24 #include "platform/RuntimeEnabledFeatures.h" | 22 #include "platform/RuntimeEnabledFeatures.h" |
25 #include "wtf/Functional.h" | 23 #include "wtf/Functional.h" |
26 | 24 |
27 namespace blink { | 25 namespace blink { |
28 | 26 |
29 static void throwExceptionIfMediaKeyExceptionOccurred(const String& keySystem, c
onst String& sessionId, WebMediaPlayer::MediaKeyException exception, ExceptionSt
ate& exceptionState) | |
30 { | |
31 switch (exception) { | |
32 case WebMediaPlayer::MediaKeyExceptionNoError: | |
33 return; | |
34 case WebMediaPlayer::MediaKeyExceptionInvalidPlayerState: | |
35 exceptionState.throwDOMException(InvalidStateError, "The player is in an
invalid state."); | |
36 return; | |
37 case WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported: | |
38 exceptionState.throwDOMException(NotSupportedError, "The key system prov
ided ('" + keySystem +"') is not supported."); | |
39 return; | |
40 case WebMediaPlayer::MediaKeyExceptionInvalidAccess: | |
41 exceptionState.throwDOMException(InvalidAccessError, "The session ID pro
vided ('" + sessionId + "') is invalid."); | |
42 return; | |
43 } | |
44 | |
45 ASSERT_NOT_REACHED(); | |
46 return; | |
47 } | |
48 | |
49 // This class allows MediaKeys to be set asynchronously. | 27 // This class allows MediaKeys to be set asynchronously. |
50 class SetMediaKeysHandler : public ScriptPromiseResolver { | 28 class SetMediaKeysHandler : public ScriptPromiseResolver { |
51 WTF_MAKE_NONCOPYABLE(SetMediaKeysHandler); | 29 WTF_MAKE_NONCOPYABLE(SetMediaKeysHandler); |
52 public: | 30 public: |
53 static ScriptPromise create(ScriptState*, HTMLMediaElement&, MediaKeys*); | 31 static ScriptPromise create(ScriptState*, HTMLMediaElement&, MediaKeys*); |
54 ~SetMediaKeysHandler() override; | 32 ~SetMediaKeysHandler() override; |
55 | 33 |
56 DECLARE_VIRTUAL_TRACE(); | 34 DECLARE_VIRTUAL_TRACE(); |
57 | 35 |
58 private: | 36 private: |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 | 263 |
286 DEFINE_TRACE(SetMediaKeysHandler) | 264 DEFINE_TRACE(SetMediaKeysHandler) |
287 { | 265 { |
288 visitor->trace(m_element); | 266 visitor->trace(m_element); |
289 visitor->trace(m_newMediaKeys); | 267 visitor->trace(m_newMediaKeys); |
290 ScriptPromiseResolver::trace(visitor); | 268 ScriptPromiseResolver::trace(visitor); |
291 } | 269 } |
292 | 270 |
293 HTMLMediaElementEncryptedMedia::HTMLMediaElementEncryptedMedia(HTMLMediaElement&
element) | 271 HTMLMediaElementEncryptedMedia::HTMLMediaElementEncryptedMedia(HTMLMediaElement&
element) |
294 : m_mediaElement(&element) | 272 : m_mediaElement(&element) |
295 , m_emeMode(EmeModeNotSelected) | |
296 , m_isWaitingForKey(false) | 273 , m_isWaitingForKey(false) |
297 { | 274 { |
298 } | 275 } |
299 | 276 |
300 HTMLMediaElementEncryptedMedia::~HTMLMediaElementEncryptedMedia() | 277 HTMLMediaElementEncryptedMedia::~HTMLMediaElementEncryptedMedia() |
301 { | 278 { |
302 #if !ENABLE(OILPAN) | 279 #if !ENABLE(OILPAN) |
303 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::~HTMLMediaElementEncryptedMe
dia"); | 280 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::~HTMLMediaElementEncryptedMe
dia"); |
304 if (m_mediaKeys) | 281 if (m_mediaKeys) |
305 m_mediaKeys->clearMediaElement(); | 282 m_mediaKeys->clearMediaElement(); |
306 #endif | 283 #endif |
307 } | 284 } |
308 | 285 |
309 const char* HTMLMediaElementEncryptedMedia::supplementName() | 286 const char* HTMLMediaElementEncryptedMedia::supplementName() |
310 { | 287 { |
311 return "HTMLMediaElementEncryptedMedia"; | 288 return "HTMLMediaElementEncryptedMedia"; |
312 } | 289 } |
313 | 290 |
314 HTMLMediaElementEncryptedMedia& HTMLMediaElementEncryptedMedia::from(HTMLMediaEl
ement& element) | 291 HTMLMediaElementEncryptedMedia& HTMLMediaElementEncryptedMedia::from(HTMLMediaEl
ement& element) |
315 { | 292 { |
316 HTMLMediaElementEncryptedMedia* supplement = static_cast<HTMLMediaElementEnc
ryptedMedia*>(WillBeHeapSupplement<HTMLMediaElement>::from(element, supplementNa
me())); | 293 HTMLMediaElementEncryptedMedia* supplement = static_cast<HTMLMediaElementEnc
ryptedMedia*>(WillBeHeapSupplement<HTMLMediaElement>::from(element, supplementNa
me())); |
317 if (!supplement) { | 294 if (!supplement) { |
318 supplement = new HTMLMediaElementEncryptedMedia(element); | 295 supplement = new HTMLMediaElementEncryptedMedia(element); |
319 provideTo(element, supplementName(), adoptPtrWillBeNoop(supplement)); | 296 provideTo(element, supplementName(), adoptPtrWillBeNoop(supplement)); |
320 } | 297 } |
321 return *supplement; | 298 return *supplement; |
322 } | 299 } |
323 | 300 |
324 bool HTMLMediaElementEncryptedMedia::setEmeMode(EmeMode emeMode) | |
325 { | |
326 if (m_emeMode != EmeModeNotSelected && m_emeMode != emeMode) | |
327 return false; | |
328 | |
329 m_emeMode = emeMode; | |
330 return true; | |
331 } | |
332 | |
333 MediaKeys* HTMLMediaElementEncryptedMedia::mediaKeys(HTMLMediaElement& element) | 301 MediaKeys* HTMLMediaElementEncryptedMedia::mediaKeys(HTMLMediaElement& element) |
334 { | 302 { |
335 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia
::from(element); | 303 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia
::from(element); |
336 return thisElement.m_mediaKeys.get(); | 304 return thisElement.m_mediaKeys.get(); |
337 } | 305 } |
338 | 306 |
339 ScriptPromise HTMLMediaElementEncryptedMedia::setMediaKeys(ScriptState* scriptSt
ate, HTMLMediaElement& element, MediaKeys* mediaKeys) | 307 ScriptPromise HTMLMediaElementEncryptedMedia::setMediaKeys(ScriptState* scriptSt
ate, HTMLMediaElement& element, MediaKeys* mediaKeys) |
340 { | 308 { |
341 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia
::from(element); | 309 HTMLMediaElementEncryptedMedia& thisElement = HTMLMediaElementEncryptedMedia
::from(element); |
342 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::setMediaKeys current(%p), ne
w(%p)", thisElement.m_mediaKeys.get(), mediaKeys); | 310 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::setMediaKeys current(%p), ne
w(%p)", thisElement.m_mediaKeys.get(), mediaKeys); |
343 | 311 |
344 if (!thisElement.setEmeMode(EmeModeUnprefixed)) | |
345 return ScriptPromise::rejectWithDOMException(scriptState, DOMException::
create(InvalidStateError, "Mixed use of EME prefixed and unprefixed API not allo
wed.")); | |
346 | |
347 // 1. If mediaKeys and the mediaKeys attribute are the same object, return | 312 // 1. If mediaKeys and the mediaKeys attribute are the same object, return |
348 // a promise resolved with undefined. | 313 // a promise resolved with undefined. |
349 if (thisElement.m_mediaKeys == mediaKeys) | 314 if (thisElement.m_mediaKeys == mediaKeys) |
350 return ScriptPromise::cast(scriptState, v8::Undefined(scriptState->isola
te())); | 315 return ScriptPromise::cast(scriptState, v8::Undefined(scriptState->isola
te())); |
351 | 316 |
352 // 2. Let promise be a new promise. Remaining steps done in handler. | 317 // 2. Let promise be a new promise. Remaining steps done in handler. |
353 return SetMediaKeysHandler::create(scriptState, element, mediaKeys); | 318 return SetMediaKeysHandler::create(scriptState, element, mediaKeys); |
354 } | 319 } |
355 | 320 |
356 // Create a MediaEncryptedEvent for WD EME. | 321 // Create a MediaEncryptedEvent for WD EME. |
357 static PassRefPtrWillBeRawPtr<Event> createEncryptedEvent(WebEncryptedMediaInitD
ataType initDataType, const unsigned char* initData, unsigned initDataLength) | 322 static PassRefPtrWillBeRawPtr<Event> createEncryptedEvent(WebEncryptedMediaInitD
ataType initDataType, const unsigned char* initData, unsigned initDataLength) |
358 { | 323 { |
359 MediaEncryptedEventInit initializer; | 324 MediaEncryptedEventInit initializer; |
360 initializer.setInitDataType(EncryptedMediaUtils::convertFromInitDataType(ini
tDataType)); | 325 initializer.setInitDataType(EncryptedMediaUtils::convertFromInitDataType(ini
tDataType)); |
361 initializer.setInitData(DOMArrayBuffer::create(initData, initDataLength)); | 326 initializer.setInitData(DOMArrayBuffer::create(initData, initDataLength)); |
362 initializer.setBubbles(false); | 327 initializer.setBubbles(false); |
363 initializer.setCancelable(false); | 328 initializer.setCancelable(false); |
364 | 329 |
365 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); | 330 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); |
366 } | 331 } |
367 | 332 |
368 // Create a 'needkey' MediaKeyEvent for v0.1b EME. | |
369 static PassRefPtrWillBeRawPtr<Event> createWebkitNeedKeyEvent(const unsigned cha
r* initData, unsigned initDataLength) | |
370 { | |
371 MediaKeyEventInit webkitInitializer; | |
372 webkitInitializer.setInitData(DOMUint8Array::create(initData, initDataLength
)); | |
373 | |
374 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize
r); | |
375 } | |
376 | |
377 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
element, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionS
tate& exceptionState) | |
378 { | |
379 HTMLMediaElementEncryptedMedia::from(element).generateKeyRequest(element.web
MediaPlayer(), keySystem, initData, exceptionState); | |
380 } | |
381 | |
382 void HTMLMediaElementEncryptedMedia::generateKeyRequest(WebMediaPlayer* webMedia
Player, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionSt
ate& exceptionState) | |
383 { | |
384 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest"); | |
385 | |
386 if (!setEmeMode(EmeModePrefixed)) { | |
387 exceptionState.throwDOMException(InvalidStateError, "Mixed use of EME pr
efixed and unprefixed API not allowed."); | |
388 return; | |
389 } | |
390 | |
391 if (keySystem.isEmpty()) { | |
392 exceptionState.throwDOMException(SyntaxError, "The key system provided i
s empty."); | |
393 return; | |
394 } | |
395 | |
396 if (!webMediaPlayer) { | |
397 exceptionState.throwDOMException(InvalidStateError, "No media has been l
oaded."); | |
398 return; | |
399 } | |
400 | |
401 const unsigned char* initDataPointer = 0; | |
402 unsigned initDataLength = 0; | |
403 if (initData) { | |
404 initDataPointer = initData->data(); | |
405 initDataLength = initData->length(); | |
406 } | |
407 | |
408 WebMediaPlayer::MediaKeyException result = webMediaPlayer->generateKeyReques
t(keySystem, initDataPointer, initDataLength); | |
409 throwExceptionIfMediaKeyExceptionOccurred(keySystem, String(), result, excep
tionState); | |
410 } | |
411 | |
412 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement&
mediaElement, const String& keySystem, ExceptionState& exceptionState) | |
413 { | |
414 webkitGenerateKeyRequest(mediaElement, keySystem, DOMUint8Array::create(0),
exceptionState); | |
415 } | |
416 | |
417 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& element, con
st String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> i
nitData, const String& sessionId, ExceptionState& exceptionState) | |
418 { | |
419 HTMLMediaElementEncryptedMedia::from(element).addKey(element.webMediaPlayer(
), keySystem, key, initData, sessionId, exceptionState); | |
420 } | |
421 | |
422 void HTMLMediaElementEncryptedMedia::addKey(WebMediaPlayer* webMediaPlayer, cons
t String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> in
itData, const String& sessionId, ExceptionState& exceptionState) | |
423 { | |
424 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitAddKey"); | |
425 | |
426 if (!setEmeMode(EmeModePrefixed)) { | |
427 exceptionState.throwDOMException(InvalidStateError, "Mixed use of EME pr
efixed and unprefixed API not allowed."); | |
428 return; | |
429 } | |
430 | |
431 if (keySystem.isEmpty()) { | |
432 exceptionState.throwDOMException(SyntaxError, "The key system provided i
s empty."); | |
433 return; | |
434 } | |
435 | |
436 if (!key) { | |
437 exceptionState.throwDOMException(SyntaxError, "The key provided is inval
id."); | |
438 return; | |
439 } | |
440 | |
441 if (!key->length()) { | |
442 exceptionState.throwDOMException(TypeMismatchError, "The key provided is
invalid."); | |
443 return; | |
444 } | |
445 | |
446 if (!webMediaPlayer) { | |
447 exceptionState.throwDOMException(InvalidStateError, "No media has been l
oaded."); | |
448 return; | |
449 } | |
450 | |
451 const unsigned char* initDataPointer = 0; | |
452 unsigned initDataLength = 0; | |
453 if (initData) { | |
454 initDataPointer = initData->data(); | |
455 initDataLength = initData->length(); | |
456 } | |
457 | |
458 WebMediaPlayer::MediaKeyException result = webMediaPlayer->addKey(keySystem,
key->data(), key->length(), initDataPointer, initDataLength, sessionId); | |
459 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce
ptionState); | |
460 } | |
461 | |
462 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& mediaElement
, const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState& except
ionState) | |
463 { | |
464 webkitAddKey(mediaElement, keySystem, key, DOMUint8Array::create(0), String(
), exceptionState); | |
465 } | |
466 | |
467 void HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest(HTMLMediaElement& el
ement, const String& keySystem, const String& sessionId, ExceptionState& excepti
onState) | |
468 { | |
469 HTMLMediaElementEncryptedMedia::from(element).cancelKeyRequest(element.webMe
diaPlayer(), keySystem, sessionId, exceptionState); | |
470 } | |
471 | |
472 void HTMLMediaElementEncryptedMedia::cancelKeyRequest(WebMediaPlayer* webMediaPl
ayer, const String& keySystem, const String& sessionId, ExceptionState& exceptio
nState) | |
473 { | |
474 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest"); | |
475 | |
476 if (!setEmeMode(EmeModePrefixed)) { | |
477 exceptionState.throwDOMException(InvalidStateError, "Mixed use of EME pr
efixed and unprefixed API not allowed."); | |
478 return; | |
479 } | |
480 | |
481 if (keySystem.isEmpty()) { | |
482 exceptionState.throwDOMException(SyntaxError, "The key system provided i
s empty."); | |
483 return; | |
484 } | |
485 | |
486 if (!webMediaPlayer) { | |
487 exceptionState.throwDOMException(InvalidStateError, "No media has been l
oaded."); | |
488 return; | |
489 } | |
490 | |
491 WebMediaPlayer::MediaKeyException result = webMediaPlayer->cancelKeyRequest(
keySystem, sessionId); | |
492 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce
ptionState); | |
493 } | |
494 | |
495 void HTMLMediaElementEncryptedMedia::keyAdded(const WebString& keySystem, const
WebString& sessionId) | |
496 { | |
497 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyAdded"); | |
498 | |
499 MediaKeyEventInit initializer; | |
500 initializer.setKeySystem(keySystem); | |
501 initializer.setSessionId(sessionId); | |
502 | |
503 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk
itkeyadded, initializer); | |
504 event->setTarget(m_mediaElement); | |
505 m_mediaElement->scheduleEvent(event.release()); | |
506 } | |
507 | |
508 void HTMLMediaElementEncryptedMedia::keyError(const WebString& keySystem, const
WebString& sessionId, WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCode erro
rCode, unsigned short systemCode) | |
509 { | |
510 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyError: session
ID=%s, errorCode=%d, systemCode=%d", sessionId.utf8().data(), errorCode, systemC
ode); | |
511 | |
512 MediaKeyError::Code mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; | |
513 switch (errorCode) { | |
514 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeUnknown: | |
515 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_UNKNOWN; | |
516 break; | |
517 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeClient: | |
518 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_CLIENT; | |
519 break; | |
520 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeService: | |
521 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_SERVICE; | |
522 break; | |
523 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeOutput: | |
524 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_OUTPUT; | |
525 break; | |
526 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeHardwareChange: | |
527 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_HARDWARECHANGE; | |
528 break; | |
529 case WebMediaPlayerEncryptedMediaClient::MediaKeyErrorCodeDomain: | |
530 mediaKeyErrorCode = MediaKeyError::MEDIA_KEYERR_DOMAIN; | |
531 break; | |
532 } | |
533 | |
534 MediaKeyEventInit initializer; | |
535 initializer.setKeySystem(keySystem); | |
536 initializer.setSessionId(sessionId); | |
537 initializer.setErrorCode(MediaKeyError::create(mediaKeyErrorCode)); | |
538 initializer.setSystemCode(systemCode); | |
539 | |
540 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk
itkeyerror, initializer); | |
541 event->setTarget(m_mediaElement); | |
542 m_mediaElement->scheduleEvent(event.release()); | |
543 } | |
544 | |
545 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons
t WebString& sessionId, const unsigned char* message, unsigned messageLength, co
nst WebURL& defaultURL) | |
546 { | |
547 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi
onID=%s", sessionId.utf8().data()); | |
548 | |
549 MediaKeyEventInit initializer; | |
550 initializer.setKeySystem(keySystem); | |
551 initializer.setSessionId(sessionId); | |
552 initializer.setMessage(DOMUint8Array::create(message, messageLength)); | |
553 initializer.setDefaultURL(KURL(defaultURL)); | |
554 | |
555 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk
itkeymessage, initializer); | |
556 event->setTarget(m_mediaElement); | |
557 m_mediaElement->scheduleEvent(event.release()); | |
558 } | |
559 | |
560 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini
tDataType, const unsigned char* initData, unsigned initDataLength) | 333 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini
tDataType, const unsigned char* initData, unsigned initDataLength) |
561 { | 334 { |
562 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); | 335 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); |
563 | 336 |
564 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { | 337 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { |
565 // Send event for WD EME. | 338 // Send event for WD EME. |
566 RefPtrWillBeRawPtr<Event> event; | 339 RefPtrWillBeRawPtr<Event> event; |
567 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC
ontext()->securityOrigin())) { | 340 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC
ontext()->securityOrigin())) { |
568 event = createEncryptedEvent(initDataType, initData, initDataLength)
; | 341 event = createEncryptedEvent(initDataType, initData, initDataLength)
; |
569 } else { | 342 } else { |
570 // Current page is not allowed to see content from the media file, | 343 // Current page is not allowed to see content from the media file, |
571 // so don't return the initData. However, they still get an event. | 344 // so don't return the initData. However, they still get an event. |
572 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown,
nullptr, 0); | 345 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown,
nullptr, 0); |
573 } | 346 } |
574 | 347 |
575 event->setTarget(m_mediaElement); | 348 event->setTarget(m_mediaElement); |
576 m_mediaElement->scheduleEvent(event.release()); | 349 m_mediaElement->scheduleEvent(event.release()); |
577 } | 350 } |
578 | |
579 if (RuntimeEnabledFeatures::prefixedEncryptedMediaEnabled()) { | |
580 // Send event for v0.1b EME. | |
581 RefPtrWillBeRawPtr<Event> event = createWebkitNeedKeyEvent(initData, ini
tDataLength); | |
582 event->setTarget(m_mediaElement); | |
583 m_mediaElement->scheduleEvent(event.release()); | |
584 } | |
585 } | 351 } |
586 | 352 |
587 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey() | 353 void HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKey() |
588 { | 354 { |
589 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe
y"); | 355 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::didBlockPlaybackWaitingForKe
y"); |
590 | 356 |
591 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey: | 357 // From https://w3c.github.io/encrypted-media/#queue-waitingforkey: |
592 // It should only be called when the HTMLMediaElement object is potentially | 358 // It should only be called when the HTMLMediaElement object is potentially |
593 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater. | 359 // playing and its readyState is equal to HAVE_FUTURE_DATA or greater. |
594 // FIXME: Is this really required? | 360 // FIXME: Is this really required? |
(...skipping 30 matching lines...) Expand all Loading... |
625 } | 391 } |
626 | 392 |
627 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) | 393 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) |
628 { | 394 { |
629 visitor->trace(m_mediaElement); | 395 visitor->trace(m_mediaElement); |
630 visitor->trace(m_mediaKeys); | 396 visitor->trace(m_mediaKeys); |
631 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); | 397 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); |
632 } | 398 } |
633 | 399 |
634 } // namespace blink | 400 } // namespace blink |
OLD | NEW |