Bug 1287007 - Remove .contentWindow from ProxyContext draft
authorRob Wu <rob@robwu.nl>
Tue, 13 Sep 2016 16:02:03 -0700
changeset 428446 4e76e3f93a905dd3af9a58cfec9d571903c47e26
parent 428445 99e88e15e92d273d05b411b92efd51fe7d7eb9bb
child 428447 f9599cd16356dd056f6109318c4c00d89321e2f5
push id33305
push userbmo:rob@robwu.nl
push dateSun, 23 Oct 2016 20:56:25 +0000
bugs1287007
milestone52.0a1
Bug 1287007 - Remove .contentWindow from ProxyContext MozReview-Commit-ID: ASNigrM07yz
browser/components/extensions/ext-utils.js
mobile/android/components/extensions/ext-pageAction.js
toolkit/components/extensions/ExtensionChild.jsm
toolkit/components/extensions/ExtensionUtils.jsm
--- a/browser/components/extensions/ext-utils.js
+++ b/browser/components/extensions/ext-utils.js
@@ -76,17 +76,18 @@ XPCOMUtils.defineLazyGetter(this, "stand
     stylesheets.push("chrome://browser/content/extension-win-panel.css");
   }
   return stylesheets;
 });
 
 /* eslint-disable mozilla/balanced-listeners */
 extensions.on("page-shutdown", (type, context) => {
   if (context.viewType == "popup" && context.active) {
-    context.contentWindow.close();
+    // TODO(robwu): This is not webext-oop compatible.
+    context.xulBrowser.contentWindow.close();
   }
 });
 /* eslint-enable mozilla/balanced-listeners */
 
 class BasePopup {
   constructor(extension, viewNode, popupURL, browserStyle, fixedWidth = false) {
     this.extension = extension;
     this.popupURL = popupURL;
--- a/mobile/android/components/extensions/ext-pageAction.js
+++ b/mobile/android/components/extensions/ext-pageAction.js
@@ -59,21 +59,30 @@ PageAction.prototype = {
 
     if (this.options.icon) {
       this.id = PageActions.add(this.options);
       return Promise.resolve();
     }
 
     this.shouldShow = true;
 
+    // TODO(robwu): Remove dependency on contentWindow from this file. It should
+    // be put in a separate file called ext-c-pageAction.js.
+    // Note: Fennec is not going to be multi-process for the foreseaable future,
+    // so this layering violation has no immediate impact. However, it is should
+    // be done at some point.
+    let {contentWindow} = context.xulBrowser;
+
+    // TODO(robwu): Why is this contentWindow.devicePixelRatio, while
+    // convertImageURLToDataURL uses browserWindow.devicePixelRatio?
     let {icon} = IconDetails.getPreferredIcon(this.icons, this.extension,
-                                              18 * context.contentWindow.devicePixelRatio);
+                                              18 * contentWindow.devicePixelRatio);
 
     let browserWindow = Services.wm.getMostRecentWindow("navigator:browser");
-    return IconDetails.convertImageURLToDataURL(icon, context, browserWindow).then(dataURI => {
+    return IconDetails.convertImageURLToDataURL(icon, contentWindow, browserWindow).then(dataURI => {
       if (this.shouldShow) {
         this.options.icon = dataURI;
         this.id = PageActions.add(this.options);
       }
     }).catch(() => {
       return Promise.reject({
         message: "Failed to load PageAction icon",
       });
--- a/toolkit/components/extensions/ExtensionChild.jsm
+++ b/toolkit/components/extensions/ExtensionChild.jsm
@@ -98,19 +98,16 @@ class WannabeChildAPIManager extends Chi
     // parent cloneScope does not really matter (because when the message
     // arrives locally, the object is cloned into the local clone scope).
     // If all calls are direct, then the parent cloneScope does matter, because
     // the objects are not cloned again.
     Object.defineProperty(proxyContext, "cloneScope", {
       get: () => this.cloneScope,
     });
 
-    // Many APIs rely on this, so temporarily add it to keep the commit small.
-    proxyContext.setContentWindow(this.context.contentWindow);
-
     // Synchronously unload the ProxyContext because we synchronously create it.
     this.context.callOnClose({close: proxyContext.unload.bind(proxyContext)});
   }
 
   getFallbackImplementation(namespace, name) {
     // This is gross and should be removed ASAP.
     let shouldSynchronouslyUseParentAPI = false;
     // Incompatible APIs are listed here.
--- a/toolkit/components/extensions/ExtensionUtils.jsm
+++ b/toolkit/components/extensions/ExtensionUtils.jsm
@@ -592,21 +592,21 @@ let IconDetails = {
 
     if (bestSize) {
       return {size: bestSize, icon: icons[bestSize]};
     }
 
     return {size, icon: DEFAULT};
   },
 
-  convertImageURLToDataURL(imageURL, context, browserWindow, size = 18) {
+  convertImageURLToDataURL(imageURL, contentWindow, browserWindow, size = 18) {
     return new Promise((resolve, reject) => {
-      let image = new context.contentWindow.Image();
+      let image = new contentWindow.Image();
       image.onload = function() {
-        let canvas = context.contentWindow.document.createElement("canvas");
+        let canvas = contentWindow.document.createElement("canvas");
         let ctx = canvas.getContext("2d");
         let dSize = size * browserWindow.devicePixelRatio;
 
         // Scales the image while maintaing width to height ratio.
         // If the width and height differ, the image is centered using the
         // smaller of the two dimensions.
         let dWidth, dHeight, dx, dy;
         if (this.width > this.height) {
@@ -1061,24 +1061,21 @@ SingletonEventManager.prototype = {
 
 // Simple API for event listeners where events never fire.
 function ignoreEvent(context, name) {
   return {
     addListener: function(callback) {
       let id = context.extension.id;
       let frame = Components.stack.caller;
       let msg = `In add-on ${id}, attempting to use listener "${name}", which is unimplemented.`;
-      let winID = context.contentWindow.QueryInterface(Ci.nsIInterfaceRequestor)
-        .getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID;
       let scriptError = Cc["@mozilla.org/scripterror;1"]
         .createInstance(Ci.nsIScriptError);
-      scriptError.initWithWindowID(msg, frame.filename, null,
-                                   frame.lineNumber, frame.columnNumber,
-                                   Ci.nsIScriptError.warningFlag,
-                                   "content javascript", winID);
+      scriptError.init(msg, frame.filename, null, frame.lineNumber,
+                       frame.columnNumber, Ci.nsIScriptError.warningFlag,
+                       "content javascript");
       let consoleService = Cc["@mozilla.org/consoleservice;1"]
         .getService(Ci.nsIConsoleService);
       consoleService.logMessage(scriptError);
     },
     removeListener: function(callback) {},
     hasListener: function(callback) {},
   };
 }