mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 1180421 - Add support for DOMMediaPlaybackStarted and DOMMediaPlaybackStopped events; r=mconley
These events are dispatched to a XUL browser element when a document loaded inside them starts or stops media playback.
This commit is contained in:
parent
03d650a612
commit
509ac0bdc0
@ -691,3 +691,29 @@ addMessageListener("WebChannelMessageToContent", function (e) {
|
||||
Cu.reportError("WebChannel message failed. No message data.");
|
||||
}
|
||||
});
|
||||
|
||||
let MediaPlaybackListener = {
|
||||
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
|
||||
|
||||
init() {
|
||||
Services.obs.addObserver(this, "media-playback", false);
|
||||
addEventListener("unload", () => {
|
||||
MediaPlaybackListener.uninit();
|
||||
});
|
||||
},
|
||||
|
||||
uninit() {
|
||||
Services.obs.removeObserver(this, "media-playback");
|
||||
},
|
||||
|
||||
observe(subject, topic, data) {
|
||||
if (topic === "media-playback") {
|
||||
if (subject && subject.top == global.content) {
|
||||
let name = "MediaPlayback:";
|
||||
name += (data === "active") ? "Start" : "Stop";
|
||||
sendAsyncMessage(name);
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
MediaPlaybackListener.init();
|
||||
|
BIN
toolkit/content/tests/browser/audio.ogg
Normal file
BIN
toolkit/content/tests/browser/audio.ogg
Normal file
Binary file not shown.
@ -36,4 +36,9 @@ skip-if = !e10s || !crashreporter
|
||||
support-files =
|
||||
file_redirect.html
|
||||
file_redirect_to.html
|
||||
[browser_bug1170531.js]
|
||||
[browser_bug1170531.js]
|
||||
[browser_mediaPlayback.js]
|
||||
support-files =
|
||||
file_mediaPlayback.html
|
||||
file_mediaPlaybackFrame.html
|
||||
audio.ogg
|
||||
|
36
toolkit/content/tests/browser/browser_mediaPlayback.js
Normal file
36
toolkit/content/tests/browser/browser_mediaPlayback.js
Normal file
@ -0,0 +1,36 @@
|
||||
const PAGE = "https://example.com/browser/toolkit/content/tests/browser/file_mediaPlayback.html";
|
||||
const FRAME = "https://example.com/browser/toolkit/content/tests/browser/file_mediaPlaybackFrame.html";
|
||||
|
||||
function wait_for_event(browser, event) {
|
||||
return BrowserTestUtils.waitForEvent(browser, event, false, (event) => {
|
||||
is(event.originalTarget, browser, "Event must be dispatched to correct browser.");
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
function* test_on_browser(url, browser) {
|
||||
browser.loadURI(url);
|
||||
yield wait_for_event(browser, "DOMMediaPlaybackStarted");
|
||||
yield wait_for_event(browser, "DOMMediaPlaybackStopped");
|
||||
}
|
||||
|
||||
add_task(function*() {
|
||||
yield new Promise((resolve) => {
|
||||
SpecialPowers.pushPrefEnv({"set": [["media.useAudioChannelService", true]]},
|
||||
resolve);
|
||||
});
|
||||
});
|
||||
|
||||
add_task(function* test_page() {
|
||||
yield BrowserTestUtils.withNewTab({
|
||||
gBrowser,
|
||||
url: "about:blank",
|
||||
}, test_on_browser.bind(undefined, PAGE));
|
||||
});
|
||||
|
||||
add_task(function* test_frame() {
|
||||
yield BrowserTestUtils.withNewTab({
|
||||
gBrowser,
|
||||
url: "about:blank",
|
||||
}, test_on_browser.bind(undefined, FRAME));
|
||||
});
|
13
toolkit/content/tests/browser/file_mediaPlayback.html
Normal file
13
toolkit/content/tests/browser/file_mediaPlayback.html
Normal file
@ -0,0 +1,13 @@
|
||||
<!DOCTYPE html>
|
||||
<script type="text/javascript">
|
||||
var audio = new Audio();
|
||||
audio.oncanplay = function() {
|
||||
audio.oncanplay = null;
|
||||
audio.onplaying = function() {
|
||||
audio.onplaying = null;
|
||||
audio.pause();
|
||||
};
|
||||
audio.play();
|
||||
};
|
||||
audio.src = "audio.ogg";
|
||||
</script>
|
@ -0,0 +1,2 @@
|
||||
<!DOCTYPE html>
|
||||
<iframe src="file_mediaPlayback.html"></iframe>
|
@ -641,7 +641,7 @@
|
||||
<method name="updateBlockedPopups">
|
||||
<body>
|
||||
<![CDATA[
|
||||
var event = document.createEvent("Events");
|
||||
let event = document.createEvent("Events");
|
||||
event.initEvent("DOMUpdatePageReport", true, true);
|
||||
this.dispatchEvent(event);
|
||||
]]>
|
||||
@ -663,6 +663,26 @@
|
||||
onget="return this.blockedPopups;"
|
||||
readonly="true"/>
|
||||
|
||||
<method name="mediaPlaybackStarted">
|
||||
<body>
|
||||
<![CDATA[
|
||||
let event = document.createEvent("Events");
|
||||
event.initEvent("DOMMediaPlaybackStarted", true, true);
|
||||
this.dispatchEvent(event);
|
||||
]]>
|
||||
</body>
|
||||
</method>
|
||||
|
||||
<method name="mediaPlaybackStopped">
|
||||
<body>
|
||||
<![CDATA[
|
||||
let event = document.createEvent("Events");
|
||||
event.initEvent("DOMMediaPlaybackStopped", true, true);
|
||||
this.dispatchEvent(event);
|
||||
]]>
|
||||
</body>
|
||||
</method>
|
||||
|
||||
<property name="securityUI">
|
||||
<getter>
|
||||
<![CDATA[
|
||||
@ -813,6 +833,8 @@
|
||||
this.messageManager.addMessageListener("PopupBlocking:UpdateBlockedPopups", this);
|
||||
this.messageManager.addMessageListener("Autoscroll:Start", this);
|
||||
this.messageManager.addMessageListener("Autoscroll:Cancel", this);
|
||||
this.messageManager.addMessageListener("MediaPlayback:Start", this);
|
||||
this.messageManager.addMessageListener("MediaPlayback:Stop", this);
|
||||
}
|
||||
]]>
|
||||
</constructor>
|
||||
@ -899,6 +921,12 @@
|
||||
case "Autoscroll:Cancel":
|
||||
this._autoScrollPopup.hidePopup();
|
||||
break;
|
||||
case "MediaPlayback:Start":
|
||||
this.mediaPlaybackStarted();
|
||||
break;
|
||||
case "MediaPlayback:Stop":
|
||||
this.mediaPlaybackStopped();
|
||||
break;
|
||||
}
|
||||
]]></body>
|
||||
</method>
|
||||
|
Loading…
Reference in New Issue
Block a user