Bug 1233803 - Add RemoteWebNavigation sessionHistory shim for addons. r?krizsa draft
authorMike Conley <mconley@mozilla.com>
Thu, 07 Jan 2016 09:52:35 -0500
changeset 321770 6c1ed5b96cc7b8400828773c3c31e73c4b2c7a9a
parent 321769 43f1f73a6f2a2f363a4320c7ec25865359183ef0
child 321771 4225883a3b72ceca043ce4036dd0faf458889ba0
push id9458
push usermconley@mozilla.com
push dateThu, 14 Jan 2016 20:10:27 +0000
reviewerskrizsa
bugs1233803
milestone46.0a1
Bug 1233803 - Add RemoteWebNavigation sessionHistory shim for addons. r?krizsa
toolkit/components/addoncompat/RemoteAddonsParent.jsm
--- 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) {