From c61806974f98c7b21dfd6269591012c96c05742f Mon Sep 17 00:00:00 2001 From: eight Date: Fri, 21 Jun 2019 03:35:41 +0800 Subject: [PATCH] Fix: db initializing error, polyfill localStorage/sessionStorage (#616) * Fix: make sure all errors are caught when initializing * Fix: polyfill localStorage and sessionStorage --- background/db.js | 18 ++++++++++++++---- js/polyfill.js | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/background/db.js b/background/db.js index c88af141..46fd0c9b 100644 --- a/background/db.js +++ b/background/db.js @@ -18,7 +18,7 @@ const db = (() => { }; function prepare() { - return shouldUseIndexedDB().then( + return withPromise(shouldUseIndexedDB).then( ok => { if (ok) { useIndexedDB(); @@ -37,16 +37,18 @@ const db = (() => { // which, once detected on the first run, is remembered in chrome.storage.local // for reliablility and in localStorage for fast synchronous access // (FF may block localStorage depending on its privacy options) + // note that it may throw when accessing the variable + // https://github.com/openstyles/stylus/issues/615 if (typeof indexedDB === 'undefined') { - return Promise.reject(new Error('indexedDB is undefined')); + throw new Error('indexedDB is undefined'); } // test localStorage const fallbackSet = localStorage.dbInChromeStorage; if (fallbackSet === 'true') { - return Promise.resolve(false); + return false; } if (fallbackSet === 'false') { - return Promise.resolve(true); + return true; } // test storage.local return chromeLocal.get('dbInChromeStorage') @@ -59,6 +61,14 @@ const db = (() => { }); } + function withPromise(fn) { + try { + return Promise.resolve(fn()); + } catch (err) { + return Promise.reject(err); + } + } + function testDBSize() { return dbExecIndexedDB('getAllKeys', IDBKeyRange.lowerBound(1), 1) .then(event => ( diff --git a/js/polyfill.js b/js/polyfill.js index 7de2c83c..78665c85 100644 --- a/js/polyfill.js +++ b/js/polyfill.js @@ -50,4 +50,22 @@ } } } + try { + if (!localStorage) { + throw new Error('localStorage is null'); + } + localStorage._access_check = 1; + delete localStorage._access_check; + } catch (err) { + Object.defineProperty(self, 'localStorage', {value: {}}); + } + try { + if (!sessionStorage) { + throw new Error('sessionStorage is null'); + } + sessionStorage._access_check = 1; + delete sessionStorage._access_check; + } catch (err) { + Object.defineProperty(self, 'sessionStorage', {value: {}}); + } })();