158 lines
5.1 KiB
JavaScript
158 lines
5.1 KiB
JavaScript
/* 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.
|
|
*/
|
|
|
|
var EXPORTED_SYMBOLS = ["PdfJs"];
|
|
|
|
const Cc = Components.classes;
|
|
const Ci = Components.interfaces;
|
|
const Cr = Components.results;
|
|
const Cm = Components.manager;
|
|
const Cu = Components.utils;
|
|
|
|
const PREF_PREFIX = 'pdfjs';
|
|
const PREF_DISABLED = PREF_PREFIX + '.disabled';
|
|
const PREF_FIRST_RUN = PREF_PREFIX + '.firstRun';
|
|
const PREF_PREVIOUS_ACTION = PREF_PREFIX + '.previousHandler.preferredAction';
|
|
const PREF_PREVIOUS_ASK = PREF_PREFIX + '.previousHandler.alwaysAskBeforeHandling';
|
|
const TOPIC_PDFJS_HANDLER_CHANGED = 'pdfjs:handlerChanged';
|
|
|
|
Cu.import('resource://gre/modules/XPCOMUtils.jsm');
|
|
Cu.import('resource://gre/modules/Services.jsm');
|
|
Cu.import('resource://pdf.js.components/PdfStreamConverter.js');
|
|
|
|
let Svc = {};
|
|
XPCOMUtils.defineLazyServiceGetter(Svc, 'mime',
|
|
'@mozilla.org/mime;1',
|
|
'nsIMIMEService');
|
|
|
|
function getBoolPref(aPref, aDefaultValue) {
|
|
try {
|
|
return Services.prefs.getBoolPref(aPref);
|
|
} catch (ex) {
|
|
return aDefaultValue;
|
|
}
|
|
}
|
|
|
|
// Register/unregister a constructor as a component.
|
|
let Factory = {
|
|
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);
|
|
},
|
|
|
|
unregister: function unregister() {
|
|
var proto = this._targetConstructor.prototype;
|
|
var registrar = Cm.QueryInterface(Ci.nsIComponentRegistrar);
|
|
registrar.unregisterFactory(proto.classID, 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;
|
|
}
|
|
};
|
|
|
|
let PdfJs = {
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
|
|
_registered: false,
|
|
|
|
init: function init() {
|
|
// On first run make pdf.js the default handler.
|
|
if (!getBoolPref(PREF_DISABLED, true) && getBoolPref(PREF_FIRST_RUN, false)) {
|
|
Services.prefs.setBoolPref(PREF_FIRST_RUN, false);
|
|
|
|
let handlerInfo = Svc.mime.getFromTypeAndExtension('application/pdf', 'pdf');
|
|
// Store the previous settings of preferredAction and
|
|
// alwaysAskBeforeHandling in case we need to revert them in a hotfix that
|
|
// would turn pdf.js off.
|
|
Services.prefs.setIntPref(PREF_PREVIOUS_ACTION, handlerInfo.preferredAction);
|
|
Services.prefs.setBoolPref(PREF_PREVIOUS_ASK, handlerInfo.alwaysAskBeforeHandling);
|
|
|
|
let handlerService = Cc['@mozilla.org/uriloader/handler-service;1'].
|
|
getService(Ci.nsIHandlerService);
|
|
|
|
// Change and save mime handler settings.
|
|
handlerInfo.alwaysAskBeforeHandling = false;
|
|
handlerInfo.preferredAction = Ci.nsIHandlerInfo.handleInternally;
|
|
handlerService.store(handlerInfo);
|
|
}
|
|
|
|
if (this.enabled)
|
|
this._ensureRegistered();
|
|
else
|
|
this._ensureUnregistered();
|
|
|
|
// Listen for when pdf.js is completely disabled or a different pdf handler
|
|
// is chosen.
|
|
Services.prefs.addObserver(PREF_DISABLED, this, false);
|
|
Services.obs.addObserver(this, TOPIC_PDFJS_HANDLER_CHANGED, false);
|
|
},
|
|
|
|
// nsIObserver
|
|
observe: function observe(aSubject, aTopic, aData) {
|
|
if (this.enabled)
|
|
this._ensureRegistered();
|
|
else
|
|
this._ensureUnregistered();
|
|
},
|
|
|
|
/**
|
|
* pdf.js is only enabled if it is both selected as the pdf viewer and if the
|
|
* global switch enabling it is true.
|
|
* @return {boolean} Wether or not it's enabled.
|
|
*/
|
|
get enabled() {
|
|
var disabled = getBoolPref(PREF_DISABLED, true);
|
|
if (disabled)
|
|
return false;
|
|
|
|
var handlerInfo = Svc.mime.
|
|
getFromTypeAndExtension('application/pdf', 'pdf');
|
|
return handlerInfo.alwaysAskBeforeHandling == false &&
|
|
handlerInfo.preferredAction == Ci.nsIHandlerInfo.handleInternally;
|
|
},
|
|
|
|
_ensureRegistered: function _ensureRegistered() {
|
|
if (this._registered)
|
|
return;
|
|
|
|
Factory.register(PdfStreamConverter);
|
|
this._registered = true;
|
|
},
|
|
|
|
_ensureUnregistered: function _ensureUnregistered() {
|
|
if (!this._registered)
|
|
return;
|
|
|
|
Factory.unregister();
|
|
this._registered = false;
|
|
}
|
|
};
|