Bug 1233803 - Add RemoteWebNavigation sessionHistory shim for addons. r?krizsa
--- a/toolkit/components/addoncompat/RemoteAddonsParent.jsm
+++ b/toolkit/components/addoncompat/RemoteAddonsParent.jsm
@@ -950,16 +950,44 @@ ChromeWindowInterposition.getters._conte
let browser = target.gBrowser.selectedBrowser;
if (!browser.contentWindowAsCPOW) {
return makeDummyContentWindow(browser);
}
return browser.contentWindowAsCPOW;
};
+var RemoteWebNavigationInterposition = new Interposition("RemoteWebNavigation");
+
+RemoteWebNavigationInterposition.getters.sessionHistory = function(addon, target) {
+ CompatWarning.warn("Direct access to browser.sessionHistory will no longer work in the chrome process.",
+ addon, CompatWarning.warnings.content);
+
+ if (target instanceof Ci.nsIDocShell) {
+ // We must have a non-remote browser, so we can go ahead
+ // and just return the real sessionHistory.
+ return target.sessionHistory;
+ }
+
+ let impl = target.wrappedJSObject;
+ if (!impl) {
+ return null;
+ }
+
+ let browser = impl._browser;
+
+ let remoteChromeGlobal = RemoteAddonsParent.browserToGlobal.get(browser);
+ if (!remoteChromeGlobal) {
+ CompatWarning.warn("CPOW for the remote browser docShell hasn't been received yet.");
+ // We may not have any messages from this tab yet.
+ return null;
+ }
+ return remoteChromeGlobal.docShell.sessionHistory;
+}
+
var RemoteAddonsParent = {
init: function() {
let mm = Cc["@mozilla.org/globalmessagemanager;1"].getService(Ci.nsIMessageListenerManager);
mm.addMessageListener("Addons:RegisterGlobal", this);
Services.ppmm.initialProcessData.remoteAddonsParentInitted = true;
this.globalToBrowser = new WeakMap();
@@ -972,16 +1000,17 @@ var RemoteAddonsParent = {
function register(intf, interp) {
result[intf.number] = interp;
}
register(Ci.nsICategoryManager, CategoryManagerInterposition);
register(Ci.nsIComponentRegistrar, ComponentRegistrarInterposition);
register(Ci.nsIObserverService, ObserverInterposition);
register(Ci.nsIXPCComponents_Utils, ComponentsUtilsInterposition);
+ register(Ci.nsIWebNavigation, RemoteWebNavigationInterposition);
return result;
},
getTaggedInterpositions: function() {
let result = {};
function register(tag, interp) {