preferences.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. var defaultPreferences = null;
  17. function getDefaultPreferences() {
  18. if (!defaultPreferences) {
  19. defaultPreferences = Promise.resolve({
  20. "showPreviousViewOnLoad": true,
  21. "defaultZoomValue": "",
  22. "sidebarViewOnLoad": 0,
  23. "enableHandToolOnLoad": false,
  24. "enableWebGL": false,
  25. "pdfBugEnabled": false,
  26. "disableRange": false,
  27. "disableStream": false,
  28. "disableAutoFetch": false,
  29. "disableFontFace": false,
  30. "disableTextLayer": false,
  31. "useOnlyCssZoom": false,
  32. "externalLinkTarget": 0,
  33. "enhanceTextSelection": false,
  34. "renderer": "canvas",
  35. "renderInteractiveForms": false,
  36. "enablePrintAutoRotate": false,
  37. "disablePageLabels": false
  38. });
  39. }
  40. return defaultPreferences;
  41. }
  42. function cloneObj(obj) {
  43. var result = {};
  44. for (var i in obj) {
  45. if (Object.prototype.hasOwnProperty.call(obj, i)) {
  46. result[i] = obj[i];
  47. }
  48. }
  49. return result;
  50. }
  51. var Preferences = {
  52. prefs: null,
  53. isInitializedPromiseResolved: false,
  54. initializedPromise: null,
  55. initialize: function preferencesInitialize() {
  56. return this.initializedPromise = getDefaultPreferences().then(function (defaults) {
  57. Object.defineProperty(this, 'defaults', {
  58. value: Object.freeze(defaults),
  59. writable: false,
  60. enumerable: true,
  61. configurable: false
  62. });
  63. this.prefs = cloneObj(defaults);
  64. return this._readFromStorage(defaults);
  65. }.bind(this)).then(function (prefObj) {
  66. this.isInitializedPromiseResolved = true;
  67. if (prefObj) {
  68. this.prefs = prefObj;
  69. }
  70. }.bind(this));
  71. },
  72. _writeToStorage: function preferences_writeToStorage(prefObj) {
  73. return Promise.resolve();
  74. },
  75. _readFromStorage: function preferences_readFromStorage(prefObj) {
  76. return Promise.resolve();
  77. },
  78. reset: function preferencesReset() {
  79. return this.initializedPromise.then(function () {
  80. this.prefs = cloneObj(this.defaults);
  81. return this._writeToStorage(this.defaults);
  82. }.bind(this));
  83. },
  84. reload: function preferencesReload() {
  85. return this.initializedPromise.then(function () {
  86. this._readFromStorage(this.defaults).then(function (prefObj) {
  87. if (prefObj) {
  88. this.prefs = prefObj;
  89. }
  90. }.bind(this));
  91. }.bind(this));
  92. },
  93. set: function preferencesSet(name, value) {
  94. return this.initializedPromise.then(function () {
  95. if (this.defaults[name] === undefined) {
  96. throw new Error('preferencesSet: \'' + name + '\' is undefined.');
  97. } else if (value === undefined) {
  98. throw new Error('preferencesSet: no value is specified.');
  99. }
  100. var valueType = typeof value;
  101. var defaultType = typeof this.defaults[name];
  102. if (valueType !== defaultType) {
  103. if (valueType === 'number' && defaultType === 'string') {
  104. value = value.toString();
  105. } else {
  106. throw new Error('Preferences_set: \'' + value + '\' is a \"' + valueType + '\", expected \"' + defaultType + '\".');
  107. }
  108. } else {
  109. if (valueType === 'number' && (value | 0) !== value) {
  110. throw new Error('Preferences_set: \'' + value + '\' must be an \"integer\".');
  111. }
  112. }
  113. this.prefs[name] = value;
  114. return this._writeToStorage(this.prefs);
  115. }.bind(this));
  116. },
  117. get: function preferencesGet(name) {
  118. return this.initializedPromise.then(function () {
  119. var defaultValue = this.defaults[name];
  120. if (defaultValue === undefined) {
  121. throw new Error('preferencesGet: \'' + name + '\' is undefined.');
  122. } else {
  123. var prefValue = this.prefs[name];
  124. if (prefValue !== undefined) {
  125. return prefValue;
  126. }
  127. }
  128. return defaultValue;
  129. }.bind(this));
  130. }
  131. };
  132. Preferences._writeToStorage = function (prefObj) {
  133. return new Promise(function (resolve) {
  134. localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
  135. resolve();
  136. });
  137. };
  138. Preferences._readFromStorage = function (prefObj) {
  139. return new Promise(function (resolve) {
  140. var readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));
  141. resolve(readPrefs);
  142. });
  143. };
  144. exports.Preferences = Preferences;