| /** | 
 |  * @licstart The following is the entire license notice for the | 
 |  * Javascript code in this page | 
 |  * | 
 |  * Copyright 2020 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. | 
 |  * | 
 |  * @licend The above is the entire license notice for the | 
 |  * Javascript code in this page | 
 |  */ | 
 | "use strict"; | 
 |  | 
 | Object.defineProperty(exports, "__esModule", { | 
 |   value: true | 
 | }); | 
 | exports.BasePreferences = void 0; | 
 |  | 
 | var _app_options = require("./app_options.js"); | 
 |  | 
 | let defaultPreferences = null; | 
 |  | 
 | function getDefaultPreferences() { | 
 |   if (!defaultPreferences) { | 
 |     defaultPreferences = Promise.resolve({ | 
 |       "cursorToolOnLoad": 0, | 
 |       "defaultZoomValue": "", | 
 |       "disablePageLabels": false, | 
 |       "enablePermissions": false, | 
 |       "enablePrintAutoRotate": false, | 
 |       "enableWebGL": false, | 
 |       "externalLinkTarget": 0, | 
 |       "historyUpdateUrl": false, | 
 |       "ignoreDestinationZoom": false, | 
 |       "pdfBugEnabled": false, | 
 |       "renderer": "canvas", | 
 |       "renderInteractiveForms": true, | 
 |       "sidebarViewOnLoad": -1, | 
 |       "scrollModeOnLoad": -1, | 
 |       "spreadModeOnLoad": -1, | 
 |       "textLayerMode": 1, | 
 |       "useOnlyCssZoom": false, | 
 |       "viewOnLoad": 0, | 
 |       "disableAutoFetch": false, | 
 |       "disableFontFace": false, | 
 |       "disableRange": false, | 
 |       "disableStream": false | 
 |     }); | 
 |   } | 
 |  | 
 |   return defaultPreferences; | 
 | } | 
 |  | 
 | class BasePreferences { | 
 |   constructor() { | 
 |     if (this.constructor === BasePreferences) { | 
 |       throw new Error("Cannot initialize BasePreferences."); | 
 |     } | 
 |  | 
 |     this.prefs = null; | 
 |     this._initializedPromise = getDefaultPreferences().then(defaults => { | 
 |       Object.defineProperty(this, "defaults", { | 
 |         value: Object.freeze(defaults), | 
 |         writable: false, | 
 |         enumerable: true, | 
 |         configurable: false | 
 |       }); | 
 |       this.prefs = Object.assign(Object.create(null), defaults); | 
 |       return this._readFromStorage(defaults); | 
 |     }).then(prefs => { | 
 |       if (!prefs) { | 
 |         return; | 
 |       } | 
 |  | 
 |       for (const name in prefs) { | 
 |         const defaultValue = this.defaults[name], | 
 |               prefValue = prefs[name]; | 
 |  | 
 |         if (defaultValue === undefined || typeof prefValue !== typeof defaultValue) { | 
 |           continue; | 
 |         } | 
 |  | 
 |         this.prefs[name] = prefValue; | 
 |       } | 
 |     }); | 
 |   } | 
 |  | 
 |   async _writeToStorage(prefObj) { | 
 |     throw new Error("Not implemented: _writeToStorage"); | 
 |   } | 
 |  | 
 |   async _readFromStorage(prefObj) { | 
 |     throw new Error("Not implemented: _readFromStorage"); | 
 |   } | 
 |  | 
 |   async reset() { | 
 |     await this._initializedPromise; | 
 |     this.prefs = Object.assign(Object.create(null), this.defaults); | 
 |     return this._writeToStorage(this.defaults); | 
 |   } | 
 |  | 
 |   async set(name, value) { | 
 |     await this._initializedPromise; | 
 |     const defaultValue = this.defaults[name]; | 
 |  | 
 |     if (defaultValue === undefined) { | 
 |       throw new Error(`Set preference: "${name}" is undefined.`); | 
 |     } else if (value === undefined) { | 
 |       throw new Error("Set preference: no value is specified."); | 
 |     } | 
 |  | 
 |     const valueType = typeof value; | 
 |     const defaultType = typeof defaultValue; | 
 |  | 
 |     if (valueType !== defaultType) { | 
 |       if (valueType === "number" && defaultType === "string") { | 
 |         value = value.toString(); | 
 |       } else { | 
 |         throw new Error(`Set preference: "${value}" is a ${valueType}, ` + `expected a ${defaultType}.`); | 
 |       } | 
 |     } 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); | 
 |   } | 
 |  | 
 |   async get(name) { | 
 |     await this._initializedPromise; | 
 |     const defaultValue = this.defaults[name]; | 
 |  | 
 |     if (defaultValue === undefined) { | 
 |       throw new Error(`Get preference: "${name}" is undefined.`); | 
 |     } else { | 
 |       const prefValue = this.prefs[name]; | 
 |  | 
 |       if (prefValue !== undefined) { | 
 |         return prefValue; | 
 |       } | 
 |     } | 
 |  | 
 |     return defaultValue; | 
 |   } | 
 |  | 
 |   async getAll() { | 
 |     await this._initializedPromise; | 
 |     return Object.assign(Object.create(null), this.defaults, this.prefs); | 
 |   } | 
 |  | 
 | } | 
 |  | 
 | exports.BasePreferences = BasePreferences; |