Bug 1351690, part 4 - Only load the stream converter when we try to view a pdf. r=bdahl draft
authorAndrew McCreight <continuation@gmail.com>
Tue, 22 May 2018 16:13:47 -0700
changeset 803086 30a2d984c42ad4ca133a24ce7a55e5ce0e062c55
parent 803085 47e7548ba8aae7740061e776dd0db92a8d2721d4
push id112027
push userbmo:continuation@gmail.com
push dateFri, 01 Jun 2018 21:32:44 +0000
reviewersbdahl
bugs1351690
milestone62.0a1
Bug 1351690, part 4 - Only load the stream converter when we try to view a pdf. r=bdahl This inlines and simplifies the call to XPCOMUtils._getFactory, because otherwise passing PdfStreamConverter appears to resolve it immediately, loading the JSM. (The stream converter prototype does not have a property _xpcom_factory, so there's no need for the check.) Once that is done, we can just lazily load the stream converter JSM to keep it from being loaded on startup. This patch also checks that the stream converter is not loaded at startup in the main process or the content process, and that PdfJs.jsm is not loaded at startup in the content process. It needs to be loaded in the main process to watch for some prefs. MozReview-Commit-ID: EA0pSgs4AWH
browser/base/content/test/performance/browser_startup.js
browser/base/content/test/performance/browser_startup_content.js
browser/extensions/pdfjs/content/PdfJsRegistration.jsm
--- a/browser/base/content/test/performance/browser_startup.js
+++ b/browser/base/content/test/performance/browser_startup.js
@@ -114,16 +114,17 @@ const startupPhases = {
   "before becoming idle": {blacklist: {
     components: new Set([
       "UnifiedComplete.js",
     ]),
     modules: new Set([
       "resource://gre/modules/AsyncPrefs.jsm",
       "resource://gre/modules/LoginManagerContextMenu.jsm",
       "resource://gre/modules/Task.jsm",
+      "resource://pdf.js/PdfStreamConverter.jsm",
     ]),
   }},
 };
 
 if (Services.prefs.getBoolPref("browser.startup.blankWindow")) {
   startupPhases["before profile selection"].whitelist.components.add("XULStore.js");
 }
 
--- a/browser/base/content/test/performance/browser_startup_content.js
+++ b/browser/base/content/test/performance/browser_startup_content.js
@@ -24,16 +24,18 @@ const blacklist = {
   ]),
   modules: new Set([
     "resource:///modules/ContentWebRTC.jsm",
     "resource://gre/modules/InlineSpellChecker.jsm",
     "resource://gre/modules/InlineSpellCheckerContent.jsm",
     "resource://gre/modules/Promise.jsm",
     "resource://gre/modules/Task.jsm",
     "resource://gre/modules/osfile.jsm",
+    "resource://pdf.js/PdfJs.jsm",
+    "resource://pdf.js/PdfStreamConverter.jsm",
   ]),
   services: new Set([
     "@mozilla.org/base/telemetry-startup;1",
     "@mozilla.org/push/Service;1",
   ])
 };
 
 add_task(async function() {
--- a/browser/extensions/pdfjs/content/PdfJsRegistration.jsm
+++ b/browser/extensions/pdfjs/content/PdfJsRegistration.jsm
@@ -16,32 +16,41 @@
 "use strict";
 
 var EXPORTED_SYMBOLS = ["PdfJsRegistration"];
 
 const Cm = Components.manager;
 
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 
+ChromeUtils.defineModuleGetter(this, "PdfStreamConverter",
+  "resource://pdf.js/PdfStreamConverter.jsm");
 
 // Register/unregister a constructor as a factory.
 function StreamConverterFactory() {}
 StreamConverterFactory.prototype = {
 
   // properties required for XPCOM registration:
   _classID: Components.ID("{d0c5195d-e798-49d4-b1d3-9324328b2291}"),
   _classDescription: "pdf.js Component",
   _contractID: "@mozilla.org/streamconv;1?from=application/pdf&to=*/*",
 
   _classID2: Components.ID("{d0c5195d-e798-49d4-b1d3-9324328b2292}"),
   _contractID2: "@mozilla.org/streamconv;1?from=application/pdf&to=text/html",
 
   register: function register() {
-    ChromeUtils.import("resource://pdf.js/PdfStreamConverter.jsm");
-    var factory = XPCOMUtils._getFactory(PdfStreamConverter);
+    var factory = {
+      createInstance(outer, iid) {
+        if (outer)
+          throw Cr.NS_ERROR_NO_AGGREGATION;
+        return (new PdfStreamConverter()).QueryInterface(iid);
+      },
+      QueryInterface: ChromeUtils.generateQI([Ci.nsIFactory])
+    };
+
     this._factory = factory;
 
     var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
     registrar.registerFactory(this._classID, this._classDescription,
                               this._contractID, factory);
     registrar.registerFactory(this._classID2, this._classDescription,
                               this._contractID2, factory);
   },