summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webaudio/the-audio-api/the-audioworklet-interface/processors/process-getter-test-prototype-processor.js
blob: cef5fa8b52fa5cb2a04783b95a17d8f79d968644 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
 * @class ProcessGetterTestPrototypeProcessor
 * @extends AudioWorkletProcessor
 *
 * This processor class tests that a 'process' getter on
 * AudioWorkletProcessorConstructor is called at the right times.
 */

// Reporting errors during registerProcess() is awkward.
// The occurrance of an error is flagged, so that a trial registration can be
// performed and registration against the expected AudioWorkletNode name is
// performed only if no errors are flagged during the trial registration.
let error_flag = false;

class ProcessGetterTestPrototypeProcessor extends AudioWorkletProcessor {
  constructor() {
    super();
    this.getterCallCount = 0;
    this.totalProcessCallCount = 0;
  }
  get process() {
    if (!(this instanceof ProcessGetterTestPrototypeProcessor)) {
      error_flag = true;
      throw new Error('`process` getter called with bad `this`.');
    }
    ++this.getterCallCount;
    let functionCallCount = 0;
    return () => {
      if (++functionCallCount > 1) {
        const message = 'Closure of function returned from `process` getter' +
            ' should be used for only one call.'
        this.port.postMessage({message: message});
        throw new Error(message);
      }
      if (++this.totalProcessCallCount < 2) {
        return true; // Expect another getter call.
      }
      if (this.totalProcessCallCount != this.getterCallCount) {
        const message =
            'Getter should be called only once for each process() call.'
        this.port.postMessage({message: message});
        throw new Error(message);
      }
      this.port.postMessage({message: 'done'});
      return false; // No more calls required.
    };
  }
}

registerProcessor('trial-process-getter-test-prototype',
                  ProcessGetterTestPrototypeProcessor);
if (!error_flag) {
  registerProcessor('process-getter-test-prototype',
                    ProcessGetterTestPrototypeProcessor);
}