Rewrite 'Preferences' to make it async
This commit is contained in:
parent
bd11111465
commit
c920372ff2
@ -104,15 +104,17 @@ var DownloadManager = (function DownloadManagerClosure() {
|
|||||||
return DownloadManager;
|
return DownloadManager;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
Preferences.prototype.writeToStorage = function(prefObj) {
|
Preferences._writeToStorage = function (prefObj) {
|
||||||
FirefoxCom.requestSync('setPreferences', prefObj);
|
return new Promise(function (resolve) {
|
||||||
|
FirefoxCom.requestSync('setPreferences', prefObj);
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
Preferences.prototype.readFromStorage = function(prefObj) {
|
Preferences._readFromStorage = function (prefObj) {
|
||||||
var readFromStoragePromise = new Promise(function (resolve) {
|
return new Promise(function (resolve) {
|
||||||
var readPrefs = JSON.parse(FirefoxCom.requestSync('getPreferences',
|
var readPrefs = JSON.parse(FirefoxCom.requestSync('getPreferences',
|
||||||
prefObj));
|
prefObj));
|
||||||
resolve(readPrefs);
|
resolve(readPrefs);
|
||||||
});
|
});
|
||||||
return readFromStoragePromise;
|
|
||||||
};
|
};
|
||||||
|
@ -14,51 +14,99 @@
|
|||||||
* See the License for the specific language governing permissions and
|
* See the License for the specific language governing permissions and
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
/* globals DEFAULT_PREFERENCES, PDFJS, isLocalStorageEnabled, Promise */
|
/* globals DEFAULT_PREFERENCES, isLocalStorageEnabled, Promise */
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
//#include default_preferences.js
|
//#include default_preferences.js
|
||||||
|
|
||||||
var Preferences = (function PreferencesClosure() {
|
/**
|
||||||
function Preferences() {
|
* Preferences - Utility for storing persistent settings.
|
||||||
this.prefs = {};
|
* Used for settings that should be applied to all opened documents,
|
||||||
this.isInitializedPromiseResolved = false;
|
* or every time the viewer is loaded.
|
||||||
this.initializedPromise = this.readFromStorage(DEFAULT_PREFERENCES).then(
|
*/
|
||||||
function(prefObj) {
|
var Preferences = {
|
||||||
this.isInitializedPromiseResolved = true;
|
prefs: Object.create(DEFAULT_PREFERENCES),
|
||||||
|
isInitializedPromiseResolved: false,
|
||||||
|
initializedPromise: null,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize and fetch the current preference values from storage.
|
||||||
|
* @return {Promise} A promise that is resolved when the preferences
|
||||||
|
* have been initialized.
|
||||||
|
*/
|
||||||
|
initialize: function preferencesInitialize() {
|
||||||
|
return this.initializedPromise =
|
||||||
|
this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {
|
||||||
|
this.isInitializedPromiseResolved = true;
|
||||||
|
if (prefObj) {
|
||||||
|
this.prefs = prefObj;
|
||||||
|
}
|
||||||
|
}.bind(this));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stub function for writing preferences to storage.
|
||||||
|
* NOTE: This should be overridden by a build-specific function defined below.
|
||||||
|
* @param {Object} prefObj The preferences that should be written to storage.
|
||||||
|
* @return {Promise} A promise that is resolved when the preference values
|
||||||
|
* have been written.
|
||||||
|
*/
|
||||||
|
_writeToStorage: function preferences_writeToStorage(prefObj) {
|
||||||
|
return Promise.resolve();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Stub function for reading preferences from storage.
|
||||||
|
* NOTE: This should be overridden by a build-specific function defined below.
|
||||||
|
* @param {Object} prefObj The preferences that should be read from storage.
|
||||||
|
* @return {Promise} A promise that is resolved with an {Object} containing
|
||||||
|
* the preferences that have been read.
|
||||||
|
*/
|
||||||
|
_readFromStorage: function preferences_readFromStorage(prefObj) {
|
||||||
|
return Promise.resolve();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the preferences to their default values and update storage.
|
||||||
|
* @return {Promise} A promise that is resolved when the preference values
|
||||||
|
* have been reset.
|
||||||
|
*/
|
||||||
|
reset: function preferencesReset() {
|
||||||
|
return this.initializedPromise.then(function() {
|
||||||
|
this.prefs = Object.create(DEFAULT_PREFERENCES);
|
||||||
|
return this._writeToStorage(DEFAULT_PREFERENCES);
|
||||||
|
}.bind(this));
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replace the current preference values with the ones from storage.
|
||||||
|
* @return {Promise} A promise that is resolved when the preference values
|
||||||
|
* have been updated.
|
||||||
|
*/
|
||||||
|
reload: function preferencesReload() {
|
||||||
|
return this.initializedPromise.then(function () {
|
||||||
|
this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {
|
||||||
if (prefObj) {
|
if (prefObj) {
|
||||||
this.prefs = prefObj;
|
this.prefs = prefObj;
|
||||||
}
|
}
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
}
|
}.bind(this));
|
||||||
|
},
|
||||||
|
|
||||||
Preferences.prototype = {
|
/**
|
||||||
writeToStorage: function Preferences_writeToStorage(prefObj) {
|
* Set the value of a preference.
|
||||||
return;
|
* @param {string} name The name of the preference that should be changed.
|
||||||
},
|
* @param {boolean|number|string} value The new value of the preference.
|
||||||
|
* @return {Promise} A promise that is resolved when the value has been set,
|
||||||
readFromStorage: function Preferences_readFromStorage(prefObj) {
|
* provided that the preference exists and the types match.
|
||||||
var readFromStoragePromise = Promise.resolve();
|
*/
|
||||||
return readFromStoragePromise;
|
set: function preferencesSet(name, value) {
|
||||||
},
|
return this.initializedPromise.then(function () {
|
||||||
|
if (DEFAULT_PREFERENCES[name] === undefined) {
|
||||||
reset: function Preferences_reset() {
|
throw new Error('preferencesSet: \'' + name + '\' is undefined.');
|
||||||
if (this.isInitializedPromiseResolved) {
|
|
||||||
this.prefs = {};
|
|
||||||
this.writeToStorage(DEFAULT_PREFERENCES);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
set: function Preferences_set(name, value) {
|
|
||||||
if (!this.isInitializedPromiseResolved) {
|
|
||||||
return;
|
|
||||||
} else if (DEFAULT_PREFERENCES[name] === undefined) {
|
|
||||||
console.error('Preferences_set: \'' + name + '\' is undefined.');
|
|
||||||
return;
|
|
||||||
} else if (value === undefined) {
|
} else if (value === undefined) {
|
||||||
console.error('Preferences_set: no value is specified.');
|
throw new Error('preferencesSet: no value is specified.');
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
var valueType = typeof value;
|
var valueType = typeof value;
|
||||||
var defaultType = typeof DEFAULT_PREFERENCES[name];
|
var defaultType = typeof DEFAULT_PREFERENCES[name];
|
||||||
@ -67,71 +115,79 @@ var Preferences = (function PreferencesClosure() {
|
|||||||
if (valueType === 'number' && defaultType === 'string') {
|
if (valueType === 'number' && defaultType === 'string') {
|
||||||
value = value.toString();
|
value = value.toString();
|
||||||
} else {
|
} else {
|
||||||
console.error('Preferences_set: \'' + value + '\' is a \"' +
|
throw new Error('Preferences_set: \'' + value + '\' is a \"' +
|
||||||
valueType + '\", expected a \"' + defaultType + '\".');
|
valueType + '\", expected \"' + defaultType + '\".');
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (valueType === 'number' && (value | 0) !== value) {
|
if (valueType === 'number' && (value | 0) !== value) {
|
||||||
console.error('Preferences_set: \'' + value +
|
throw new Error('Preferences_set: \'' + value +
|
||||||
'\' must be an \"integer\".');
|
'\' must be an \"integer\".');
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.prefs[name] = value;
|
this.prefs[name] = value;
|
||||||
this.writeToStorage(this.prefs);
|
return this._writeToStorage(this.prefs);
|
||||||
},
|
}.bind(this));
|
||||||
|
},
|
||||||
|
|
||||||
get: function Preferences_get(name) {
|
/**
|
||||||
var defaultPref = DEFAULT_PREFERENCES[name];
|
* Get the value of a preference.
|
||||||
|
* @param {string} name The name of the preference whose value is requested.
|
||||||
|
* @return {Promise} A promise that is resolved with a {boolean|number|string}
|
||||||
|
* containing the value of the preference.
|
||||||
|
*/
|
||||||
|
get: function preferencesGet(name) {
|
||||||
|
return this.initializedPromise.then(function () {
|
||||||
|
var defaultValue = DEFAULT_PREFERENCES[name];
|
||||||
|
|
||||||
if (defaultPref === undefined) {
|
if (defaultValue === undefined) {
|
||||||
console.error('Preferences_get: \'' + name + '\' is undefined.');
|
throw new Error('preferencesGet: \'' + name + '\' is undefined.');
|
||||||
return;
|
} else {
|
||||||
} else if (this.isInitializedPromiseResolved) {
|
var prefValue = this.prefs[name];
|
||||||
var pref = this.prefs[name];
|
|
||||||
|
|
||||||
if (pref !== undefined) {
|
if (prefValue !== undefined) {
|
||||||
return pref;
|
return prefValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return defaultPref;
|
return defaultValue;
|
||||||
}
|
}.bind(this));
|
||||||
};
|
}
|
||||||
|
};
|
||||||
return Preferences;
|
|
||||||
})();
|
|
||||||
|
|
||||||
//#if B2G
|
//#if B2G
|
||||||
//Preferences.prototype.writeToStorage = function(prefObj) {
|
//Preferences._writeToStorage = function (prefObj) {
|
||||||
// asyncStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
|
// return new Promise(function (resolve) {
|
||||||
|
// asyncStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj),
|
||||||
|
// resolve);
|
||||||
|
// });
|
||||||
//};
|
//};
|
||||||
//
|
//
|
||||||
//Preferences.prototype.readFromStorage = function(prefObj) {
|
//Preferences._readFromStorage = function (prefObj) {
|
||||||
// var readFromStoragePromise = new Promise(function (resolve) {
|
// return new Promise(function (resolve) {
|
||||||
// asyncStorage.getItem('pdfjs.preferences', function(prefStr) {
|
// asyncStorage.getItem('pdfjs.preferences', function (prefStr) {
|
||||||
// var readPrefs = JSON.parse(prefStr);
|
// var readPrefs = JSON.parse(prefStr);
|
||||||
// resolve(readPrefs);
|
// resolve(readPrefs);
|
||||||
// });
|
// });
|
||||||
// });
|
// });
|
||||||
// return readFromStoragePromise;
|
|
||||||
//};
|
//};
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
//#if !(FIREFOX || MOZCENTRAL || B2G)
|
//#if !(FIREFOX || MOZCENTRAL || B2G)
|
||||||
Preferences.prototype.writeToStorage = function(prefObj) {
|
Preferences._writeToStorage = function (prefObj) {
|
||||||
if (isLocalStorageEnabled) {
|
return new Promise(function (resolve) {
|
||||||
localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
|
if (isLocalStorageEnabled) {
|
||||||
}
|
localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
|
||||||
|
}
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
Preferences.prototype.readFromStorage = function(prefObj) {
|
Preferences._readFromStorage = function (prefObj) {
|
||||||
var readFromStoragePromise = new Promise(function (resolve) {
|
return new Promise(function (resolve) {
|
||||||
|
var readPrefs;
|
||||||
if (isLocalStorageEnabled) {
|
if (isLocalStorageEnabled) {
|
||||||
var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));
|
readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));
|
||||||
resolve(readPrefs);
|
|
||||||
}
|
}
|
||||||
|
resolve(readPrefs);
|
||||||
});
|
});
|
||||||
return readFromStoragePromise;
|
|
||||||
};
|
};
|
||||||
//#endif
|
//#endif
|
||||||
|
@ -140,6 +140,8 @@ var PDFView = {
|
|||||||
this.watchScroll(thumbnailContainer, this.thumbnailViewScroll,
|
this.watchScroll(thumbnailContainer, this.thumbnailViewScroll,
|
||||||
this.renderHighestPriority.bind(this));
|
this.renderHighestPriority.bind(this));
|
||||||
|
|
||||||
|
Preferences.initialize();
|
||||||
|
|
||||||
PDFFindBar.initialize({
|
PDFFindBar.initialize({
|
||||||
bar: document.getElementById('findbar'),
|
bar: document.getElementById('findbar'),
|
||||||
toggleButton: document.getElementById('viewFind'),
|
toggleButton: document.getElementById('viewFind'),
|
||||||
@ -583,6 +585,9 @@ var PDFView = {
|
|||||||
pdfDataRangeTransport, args) {
|
pdfDataRangeTransport, args) {
|
||||||
if (this.pdfDocument) {
|
if (this.pdfDocument) {
|
||||||
this.close();
|
this.close();
|
||||||
|
|
||||||
|
// Reload the preferences if a document was previously opened.
|
||||||
|
Preferences.reload();
|
||||||
}
|
}
|
||||||
|
|
||||||
var parameters = {password: password};
|
var parameters = {password: password};
|
||||||
@ -904,7 +909,6 @@ var PDFView = {
|
|||||||
mozL10n.get('page_of', {pageCount: pagesCount}, 'of {{pageCount}}');
|
mozL10n.get('page_of', {pageCount: pagesCount}, 'of {{pageCount}}');
|
||||||
document.getElementById('pageNumber').max = pagesCount;
|
document.getElementById('pageNumber').max = pagesCount;
|
||||||
|
|
||||||
var prefs = PDFView.prefs = new Preferences();
|
|
||||||
PDFView.documentFingerprint = id;
|
PDFView.documentFingerprint = id;
|
||||||
var store = PDFView.store = new ViewHistory(id);
|
var store = PDFView.store = new ViewHistory(id);
|
||||||
|
|
||||||
@ -973,15 +977,26 @@ var PDFView = {
|
|||||||
PDFView.loadingBar.setWidth(container);
|
PDFView.loadingBar.setWidth(container);
|
||||||
|
|
||||||
PDFFindController.resolveFirstPage();
|
PDFFindController.resolveFirstPage();
|
||||||
|
|
||||||
|
// Initialize the browsing history.
|
||||||
|
PDFHistory.initialize(self.documentFingerprint);
|
||||||
});
|
});
|
||||||
|
|
||||||
var prefsPromise = prefs.initializedPromise;
|
// Fetch the necessary preference values.
|
||||||
var storePromise = store.initializedPromise;
|
var showPreviousViewOnLoad;
|
||||||
Promise.all([firstPagePromise, prefsPromise, storePromise]).
|
var showPreviousViewOnLoadPromise =
|
||||||
then(function() {
|
Preferences.get('showPreviousViewOnLoad').then(function (prefValue) {
|
||||||
var showPreviousViewOnLoad = prefs.get('showPreviousViewOnLoad');
|
showPreviousViewOnLoad = prefValue;
|
||||||
var defaultZoomValue = prefs.get('defaultZoomValue');
|
});
|
||||||
|
var defaultZoomValue;
|
||||||
|
var defaultZoomValuePromise =
|
||||||
|
Preferences.get('defaultZoomValue').then(function (prefValue) {
|
||||||
|
defaultZoomValue = prefValue;
|
||||||
|
});
|
||||||
|
|
||||||
|
var storePromise = store.initializedPromise;
|
||||||
|
Promise.all([firstPagePromise, storePromise, showPreviousViewOnLoadPromise,
|
||||||
|
defaultZoomValuePromise]).then(function resolved() {
|
||||||
var storedHash = null;
|
var storedHash = null;
|
||||||
if (showPreviousViewOnLoad && store.get('exists', false)) {
|
if (showPreviousViewOnLoad && store.get('exists', false)) {
|
||||||
var pageNum = store.get('page', '1');
|
var pageNum = store.get('page', '1');
|
||||||
@ -994,9 +1009,6 @@ var PDFView = {
|
|||||||
} else if (defaultZoomValue) {
|
} else if (defaultZoomValue) {
|
||||||
storedHash = 'page=1&zoom=' + defaultZoomValue;
|
storedHash = 'page=1&zoom=' + defaultZoomValue;
|
||||||
}
|
}
|
||||||
// Initialize the browsing history.
|
|
||||||
PDFHistory.initialize(self.documentFingerprint);
|
|
||||||
|
|
||||||
self.setInitialView(storedHash, scale);
|
self.setInitialView(storedHash, scale);
|
||||||
|
|
||||||
// Make all navigation keys work on document load,
|
// Make all navigation keys work on document load,
|
||||||
@ -1007,6 +1019,12 @@ var PDFView = {
|
|||||||
// self.container.blur();
|
// self.container.blur();
|
||||||
//#endif
|
//#endif
|
||||||
}
|
}
|
||||||
|
}, function rejected(errorMsg) {
|
||||||
|
console.error(errorMsg);
|
||||||
|
|
||||||
|
firstPagePromise.then(function () {
|
||||||
|
self.setInitialView(null, scale);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
pagesPromise.then(function() {
|
pagesPromise.then(function() {
|
||||||
@ -1045,11 +1063,16 @@ var PDFView = {
|
|||||||
self.outline = new DocumentOutlineView(outline);
|
self.outline = new DocumentOutlineView(outline);
|
||||||
document.getElementById('viewOutline').disabled = !outline;
|
document.getElementById('viewOutline').disabled = !outline;
|
||||||
|
|
||||||
if (outline && prefs.get('ifAvailableShowOutlineOnLoad')) {
|
if (outline) {
|
||||||
if (!self.sidebarOpen) {
|
Preferences.get('ifAvailableShowOutlineOnLoad').then(
|
||||||
document.getElementById('sidebarToggle').click();
|
function (prefValue) {
|
||||||
}
|
if (prefValue) {
|
||||||
self.switchSidebarView('outline');
|
if (!self.sidebarOpen) {
|
||||||
|
document.getElementById('sidebarToggle').click();
|
||||||
|
}
|
||||||
|
self.switchSidebarView('outline');
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user