Bug 1245153 - Convert frame-manager.js to a module; r=automatedtester

MozReview-Commit-ID: HNCvHitE3Fh

--HG--
extra : histedit_source : f2b002f19e5d50378bff47939884a1dbd8d774b5
extra : rebase_source : bad2ebd1e5869cfea01e02041d20f928d4c159fa
extra : commitid : 17ftSZYTuNL
extra : source : bd41e4ab829df58950b4262d5d3ab6c457eee9fa
extra : intermediate-source : 6ebd9fde50c0303daeffc5cbe055afbf148113b3
This commit is contained in:
Andreas Tolfsen 2016-02-03 18:52:37 +00:00
Родитель 7e40dc6044
Коммит 3ce634a949
1 изменённых файлов: 50 добавлений и 35 удалений

Просмотреть файл

@ -2,54 +2,67 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file, * 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/. */ * You can obtain one at http://mozilla.org/MPL/2.0/. */
var {classes: Cc, interfaces: Ci, utils: Cu} = Components; "use strict";
this.EXPORTED_SYMBOLS = ["FrameManager"]; const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
var FRAME_SCRIPT = "chrome://marionette/content/listener.js";
Cu.import("resource://gre/modules/Services.jsm"); Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/XPCOMUtils.jsm");
var loader = Cc["@mozilla.org/moz/jssubscript-loader;1"] this.EXPORTED_SYMBOLS = ["frame"];
.getService(Ci.mozIJSSubScriptLoader);
//list of OOP frames that has the frame script loaded this.frame = {};
const FRAME_SCRIPT = "chrome://marionette/content/listener.js";
// list of OOP frames that has the frame script loaded
var remoteFrames = []; var remoteFrames = [];
/** /**
* An object representing a frame that Marionette has loaded a * An object representing a frame that Marionette has loaded a
* frame script in. * frame script in.
*/ */
function MarionetteRemoteFrame(windowId, frameId) { frame.RemoteFrame = function(windowId, frameId) {
this.windowId = windowId; //outerWindowId relative to main process // outerWindowId relative to main process
this.frameId = frameId; //actual frame relative to windowId's frames list this.windowId = windowId;
this.targetFrameId = this.frameId; //assigned FrameId, used for messaging // actual frame relative to the windowId's frames list
this.frameId = frameId;
// assigned frame ID, used for messaging
this.targetFrameId = this.frameId;
// list of OOP frames that has the frame script loaded
this.remoteFrames = [];
}; };
/** /**
* The FrameManager will maintain the list of Out Of Process (OOP) frames and will handle * The FrameManager will maintain the list of Out Of Process (OOP)
* frame switching between them. * frames and will handle frame switching between them.
* It handles explicit frame switching (switchToFrame), and implicit frame switching, which
* occurs when a modal dialog is triggered in B2G.
* *
* It handles explicit frame switching (switchToFrame), and implicit
* frame switching, which occurs when a modal dialog is triggered in B2G.
*/ */
this.FrameManager = function FrameManager(server) { frame.Manager = function(server) {
//messageManager maintains the messageManager for the current process' chrome frame or the global message manager // messageManager maintains the messageManager
this.currentRemoteFrame = null; //holds a member of remoteFrames (for an OOP frame) or null (for the main process) // for the current process' chrome frame or the global message manager
this.previousRemoteFrame = null; //frame we'll need to restore once interrupt is gone
this.handledModal = false; //set to true when we have been interrupted by a modal // holds a member of the remoteFrames (for an OOP frame)
this.server = server; // a reference to the marionette server // or null (for the main process)
this.currentRemoteFrame = null;
// frame we'll need to restore once interrupt is gone
this.previousRemoteFrame = null;
// set to true when we have been interrupted by a modal
this.handledModal = false;
// a reference to the Marionette server
this.server = server;
}; };
FrameManager.prototype = { frame.Manager.prototype = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIMessageListener, QueryInterface: XPCOMUtils.generateQI(
Ci.nsISupportsWeakReference]), [Ci.nsIMessageListener, Ci.nsISupportsWeakReference]),
/** /**
* Receives all messages from content messageManager * Receives all messages from content messageManager.
*/ */
receiveMessage: function FM_receiveMessage(message) { receiveMessage: function(message) {
switch (message.name) { switch (message.name) {
case "MarionetteFrame:getInterruptedState": case "MarionetteFrame:getInterruptedState":
// This will return true if the calling frame was interrupted by a modal dialog // This will return true if the calling frame was interrupted by a modal dialog
@ -68,6 +81,7 @@ FrameManager.prototype = {
return {value: this.handledModal}; return {value: this.handledModal};
} }
return {value: false}; return {value: false};
case "MarionetteFrame:handleModal": case "MarionetteFrame:handleModal":
/* /*
* handleModal is called when we need to switch frames to the main process due to a modal dialog interrupt. * handleModal is called when we need to switch frames to the main process due to a modal dialog interrupt.
@ -89,6 +103,7 @@ FrameManager.prototype = {
this.handledModal = true; this.handledModal = true;
this.server.sendOk(this.server.command_id); this.server.sendOk(this.server.command_id);
return {value: isLocal}; return {value: isLocal};
case "MarionetteFrame:getCurrentFrameId": case "MarionetteFrame:getCurrentFrameId":
if (this.currentRemoteFrame != null) { if (this.currentRemoteFrame != null) {
return this.currentRemoteFrame.frameId; return this.currentRemoteFrame.frameId;
@ -96,7 +111,7 @@ FrameManager.prototype = {
} }
}, },
getOopFrame: function FM_getOopFrame(winId, frameId) { getOopFrame: function(winId, frameId) {
// get original frame window // get original frame window
let outerWin = Services.wm.getOuterWindowWithId(winId); let outerWin = Services.wm.getOuterWindowWithId(winId);
// find the OOP frame // find the OOP frame
@ -104,7 +119,7 @@ FrameManager.prototype = {
return f; return f;
}, },
getFrameMM: function FM_getFrameMM(winId, frameId) { getFrameMM: function(winId, frameId) {
let oopFrame = this.getOopFrame(winId, frameId); let oopFrame = this.getOopFrame(winId, frameId);
let mm = oopFrame.QueryInterface(Ci.nsIFrameLoaderOwner) let mm = oopFrame.QueryInterface(Ci.nsIFrameLoaderOwner)
.frameLoader.messageManager; .frameLoader.messageManager;
@ -112,10 +127,10 @@ FrameManager.prototype = {
}, },
/** /**
* Switch to OOP frame. We're handling this here * Switch to OOP frame. We're handling this here so we can maintain
* so we can maintain a list of remote frames. * a list of remote frames.
*/ */
switchToFrame: function FM_switchToFrame(winId, frameId) { switchToFrame: function(winId, frameId) {
let oopFrame = this.getOopFrame(winId, frameId); let oopFrame = this.getOopFrame(winId, frameId);
let mm = this.getFrameMM(winId, frameId); let mm = this.getFrameMM(winId, frameId);
@ -145,7 +160,7 @@ FrameManager.prototype = {
// and set the frame's ChromeMessageSender as the active message manager // and set the frame's ChromeMessageSender as the active message manager
// the server will listen to. // the server will listen to.
this.addMessageManagerListeners(mm); this.addMessageManagerListeners(mm);
let aFrame = new MarionetteRemoteFrame(winId, frameId); let aFrame = new frame.RemoteFrame(winId, frameId);
aFrame.messageManager = Cu.getWeakReference(mm); aFrame.messageManager = Cu.getWeakReference(mm);
remoteFrames.push(aFrame); remoteFrames.push(aFrame);
this.currentRemoteFrame = aFrame; this.currentRemoteFrame = aFrame;
@ -159,7 +174,7 @@ FrameManager.prototype = {
* This function handles switching back to the frame that was interrupted by the modal dialog. * This function handles switching back to the frame that was interrupted by the modal dialog.
* This function gets called by the interrupted frame once the dialog is dismissed and the frame resumes its process * This function gets called by the interrupted frame once the dialog is dismissed and the frame resumes its process
*/ */
switchToModalOrigin: function FM_switchToModalOrigin() { switchToModalOrigin: function() {
//only handle this if we indeed switched out of the modal's originating frame //only handle this if we indeed switched out of the modal's originating frame
if (this.previousRemoteFrame != null) { if (this.previousRemoteFrame != null) {
this.currentRemoteFrame = this.previousRemoteFrame; this.currentRemoteFrame = this.previousRemoteFrame;
@ -179,7 +194,7 @@ FrameManager.prototype = {
* The message manager object, typically * The message manager object, typically
* ChromeMessageBroadcaster or ChromeMessageSender. * ChromeMessageBroadcaster or ChromeMessageSender.
*/ */
addMessageManagerListeners: function FM_addMessageManagerListeners(mm) { addMessageManagerListeners: function(mm) {
mm.addWeakMessageListener("Marionette:ok", this.server); mm.addWeakMessageListener("Marionette:ok", this.server);
mm.addWeakMessageListener("Marionette:done", this.server); mm.addWeakMessageListener("Marionette:done", this.server);
mm.addWeakMessageListener("Marionette:error", this.server); mm.addWeakMessageListener("Marionette:error", this.server);
@ -211,7 +226,7 @@ FrameManager.prototype = {
* The message manager object, typically * The message manager object, typically
* ChromeMessageBroadcaster or ChromeMessageSender. * ChromeMessageBroadcaster or ChromeMessageSender.
*/ */
removeMessageManagerListeners: function FM_removeMessageManagerListeners(mm) { removeMessageManagerListeners: function(mm) {
mm.removeWeakMessageListener("Marionette:ok", this.server); mm.removeWeakMessageListener("Marionette:ok", this.server);
mm.removeWeakMessageListener("Marionette:done", this.server); mm.removeWeakMessageListener("Marionette:done", this.server);
mm.removeWeakMessageListener("Marionette:error", this.server); mm.removeWeakMessageListener("Marionette:error", this.server);