Skip to content

Commit

Permalink
Refactor the Preferences classes to utilize async methods rather …
Browse files Browse the repository at this point in the history
…than manually returning `Promise`s
  • Loading branch information
Snuffleupagus committed Aug 5, 2018
1 parent 4a8428b commit 78cbb31
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 61 deletions.
4 changes: 2 additions & 2 deletions web/chromecom.js
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ function setReferer(url, callback) {
let storageArea = chrome.storage.sync || chrome.storage.local;

class ChromePreferences extends BasePreferences {
_writeToStorage(prefObj) {
async _writeToStorage(prefObj) {
return new Promise((resolve) => {
if (prefObj === this.defaults) {
let keysToRemove = Object.keys(this.defaults);
Expand All @@ -317,7 +317,7 @@ class ChromePreferences extends BasePreferences {
});
}

_readFromStorage(prefObj) {
async _readFromStorage(prefObj) {
return new Promise((resolve) => {
let getPreferences = (defaultPrefs) => {
if (chrome.runtime.lastError) {
Expand Down
4 changes: 2 additions & 2 deletions web/firefoxcom.js
Original file line number Diff line number Diff line change
Expand Up @@ -124,13 +124,13 @@ class DownloadManager {
}

class FirefoxPreferences extends BasePreferences {
_writeToStorage(prefObj) {
async _writeToStorage(prefObj) {
return new Promise(function(resolve) {
FirefoxCom.request('setPreferences', prefObj, resolve);
});
}

_readFromStorage(prefObj) {
async _readFromStorage(prefObj) {
return new Promise(function(resolve) {
FirefoxCom.request('getPreferences', prefObj, function(prefStr) {
let readPrefs = JSON.parse(prefStr);
Expand Down
14 changes: 4 additions & 10 deletions web/genericcom.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,12 @@ if (typeof PDFJSDev !== 'undefined' && !PDFJSDev.test('GENERIC')) {
let GenericCom = {};

class GenericPreferences extends BasePreferences {
_writeToStorage(prefObj) {
return new Promise(function(resolve) {
localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
resolve();
});
async _writeToStorage(prefObj) {
localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
}

_readFromStorage(prefObj) {
return new Promise(function(resolve) {
let readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));
resolve(readPrefs);
});
async _readFromStorage(prefObj) {
return JSON.parse(localStorage.getItem('pdfjs.preferences'));
}
}

Expand Down
92 changes: 45 additions & 47 deletions web/preferences.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ class BasePreferences {
* @return {Promise} A promise that is resolved when the preference values
* have been written.
*/
_writeToStorage(prefObj) {
return Promise.reject(new Error('Not implemented: _writeToStorage'));
async _writeToStorage(prefObj) {
throw new Error('Not implemented: _writeToStorage');
}

/**
Expand All @@ -93,20 +93,19 @@ class BasePreferences {
* @return {Promise} A promise that is resolved with an {Object} containing
* the preferences that have been read.
*/
_readFromStorage(prefObj) {
return Promise.reject(new Error('Not implemented: _readFromStorage'));
async _readFromStorage(prefObj) {
throw new Error('Not implemented: _readFromStorage');
}

/**
* 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() {
return this._initializedPromise.then(() => {
this.prefs = Object.assign(Object.create(null), this.defaults);
return this._writeToStorage(this.defaults);
});
async reset() {
await this._initializedPromise;
this.prefs = Object.assign(Object.create(null), this.defaults);
return this._writeToStorage(this.defaults);
}

/**
Expand All @@ -116,31 +115,32 @@ class BasePreferences {
* @return {Promise} A promise that is resolved when the value has been set,
* provided that the preference exists and the types match.
*/
set(name, value) {
return this._initializedPromise.then(() => {
if (this.defaults[name] === undefined) {
throw new Error(`Set preference: "${name}" is undefined.`);
} else if (value === undefined) {
throw new Error('Set preference: no value is specified.');
}
let valueType = typeof value;
let defaultType = typeof this.defaults[name];
async set(name, value) {
await this._initializedPromise;
let defaultValue = this.defaults[name];

if (valueType !== defaultType) {
if (valueType === 'number' && defaultType === 'string') {
value = value.toString();
} else {
throw new Error(`Set preference: "${value}" is a ${valueType}, ` +
`expected a ${defaultType}.`);
}
if (defaultValue === undefined) {
throw new Error(`Set preference: "${name}" is undefined.`);
} else if (value === undefined) {
throw new Error('Set preference: no value is specified.');
}
let valueType = typeof value;
let defaultType = typeof defaultValue;

if (valueType !== defaultType) {
if (valueType === 'number' && defaultType === 'string') {
value = value.toString();
} else {
if (valueType === 'number' && !Number.isInteger(value)) {
throw new Error(`Set preference: "${value}" must be an integer.`);
}
throw new Error(`Set preference: "${value}" is a ${valueType}, ` +
`expected a ${defaultType}.`);
}
this.prefs[name] = value;
return this._writeToStorage(this.prefs);
});
} else {
if (valueType === 'number' && !Number.isInteger(value)) {
throw new Error(`Set preference: "${value}" must be an integer.`);
}
}
this.prefs[name] = value;
return this._writeToStorage(this.prefs);
}

/**
Expand All @@ -149,32 +149,30 @@ class BasePreferences {
* @return {Promise} A promise that is resolved with a {boolean|number|string}
* containing the value of the preference.
*/
get(name) {
return this._initializedPromise.then(() => {
let defaultValue = this.defaults[name];
async get(name) {
await this._initializedPromise;
let defaultValue = this.defaults[name];

if (defaultValue === undefined) {
throw new Error(`Get preference: "${name}" is undefined.`);
} else {
let prefValue = this.prefs[name];
if (defaultValue === undefined) {
throw new Error(`Get preference: "${name}" is undefined.`);
} else {
let prefValue = this.prefs[name];

if (prefValue !== undefined) {
return prefValue;
}
if (prefValue !== undefined) {
return prefValue;
}
return defaultValue;
});
}
return defaultValue;
}

/**
* Get the values of all preferences.
* @return {Promise} A promise that is resolved with an {Object} containing
* the values of all preferences.
*/
getAll() {
return this._initializedPromise.then(() => {
return Object.assign(Object.create(null), this.defaults, this.prefs);
});
async getAll() {
await this._initializedPromise;
return Object.assign(Object.create(null), this.defaults, this.prefs);
}
}

Expand Down

0 comments on commit 78cbb31

Please sign in to comment.