diff --git a/extensions/firefox/bootstrap.js b/extensions/firefox/bootstrap.js index 4b1fb0c23..e27516225 100644 --- a/extensions/firefox/bootstrap.js +++ b/extensions/firefox/bootstrap.js @@ -16,7 +16,7 @@ */ /* jshint esnext:true */ /* globals Components, Services, dump, XPCOMUtils, PdfStreamConverter, - PdfRedirector, APP_SHUTDOWN */ + PdfRedirector, APP_SHUTDOWN, DEFAULT_PREFERENCES */ 'use strict'; @@ -56,6 +56,27 @@ function log(str) { dump(str + '\n'); } +function initializeDefaultPreferences() { + Cu.import('resource://' + RESOURCE_NAME + '/default_preferences.js'); + + 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() {} @@ -124,6 +145,8 @@ function startup(aData, aReason) { Ph.registerPlayPreviewMimeType('application/pdf', true, 'data:application/x-moz-playpreview-pdfjs;,'); } + + initializeDefaultPreferences(); } function shutdown(aData, aReason) { diff --git a/extensions/firefox/content/PdfJs.jsm b/extensions/firefox/content/PdfJs.jsm index 89800546b..96ec430f0 100644 --- a/extensions/firefox/content/PdfJs.jsm +++ b/extensions/firefox/content/PdfJs.jsm @@ -61,6 +61,27 @@ function getIntPref(aPref, aDefaultValue) { } } +function initializeDefaultPreferences() { + Cu.import('resource://pdf.js/default_preferences.js'); + + var defaultBranch = Services.prefs.getDefaultBranch(PREF_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; + } + } +} + // Register/unregister a constructor as a factory. function Factory() {} Factory.prototype = { @@ -104,6 +125,8 @@ let PdfJs = { Services.obs.addObserver(this, TOPIC_PDFJS_HANDLER_CHANGED, false); Services.obs.addObserver(this, TOPIC_PLUGINS_LIST_UPDATED, false); Services.obs.addObserver(this, TOPIC_PLUGIN_INFO_UPDATED, false); + + initializeDefaultPreferences(); }, _migrate: function migrate() { diff --git a/extensions/firefox/content/PdfStreamConverter.jsm b/extensions/firefox/content/PdfStreamConverter.jsm index 7230b4e12..f022c3c78 100644 --- a/extensions/firefox/content/PdfStreamConverter.jsm +++ b/extensions/firefox/content/PdfStreamConverter.jsm @@ -16,7 +16,7 @@ */ /* jshint esnext:true */ /* globals Components, Services, XPCOMUtils, NetUtil, PrivateBrowsingUtils, - dump, NetworkManager, PdfJsTelemetry, DEFAULT_PREFERENCES */ + dump, NetworkManager, PdfJsTelemetry */ 'use strict'; @@ -33,16 +33,14 @@ const PDF_CONTENT_TYPE = 'application/pdf'; const PREF_PREFIX = 'PDFJSSCRIPT_PREF_PREFIX'; const PDF_VIEWER_WEB_PAGE = 'resource://pdf.js/web/viewer.html'; const MAX_DATABASE_LENGTH = 4096; -const MAX_STRING_PREF_LENGTH = 4096; +const MAX_NUMBER_OF_PREFS = 50; +const MAX_STRING_PREF_LENGTH = 128; Cu.import('resource://gre/modules/XPCOMUtils.jsm'); Cu.import('resource://gre/modules/Services.jsm'); Cu.import('resource://gre/modules/NetUtil.jsm'); Cu.import('resource://pdf.js/network.js'); -// Load the default preferences. -Cu.import('resource://pdf.js/default_preferences.js'); - XPCOMUtils.defineLazyModuleGetter(this, 'PrivateBrowsingUtils', 'resource://gre/modules/PrivateBrowsingUtils.jsm'); @@ -453,56 +451,60 @@ ChromeActions.prototype = { .updateControlState(result, findPrevious); }, setPreferences: function(prefs) { - var prefValue, defaultValue, prefName, prefType, defaultType; - - for (var key in DEFAULT_PREFERENCES) { + var defaultBranch = Services.prefs.getDefaultBranch(PREF_PREFIX + '.'); + var numberOfPrefs = 0; + var prefValue, prefName; + for (var key in prefs) { + if (++numberOfPrefs > MAX_NUMBER_OF_PREFS) { + log('setPreferences - Exceeded the maximum number of preferences ' + + 'that is allowed to be set at once.'); + break; + } else if (!defaultBranch.getPrefType(key)) { + continue; + } prefValue = prefs[key]; - defaultValue = DEFAULT_PREFERENCES[key]; prefName = (PREF_PREFIX + '.' + key); - - if (prefValue === undefined || prefValue === defaultValue) { - Services.prefs.clearUserPref(prefName); - } else { - prefType = typeof prefValue; - defaultType = typeof defaultValue; - - if (prefType !== defaultType) { - continue; - } - switch (defaultType) { - case 'boolean': - setBoolPref(prefName, prefValue); - break; - case 'number': - setIntPref(prefName, prefValue); - break; - case 'string': - // Protect against adding arbitrarily long strings in about:config. - if (prefValue.length <= MAX_STRING_PREF_LENGTH) { - setStringPref(prefName, prefValue); - } - break; - } + switch (typeof prefValue) { + case 'boolean': + setBoolPref(prefName, prefValue); + break; + case 'number': + setIntPref(prefName, prefValue); + break; + case 'string': + if (prefValue.length > MAX_STRING_PREF_LENGTH) { + log('setPreferences - Exceeded the maximum allowed length ' + + 'for a string preference.'); + } else { + setStringPref(prefName, prefValue); + } + break; } } }, - getPreferences: function() { - var currentPrefs = {}; - var defaultValue, prefName; - - for (var key in DEFAULT_PREFERENCES) { - defaultValue = DEFAULT_PREFERENCES[key]; + getPreferences: function(prefs) { + var defaultBranch = Services.prefs.getDefaultBranch(PREF_PREFIX + '.'); + var currentPrefs = {}, numberOfPrefs = 0; + var prefValue, prefName; + for (var key in prefs) { + if (++numberOfPrefs > MAX_NUMBER_OF_PREFS) { + log('getPreferences - Exceeded the maximum number of preferences ' + + 'that is allowed to be fetched at once.'); + break; + } else if (!defaultBranch.getPrefType(key)) { + continue; + } + prefValue = prefs[key]; prefName = (PREF_PREFIX + '.' + key); - - switch (typeof defaultValue) { + switch (typeof prefValue) { case 'boolean': - currentPrefs[key] = getBoolPref(prefName, defaultValue); + currentPrefs[key] = getBoolPref(prefName, prefValue); break; case 'number': - currentPrefs[key] = getIntPref(prefName, defaultValue); + currentPrefs[key] = getIntPref(prefName, prefValue); break; case 'string': - currentPrefs[key] = getStringPref(prefName, defaultValue); + currentPrefs[key] = getStringPref(prefName, prefValue); break; } } diff --git a/web/firefoxcom.js b/web/firefoxcom.js index 1bdceb9d8..bdf52351f 100644 --- a/web/firefoxcom.js +++ b/web/firefoxcom.js @@ -108,9 +108,10 @@ Preferences.prototype.writeToStorage = function(prefObj) { FirefoxCom.requestSync('setPreferences', prefObj); }; -Preferences.prototype.readFromStorage = function() { +Preferences.prototype.readFromStorage = function(prefObj) { var readFromStoragePromise = new Promise(function (resolve) { - var readPrefs = JSON.parse(FirefoxCom.requestSync('getPreferences')); + var readPrefs = JSON.parse(FirefoxCom.requestSync('getPreferences', + prefObj)); resolve(readPrefs); }); return readFromStoragePromise; diff --git a/web/preferences.js b/web/preferences.js index 4e81fe245..a43c5bfe6 100644 --- a/web/preferences.js +++ b/web/preferences.js @@ -24,12 +24,13 @@ var Preferences = (function PreferencesClosure() { function Preferences() { this.prefs = {}; this.isInitializedPromiseResolved = false; - this.initializedPromise = this.readFromStorage().then(function(prefObj) { - this.isInitializedPromiseResolved = true; - if (prefObj) { - this.prefs = prefObj; - } - }.bind(this)); + this.initializedPromise = this.readFromStorage(DEFAULT_PREFERENCES).then( + function(prefObj) { + this.isInitializedPromiseResolved = true; + if (prefObj) { + this.prefs = prefObj; + } + }.bind(this)); } Preferences.prototype = { @@ -37,7 +38,7 @@ var Preferences = (function PreferencesClosure() { return; }, - readFromStorage: function Preferences_readFromStorage() { + readFromStorage: function Preferences_readFromStorage(prefObj) { var readFromStoragePromise = Promise.resolve(); return readFromStoragePromise; }, @@ -45,7 +46,7 @@ var Preferences = (function PreferencesClosure() { reset: function Preferences_reset() { if (this.isInitializedPromiseResolved) { this.prefs = {}; - this.writeToStorage(this.prefs); + this.writeToStorage(DEFAULT_PREFERENCES); } }, @@ -70,6 +71,12 @@ var Preferences = (function PreferencesClosure() { valueType + '\", expected a \"' + defaultType + '\".'); return; } + } else { + if (valueType === 'number' && (value | 0) !== value) { + console.error('Preferences_set: \'' + value + + '\' must be an \"integer\".'); + return; + } } this.prefs[name] = value; this.writeToStorage(this.prefs); @@ -97,13 +104,13 @@ var Preferences = (function PreferencesClosure() { //#if B2G //Preferences.prototype.writeToStorage = function(prefObj) { -// asyncStorage.setItem('preferences', JSON.stringify(prefObj)); +// asyncStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj)); //}; // -//Preferences.prototype.readFromStorage = function() { +//Preferences.prototype.readFromStorage = function(prefObj) { // var readFromStoragePromise = new Promise(function (resolve) { -// asyncStorage.getItem('preferences', function(prefString) { -// var readPrefs = JSON.parse(prefString); +// asyncStorage.getItem('pdfjs.preferences', function(prefStr) { +// var readPrefs = JSON.parse(prefStr); // resolve(readPrefs); // }); // }); @@ -114,14 +121,14 @@ var Preferences = (function PreferencesClosure() { //#if !(FIREFOX || MOZCENTRAL || B2G) Preferences.prototype.writeToStorage = function(prefObj) { if (isLocalStorageEnabled) { - localStorage.setItem('preferences', JSON.stringify(prefObj)); + localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj)); } }; -Preferences.prototype.readFromStorage = function() { +Preferences.prototype.readFromStorage = function(prefObj) { var readFromStoragePromise = new Promise(function (resolve) { if (isLocalStorageEnabled) { - var readPrefs = JSON.parse(localStorage.getItem('preferences')); + var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences')); resolve(readPrefs); } });