preferences.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /* Copyright 2017 Mozilla Foundation
  2. *
  3. * Licensed under the Apache License, Version 2.0 (the "License");
  4. * you may not use this file except in compliance with the License.
  5. * You may obtain a copy of the License at
  6. *
  7. * http://www.apache.org/licenses/LICENSE-2.0
  8. *
  9. * Unless required by applicable law or agreed to in writing, software
  10. * distributed under the License is distributed on an "AS IS" BASIS,
  11. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. * See the License for the specific language governing permissions and
  13. * limitations under the License.
  14. */
  15. "use strict";
  16. Object.defineProperty(exports, "__esModule", {
  17. value: true
  18. });
  19. var defaultPreferences = null;
  20. function getDefaultPreferences() {
  21. if (!defaultPreferences) {
  22. defaultPreferences = Promise.resolve({
  23. "showPreviousViewOnLoad": true,
  24. "defaultZoomValue": "",
  25. "sidebarViewOnLoad": 0,
  26. "enableHandToolOnLoad": false,
  27. "enableWebGL": false,
  28. "pdfBugEnabled": false,
  29. "disableRange": false,
  30. "disableStream": false,
  31. "disableAutoFetch": false,
  32. "disableFontFace": false,
  33. "disableTextLayer": false,
  34. "useOnlyCssZoom": false,
  35. "externalLinkTarget": 0,
  36. "enhanceTextSelection": false,
  37. "renderer": "canvas",
  38. "renderInteractiveForms": false,
  39. "enablePrintAutoRotate": false,
  40. "disablePageLabels": false
  41. });
  42. }
  43. return defaultPreferences;
  44. }
  45. function cloneObj(obj) {
  46. var result = {};
  47. for (var i in obj) {
  48. if (Object.prototype.hasOwnProperty.call(obj, i)) {
  49. result[i] = obj[i];
  50. }
  51. }
  52. return result;
  53. }
  54. var Preferences = {
  55. prefs: null,
  56. isInitializedPromiseResolved: false,
  57. initializedPromise: null,
  58. initialize: function preferencesInitialize() {
  59. return this.initializedPromise = getDefaultPreferences().then(function (defaults) {
  60. Object.defineProperty(this, 'defaults', {
  61. value: Object.freeze(defaults),
  62. writable: false,
  63. enumerable: true,
  64. configurable: false
  65. });
  66. this.prefs = cloneObj(defaults);
  67. return this._readFromStorage(defaults);
  68. }.bind(this)).then(function (prefObj) {
  69. this.isInitializedPromiseResolved = true;
  70. if (prefObj) {
  71. this.prefs = prefObj;
  72. }
  73. }.bind(this));
  74. },
  75. _writeToStorage: function preferences_writeToStorage(prefObj) {
  76. return Promise.resolve();
  77. },
  78. _readFromStorage: function preferences_readFromStorage(prefObj) {
  79. return Promise.resolve();
  80. },
  81. reset: function preferencesReset() {
  82. return this.initializedPromise.then(function () {
  83. this.prefs = cloneObj(this.defaults);
  84. return this._writeToStorage(this.defaults);
  85. }.bind(this));
  86. },
  87. reload: function preferencesReload() {
  88. return this.initializedPromise.then(function () {
  89. this._readFromStorage(this.defaults).then(function (prefObj) {
  90. if (prefObj) {
  91. this.prefs = prefObj;
  92. }
  93. }.bind(this));
  94. }.bind(this));
  95. },
  96. set: function preferencesSet(name, value) {
  97. return this.initializedPromise.then(function () {
  98. if (this.defaults[name] === undefined) {
  99. throw new Error('preferencesSet: \'' + name + '\' is undefined.');
  100. } else if (value === undefined) {
  101. throw new Error('preferencesSet: no value is specified.');
  102. }
  103. var valueType = typeof value;
  104. var defaultType = typeof this.defaults[name];
  105. if (valueType !== defaultType) {
  106. if (valueType === 'number' && defaultType === 'string') {
  107. value = value.toString();
  108. } else {
  109. throw new Error('Preferences_set: \'' + value + '\' is a \"' + valueType + '\", expected \"' + defaultType + '\".');
  110. }
  111. } else {
  112. if (valueType === 'number' && (value | 0) !== value) {
  113. throw new Error('Preferences_set: \'' + value + '\' must be an \"integer\".');
  114. }
  115. }
  116. this.prefs[name] = value;
  117. return this._writeToStorage(this.prefs);
  118. }.bind(this));
  119. },
  120. get: function preferencesGet(name) {
  121. return this.initializedPromise.then(function () {
  122. var defaultValue = this.defaults[name];
  123. if (defaultValue === undefined) {
  124. throw new Error('preferencesGet: \'' + name + '\' is undefined.');
  125. } else {
  126. var prefValue = this.prefs[name];
  127. if (prefValue !== undefined) {
  128. return prefValue;
  129. }
  130. }
  131. return defaultValue;
  132. }.bind(this));
  133. }
  134. };
  135. {
  136. Preferences._writeToStorage = function (prefObj) {
  137. return new Promise(function (resolve) {
  138. localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
  139. resolve();
  140. });
  141. };
  142. Preferences._readFromStorage = function (prefObj) {
  143. return new Promise(function (resolve) {
  144. var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));
  145. resolve(readPrefs);
  146. });
  147. };
  148. }
  149. exports.Preferences = Preferences;