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

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

Issue 1414553002: Fix out-of-memory crashes related to ArrayBuffer allocation Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 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 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 352
353 // 2. Let promise be a new promise. Remaining steps done in handler. 353 // 2. Let promise be a new promise. Remaining steps done in handler.
354 return SetMediaKeysHandler::create(scriptState, element, mediaKeys); 354 return SetMediaKeysHandler::create(scriptState, element, mediaKeys);
355 } 355 }
356 356
357 // Create a MediaEncryptedEvent for WD EME. 357 // Create a MediaEncryptedEvent for WD EME.
358 static PassRefPtrWillBeRawPtr<Event> createEncryptedEvent(WebEncryptedMediaInitD ataType initDataType, const unsigned char* initData, unsigned initDataLength) 358 static PassRefPtrWillBeRawPtr<Event> createEncryptedEvent(WebEncryptedMediaInitD ataType initDataType, const unsigned char* initData, unsigned initDataLength)
359 { 359 {
360 MediaEncryptedEventInit initializer; 360 MediaEncryptedEventInit initializer;
361 initializer.setInitDataType(EncryptedMediaUtils::convertFromInitDataType(ini tDataType)); 361 initializer.setInitDataType(EncryptedMediaUtils::convertFromInitDataType(ini tDataType));
362 initializer.setInitData(DOMArrayBuffer::create(initData, initDataLength)); 362 initializer.setInitData(DOMArrayBuffer::createOrNull(initData, initDataLengt h));
363 initializer.setBubbles(false); 363 initializer.setBubbles(false);
364 initializer.setCancelable(false); 364 initializer.setCancelable(false);
365 365
366 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); 366 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer);
367 } 367 }
368 368
369 // Create a 'needkey' MediaKeyEvent for v0.1b EME. 369 // Create a 'needkey' MediaKeyEvent for v0.1b EME.
370 static PassRefPtrWillBeRawPtr<Event> createWebkitNeedKeyEvent(const unsigned cha r* initData, unsigned initDataLength) 370 static PassRefPtrWillBeRawPtr<Event> createWebkitNeedKeyEvent(const unsigned cha r* initData, unsigned initDataLength)
371 { 371 {
372 MediaKeyEventInit webkitInitializer; 372 MediaKeyEventInit webkitInitializer;
373 webkitInitializer.setInitData(DOMUint8Array::create(initData, initDataLength )); 373 webkitInitializer.setInitData(DOMUint8Array::createOrNull(initData, initData Length));
374 374
375 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize r); 375 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize r);
376 } 376 }
377 377
378 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement& element, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionS tate& exceptionState) 378 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement& element, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionS tate& exceptionState)
379 { 379 {
380 HTMLMediaElementEncryptedMedia::from(element).generateKeyRequest(element.web MediaPlayer(), keySystem, initData, exceptionState); 380 HTMLMediaElementEncryptedMedia::from(element).generateKeyRequest(element.web MediaPlayer(), keySystem, initData, exceptionState);
381 } 381 }
382 382
383 void HTMLMediaElementEncryptedMedia::generateKeyRequest(WebMediaPlayer* webMedia Player, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionSt ate& exceptionState) 383 void HTMLMediaElementEncryptedMedia::generateKeyRequest(WebMediaPlayer* webMedia Player, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionSt ate& exceptionState)
(...skipping 21 matching lines...) Expand all
405 initDataPointer = initData->data(); 405 initDataPointer = initData->data();
406 initDataLength = initData->length(); 406 initDataLength = initData->length();
407 } 407 }
408 408
409 WebMediaPlayer::MediaKeyException result = webMediaPlayer->generateKeyReques t(keySystem, initDataPointer, initDataLength); 409 WebMediaPlayer::MediaKeyException result = webMediaPlayer->generateKeyReques t(keySystem, initDataPointer, initDataLength);
410 throwExceptionIfMediaKeyExceptionOccurred(keySystem, String(), result, excep tionState); 410 throwExceptionIfMediaKeyExceptionOccurred(keySystem, String(), result, excep tionState);
411 } 411 }
412 412
413 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement& mediaElement, const String& keySystem, ExceptionState& exceptionState) 413 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement& mediaElement, const String& keySystem, ExceptionState& exceptionState)
414 { 414 {
415 webkitGenerateKeyRequest(mediaElement, keySystem, DOMUint8Array::create(0), exceptionState); 415 RefPtr<DOMUint8Array> emptyArray = DOMUint8Array::deprecatedCreateOrCrash(nu llptr, 0);
416 webkitGenerateKeyRequest(mediaElement, keySystem, emptyArray.release(), exce ptionState);
416 } 417 }
417 418
418 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& element, con st String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> i nitData, const String& sessionId, ExceptionState& exceptionState) 419 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& element, con st String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> i nitData, const String& sessionId, ExceptionState& exceptionState)
419 { 420 {
420 HTMLMediaElementEncryptedMedia::from(element).addKey(element.webMediaPlayer( ), keySystem, key, initData, sessionId, exceptionState); 421 HTMLMediaElementEncryptedMedia::from(element).addKey(element.webMediaPlayer( ), keySystem, key, initData, sessionId, exceptionState);
421 } 422 }
422 423
423 void HTMLMediaElementEncryptedMedia::addKey(WebMediaPlayer* webMediaPlayer, cons t String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> in itData, const String& sessionId, ExceptionState& exceptionState) 424 void HTMLMediaElementEncryptedMedia::addKey(WebMediaPlayer* webMediaPlayer, cons t String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> in itData, const String& sessionId, ExceptionState& exceptionState)
424 { 425 {
425 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitAddKey"); 426 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitAddKey");
(...skipping 29 matching lines...) Expand all
455 initDataPointer = initData->data(); 456 initDataPointer = initData->data();
456 initDataLength = initData->length(); 457 initDataLength = initData->length();
457 } 458 }
458 459
459 WebMediaPlayer::MediaKeyException result = webMediaPlayer->addKey(keySystem, key->data(), key->length(), initDataPointer, initDataLength, sessionId); 460 WebMediaPlayer::MediaKeyException result = webMediaPlayer->addKey(keySystem, key->data(), key->length(), initDataPointer, initDataLength, sessionId);
460 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState); 461 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState);
461 } 462 }
462 463
463 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& mediaElement , const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState& except ionState) 464 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& mediaElement , const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState& except ionState)
464 { 465 {
465 webkitAddKey(mediaElement, keySystem, key, DOMUint8Array::create(0), String( ), exceptionState); 466 webkitAddKey(mediaElement, keySystem, key, DOMUint8Array::deprecatedCreateOr Crash(nullptr, 0), String(), exceptionState);
466 } 467 }
467 468
468 void HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest(HTMLMediaElement& el ement, const String& keySystem, const String& sessionId, ExceptionState& excepti onState) 469 void HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest(HTMLMediaElement& el ement, const String& keySystem, const String& sessionId, ExceptionState& excepti onState)
469 { 470 {
470 HTMLMediaElementEncryptedMedia::from(element).cancelKeyRequest(element.webMe diaPlayer(), keySystem, sessionId, exceptionState); 471 HTMLMediaElementEncryptedMedia::from(element).cancelKeyRequest(element.webMe diaPlayer(), keySystem, sessionId, exceptionState);
471 } 472 }
472 473
473 void HTMLMediaElementEncryptedMedia::cancelKeyRequest(WebMediaPlayer* webMediaPl ayer, const String& keySystem, const String& sessionId, ExceptionState& exceptio nState) 474 void HTMLMediaElementEncryptedMedia::cancelKeyRequest(WebMediaPlayer* webMediaPl ayer, const String& keySystem, const String& sessionId, ExceptionState& exceptio nState)
474 { 475 {
475 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest"); 476 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest");
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 m_mediaElement->scheduleEvent(event.release()); 544 m_mediaElement->scheduleEvent(event.release());
544 } 545 }
545 546
546 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons t WebString& sessionId, const unsigned char* message, unsigned messageLength, co nst WebURL& defaultURL) 547 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons t WebString& sessionId, const unsigned char* message, unsigned messageLength, co nst WebURL& defaultURL)
547 { 548 {
548 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data()); 549 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data());
549 550
550 MediaKeyEventInit initializer; 551 MediaKeyEventInit initializer;
551 initializer.setKeySystem(keySystem); 552 initializer.setKeySystem(keySystem);
552 initializer.setSessionId(sessionId); 553 initializer.setSessionId(sessionId);
553 initializer.setMessage(DOMUint8Array::create(message, messageLength)); 554 // FIXME: We currently ignore the problem if allocating the message array fa ils.
555 // Should we be aborting when that happens?
556 initializer.setMessage(DOMUint8Array::createOrNull(message, messageLength));
554 initializer.setDefaultURL(KURL(defaultURL)); 557 initializer.setDefaultURL(KURL(defaultURL));
555 558
556 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer); 559 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer);
557 event->setTarget(m_mediaElement); 560 event->setTarget(m_mediaElement);
558 m_mediaElement->scheduleEvent(event.release()); 561 m_mediaElement->scheduleEvent(event.release());
559 } 562 }
560 563
561 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini tDataType, const unsigned char* initData, unsigned initDataLength) 564 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini tDataType, const unsigned char* initData, unsigned initDataLength)
562 { 565 {
563 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); 566 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted");
564 567
565 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { 568 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) {
566 // Send event for WD EME. 569 // Send event for WD EME.
567 RefPtrWillBeRawPtr<Event> event; 570 RefPtrWillBeRawPtr<Event> event;
568 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC ontext()->securityOrigin())) { 571 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC ontext()->securityOrigin())) {
572 // FIXME: This creates an event with no data if the allocation of th e array buffer fails.
573 // Should we be aborting when that happens?
569 event = createEncryptedEvent(initDataType, initData, initDataLength) ; 574 event = createEncryptedEvent(initDataType, initData, initDataLength) ;
570 } else { 575 } else {
571 // Current page is not allowed to see content from the media file, 576 // Current page is not allowed to see content from the media file,
572 // so don't return the initData. However, they still get an event. 577 // so don't return the initData. However, they still get an event.
573 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0); 578 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0);
574 } 579 }
575 580
576 event->setTarget(m_mediaElement); 581 event->setTarget(m_mediaElement);
577 m_mediaElement->scheduleEvent(event.release()); 582 m_mediaElement->scheduleEvent(event.release());
578 } 583 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 } 631 }
627 632
628 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) 633 DEFINE_TRACE(HTMLMediaElementEncryptedMedia)
629 { 634 {
630 visitor->trace(m_mediaElement); 635 visitor->trace(m_mediaElement);
631 visitor->trace(m_mediaKeys); 636 visitor->trace(m_mediaKeys);
632 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); 637 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor);
633 } 638 }
634 639
635 } // namespace blink 640 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698