diff --git a/toolkit/content/tests/browser/browser.ini b/toolkit/content/tests/browser/browser.ini index e33fc99f91dd..e8e5df4aba40 100644 --- a/toolkit/content/tests/browser/browser.ini +++ b/toolkit/content/tests/browser/browser.ini @@ -19,6 +19,7 @@ support-files = file_redirect_to.html file_silentAudioTrack.html file_webAudio.html + gizmo.mp4 head.js image.jpg image_page.html @@ -30,6 +31,7 @@ support-files = tags = audiochannel [browser_audioCompeting_onlyForActiveAgent.js] tags = audiochannel +[browser_autoplay_policy_play_twice.js] [browser_autoscroll_disabled.js] [browser_block_autoplay_media.js] tags = audiochannel diff --git a/toolkit/content/tests/browser/browser_autoplay_policy_play_twice.js b/toolkit/content/tests/browser/browser_autoplay_policy_play_twice.js new file mode 100644 index 000000000000..addff873b2a5 --- /dev/null +++ b/toolkit/content/tests/browser/browser_autoplay_policy_play_twice.js @@ -0,0 +1,48 @@ +const FILE = "https://example.com/browser/toolkit/content/tests/browser/gizmo.mp4"; + +function setup_test_preference(enableUserGesture) { + let state = enableUserGesture ? "enable" : "disable"; + info(`- set pref : ${state} user gesture -`); + return SpecialPowers.pushPrefEnv({"set": [ + ["media.autoplay.enabled", false], + ["media.autoplay.enabled.user-gestures-needed", enableUserGesture] + ]}); +} + +async function allow_play_for_played_video() { + info("- open new tab -"); + let tab = await BrowserTestUtils.openNewForegroundTab(window.gBrowser, + "about:blank"); + info("- create video -"); + let document = tab.linkedBrowser.contentDocument; + let video = document.createElement("video"); + video.src = FILE; + video.controls = true; + document.body.appendChild(video); + + info("- simulate user-click to start video -"); + let waitForPlayEvent = once(video, "play"); + await BrowserTestUtils.synthesizeMouseAtCenter(video, {button: 0}, + tab.linkedBrowser); + info("- video starts playing -"); + await waitForPlayEvent; + + info("- call video play() again -"); + try { + await video.play(); + ok(true, "success to resolve play promise"); + } catch (e) { + ok(false, "promise should not be rejected"); + } + + info("- remove tab -"); + await BrowserTestUtils.removeTab(tab); +} + +add_task(async function start_test() { + await setup_test_preference(true); + await allow_play_for_played_video(); + + await setup_test_preference(false); + await allow_play_for_played_video(); +}); diff --git a/toolkit/content/tests/browser/gizmo.mp4 b/toolkit/content/tests/browser/gizmo.mp4 new file mode 100644 index 000000000000..87efad5ade9f Binary files /dev/null and b/toolkit/content/tests/browser/gizmo.mp4 differ diff --git a/toolkit/content/tests/browser/head.js b/toolkit/content/tests/browser/head.js index fe6009f7e0e6..4dc2f699e2c5 100644 --- a/toolkit/content/tests/browser/head.js +++ b/toolkit/content/tests/browser/head.js @@ -212,3 +212,15 @@ class DateTimeTestHelper { this.panel = null; } } + +/** + * Used to listen events if you just need it once + */ +function once(target, name) { + var p = new Promise(function(resolve, reject) { + target.addEventListener(name, function() { + resolve(); + }, {once: true}); + }); + return p; +}