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:
Ehsan Akhgari 2015-07-04 15:00:41 -04:00
parent 03d650a612
commit 509ac0bdc0
7 changed files with 112 additions and 2 deletions

View File

@ -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();

Binary file not shown.

View File

@ -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

View 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));
});

View 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>

View File

@ -0,0 +1,2 @@
<!DOCTYPE html>
<iframe src="file_mediaPlayback.html"></iframe>

View File

@ -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>