Bug 1351690, part 1 - Split out pdf.js stream registration into another jsm. r=bdahl draft
authorAndrew McCreight <continuation@gmail.com>
Fri, 18 May 2018 16:57:59 -0700
changeset 803081 2144e49fe3d6598b7a5bdc85ec5cd1f4f8e334ad
parent 802711 9900cebb1f9000bd05731ba67736b7c51f7eb812
child 803082 f0dbd1caaa91f29afe29d8a8ab44d7ad24804e8e
push id112025
push userbmo:continuation@gmail.com
push dateFri, 01 Jun 2018 21:29:31 +0000
reviewersbdahl
bugs1351690
milestone62.0a1
Bug 1351690, part 1 - Split out pdf.js stream registration into another jsm. r=bdahl The goal of these patches is to load neither PdfJs.jsm nor PdfStreamConverter.jsm in a content process unless the user is viewing a PDF, to save memory. This first patch creates a small stub JSM to do the stream registration, and calls it directly in the content process, avoiding one way we load PdfJs.jsm. The existing registration methods are kept for the main process. MozReview-Commit-ID: 5GH8tjHXfLb
browser/extensions/pdfjs/content/PdfJs.jsm
browser/extensions/pdfjs/content/PdfJsRegistration.jsm
browser/extensions/pdfjs/content/PdfjsContentUtils.jsm
browser/extensions/pdfjs/content/pdfjschildbootstrap-enabled.js
--- a/browser/extensions/pdfjs/content/PdfJs.jsm
+++ b/browser/extensions/pdfjs/content/PdfJs.jsm
@@ -12,18 +12,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 
 "use strict";
 
 var EXPORTED_SYMBOLS = ["PdfJs"];
 
-const Cm = Components.manager;
-
 const PREF_PREFIX = "pdfjs";
 const PREF_DISABLED = PREF_PREFIX + ".disabled";
 const PREF_MIGRATION_VERSION = PREF_PREFIX + ".migrationVersion";
 const PREF_PREVIOUS_ACTION = PREF_PREFIX + ".previousHandler.preferredAction";
 const PREF_PREVIOUS_ASK = PREF_PREFIX +
                           ".previousHandler.alwaysAskBeforeHandling";
 const PREF_DISABLED_PLUGIN_TYPES = "plugin.disable_full_page_plugin_for_types";
 const PREF_ENABLED_CACHE_STATE = PREF_PREFIX + ".enabledCache.state";
@@ -46,16 +44,18 @@ XPCOMUtils.defineLazyServiceGetter(Svc, 
                                    "@mozilla.org/plugin/host;1",
                                    "nsIPluginHost");
 ChromeUtils.defineModuleGetter(this, "PdfjsChromeUtils",
                                "resource://pdf.js/PdfjsChromeUtils.jsm");
 ChromeUtils.defineModuleGetter(this, "PdfjsContentUtils",
                                "resource://pdf.js/PdfjsContentUtils.jsm");
 ChromeUtils.defineModuleGetter(this, "PdfJsDefaultPreferences",
   "resource://pdf.js/PdfJsDefaultPreferences.jsm");
+ChromeUtils.defineModuleGetter(this, "PdfJsRegistration",
+  "resource://pdf.js/PdfJsRegistration.jsm");
 
 function getBoolPref(aPref, aDefaultValue) {
   try {
     return Services.prefs.getBoolPref(aPref);
   } catch (ex) {
     return aDefaultValue;
   }
 }
@@ -90,50 +90,18 @@ function initializeDefaultPreferences() 
         break;
       case "string":
         defaultBranch.setCharPref(key, defaultValue);
         break;
     }
   }
 }
 
-// Register/unregister a constructor as a factory.
-function Factory() {}
-Factory.prototype = {
-  register: function register(targetConstructor) {
-    var proto = targetConstructor.prototype;
-    this._classID = proto.classID;
-
-    var factory = XPCOMUtils._getFactory(targetConstructor);
-    this._factory = factory;
-
-    var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
-    registrar.registerFactory(proto.classID, proto.classDescription,
-                              proto.contractID, factory);
-
-    if (proto.classID2) {
-      this._classID2 = proto.classID2;
-      registrar.registerFactory(proto.classID2, proto.classDescription,
-                                proto.contractID2, factory);
-    }
-  },
-
-  unregister: function unregister() {
-    var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
-    registrar.unregisterFactory(this._classID, this._factory);
-    if (this._classID2) {
-      registrar.unregisterFactory(this._classID2, this._factory);
-    }
-    this._factory = null;
-  },
-};
-
 var PdfJs = {
   QueryInterface: ChromeUtils.generateQI([Ci.nsIObserver]),
-  _registered: false,
   _initialized: false,
 
   init: function init(remote) {
     if (Services.appinfo.processType !==
         Services.appinfo.PROCESS_TYPE_DEFAULT) {
       throw new Error("PdfJs.init should only get called " +
                       "in the parent process.");
     }
@@ -328,30 +296,16 @@ var PdfJs = {
       }
 
       Services.prefs.setBoolPref(PREF_ENABLED_CACHE_INITIALIZED, true);
     }
     return Services.prefs.getBoolPref(PREF_ENABLED_CACHE_STATE, true);
   },
 
   ensureRegistered: function ensureRegistered() {
-    if (this._registered) {
-      return;
-    }
-    this._pdfStreamConverterFactory = new Factory();
-    ChromeUtils.import("resource://pdf.js/PdfStreamConverter.jsm");
-    this._pdfStreamConverterFactory.register(PdfStreamConverter);
-
-    this._registered = true;
+    PdfJsRegistration.ensureRegistered();
   },
 
   ensureUnregistered: function ensureUnregistered() {
-    if (!this._registered) {
-      return;
-    }
-    this._pdfStreamConverterFactory.unregister();
-    Cu.unload("resource://pdf.js/PdfStreamConverter.jsm");
-    delete this._pdfStreamConverterFactory;
-
-    this._registered = false;
+    PdfJsRegistration.ensureUnregistered();
   },
 };
 
new file mode 100644
--- /dev/null
+++ b/browser/extensions/pdfjs/content/PdfJsRegistration.jsm
@@ -0,0 +1,81 @@
+/* Copyright 2018 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+"use strict";
+
+var EXPORTED_SYMBOLS = ["PdfJsRegistration"];
+
+const Cm = Components.manager;
+
+ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+
+// Register/unregister a constructor as a factory.
+function Factory() {}
+Factory.prototype = {
+  register: function register(targetConstructor) {
+    var proto = targetConstructor.prototype;
+    this._classID = proto.classID;
+
+    var factory = XPCOMUtils._getFactory(targetConstructor);
+    this._factory = factory;
+
+    var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
+    registrar.registerFactory(proto.classID, proto.classDescription,
+                              proto.contractID, factory);
+
+    if (proto.classID2) {
+      this._classID2 = proto.classID2;
+      registrar.registerFactory(proto.classID2, proto.classDescription,
+                                proto.contractID2, factory);
+    }
+  },
+
+  unregister: function unregister() {
+    var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
+    registrar.unregisterFactory(this._classID, this._factory);
+    if (this._classID2) {
+      registrar.unregisterFactory(this._classID2, this._factory);
+    }
+    this._factory = null;
+  },
+};
+
+var PdfJsRegistration = {
+  _registered: false,
+
+  ensureRegistered: function ensureRegistered() {
+    if (this._registered) {
+      return;
+    }
+    this._pdfStreamConverterFactory = new Factory();
+    ChromeUtils.import("resource://pdf.js/PdfStreamConverter.jsm");
+    this._pdfStreamConverterFactory.register(PdfStreamConverter);
+
+    this._registered = true;
+  },
+
+  ensureUnregistered: function ensureUnregistered() {
+    if (!this._registered) {
+      return;
+    }
+    this._pdfStreamConverterFactory.unregister();
+    Cu.unload("resource://pdf.js/PdfStreamConverter.jsm");
+    delete this._pdfStreamConverterFactory;
+
+    this._registered = false;
+  },
+
+};
--- a/browser/extensions/pdfjs/content/PdfjsContentUtils.jsm
+++ b/browser/extensions/pdfjs/content/PdfjsContentUtils.jsm
@@ -113,21 +113,21 @@ var PdfjsContentUtils = {
   },
 
   receiveMessage(aMsg) {
     switch (aMsg.name) {
       case "PDFJS:Child:updateSettings":
         // Only react to this if we are remote.
         if (Services.appinfo.processType ===
             Services.appinfo.PROCESS_TYPE_CONTENT) {
-          let jsm = "resource://pdf.js/PdfJs.jsm";
-          let pdfjs = ChromeUtils.import(jsm, {}).PdfJs;
+          let jsm = "resource://pdf.js/PdfJsRegistration.jsm";
+          let pdfjsr = ChromeUtils.import(jsm, {}).PdfJsRegistration;
           if (aMsg.data.enabled) {
-            pdfjs.ensureRegistered();
+            pdfjsr.ensureRegistered();
           } else {
-            pdfjs.ensureUnregistered();
+            pdfjsr.ensureUnregistered();
           }
         }
         break;
     }
   },
 };
 
--- a/browser/extensions/pdfjs/content/pdfjschildbootstrap-enabled.js
+++ b/browser/extensions/pdfjs/content/pdfjschildbootstrap-enabled.js
@@ -17,14 +17,14 @@
 
 /*
  * pdfjschildbootstrap-enabled.js loads into the content process to
  * take care of initializing our built-in version of pdfjs when
  * running remote. It will only be run when PdfJs.enable is true.
  */
 
 ChromeUtils.import("resource://gre/modules/Services.jsm");
-ChromeUtils.import("resource://pdf.js/PdfJs.jsm");
+ChromeUtils.import("resource://pdf.js/PdfJsRegistration.jsm");
 
 if (Services.appinfo.processType === Services.appinfo.PROCESS_TYPE_CONTENT) {
   // register various pdfjs factories that hook us into content loading.
-  PdfJs.ensureRegistered();
+  PdfJsRegistration.ensureRegistered();
 }