diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in index ba9b41eaf6cc..1fe70d1dad4f 100644 --- a/browser/installer/package-manifest.in +++ b/browser/installer/package-manifest.in @@ -382,6 +382,7 @@ @RESPATH@/browser/modules/* @RESPATH@/modules/* @RESPATH@/browser/actors/* +@RESPATH@/actors/* ; Safe Browsing @RESPATH@/components/nsURLClassifier.manifest diff --git a/mobile/android/installer/package-manifest.in b/mobile/android/installer/package-manifest.in index 8983a2dda0cc..c261afd748d0 100644 --- a/mobile/android/installer/package-manifest.in +++ b/mobile/android/installer/package-manifest.in @@ -245,6 +245,7 @@ ; Modules @BINPATH@/modules/* +@BINPATH@/actors/* ; Safe Browsing @BINPATH@/components/nsURLClassifier.manifest diff --git a/toolkit/actors/AudioPlaybackChild.jsm b/toolkit/actors/AudioPlaybackChild.jsm new file mode 100644 index 000000000000..53ca6e1ebdef --- /dev/null +++ b/toolkit/actors/AudioPlaybackChild.jsm @@ -0,0 +1,72 @@ +/* vim: set ts=2 sw=2 sts=2 et tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +"use strict"; + +var EXPORTED_SYMBOLS = ["AudioPlaybackChild"]; + +ChromeUtils.import("resource://gre/modules/ActorChild.jsm"); + +class AudioPlaybackChild extends ActorChild { + handleMediaControlMessage(msg) { + let utils = this.content.windowUtils; + let suspendTypes = Ci.nsISuspendedTypes; + switch (msg) { + case "mute": + utils.audioMuted = true; + break; + case "unmute": + utils.audioMuted = false; + break; + case "lostAudioFocus": + utils.mediaSuspend = suspendTypes.SUSPENDED_PAUSE_DISPOSABLE; + break; + case "lostAudioFocusTransiently": + utils.mediaSuspend = suspendTypes.SUSPENDED_PAUSE; + break; + case "gainAudioFocus": + utils.mediaSuspend = suspendTypes.NONE_SUSPENDED; + break; + case "mediaControlPaused": + utils.mediaSuspend = suspendTypes.SUSPENDED_PAUSE_DISPOSABLE; + break; + case "mediaControlStopped": + utils.mediaSuspend = suspendTypes.SUSPENDED_STOP_DISPOSABLE; + break; + case "resumeMedia": + // User has clicked the tab audio indicator to play a delayed + // media. That's clear user intent to play, so gesture activate + // the content document tree so that the block-autoplay logic + // allows the media to autoplay. + this.content.document.notifyUserGestureActivation(); + utils.mediaSuspend = suspendTypes.NONE_SUSPENDED; + break; + default: + dump("Error : wrong media control msg!\n"); + break; + } + } + + observe(subject, topic, data) { + if (topic === "audio-playback") { + if (subject && subject.top == this.content) { + let name = "AudioPlayback:"; + if (data === "activeMediaBlockStart") { + name += "ActiveMediaBlockStart"; + } else if (data === "activeMediaBlockStop") { + name += "ActiveMediaBlockStop"; + } else { + name += (data === "active") ? "Start" : "Stop"; + } + this.mm.sendAsyncMessage(name); + } + } + } + + receiveMessage(msg) { + if (msg.name == "AudioPlayback") { + this.handleMediaControlMessage(msg.data.type); + } + } +} diff --git a/toolkit/actors/moz.build b/toolkit/actors/moz.build new file mode 100644 index 000000000000..b1057c6126d9 --- /dev/null +++ b/toolkit/actors/moz.build @@ -0,0 +1,9 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +FINAL_TARGET_FILES.actors += [ + 'AudioPlaybackChild.jsm', +] diff --git a/toolkit/content/browser-content.js b/toolkit/content/browser-content.js index 45d360e1f3d9..d42a2e9cb4ff 100644 --- a/toolkit/content/browser-content.js +++ b/toolkit/content/browser-content.js @@ -190,88 +190,6 @@ addEventListener("WebChannelMessageToChrome", WebChannelContent, true, true); addMessageListener("WebChannelMessageToContent", WebChannelContent); -var AudioPlaybackListener = { - QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver]), - - init() { - Services.obs.addObserver(this, "audio-playback"); - - addMessageListener("AudioPlayback", this); - addEventListener("unload", () => { - AudioPlaybackListener.uninit(); - }); - this.init = null; - }, - - uninit() { - Services.obs.removeObserver(this, "audio-playback"); - - removeMessageListener("AudioPlayback", this); - }, - - handleMediaControlMessage(msg) { - let utils = global.content.windowUtils; - let suspendTypes = Ci.nsISuspendedTypes; - switch (msg) { - case "mute": - utils.audioMuted = true; - break; - case "unmute": - utils.audioMuted = false; - break; - case "lostAudioFocus": - utils.mediaSuspend = suspendTypes.SUSPENDED_PAUSE_DISPOSABLE; - break; - case "lostAudioFocusTransiently": - utils.mediaSuspend = suspendTypes.SUSPENDED_PAUSE; - break; - case "gainAudioFocus": - utils.mediaSuspend = suspendTypes.NONE_SUSPENDED; - break; - case "mediaControlPaused": - utils.mediaSuspend = suspendTypes.SUSPENDED_PAUSE_DISPOSABLE; - break; - case "mediaControlStopped": - utils.mediaSuspend = suspendTypes.SUSPENDED_STOP_DISPOSABLE; - break; - case "resumeMedia": - // User has clicked the tab audio indicator to play a delayed - // media. That's clear user intent to play, so gesture activate - // the content document tree so that the block-autoplay logic - // allows the media to autoplay. - content.document.notifyUserGestureActivation(); - utils.mediaSuspend = suspendTypes.NONE_SUSPENDED; - break; - default: - dump("Error : wrong media control msg!\n"); - break; - } - }, - - observe(subject, topic, data) { - if (topic === "audio-playback") { - if (subject && subject.top == global.content) { - let name = "AudioPlayback:"; - if (data === "activeMediaBlockStart") { - name += "ActiveMediaBlockStart"; - } else if (data === "activeMediaBlockStop") { - name += "ActiveMediaBlockStop"; - } else { - name += (data === "active") ? "Start" : "Stop"; - } - sendAsyncMessage(name); - } - } - }, - - receiveMessage(msg) { - if (msg.name == "AudioPlayback") { - this.handleMediaControlMessage(msg.data.type); - } - }, -}; -AudioPlaybackListener.init(); - var UnselectedTabHoverObserver = { init() { addMessageListener("Browser:UnselectedTabHover", this); diff --git a/toolkit/modules/ActorManagerParent.jsm b/toolkit/modules/ActorManagerParent.jsm index 3e71e4cfa699..1a135650714a 100644 --- a/toolkit/modules/ActorManagerParent.jsm +++ b/toolkit/modules/ActorManagerParent.jsm @@ -100,6 +100,17 @@ ChromeUtils.import("resource://gre/modules/Services.jsm"); const {DefaultMap} = ExtensionUtils; let ACTORS = { + AudioPlayback: { + child: { + module: "resource://gre/actors/AudioPlaybackChild.jsm", + messages: [ + "AudioPlayback", + ], + observers: [ + "audio-playback", + ], + }, + }, }; class ActorSet { diff --git a/toolkit/moz.build b/toolkit/moz.build index b8b733cd3963..109fb2ce9369 100644 --- a/toolkit/moz.build +++ b/toolkit/moz.build @@ -5,6 +5,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. DIRS += [ + 'actors', 'components', 'content', 'crashreporter',