зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
7e40dc6044
Коммит
3ce634a949
|
@ -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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче