/* Copyright 2012 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. */ /* globals PdfStreamConverter, APP_SHUTDOWN, PdfjsChromeUtils, PdfjsContentUtils */ "use strict"; const RESOURCE_NAME = "pdf.js"; const EXT_PREFIX = "extensions.uriloader@pdf.js"; const Cc = Components.classes; const Ci = Components.interfaces; const Cm = Components.manager; const Cu = Components.utils; const Cr = Components.results; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); function getBoolPref(pref, def) { try { return Services.prefs.getBoolPref(pref); } catch (ex) { return def; } } function log(str) { if (!getBoolPref(EXT_PREFIX + ".pdfBugEnabled", false)) { return; } dump(str + "\n"); } function initializeDefaultPreferences() { var DEFAULT_PREFERENCES = //#include ../../web/default_preferences.json //#if false "end of DEFAULT_PREFERENCES"; //#endif var defaultBranch = Services.prefs.getDefaultBranch(EXT_PREFIX + "."); var defaultValue; for (var key in DEFAULT_PREFERENCES) { defaultValue = DEFAULT_PREFERENCES[key]; switch (typeof defaultValue) { case "boolean": defaultBranch.setBoolPref(key, defaultValue); break; case "number": defaultBranch.setIntPref(key, defaultValue); break; case "string": defaultBranch.setCharPref(key, defaultValue); break; } } } // Factory that registers/unregisters a constructor as a component. function Factory() {} Factory.prototype = { QueryInterface: XPCOMUtils.generateQI([Ci.nsIFactory]), _targetConstructor: null, register: function register(targetConstructor) { this._targetConstructor = targetConstructor; var proto = targetConstructor.prototype; var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar); registrar.registerFactory(proto.classID, proto.classDescription, proto.contractID, this); if (proto.classID2) { this._classID2 = proto.classID2; registrar.registerFactory(proto.classID2, proto.classDescription, proto.contractID2, this); } }, unregister: function unregister() { var proto = this._targetConstructor.prototype; var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar); registrar.unregisterFactory(proto.classID, this); if (this._classID2) { registrar.unregisterFactory(this._classID2, this); } this._targetConstructor = null; }, // nsIFactory createInstance: function createInstance(aOuter, iid) { if (aOuter !== null) { throw Cr.NS_ERROR_NO_AGGREGATION; } return (new (this._targetConstructor)()).QueryInterface(iid); }, // nsIFactory lockFactory: function lockFactory(lock) { // No longer used as of gecko 1.7. throw Cr.NS_ERROR_NOT_IMPLEMENTED; }, }; var pdfStreamConverterFactory = new Factory(); var pdfBaseUrl = null; var e10sEnabled = false; // 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) { // Setup the resource url. var ioService = Services.io; var resProt = ioService.getProtocolHandler("resource") .QueryInterface(Ci.nsIResProtocolHandler); var aliasURI = ioService.newURI("content/", "UTF-8", aData.resourceURI); resProt.setSubstitution(RESOURCE_NAME, aliasURI); pdfBaseUrl = aData.resourceURI.spec; Cu.import(pdfBaseUrl + "content/PdfjsChromeUtils.jsm"); PdfjsChromeUtils.init(); Cu.import(pdfBaseUrl + "content/PdfjsContentUtils.jsm"); PdfjsContentUtils.init(); // Load the component and register it. var pdfStreamConverterUrl = pdfBaseUrl + "content/PdfStreamConverter.jsm"; Cu.import(pdfStreamConverterUrl); pdfStreamConverterFactory.register(PdfStreamConverter); try { let globalMM = Cc["@mozilla.org/globalmessagemanager;1"] .getService(Ci.nsIFrameScriptLoader); globalMM.loadFrameScript("chrome://pdf.js/content/content.js", true); e10sEnabled = true; } catch (ex) { } initializeDefaultPreferences(); } function shutdown(aData, aReason) { if (aReason === APP_SHUTDOWN) { return; } if (e10sEnabled) { let globalMM = Cc["@mozilla.org/globalmessagemanager;1"] .getService(Ci.nsIMessageBroadcaster); globalMM.broadcastAsyncMessage("PDFJS:Child:shutdown"); globalMM.removeDelayedFrameScript("chrome://pdf.js/content/content.js"); } 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. pdfStreamConverterFactory.unregister(); // Unload the converter var pdfStreamConverterUrl = pdfBaseUrl + "content/PdfStreamConverter.jsm"; Cu.unload(pdfStreamConverterUrl); PdfjsContentUtils.uninit(); Cu.unload(pdfBaseUrl + "content/PdfjsContentUtils.jsm"); PdfjsChromeUtils.uninit(); Cu.unload(pdfBaseUrl + "content/PdfjsChromeUtils.jsm"); } function install(aData, aReason) { } function uninstall(aData, aReason) { }