View Javadoc
1   /*
2    * Copyright (c) 2002-2025 Gargoyle Software Inc.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * https://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  package org.htmlunit.javascript.host.media;
16  
17  import org.htmlunit.WebDriverTestCase;
18  import org.htmlunit.junit.BrowserRunner;
19  import org.htmlunit.junit.annotation.Alerts;
20  import org.junit.Test;
21  import org.junit.runner.RunWith;
22  
23  /**
24   * Tests for {@link AudioContext}.
25   *
26   * @author Ronald Brill
27   */
28  @RunWith(BrowserRunner.class)
29  public class AudioContextTest extends WebDriverTestCase {
30  
31      /**
32       * @throws Exception if the test fails
33       */
34      @Test
35      @Alerts("true")
36      public void inWindow() throws Exception {
37          final String html = DOCTYPE_HTML
38              + "<html>\n"
39              + "<head>\n"
40              + "  <script>\n"
41              + LOG_TITLE_FUNCTION
42              + "    function test() {\n"
43              + "      log('AudioContext' in window);\n"
44              + "    }\n"
45              + "  </script>\n"
46              + "</head>\n"
47              + "<body onload='test()'>\n"
48              + "</body>\n"
49              + "</html>";
50  
51          loadPageVerifyTitle2(html);
52      }
53  
54      /**
55       * @throws Exception if the test fails
56       */
57      @Test
58      @Alerts({"function", "[object AudioContext]"})
59      public void ctor() throws Exception {
60          final String html = DOCTYPE_HTML
61              + "<html>\n"
62              + "<head>\n"
63              + "  <script>\n"
64              + LOG_TEXTAREA_FUNCTION
65  
66              + "    function test() {\n"
67              + "      if (!('AudioContext' in window)) {\n"
68              + "        log('AudioContext not available');\n"
69              + "        return;\n"
70              + "      }\n"
71  
72              + "      try {\n"
73              + "        log(typeof AudioContext);\n"
74              + "        log(new AudioContext());\n"
75              + "      } catch(e) { logEx(e); }\n"
76              + "    }\n"
77              + "  </script>\n"
78              + "</head>\n"
79              + "<body onload='test()'>\n"
80              + LOG_TEXTAREA
81              + "</body>\n"
82              + "</html>";
83  
84          loadPageVerifyTextArea2(html);
85      }
86  
87      /**
88       * @throws Exception if the test fails
89       */
90      @Test
91      @Alerts("[object AudioBufferSourceNode]")
92      public void createBufferSource() throws Exception {
93          final String html = DOCTYPE_HTML
94              + "<html>\n"
95              + "<head>\n"
96              + "  <script>\n"
97              + LOG_TITLE_FUNCTION
98              + "    function test() {\n"
99              + "      if (!('AudioContext' in window)) {\n"
100             + "        log('AudioContext not available');\n"
101             + "        return;\n"
102             + "      }\n"
103 
104             + "      var audioCtx = new AudioContext();\n"
105             + "      var source = audioCtx.createBufferSource();\n"
106             + "      log(source);\n"
107             + "    }\n"
108             + "  </script>\n"
109             + "</head>\n"
110             + "<body onload='test()'>\n"
111             + "</body>\n"
112             + "</html>";
113 
114         loadPageVerifyTitle2(html);
115     }
116 
117     /**
118      * @throws Exception if the test fails
119      */
120     @Test
121     @Alerts({"AudioContext prep done", "Error with decoding audio data"})
122     public void decodeAudioData() throws Exception {
123         final String html = DOCTYPE_HTML
124             + "<html>\n"
125             + "<head>\n"
126             + "  <script>\n"
127             + LOG_TEXTAREA_FUNCTION
128 
129             + "    function test() {\n"
130             + "      if (!('AudioContext' in window)) {\n"
131             + "        log('AudioContext not available');\n"
132             + "        return;\n"
133             + "      }\n"
134 
135             + "      var audioCtx = new AudioContext();\n"
136             + "      var audioData = new ArrayBuffer(0);\n"
137             + "      audioCtx.decodeAudioData(audioData,\n"
138             + "             function(buffer) { log('Decoding audio data done'); },\n"
139             + "             function(e) { log('Error with decoding audio data'); }\n"
140             + "           );\n"
141             + "      log('AudioContext prep done');\n"
142             + "    }\n"
143             + "  </script>\n"
144             + "</head>\n"
145             + "<body onload='test()'>\n"
146             + LOG_TEXTAREA
147             + "</body>\n"
148             + "</html>";
149 
150         loadPageVerifyTextArea2(html);
151     }
152 
153     /**
154      * @throws Exception if the test fails
155      */
156     @Test
157     @Alerts({"AudioContext prep done", "Error with decoding audio data"})
158     public void decodeAudioData2() throws Exception {
159         final String html = DOCTYPE_HTML
160             + "<html>\n"
161             + "<head>\n"
162             + "  <script>\n"
163             + LOG_TEXTAREA_FUNCTION
164 
165             + "    function test() {\n"
166             + "      if (!('AudioContext' in window)) {\n"
167             + "        log('AudioContext not available');\n"
168             + "        return;\n"
169             + "      }\n"
170 
171             + "      var audioCtx = new AudioContext();\n"
172             + "      var audioData = new ArrayBuffer(0);\n"
173             + "      audioCtx.decodeAudioData(audioData).then(\n"
174             + "             function(buffer) { log('Decoding audio data done'); },\n"
175             + "             function(e) { log('Error with decoding audio data'); }\n"
176             + "           );\n"
177             + "      log('AudioContext prep done');\n"
178             + "    }\n"
179             + "  </script>\n"
180             + "</head>\n"
181             + "<body onload='test()'>\n"
182             + LOG_TEXTAREA
183             + "</body>\n"
184             + "</html>";
185 
186         loadPageVerifyTextArea2(html);
187     }
188 
189     /**
190      * @throws Exception if the test fails
191      */
192     @Test
193     @Alerts({"1", "-3.4028234663852886e+38", "3.4028234663852886e+38", "1", "0.5"})
194     public void createGain() throws Exception {
195         final String html = DOCTYPE_HTML
196             + "<html>\n"
197             + "<head>\n"
198             + "  <script>\n"
199             + LOG_TEXTAREA_FUNCTION
200 
201             + "    function test() {\n"
202             + "      if (!('AudioContext' in window)) {\n"
203             + "        log('AudioContext not available');\n"
204             + "        return;\n"
205             + "      }\n"
206 
207             + "      var audioCtx = new AudioContext();\n"
208             + "      var gainNode = audioCtx.createGain();\n"
209             + "      log(gainNode.gain.defaultValue);\n"
210             + "      log(gainNode.gain.minValue);\n"
211             + "      log(gainNode.gain.maxValue);\n"
212             + "      log(gainNode.gain.value);\n"
213 
214             + "      gainNode.gain.value = 0.5;\n"
215             + "      log(gainNode.gain.value);\n"
216             + "    }\n"
217             + "  </script>\n"
218             + "</head>\n"
219             + "<body onload='test()'>\n"
220             + LOG_TEXTAREA
221             + "</body>\n"
222             + "</html>";
223 
224         loadPageVerifyTextArea2(html);
225     }
226 }