diff --git a/sound/src/main/java/org/netbeans/html/sound/impl/BrowserAudioEnv.java b/sound/src/main/java/org/netbeans/html/sound/impl/BrowserAudioEnv.java index f0323a4b9..b9cbff9d7 100644 --- a/sound/src/main/java/org/netbeans/html/sound/impl/BrowserAudioEnv.java +++ b/sound/src/main/java/org/netbeans/html/sound/impl/BrowserAudioEnv.java @@ -33,9 +33,13 @@ private BrowserAudioEnv() { } @Override - @JavaScriptBody(args = { "src" }, body = "" - + "if (typeof Audio !== 'object') return null;" - + "return new Audio(src);") + @JavaScriptBody(args = { "src" }, body = """ + if (typeof Audio === 'undefined') { + return null; + } else { + return new Audio(src); + } + """) public Object create(String src) { // null if not running in browser return null; diff --git a/sound/src/test/java/net/java/html/sound/AudioClipTest.java b/sound/src/test/java/net/java/html/sound/AudioClipTest.java index 138457429..479a7b10a 100644 --- a/sound/src/test/java/net/java/html/sound/AudioClipTest.java +++ b/sound/src/test/java/net/java/html/sound/AudioClipTest.java @@ -18,9 +18,13 @@ */ package net.java.html.sound; +import net.java.html.js.JavaScriptBody; import net.java.html.junit.BrowserRunner; +import static org.junit.Assert.assertTrue; +import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; +import org.netbeans.html.boot.spi.Fn; @RunWith(BrowserRunner.class) public class AudioClipTest { @@ -30,6 +34,40 @@ public AudioClipTest() { @Test public void testPlayNonExistingClip() { - AudioClip.create("non-existing.mp3").play(); + var clip = AudioClip.create("non-existing.mp3"); + clip.play(); + } + + @Test + public void testAudioSystemIsSupported() { + var clip = AudioClip.create("non-existing.mp3"); + if (assumeAudioObject()) { + var p = Fn.activePresenter().getClass().getName(); + assertTrue("Playing should be supported on " + p, clip.isSupported()); + } + } + + @JavaScriptBody(args = { }, body = """ + try { + var audio = new Audio("any.mp3"); + return null; + } catch (err) { + return "Error constructing new Audio: " + err.toString(); + } + """) + private static String createAudioObjectOrFail() { + return "Not running in a browser at all!"; + } + + private static boolean assumeAudioObject() { + var errMsg = createAudioObjectOrFail(); + var p = Fn.activePresenter().getClass().getName(); + if (errMsg == null) { + return true; + } else { + // it is expected that ScriptPresenter doesn't have Audio + Assume.assumeTrue("No Audio for " + p + ":" + errMsg, p.contains("ScriptPresenter")); + return false; + } } } diff --git a/src/main/javadoc/overview.html b/src/main/javadoc/overview.html index 71606ca5a..c9e0b57e0 100644 --- a/src/main/javadoc/overview.html +++ b/src/main/javadoc/overview.html @@ -163,6 +163,11 @@

Try it

vm.loadClass('org.apidesign.demo.minesweeper.MainBrwsr'); +

New in version 1.8.3

+

+ {@link net.java.html.sound.AudioClip} plays music again via internal browser audio system - see + PR #56 for details. +

New in version 1.8.2

When post-processing classes with -javaagent instrumenting agent