From 24255b75f7e550f502583d0d45ec0f6dbf4414a4 Mon Sep 17 00:00:00 2001 From: chrisguttandin Date: Fri, 9 Jun 2017 15:35:48 +0200 Subject: [PATCH] partially reintroduce decodeAudioData() patches for Chrome v61 --- src/providers/audio-context-constructor.ts | 5 +++++ .../offline-audio-context-constructor.ts | 5 +++++ .../decode-audio-data-type-error-support.ts | 2 +- src/testers/promise-support.ts | 2 +- .../chrome/canary/audio-context-constructor.js | 18 ++++++++++++++++++ .../offline-audio-context-constructor.js | 18 ++++++++++++++++++ 6 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/providers/audio-context-constructor.ts b/src/providers/audio-context-constructor.ts index ac6c7f3ed..265c201aa 100644 --- a/src/providers/audio-context-constructor.ts +++ b/src/providers/audio-context-constructor.ts @@ -507,6 +507,11 @@ export const AUDIO_CONTEXT_CONSTRUCTOR_PROVIDER = { // Bug #21: Safari does not support promises yet. if (this._isSupportingPromises) { + // Bug #1: Chrome requires a successCallback. + if (successCallback === undefined) { + successCallback = () => {}; // tslint:disable-line:no-empty + } + const promise = this._unpatchedAudioContext .decodeAudioData(audioData, successCallback, (err: DOMException | Error) => { if (typeof errorCallback === 'function') { diff --git a/src/providers/offline-audio-context-constructor.ts b/src/providers/offline-audio-context-constructor.ts index 6559399d1..282605c5d 100644 --- a/src/providers/offline-audio-context-constructor.ts +++ b/src/providers/offline-audio-context-constructor.ts @@ -204,6 +204,11 @@ export const OFFLINE_AUDIO_CONTEXT_CONSTRUCTOR_PROVIDER = { // Bug #21: Safari does not support promises yet. if (this._isSupportingPromises) { + // Bug #1: Chrome requires a successCallback. + if (successCallback === undefined) { + successCallback = () => {}; // tslint:disable-line:no-empty + } + const promise = this._unpatchedOfflineAudioContext .decodeAudioData(audioData, successCallback, (err: DOMException | Error) => { if (typeof errorCallback === 'function') { diff --git a/src/testers/decode-audio-data-type-error-support.ts b/src/testers/decode-audio-data-type-error-support.ts index 6c1022337..90a29bf6f 100644 --- a/src/testers/decode-audio-data-type-error-support.ts +++ b/src/testers/decode-audio-data-type-error-support.ts @@ -22,7 +22,7 @@ export class DecodeAudioDataTypeErrorSupportTester { const audioContext = new this._unpatchedOfflineAudioContextConstructor(1, 1, 44100); // Bug #21: Safari does not support promises yet. - // Bug #1: Safari requires a successCallback. + // Bug #1: Chrome Canary & Safari requires a successCallback. return new Promise((resolve) => { audioContext .decodeAudioData( null, () => { diff --git a/src/testers/promise-support.ts b/src/testers/promise-support.ts index e7e2ebed4..7516262cc 100644 --- a/src/testers/promise-support.ts +++ b/src/testers/promise-support.ts @@ -20,7 +20,7 @@ export class PromiseSupportTester { ]); try { - // Bug #1: Safari requires a successCallback. + // Bug #1: Chrome Canary & Safari requires a successCallback. const promise = audioContext.decodeAudioData(uint32Array.buffer, () => { // Ignore the success callback. }); diff --git a/test/expectation/chrome/canary/audio-context-constructor.js b/test/expectation/chrome/canary/audio-context-constructor.js index 685a44a5f..4a2e6dc17 100644 --- a/test/expectation/chrome/canary/audio-context-constructor.js +++ b/test/expectation/chrome/canary/audio-context-constructor.js @@ -2,6 +2,7 @@ import 'core-js/es7/reflect'; import { UNPATCHED_AUDIO_CONTEXT_CONSTRUCTOR_PROVIDER, unpatchedAudioContextConstructor } from '../../../../src/providers/unpatched-audio-context-constructor'; import { ReflectiveInjector } from '@angular/core'; import { WINDOW_PROVIDER } from '../../../../src/providers/window'; +import { loadFixture } from '../../../helper/load-fixture'; import { spy } from 'sinon'; describe('audioContextConstructor', () => { @@ -92,6 +93,23 @@ describe('audioContextConstructor', () => { describe('decodeAudioData()', () => { + // bug #1 + + it('should require the success callback function as a parameter', (done) => { + loadFixture('1000-frames-of-noise.wav', (err, arrayBuffer) => { + expect(err).to.be.null; + + audioContext + .decodeAudioData(arrayBuffer, undefined, () => {}) + .catch((err) => { + expect(err).to.be.an.instanceOf(TypeError); + expect(err.message).to.equal("Failed to execute 'decodeAudioData' on 'BaseAudioContext': The callback provided as parameter 2 is not a function."); + + done(); + }); + }); + }); + // bug #6 it('should not call the errorCallback at all', (done) => { diff --git a/test/expectation/chrome/canary/offline-audio-context-constructor.js b/test/expectation/chrome/canary/offline-audio-context-constructor.js index 4f390f96d..788b8c872 100644 --- a/test/expectation/chrome/canary/offline-audio-context-constructor.js +++ b/test/expectation/chrome/canary/offline-audio-context-constructor.js @@ -2,6 +2,7 @@ import 'core-js/es7/reflect'; import { UNPATCHED_OFFLINE_AUDIO_CONTEXT_CONSTRUCTOR_PROVIDER, unpatchedOfflineAudioContextConstructor } from '../../../../src/providers/unpatched-offline-audio-context-constructor'; import { ReflectiveInjector } from '@angular/core'; import { WINDOW_PROVIDER } from '../../../../src/providers/window'; +import { loadFixture } from '../../../helper/load-fixture'; import { spy } from 'sinon'; describe('offlineAudioContextConstructor', () => { @@ -107,6 +108,23 @@ describe('offlineAudioContextConstructor', () => { describe('decodeAudioData()', () => { + // bug #1 + + it('should require the success callback function as a parameter', (done) => { + loadFixture('1000-frames-of-noise.wav', (err, arrayBuffer) => { + expect(err).to.be.null; + + offlineAudioContext + .decodeAudioData(arrayBuffer, undefined, () => {}) + .catch((err) => { + expect(err).to.be.an.instanceOf(TypeError); + expect(err.message).to.equal("Failed to execute 'decodeAudioData' on 'BaseAudioContext': The callback provided as parameter 2 is not a function."); + + done(); + }); + }); + }); + // bug #6 it('should not call the errorCallback at all', (done) => {