| Index: third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp
|
| diff --git a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp
|
| index d0acd8dbd40e27c20f1486655552d659e763b0ab..4919f18e578cefde127ec84a18f64ea3efd8d76c 100644
|
| --- a/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp
|
| +++ b/third_party/WebKit/Source/modules/webaudio/BaseAudioContext.cpp
|
| @@ -284,9 +284,26 @@ ScriptPromise BaseAudioContext::decodeAudioData(
|
|
|
| DCHECK_GT(rate, 0);
|
|
|
| - m_decodeAudioResolvers.insert(resolver);
|
| - m_audioDecoder.decodeAsync(audioData, rate, successCallback, errorCallback,
|
| - resolver, this);
|
| + if (audioData->isNeutered()) {
|
| + // If audioData is detached (neutered) we need to reject the
|
| + // promise with an error.
|
| + DOMException* error = DOMException::create(
|
| + DataCloneError, "Cannot decode detached ArrayBuffer");
|
| + resolver->reject(error);
|
| + if (errorCallback) {
|
| + errorCallback->handleEvent(error);
|
| + }
|
| + } else {
|
| + // Detach the audio array buffer from the main thread and start
|
| + // async decoding of the data.
|
| + WTF::ArrayBufferContents bufferContents;
|
| + audioData->transfer(bufferContents);
|
| + DOMArrayBuffer* audio = DOMArrayBuffer::create(bufferContents);
|
| +
|
| + m_decodeAudioResolvers.insert(resolver);
|
| + m_audioDecoder.decodeAsync(audio, rate, successCallback, errorCallback,
|
| + resolver, this);
|
| + }
|
|
|
| return promise;
|
| }
|
|
|