From 1af9a72011f26b9f1641d656923f2090337a2688 Mon Sep 17 00:00:00 2001 From: Brendan Dahl Date: Tue, 7 Feb 2012 16:39:07 -0800 Subject: [PATCH] Make the add-on truly restartless. --- Makefile | 2 - extensions/firefox/bootstrap.js | 72 +++++++++++++++---- extensions/firefox/chrome.manifest | 5 -- .../firefox/components/PdfStreamConverter.js | 2 + 4 files changed, 62 insertions(+), 19 deletions(-) delete mode 100644 extensions/firefox/chrome.manifest diff --git a/Makefile b/Makefile index c1062d49d..043cb7fb5 100644 --- a/Makefile +++ b/Makefile @@ -223,14 +223,12 @@ FIREFOX_CONTENT_DIR := $(EXTENSION_SRC)/firefox/$(CONTENT_DIR)/ FIREFOX_EXTENSION_FILES_TO_COPY = \ *.js \ *.rdf \ - chrome.manifest \ components \ $(NULL) FIREFOX_EXTENSION_FILES = \ content \ *.js \ install.rdf \ - chrome.manifest \ components \ content \ $(NULL) diff --git a/extensions/firefox/bootstrap.js b/extensions/firefox/bootstrap.js index f1a712c0c..fbea70203 100644 --- a/extensions/firefox/bootstrap.js +++ b/extensions/firefox/bootstrap.js @@ -3,8 +3,9 @@ 'use strict'; +const RESOURCE_NAME = 'pdf.js'; const EXT_PREFIX = 'extensions.uriloader@pdf.js'; -const PDFJS_EVENT_ID = 'pdf.js.message'; + let Cc = Components.classes; let Ci = Components.interfaces; let Cm = Components.manager; @@ -16,24 +17,71 @@ function log(str) { dump(str + '\n'); } +// Register/unregister a class as a component. +let Factory = { + registrar: null, + aClass: null, + register: function(aClass) { + if (this.aClass) { + log('Cannot register more than one class'); + return; + } + this.registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar); + this.aClass = aClass; + var proto = aClass.prototype; + this.registrar.registerFactory(proto.classID, proto.classDescription, + proto.contractID, this); + }, + unregister: function() { + if (!this.aClass) { + log('Class was never registered.'); + return; + } + var proto = this.aClass.prototype; + this.registrar.unregisterFactory(proto.classID, this); + this.aClass = null; + }, + // nsIFactory::createInstance + createInstance: function(outer, iid) { + if (outer !== null) + throw Cr.NS_ERROR_NO_AGGREGATION; + return (new (this.aClass)).QueryInterface(iid); + } +}; + +// As of Firefox 13 bootstrapped add-ons don't support automatic registering and +// unregistering of resource urls and components/contracts. Until then we do +// it programatically. See ManifestDirective ManifestParser.cpp for support. function startup(aData, aReason) { - let manifestPath = 'chrome.manifest'; - let manifest = Cc['@mozilla.org/file/local;1'] - .createInstance(Ci.nsILocalFile); - try { - manifest.initWithPath(aData.installPath.path); - manifest.append(manifestPath); - Cm.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(manifest); - Services.prefs.setBoolPref('extensions.pdf.js.active', true); - } catch (e) { - log(e); - } + // Setup the resource url. + var ioService = Services.io; + var resProt = ioService.getProtocolHandler('resource') + .QueryInterface(Ci.nsIResProtocolHandler); + var aliasFile = Cc['@mozilla.org/file/local;1'] + .createInstance(Ci.nsILocalFile); + var componentPath = aData.installPath.clone(); + componentPath.append('content'); + aliasFile.initWithPath(componentPath.path); + var aliasURI = ioService.newFileURI(aliasFile); + resProt.setSubstitution(RESOURCE_NAME, aliasURI); + + // Load the component and register it. + Cu.import(aData.resourceURI.spec + 'components/PdfStreamConverter.js'); + Factory.register(PdfStreamConverter); + Services.prefs.setBoolPref('extensions.pdf.js.active', true); } function shutdown(aData, aReason) { if (Services.prefs.getBoolPref('extensions.pdf.js.active')) Services.prefs.setBoolPref('extensions.pdf.js.active', false); + var ioService = Services.io; + var resProt = ioService.getProtocolHandler('resource') + .QueryInterface(Ci.nsIResProtocolHandler); + // Remove the resource url. + resProt.setSubstitution(RESOURCE_NAME, null); + // Remove the contract/component. + Factory.unregister(); } function install(aData, aReason) { diff --git a/extensions/firefox/chrome.manifest b/extensions/firefox/chrome.manifest deleted file mode 100644 index 5351257e7..000000000 --- a/extensions/firefox/chrome.manifest +++ /dev/null @@ -1,5 +0,0 @@ -resource pdf.js content/ - -component {6457a96b-2d68-439a-bcfa-44465fbcdbb1} components/PdfStreamConverter.js -contract @mozilla.org/streamconv;1?from=application/pdf&to=*/* {6457a96b-2d68-439a-bcfa-44465fbcdbb1} - diff --git a/extensions/firefox/components/PdfStreamConverter.js b/extensions/firefox/components/PdfStreamConverter.js index 78a1f5a46..7b8cdab49 100644 --- a/extensions/firefox/components/PdfStreamConverter.js +++ b/extensions/firefox/components/PdfStreamConverter.js @@ -3,6 +3,8 @@ 'use strict'; +var EXPORTED_SYMBOLS = ['PdfStreamConverter']; + const Cc = Components.classes; const Ci = Components.interfaces; const Cr = Components.results;