]> git.parisson.com Git - pdf.js.git/commitdiff
Refactoring Settings manager, now with limit on memory usage
authorSaebekassebil <saebekassebil@gmail.com>
Mon, 26 Dec 2011 14:07:24 +0000 (15:07 +0100)
committerSaebekassebil <saebekassebil@gmail.com>
Mon, 26 Dec 2011 14:07:24 +0000 (15:07 +0100)
src/core.js
web/viewer.js

index 664ecf33cf3b4cf5db9e219830131432d147dd0a..50abf6a047125bdbe425e3b8221361942b89480e 100644 (file)
@@ -527,8 +527,7 @@ var PDFDocModel = (function PDFDocModelClosure() {
                            this.startXRef,
                            this.mainXRefEntriesOffset);
       this.catalog = new Catalog(this.xref);
-      
-      if(this.xref.trailer && this.xref.trailer.has('ID')) {
+      if (this.xref.trailer && this.xref.trailer.has('ID')) {
         var fileID = '';
         this.xref.trailer.get('ID')[0].split('').forEach(function(el) {
           fileID += Number(el.charCodeAt(0)).toString(16);
@@ -543,14 +542,15 @@ var PDFDocModel = (function PDFDocModelClosure() {
       return shadow(this, 'numPages', num);
     },
     getFingerprint: function pdfDocGetFingerprint() {
-      if(this.fileID) {
+      if (this.fileID) {
         return this.fileID;
       } else {
-        // If we got no fileID, then we generate one, from the first 100 bytes of PDF
+        // If we got no fileID, then we generate one,
+        // from the first 100 bytes of PDF
         var data = this.stream.bytes.subarray(0, 100);
         var hash = calculateMD5(data, 0, data.length);
         var strHash = '';
-        for(var i = 0, length = hash.length; i < length; i++) {
+        for (var i = 0, length = hash.length; i < length; i++) {
           strHash += Number(hash[i]).toString(16);
         }
 
index d00d505052d822fbaba41687e497651a1076dfa2..36b1299efb0b63a2b2d630d1ca90f0b3f4212a16 100644 (file)
@@ -28,12 +28,7 @@ var Cache = function cacheCache(size) {
 // Settings Manager - This is a utility for saving settings
 // First we see if localStorage is available, FF bug #495747
 // If not, we use FUEL in FF and fallback to Cookies for other browsers.
-var Settings = (function settingsClosure() {
-  var isCookiesEnabled = (function cookiesEnabledTest() {
-    document.cookie = 'they=work';
-    return document.cookie.length > 0;
-  })();
-
+var Settings = (function SettingsClosure() {
   var isLocalStorageEnabled = (function localStorageEnabledTest() {
     try {
       localStorage;
@@ -42,36 +37,60 @@ var Settings = (function settingsClosure() {
     }
     return true;
   })();
-
   var extPrefix = 'extensions.uriloader@pdf.js';
+  var isExtension = location.protocol == 'chrome:' && !isLocalStorageEnabled;
+
+  function Settings(fingerprint) {
+    var database = null;
+    var index;
+    if (isExtension)
+      database = Application.prefs.getValue(extPrefix + '.database', '{}');
+    else if (isLocalStorageEnabled)
+      database = localStorage.getItem('database') || '{}';
+    else
+      return false;
+
+    database = JSON.parse(database);
+    if (!('files' in database))
+      database.files = [];
+    if (database.files.length >= 20)
+      database.files.shift();
+    for (var i = 0, length = database.files.length; i < length; i++) {
+      var branch = database.files[i];
+      if (branch.fingerprint == fingerprint) {
+        index = i;
+        break;
+      }
+    }
+    if (typeof index != 'number')
+      index = database.files.push({fingerprint: fingerprint}) - 1;
+    this.file = database.files[index];
+    this.database = database;
+    if (isExtension)
+      Application.prefs.setValue(extPrefix + '.database',
+          JSON.stringify(database));
+    else if (isLocalStorageEnabled)
+      localStorage.setItem('database', JSON.stringify(database));
+  }
 
-  return {
+  Settings.prototype = {
     set: function settingsSet(name, val) {
-      if (location.protocol == 'chrome:' && !isLocalStorageEnabled) {
-        Application.prefs.setValue(extPrefix + '.' + name, val);
-      } else if (isLocalStorageEnabled) {
-        localStorage.setItem(name, val);
-      } else if (isCookiesEnabled) {
-        var cookieString = name + '=' + escape(val);
-        var expire = new Date();
-        expire.setTime(expire.getTime() + 1000 * 60 * 60 * 24 * 365);
-        cookieString += '; expires=' + expire.toGMTString();
-        document.cookie = cookieString;
+      var file = this.file;
+      file[name] = val;
+      if (isExtension) {
+        Application.prefs.setValue(extPrefix + '.database',
+            JSON.stringify(this.database));
       }
+      else if (isLocalStorageEnabled)
+        localStorage.setItem('database', JSON.stringify(this.database));
     },
 
     get: function settingsGet(name, defaultValue) {
-      if (location.protocol == 'chrome:' && !isLocalStorageEnabled) {
-        var preferenceName = extPrefix + '.' + name;
-        return Application.prefs.getValue(preferenceName, defaultValue);
-      } else if (isLocalStorageEnabled) {
-        return localStorage.getItem(name) || defaultValue;
-      } else if (isCookiesEnabled) {
-        var res = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
-        return res ? unescape(res[2]) : defaultValue;
-      }
+      return this.file[name] || defaultValue;
     }
   };
+
+  return Settings;
 })();
 
 var cache = new Cache(kCacheSize);
@@ -326,15 +345,14 @@ var PDFView = {
     document.getElementById('numPages').innerHTML = pagesCount;
     document.getElementById('pageNumber').max = pagesCount;
     PDFView.documentFingerprint = id;
-
-    if (Settings.get(id + '.exists', false)) {
-      var page = Settings.get(id + '.page', '1');
-      var zoom = Settings.get(id + '.zoom', PDFView.currentScale);
-      var left = Settings.get(id + '.scrollLeft', '0');
-      var top = Settings.get(id + '.scrollTop', '0');
-
-      storedHash = 'page=' + page + '&zoom=' + Math.round(zoom * 100);
-      storedHash += ',' + left + ',' + top;
+    var store = PDFView.store = new Settings(id);
+    if (store.get('exists', false)) {
+      var page = store.get('page', '1');
+      var zoom = store.get('zoom', PDFView.currentScale);
+      var left = store.get('scrollLeft', '0');
+      var top = store.get('scrollTop', '0');
+
+      storedHash = 'page=' + page + '&zoom=' + zoom + ',' + left + ',' + top;
     }
 
     var pages = this.pages = [];
@@ -371,7 +389,8 @@ var PDFView = {
     }
     else if (storedHash) {
      this.setHash(storedHash);
-    }
+    } else
+      window.scrollTo(0, 0); // Scroll to top is default.
   },
 
   setHash: function pdfViewSetHash(hash) {
@@ -890,12 +909,12 @@ function updateViewarea() {
     window.pageYOffset - firstPage.y - kViewerTopMargin);
   pdfOpenParams += ',' + Math.round(topLeft.x) + ',' + Math.round(topLeft.y);
 
-  var id = PDFView.documentFingerprint;
-  Settings.set(id + '.exists', true);
-  Settings.set(id + '.page', pageNumber);
-  Settings.set(id + '.zoom', PDFView.currentScale);
-  Settings.set(id + '.scrollLeft', Math.round(topLeft.x));
-  Settings.set(id + '.scrollTop', Math.round(topLeft.y));
+  var store = PDFView.store;
+  store.set('exists', true);
+  store.set('page', pageNumber);
+  store.set('zoom', Math.round(PDFView.currentScale * 100));
+  store.set('scrollLeft', Math.round(topLeft.x));
+  store.set('scrollTop', Math.round(topLeft.y));
 
   document.getElementById('viewBookmark').href = pdfOpenParams;
 }