2013-04-25 05:29:31 +00:00
|
|
|
/* 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/. */
|
|
|
|
|
|
|
|
let Cc = Components.classes;
|
|
|
|
let Ci = Components.interfaces;
|
|
|
|
let Cu = Components.utils;
|
|
|
|
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
|
|
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
|
2013-08-29 04:43:00 +00:00
|
|
|
Cu.import("resource://gre/modules/RemoteAddonsChild.jsm");
|
2013-04-25 05:29:31 +00:00
|
|
|
|
2013-11-19 21:20:15 +00:00
|
|
|
let SyncHandler = {
|
|
|
|
init: function() {
|
|
|
|
sendAsyncMessage("SetSyncHandler", {}, {handler: this});
|
|
|
|
},
|
|
|
|
|
|
|
|
getFocusedElementAndWindow: function() {
|
|
|
|
let fm = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager);
|
|
|
|
|
|
|
|
let focusedWindow = {};
|
|
|
|
let elt = fm.getFocusedElementForWindow(content, true, focusedWindow);
|
|
|
|
return [elt, focusedWindow.value];
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
SyncHandler.init();
|
|
|
|
|
2013-04-25 05:29:31 +00:00
|
|
|
let WebProgressListener = {
|
|
|
|
init: function() {
|
|
|
|
let webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
|
|
.getInterface(Ci.nsIWebProgress);
|
|
|
|
webProgress.addProgressListener(this, Ci.nsIWebProgress.NOTIFY_ALL);
|
|
|
|
},
|
|
|
|
|
|
|
|
_requestSpec: function (aRequest) {
|
|
|
|
if (!aRequest || !(aRequest instanceof Ci.nsIChannel))
|
|
|
|
return null;
|
|
|
|
return aRequest.QueryInterface(Ci.nsIChannel).URI.spec;
|
|
|
|
},
|
|
|
|
|
|
|
|
_setupJSON: function setupJSON(aWebProgress, aRequest) {
|
|
|
|
return {
|
|
|
|
isTopLevel: aWebProgress.isTopLevel,
|
2013-07-29 15:03:41 +00:00
|
|
|
isLoadingDocument: aWebProgress.isLoadingDocument,
|
|
|
|
requestURI: this._requestSpec(aRequest),
|
|
|
|
loadType: aWebProgress.loadType
|
2013-04-25 05:29:31 +00:00
|
|
|
};
|
|
|
|
},
|
|
|
|
|
2013-07-17 13:27:49 +00:00
|
|
|
_setupObjects: function setupObjects(aWebProgress) {
|
|
|
|
return {
|
2013-11-19 21:20:15 +00:00
|
|
|
contentWindow: content,
|
2013-07-17 13:27:49 +00:00
|
|
|
// DOMWindow is not necessarily the content-window with subframes.
|
|
|
|
DOMWindow: aWebProgress.DOMWindow
|
|
|
|
};
|
|
|
|
},
|
|
|
|
|
2013-04-25 05:29:31 +00:00
|
|
|
onStateChange: function onStateChange(aWebProgress, aRequest, aStateFlags, aStatus) {
|
|
|
|
let json = this._setupJSON(aWebProgress, aRequest);
|
2013-07-17 13:27:49 +00:00
|
|
|
let objects = this._setupObjects(aWebProgress);
|
|
|
|
|
2013-04-25 05:29:31 +00:00
|
|
|
json.stateFlags = aStateFlags;
|
|
|
|
json.status = aStatus;
|
|
|
|
|
2013-07-17 13:27:49 +00:00
|
|
|
sendAsyncMessage("Content:StateChange", json, objects);
|
2013-04-25 05:29:31 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
onProgressChange: function onProgressChange(aWebProgress, aRequest, aCurSelf, aMaxSelf, aCurTotal, aMaxTotal) {
|
|
|
|
},
|
|
|
|
|
|
|
|
onLocationChange: function onLocationChange(aWebProgress, aRequest, aLocationURI, aFlags) {
|
|
|
|
let json = this._setupJSON(aWebProgress, aRequest);
|
2013-07-17 13:27:49 +00:00
|
|
|
let objects = this._setupObjects(aWebProgress);
|
|
|
|
|
2013-09-05 23:24:29 +00:00
|
|
|
json.location = aLocationURI ? aLocationURI.spec : "";
|
|
|
|
|
|
|
|
if (json.isTopLevel) {
|
|
|
|
json.canGoBack = docShell.canGoBack;
|
|
|
|
json.canGoForward = docShell.canGoForward;
|
|
|
|
json.documentURI = content.document.documentURIObject.spec;
|
|
|
|
json.charset = content.document.characterSet;
|
|
|
|
}
|
2013-04-25 05:29:31 +00:00
|
|
|
|
2013-07-17 13:27:49 +00:00
|
|
|
sendAsyncMessage("Content:LocationChange", json, objects);
|
2013-04-25 05:29:31 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
onStatusChange: function onStatusChange(aWebProgress, aRequest, aStatus, aMessage) {
|
|
|
|
let json = this._setupJSON(aWebProgress, aRequest);
|
2013-07-17 13:27:49 +00:00
|
|
|
let objects = this._setupObjects(aWebProgress);
|
|
|
|
|
2013-04-25 05:29:31 +00:00
|
|
|
json.status = aStatus;
|
|
|
|
json.message = aMessage;
|
|
|
|
|
2013-07-17 13:27:49 +00:00
|
|
|
sendAsyncMessage("Content:StatusChange", json, objects);
|
2013-04-25 05:29:31 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
onSecurityChange: function onSecurityChange(aWebProgress, aRequest, aState) {
|
|
|
|
let json = this._setupJSON(aWebProgress, aRequest);
|
2013-07-17 13:27:49 +00:00
|
|
|
let objects = this._setupObjects(aWebProgress);
|
|
|
|
|
2013-04-25 05:29:31 +00:00
|
|
|
json.state = aState;
|
2013-07-10 02:45:07 +00:00
|
|
|
json.status = SecurityUI.getSSLStatusAsString();
|
2013-04-25 05:29:31 +00:00
|
|
|
|
2013-07-17 13:27:49 +00:00
|
|
|
sendAsyncMessage("Content:SecurityChange", json, objects);
|
2013-04-25 05:29:31 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
QueryInterface: function QueryInterface(aIID) {
|
|
|
|
if (aIID.equals(Ci.nsIWebProgressListener) ||
|
|
|
|
aIID.equals(Ci.nsISupportsWeakReference) ||
|
|
|
|
aIID.equals(Ci.nsISupports)) {
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
throw Components.results.NS_ERROR_NO_INTERFACE;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
WebProgressListener.init();
|
|
|
|
|
|
|
|
let WebNavigation = {
|
|
|
|
_webNavigation: docShell.QueryInterface(Ci.nsIWebNavigation),
|
|
|
|
|
|
|
|
init: function() {
|
|
|
|
addMessageListener("WebNavigation:GoBack", this);
|
|
|
|
addMessageListener("WebNavigation:GoForward", this);
|
|
|
|
addMessageListener("WebNavigation:GotoIndex", this);
|
|
|
|
addMessageListener("WebNavigation:LoadURI", this);
|
|
|
|
addMessageListener("WebNavigation:Reload", this);
|
|
|
|
addMessageListener("WebNavigation:Stop", this);
|
2013-10-28 19:24:51 +00:00
|
|
|
|
|
|
|
// Send a CPOW for the sessionHistory object.
|
|
|
|
let history = this._webNavigation.sessionHistory;
|
|
|
|
sendAsyncMessage("WebNavigation:setHistory", {}, {history: history});
|
2013-04-25 05:29:31 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
receiveMessage: function(message) {
|
|
|
|
switch (message.name) {
|
|
|
|
case "WebNavigation:GoBack":
|
|
|
|
this.goBack();
|
|
|
|
break;
|
|
|
|
case "WebNavigation:GoForward":
|
|
|
|
this.goForward();
|
|
|
|
break;
|
|
|
|
case "WebNavigation:GotoIndex":
|
2013-10-28 19:24:51 +00:00
|
|
|
this.gotoIndex(message.data.index);
|
2013-04-25 05:29:31 +00:00
|
|
|
break;
|
|
|
|
case "WebNavigation:LoadURI":
|
2013-10-28 19:24:51 +00:00
|
|
|
this.loadURI(message.data.uri, message.data.flags);
|
2013-04-25 05:29:31 +00:00
|
|
|
break;
|
|
|
|
case "WebNavigation:Reload":
|
2013-10-28 19:24:51 +00:00
|
|
|
this.reload(message.data.flags);
|
2013-04-25 05:29:31 +00:00
|
|
|
break;
|
|
|
|
case "WebNavigation:Stop":
|
2013-10-28 19:24:51 +00:00
|
|
|
this.stop(message.data.flags);
|
2013-04-25 05:29:31 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
goBack: function() {
|
|
|
|
if (this._webNavigation.canGoBack)
|
|
|
|
this._webNavigation.goBack();
|
|
|
|
},
|
|
|
|
|
|
|
|
goForward: function() {
|
|
|
|
if (this._webNavigation.canGoForward)
|
|
|
|
this._webNavigation.goForward();
|
|
|
|
},
|
|
|
|
|
2013-10-28 19:24:51 +00:00
|
|
|
gotoIndex: function(index) {
|
|
|
|
this._webNavigation.gotoIndex(index);
|
2013-04-25 05:29:31 +00:00
|
|
|
},
|
|
|
|
|
2013-10-28 19:24:51 +00:00
|
|
|
loadURI: function(uri, flags) {
|
|
|
|
this._webNavigation.loadURI(uri, flags, null, null, null);
|
2013-04-25 05:29:31 +00:00
|
|
|
},
|
|
|
|
|
2013-10-28 19:24:51 +00:00
|
|
|
reload: function(flags) {
|
2013-04-25 05:29:31 +00:00
|
|
|
this._webNavigation.reload(flags);
|
|
|
|
},
|
|
|
|
|
2013-10-28 19:24:51 +00:00
|
|
|
stop: function(flags) {
|
2013-04-25 05:29:31 +00:00
|
|
|
this._webNavigation.stop(flags);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
WebNavigation.init();
|
2013-04-25 05:29:39 +00:00
|
|
|
|
2013-07-10 02:45:07 +00:00
|
|
|
let SecurityUI = {
|
|
|
|
getSSLStatusAsString: function() {
|
|
|
|
let status = docShell.securityUI.QueryInterface(Ci.nsISSLStatusProvider).SSLStatus;
|
|
|
|
|
|
|
|
if (status) {
|
|
|
|
let helper = Cc["@mozilla.org/network/serialization-helper;1"]
|
|
|
|
.getService(Ci.nsISerializationHelper);
|
|
|
|
|
|
|
|
status.QueryInterface(Ci.nsISerializable);
|
|
|
|
return helper.serializeToString(status);
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2013-08-21 17:24:53 +00:00
|
|
|
let ControllerCommands = {
|
|
|
|
init: function () {
|
|
|
|
addMessageListener("ControllerCommands:Do", this);
|
|
|
|
},
|
|
|
|
|
|
|
|
receiveMessage: function(message) {
|
|
|
|
switch(message.name) {
|
|
|
|
case "ControllerCommands:Do":
|
|
|
|
if (docShell.isCommandEnabled(message.data))
|
|
|
|
docShell.doCommand(message.data);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ControllerCommands.init()
|
|
|
|
|
2013-04-25 05:29:39 +00:00
|
|
|
addEventListener("DOMTitleChanged", function (aEvent) {
|
|
|
|
let document = content.document;
|
|
|
|
switch (aEvent.type) {
|
|
|
|
case "DOMTitleChanged":
|
|
|
|
if (!aEvent.isTrusted || aEvent.target.defaultView != content)
|
|
|
|
return;
|
|
|
|
|
|
|
|
sendAsyncMessage("DOMTitleChanged", { title: document.title });
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}, false);
|
2013-07-29 15:03:41 +00:00
|
|
|
|
|
|
|
addEventListener("ImageContentLoaded", function (aEvent) {
|
|
|
|
if (content.document instanceof Ci.nsIImageDocument) {
|
|
|
|
let req = content.document.imageRequest;
|
|
|
|
if (!req.image)
|
|
|
|
return;
|
|
|
|
sendAsyncMessage("ImageDocumentLoaded", { width: req.image.width,
|
|
|
|
height: req.image.height });
|
|
|
|
}
|
2013-08-29 04:43:00 +00:00
|
|
|
}, false);
|
|
|
|
|
|
|
|
RemoteAddonsChild.init(this);
|
2013-10-28 19:24:45 +00:00
|
|
|
|
|
|
|
addMessageListener("History:UseGlobalHistory", function (aMessage) {
|
|
|
|
docShell.useGlobalHistory = aMessage.data.enabled;
|
|
|
|
});
|