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

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: rebase+more tweaks Created 5 years, 1 month 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 // TODO(junov): crbug.com/536816
363 // We should use createOrNull instead of deprecatedCreateOrCrash to
364 // fail gracefully instead of crashing the process when allocation fails.
365 // Need to investigate how this should be handled in the spec.
366 // Would it make sense to throw a RangeError exception from here? Would
367 // it be okay pass a nullptr to setInitData?
368 initializer.setInitData(DOMArrayBuffer::deprecatedCreateOrCrash(initData, in itDataLength));
363 initializer.setBubbles(false); 369 initializer.setBubbles(false);
364 initializer.setCancelable(false); 370 initializer.setCancelable(false);
365 371
366 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer); 372 return MediaEncryptedEvent::create(EventTypeNames::encrypted, initializer);
367 } 373 }
368 374
369 // Create a 'needkey' MediaKeyEvent for v0.1b EME. 375 // Create a 'needkey' MediaKeyEvent for v0.1b EME.
370 static PassRefPtrWillBeRawPtr<Event> createWebkitNeedKeyEvent(const unsigned cha r* initData, unsigned initDataLength) 376 static PassRefPtrWillBeRawPtr<Event> createWebkitNeedKeyEvent(const unsigned cha r* initData, unsigned initDataLength)
371 { 377 {
372 MediaKeyEventInit webkitInitializer; 378 MediaKeyEventInit webkitInitializer;
373 webkitInitializer.setInitData(DOMUint8Array::create(initData, initDataLength )); 379 // TODO(junov): crbug.com/536816
380 // We should use createOrNull instead of deprecatedCreateOrCrash to
381 // fail gracefully instead of crashing the process when allocation fails.
382 // Need to investigate how this should be handled in the spec.
383 // Would it make sense to throw a RangeError exception from here? Would
384 // it be okay pass a nullptr to setInitData?
385 webkitInitializer.setInitData(DOMUint8Array::createOrNull(initData, initData Length));
374 386
375 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize r); 387 return MediaKeyEvent::create(EventTypeNames::webkitneedkey, webkitInitialize r);
376 } 388 }
377 389
378 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement& element, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionS tate& exceptionState) 390 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement& element, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionS tate& exceptionState)
379 { 391 {
380 HTMLMediaElementEncryptedMedia::from(element).generateKeyRequest(element.web MediaPlayer(), keySystem, initData, exceptionState); 392 HTMLMediaElementEncryptedMedia::from(element).generateKeyRequest(element.web MediaPlayer(), keySystem, initData, exceptionState);
381 } 393 }
382 394
383 void HTMLMediaElementEncryptedMedia::generateKeyRequest(WebMediaPlayer* webMedia Player, const String& keySystem, PassRefPtr<DOMUint8Array> initData, ExceptionSt ate& exceptionState) 395 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(); 417 initDataPointer = initData->data();
406 initDataLength = initData->length(); 418 initDataLength = initData->length();
407 } 419 }
408 420
409 WebMediaPlayer::MediaKeyException result = webMediaPlayer->generateKeyReques t(keySystem, initDataPointer, initDataLength); 421 WebMediaPlayer::MediaKeyException result = webMediaPlayer->generateKeyReques t(keySystem, initDataPointer, initDataLength);
410 throwExceptionIfMediaKeyExceptionOccurred(keySystem, String(), result, excep tionState); 422 throwExceptionIfMediaKeyExceptionOccurred(keySystem, String(), result, excep tionState);
411 } 423 }
412 424
413 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement& mediaElement, const String& keySystem, ExceptionState& exceptionState) 425 void HTMLMediaElementEncryptedMedia::webkitGenerateKeyRequest(HTMLMediaElement& mediaElement, const String& keySystem, ExceptionState& exceptionState)
414 { 426 {
415 webkitGenerateKeyRequest(mediaElement, keySystem, DOMUint8Array::create(0), exceptionState); 427 RefPtr<DOMUint8Array> emptyArray = DOMUint8Array::deprecatedCreateOrCrash(nu llptr, 0);
428 webkitGenerateKeyRequest(mediaElement, keySystem, emptyArray.release(), exce ptionState);
416 } 429 }
417 430
418 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& element, con st String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> i nitData, const String& sessionId, ExceptionState& exceptionState) 431 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& element, con st String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> i nitData, const String& sessionId, ExceptionState& exceptionState)
419 { 432 {
420 HTMLMediaElementEncryptedMedia::from(element).addKey(element.webMediaPlayer( ), keySystem, key, initData, sessionId, exceptionState); 433 HTMLMediaElementEncryptedMedia::from(element).addKey(element.webMediaPlayer( ), keySystem, key, initData, sessionId, exceptionState);
421 } 434 }
422 435
423 void HTMLMediaElementEncryptedMedia::addKey(WebMediaPlayer* webMediaPlayer, cons t String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> in itData, const String& sessionId, ExceptionState& exceptionState) 436 void HTMLMediaElementEncryptedMedia::addKey(WebMediaPlayer* webMediaPlayer, cons t String& keySystem, PassRefPtr<DOMUint8Array> key, PassRefPtr<DOMUint8Array> in itData, const String& sessionId, ExceptionState& exceptionState)
424 { 437 {
425 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitAddKey"); 438 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitAddKey");
(...skipping 29 matching lines...) Expand all
455 initDataPointer = initData->data(); 468 initDataPointer = initData->data();
456 initDataLength = initData->length(); 469 initDataLength = initData->length();
457 } 470 }
458 471
459 WebMediaPlayer::MediaKeyException result = webMediaPlayer->addKey(keySystem, key->data(), key->length(), initDataPointer, initDataLength, sessionId); 472 WebMediaPlayer::MediaKeyException result = webMediaPlayer->addKey(keySystem, key->data(), key->length(), initDataPointer, initDataLength, sessionId);
460 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState); 473 throwExceptionIfMediaKeyExceptionOccurred(keySystem, sessionId, result, exce ptionState);
461 } 474 }
462 475
463 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& mediaElement , const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState& except ionState) 476 void HTMLMediaElementEncryptedMedia::webkitAddKey(HTMLMediaElement& mediaElement , const String& keySystem, PassRefPtr<DOMUint8Array> key, ExceptionState& except ionState)
464 { 477 {
465 webkitAddKey(mediaElement, keySystem, key, DOMUint8Array::create(0), String( ), exceptionState); 478 webkitAddKey(mediaElement, keySystem, key, DOMUint8Array::deprecatedCreateOr Crash(nullptr, 0), String(), exceptionState);
466 } 479 }
467 480
468 void HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest(HTMLMediaElement& el ement, const String& keySystem, const String& sessionId, ExceptionState& excepti onState) 481 void HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest(HTMLMediaElement& el ement, const String& keySystem, const String& sessionId, ExceptionState& excepti onState)
469 { 482 {
470 HTMLMediaElementEncryptedMedia::from(element).cancelKeyRequest(element.webMe diaPlayer(), keySystem, sessionId, exceptionState); 483 HTMLMediaElementEncryptedMedia::from(element).cancelKeyRequest(element.webMe diaPlayer(), keySystem, sessionId, exceptionState);
471 } 484 }
472 485
473 void HTMLMediaElementEncryptedMedia::cancelKeyRequest(WebMediaPlayer* webMediaPl ayer, const String& keySystem, const String& sessionId, ExceptionState& exceptio nState) 486 void HTMLMediaElementEncryptedMedia::cancelKeyRequest(WebMediaPlayer* webMediaPl ayer, const String& keySystem, const String& sessionId, ExceptionState& exceptio nState)
474 { 487 {
475 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest"); 488 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::webkitCancelKeyRequest");
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
543 m_mediaElement->scheduleEvent(event.release()); 556 m_mediaElement->scheduleEvent(event.release());
544 } 557 }
545 558
546 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons t WebString& sessionId, const unsigned char* message, unsigned messageLength, co nst WebURL& defaultURL) 559 void HTMLMediaElementEncryptedMedia::keyMessage(const WebString& keySystem, cons t WebString& sessionId, const unsigned char* message, unsigned messageLength, co nst WebURL& defaultURL)
547 { 560 {
548 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data()); 561 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::mediaPlayerKeyMessage: sessi onID=%s", sessionId.utf8().data());
549 562
550 MediaKeyEventInit initializer; 563 MediaKeyEventInit initializer;
551 initializer.setKeySystem(keySystem); 564 initializer.setKeySystem(keySystem);
552 initializer.setSessionId(sessionId); 565 initializer.setSessionId(sessionId);
553 initializer.setMessage(DOMUint8Array::create(message, messageLength)); 566 // TODO(junov): crbug.com/536816
567 // Should use createOrNull instead of deprecatedCreateOrCrash.
568 // Need to find an acceptable way to fail gracefully when allocation
569 // fails. Possible solutions: throw a RangeError exception, pass
570 // a null message
571 initializer.setMessage(DOMUint8Array::deprecatedCreateOrCrash(message, messa geLength));
554 initializer.setDefaultURL(KURL(defaultURL)); 572 initializer.setDefaultURL(KURL(defaultURL));
555 573
556 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer); 574 RefPtrWillBeRawPtr<Event> event = MediaKeyEvent::create(EventTypeNames::webk itkeymessage, initializer);
557 event->setTarget(m_mediaElement); 575 event->setTarget(m_mediaElement);
558 m_mediaElement->scheduleEvent(event.release()); 576 m_mediaElement->scheduleEvent(event.release());
559 } 577 }
560 578
561 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini tDataType, const unsigned char* initData, unsigned initDataLength) 579 void HTMLMediaElementEncryptedMedia::encrypted(WebEncryptedMediaInitDataType ini tDataType, const unsigned char* initData, unsigned initDataLength)
562 { 580 {
563 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted"); 581 WTF_LOG(Media, "HTMLMediaElementEncryptedMedia::encrypted");
564 582
565 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) { 583 if (RuntimeEnabledFeatures::encryptedMediaEnabled()) {
566 // Send event for WD EME. 584 // Send event for WD EME.
567 RefPtrWillBeRawPtr<Event> event; 585 RefPtrWillBeRawPtr<Event> event;
568 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC ontext()->securityOrigin())) { 586 if (m_mediaElement->isMediaDataCORSSameOrigin(m_mediaElement->executionC ontext()->securityOrigin())) {
587 // TODO(junov): crbug.com/536816
588 // This creates an event with no data if the allocation of the array buffer fails.
589 // Should we be aborting when that happens?
569 event = createEncryptedEvent(initDataType, initData, initDataLength) ; 590 event = createEncryptedEvent(initDataType, initData, initDataLength) ;
570 } else { 591 } else {
571 // Current page is not allowed to see content from the media file, 592 // 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. 593 // so don't return the initData. However, they still get an event.
573 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0); 594 event = createEncryptedEvent(WebEncryptedMediaInitDataType::Unknown, nullptr, 0);
574 } 595 }
575 596
576 event->setTarget(m_mediaElement); 597 event->setTarget(m_mediaElement);
577 m_mediaElement->scheduleEvent(event.release()); 598 m_mediaElement->scheduleEvent(event.release());
578 } 599 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 } 647 }
627 648
628 DEFINE_TRACE(HTMLMediaElementEncryptedMedia) 649 DEFINE_TRACE(HTMLMediaElementEncryptedMedia)
629 { 650 {
630 visitor->trace(m_mediaElement); 651 visitor->trace(m_mediaElement);
631 visitor->trace(m_mediaKeys); 652 visitor->trace(m_mediaKeys);
632 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor); 653 WillBeHeapSupplement<HTMLMediaElement>::trace(visitor);
633 } 654 }
634 655
635 } // namespace blink 656 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698