| Index: third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-basic.html
|
| diff --git a/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-basic.html b/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-basic.html
|
| index 8c81ef59e282014a351ebf9b614cb4e97679aec1..1947142345c65deaaebe0a81d50e7ff51d97dbbf 100644
|
| --- a/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-basic.html
|
| +++ b/third_party/WebKit/LayoutTests/webaudio/decodeAudioData/decode-audio-data-basic.html
|
| @@ -1,175 +1,192 @@
|
| -<!doctype html>
|
| +<!DOCTYPE html>
|
| <html>
|
| -<head>
|
| - <script src="../../resources/testharness.js"></script>
|
| - <script src="../../resources/testharnessreport.js"></script>
|
| - <script src="../resources/audit.js"></script>
|
| - <title>Test decodeAudioData promises</title>
|
| -</head>
|
| -<body>
|
| - <script>
|
| - // The functionality of decodeAudioData() is orthogonal to the type and the
|
| - // state of AudioContext. So we use the online context here and any
|
| - // resampling of the file is okay for this test.
|
| - let context = new AudioContext();
|
| -
|
| - // Test file URLs.
|
| - let validAudioFileUrl = '../resources/media/24bit-44khz.wav';
|
| - let invalidAudioFileUrl = '../resources/media/invalid-audio-file.txt';
|
| -
|
| - // Global storage for array buffers from XHR.
|
| - let validArrayBuffer;
|
| - let invalidArrayBuffer;
|
| -
|
| - // Decoded data from validAudioFile.
|
| - let referenceDecodedAudioBuffer;
|
| -
|
| - let audit = Audit.createTaskRunner();
|
| -
|
| - // Preload ArrayBuffer and the reference AudioBuffer from URLs.
|
| - audit.define('preload-arraybuffer', (task, should) => {
|
| - Promise
|
| - .all([
|
| - should(Audit.loadFileFromUrl(validAudioFileUrl),
|
| - "Loading valid audio file")
|
| - .beResolved(),
|
| - should(Audit.loadFileFromUrl(invalidAudioFileUrl),
|
| - "loading invalid audio file")
|
| - .beResolved()
|
| - ])
|
| - .then((arrayBuffers) => {
|
| - validArrayBuffer = arrayBuffers[0];
|
| - invalidArrayBuffer = arrayBuffers[1];
|
| - })
|
| - .then(() => task.done());
|
| - });
|
| -
|
| - // Decode a valid encoded file and verify that the promise succeeds
|
| - // correctly.
|
| - audit.define('decode-valid-file', (task, should) => {
|
| - // Note that the order of completion for each promise is undefined and
|
| - // we do not care about it in this test.
|
| - Promise
|
| - .all([
|
| - // Do not use the original arrayBuffers for decoding; decode a copy
|
| - // because decodeAudioData will detach the buffers.
|
| - should(context.decodeAudioData(validArrayBuffer.slice(0)),
|
| - 'Decoding a valid audio file')
|
| - .beResolved()
|
| - .then(buffer => referenceDecodedAudioBuffer = buffer),
|
| - should(context.decodeAudioData(invalidArrayBuffer.slice(0)),
|
| - 'Decoding an invalid audio file')
|
| - .beRejectedWith('EncodingError'),
|
| - should(context.decodeAudioData(null), 'Decoding null AudioBuffer')
|
| - .beRejected()
|
| - ])
|
| - .then(() => task.done());
|
| - });
|
| -
|
| - // Decode a valid file and verify that the promise is fulfilled and the
|
| - // successCallback is invoked and both have identical decoded audio buffers.
|
| - audit.define("promise-and-success-callback", (task, should) => {
|
| - let bufferByCallback;
|
| - let bufferByPromise;
|
| -
|
| - // Use one callback for success and error. |callbackArg| is a parameter
|
| - // for callback functions; it is a decoded audio buffer for success case
|
| - // and an error object for failure case.
|
| - let successOrErrorCallback = (callbackArg) => {
|
| - should(callbackArg instanceof AudioBuffer,
|
| - 'Decoding valid file by callback function')
|
| - .message('successCallback invoked correctly',
|
| - 'errorCallback incorrectly invoked with ' + callbackArg);
|
| - bufferByCallback = callbackArg;
|
| - };
|
| -
|
| - // Step 1: Decode a file with callback functions.
|
| - let step1 = context.decodeAudioData(validArrayBuffer.slice(),
|
| - successOrErrorCallback,
|
| - successOrErrorCallback);
|
| -
|
| - // Step 2: Then decode a file with promise pattern.
|
| - let step2 = should(step1, 'Decoding a file via promise')
|
| - .beResolved()
|
| - .then((audioBuffer) => {
|
| - bufferByPromise = audioBuffer;
|
| - });
|
| -
|
| - // Step 3: compare two buffers from Step 1 and Step 2.
|
| - step2.then(() => {
|
| - should(bufferByCallback === bufferByPromise,
|
| - 'Two buffers decoded by callback function and promise')
|
| - .message('are identical', 'are different');
|
| - task.done();
|
| + <head>
|
| + <title>
|
| + Test decodeAudioData promises
|
| + </title>
|
| + <script src="../../resources/testharness.js"></script>
|
| + <script src="../../resources/testharnessreport.js"></script>
|
| + <script src="../resources/audit.js"></script>
|
| + </head>
|
| + <body>
|
| + <script id="layout-test-code">
|
| + // The functionality of decodeAudioData() is orthogonal to the type and
|
| + // the state of AudioContext. So we use the online context here and any
|
| + // resampling of the file is okay for this test.
|
| + let context = new AudioContext();
|
| +
|
| + // Test file URLs.
|
| + let validAudioFileUrl = '../resources/media/24bit-44khz.wav';
|
| + let invalidAudioFileUrl = '../resources/media/invalid-audio-file.txt';
|
| +
|
| + // Global storage for array buffers from XHR.
|
| + let validArrayBuffer;
|
| + let invalidArrayBuffer;
|
| +
|
| + // Decoded data from validAudioFile.
|
| + let referenceDecodedAudioBuffer;
|
| +
|
| + let audit = Audit.createTaskRunner();
|
| +
|
| + // Preload ArrayBuffer and the reference AudioBuffer from URLs.
|
| + audit.define('preload-arraybuffer', (task, should) => {
|
| + Promise
|
| + .all([
|
| + should(
|
| + Audit.loadFileFromUrl(validAudioFileUrl),
|
| + 'Loading valid audio file')
|
| + .beResolved(),
|
| + should(
|
| + Audit.loadFileFromUrl(invalidAudioFileUrl),
|
| + 'loading invalid audio file')
|
| + .beResolved()
|
| + ])
|
| + .then((arrayBuffers) => {
|
| + validArrayBuffer = arrayBuffers[0];
|
| + invalidArrayBuffer = arrayBuffers[1];
|
| + })
|
| + .then(() => task.done());
|
| });
|
| - });
|
| -
|
| - // Decode an invalid file and verify that the promise is rejected and the
|
| - // errorCallback is invoked.
|
| - audit.define("promise-and-error-callback", (task, should) => {
|
| - let successOrErrorCallback = (callbackArg) => {
|
| - should(callbackArg instanceof Error,
|
| - 'Decoding invalid file with promise and callback:')
|
| - .message('errorCallback invoked correctly with ' + callbackArg,
|
| - 'successCallback should not have invoked');
|
| - };
|
| -
|
| - let decodeAudioDataPromise =
|
| - context.decodeAudioData(invalidArrayBuffer.slice(),
|
| - successOrErrorCallback,
|
| - successOrErrorCallback);
|
| -
|
| - should(decodeAudioDataPromise, 'decodeAudioData promise')
|
| - .beRejected('EncodingError')
|
| - .then(() => task.done());
|
| - });
|
| -
|
| - // decodeAudioData() should be functional even after the associated context
|
| - // is closed.
|
| - audit.define('decoding-on-closed-context', (task, should) => {
|
| - // Use one handler for resolve and reject. |promiseArg| is a parameter for
|
| - // handlers; it is a decoded audio buffer for success case and an error
|
| - // object for failure case.
|
| - let resolveOrReject = (promiseArg) => {
|
| - let didDecode = promiseArg instanceof AudioBuffer;
|
| -
|
| - if (didDecode) {
|
| - // Compare two decoded AudioBuffers.
|
| - let actual = promiseArg;
|
| - let expected = referenceDecodedAudioBuffer;
|
| - should(actual.length, 'Decoded buffer length (frames)')
|
| - .beEqualTo(expected.length);
|
| - should(actual.duration, 'Decoded buffer duration (sec)')
|
| - .beEqualTo(expected.duration);
|
| - should(actual.sampleRate, 'Decoded buffer sample rate (Hz)')
|
| - .beEqualTo(expected.sampleRate);
|
| - should(actual.numberOfChannels,
|
| - 'Number of channels in decoded buffer')
|
| - .beEqualTo(expected.numberOfChannels);
|
| - for (let c = 0; c < expected.numberOfChannels; ++c) {
|
| - let actualChannelData = actual.getChannelData(c);
|
| - let expectedChannelData = expected.getChannelData(c);
|
| - should(actualChannelData, 'Decoded buffer channel #' + c)
|
| - .beEqualToArray(expectedChannelData,
|
| - 'the expected channel #' + c);
|
| +
|
| + // Decode a valid encoded file and verify that the promise succeeds
|
| + // correctly.
|
| + audit.define('decode-valid-file', (task, should) => {
|
| + // Note that the order of completion for each promise is undefined and
|
| + // we do not care about it in this test.
|
| + Promise
|
| + .all([
|
| + // Do not use the original arrayBuffers for decoding; decode a
|
| + // copy because decodeAudioData will detach the buffers.
|
| + should(
|
| + context.decodeAudioData(validArrayBuffer.slice(0)),
|
| + 'Decoding a valid audio file')
|
| + .beResolved()
|
| + .then(buffer => referenceDecodedAudioBuffer = buffer),
|
| + should(
|
| + context.decodeAudioData(invalidArrayBuffer.slice(0)),
|
| + 'Decoding an invalid audio file')
|
| + .beRejectedWith('EncodingError'),
|
| + should(context.decodeAudioData(null), 'Decoding null AudioBuffer')
|
| + .beRejected()
|
| + ])
|
| + .then(() => task.done());
|
| + });
|
| +
|
| + // Decode a valid file and verify that the promise is fulfilled and the
|
| + // successCallback is invoked and both have identical decoded audio
|
| + // buffers.
|
| + audit.define('promise-and-success-callback', (task, should) => {
|
| + let bufferByCallback;
|
| + let bufferByPromise;
|
| +
|
| + // Use one callback for success and error. |callbackArg| is a parameter
|
| + // for callback functions; it is a decoded audio buffer for success case
|
| + // and an error object for failure case.
|
| + let successOrErrorCallback = (callbackArg) => {
|
| + should(
|
| + callbackArg instanceof AudioBuffer,
|
| + 'Decoding valid file by callback function')
|
| + .message(
|
| + 'successCallback invoked correctly',
|
| + 'errorCallback incorrectly invoked with ' + callbackArg);
|
| + bufferByCallback = callbackArg;
|
| + };
|
| +
|
| + // Step 1: Decode a file with callback functions.
|
| + let step1 = context.decodeAudioData(
|
| + validArrayBuffer.slice(), successOrErrorCallback,
|
| + successOrErrorCallback);
|
| +
|
| + // Step 2: Then decode a file with promise pattern.
|
| + let step2 = should(step1, 'Decoding a file via promise')
|
| + .beResolved()
|
| + .then((audioBuffer) => {
|
| + bufferByPromise = audioBuffer;
|
| + });
|
| +
|
| + // Step 3: compare two buffers from Step 1 and Step 2.
|
| + step2.then(() => {
|
| + should(
|
| + bufferByCallback === bufferByPromise,
|
| + 'Two buffers decoded by callback function and promise')
|
| + .message('are identical', 'are different');
|
| + task.done();
|
| + });
|
| + });
|
| +
|
| + // Decode an invalid file and verify that the promise is rejected and the
|
| + // errorCallback is invoked.
|
| + audit.define('promise-and-error-callback', (task, should) => {
|
| + let successOrErrorCallback = (callbackArg) => {
|
| + should(
|
| + callbackArg instanceof Error,
|
| + 'Decoding invalid file with promise and callback:')
|
| + .message(
|
| + 'errorCallback invoked correctly with ' + callbackArg,
|
| + 'successCallback should not have invoked');
|
| + };
|
| +
|
| + let decodeAudioDataPromise = context.decodeAudioData(
|
| + invalidArrayBuffer.slice(), successOrErrorCallback,
|
| + successOrErrorCallback);
|
| +
|
| + should(decodeAudioDataPromise, 'decodeAudioData promise')
|
| + .beRejected('EncodingError')
|
| + .then(() => task.done());
|
| + });
|
| +
|
| + // decodeAudioData() should be functional even after the associated
|
| + // context is closed.
|
| + audit.define('decoding-on-closed-context', (task, should) => {
|
| + // Use one handler for resolve and reject. |promiseArg| is a parameter
|
| + // for handlers; it is a decoded audio buffer for success case and an
|
| + // error object for failure case.
|
| + let resolveOrReject = (promiseArg) => {
|
| + let didDecode = promiseArg instanceof AudioBuffer;
|
| +
|
| + if (didDecode) {
|
| + // Compare two decoded AudioBuffers.
|
| + let actual = promiseArg;
|
| + let expected = referenceDecodedAudioBuffer;
|
| + should(actual.length, 'Decoded buffer length (frames)')
|
| + .beEqualTo(expected.length);
|
| + should(actual.duration, 'Decoded buffer duration (sec)')
|
| + .beEqualTo(expected.duration);
|
| + should(actual.sampleRate, 'Decoded buffer sample rate (Hz)')
|
| + .beEqualTo(expected.sampleRate);
|
| + should(
|
| + actual.numberOfChannels, 'Number of channels in decoded buffer')
|
| + .beEqualTo(expected.numberOfChannels);
|
| + for (let c = 0; c < expected.numberOfChannels; ++c) {
|
| + let actualChannelData = actual.getChannelData(c);
|
| + let expectedChannelData = expected.getChannelData(c);
|
| + should(actualChannelData, 'Decoded buffer channel #' + c)
|
| + .beEqualToArray(
|
| + expectedChannelData, 'the expected channel #' + c);
|
| + }
|
| + should(task.state, 'The buffer')
|
| + .message(
|
| + 'correctly decoded after the context has been closed',
|
| + 'decoding succeeded but the data is incorrect');
|
| }
|
| - should(task.state, 'The buffer')
|
| - .message('correctly decoded after the context has been closed',
|
| - 'decoding succeeded but the data is incorrect');
|
| - }
|
| -
|
| - should(didDecode, 'Decoding ArrayBuffer after context has been closed')
|
| - .message('completed successfully', 'failed : ' + promiseArg);
|
| - };
|
| -
|
| - let onlineContext = new AudioContext();
|
| - onlineContext.close()
|
| - .then(() => { return context.decodeAudioData(validArrayBuffer); })
|
| - .then(resolveOrReject, resolveOrReject)
|
| - .then(() => { task.done(); });
|
| - });
|
| -
|
| - audit.run();
|
| -</script>
|
| -</body>
|
| +
|
| + should(
|
| + didDecode, 'Decoding ArrayBuffer after context has been closed')
|
| + .message('completed successfully', 'failed : ' + promiseArg);
|
| + };
|
| +
|
| + let onlineContext = new AudioContext();
|
| + onlineContext.close()
|
| + .then(() => {
|
| + return context.decodeAudioData(validArrayBuffer);
|
| + })
|
| + .then(resolveOrReject, resolveOrReject)
|
| + .then(() => {
|
| + task.done();
|
| + });
|
| + });
|
| +
|
| + audit.run();
|
| + </script>
|
| + </body>
|
| </html>
|
|
|