Fix: db initializing error, polyfill localStorage/sessionStorage (#616)

* Fix: make sure all errors are caught when initializing

* Fix: polyfill localStorage and sessionStorage
This commit is contained in:
eight 2019-06-21 03:35:41 +08:00 committed by narcolepticinsomniac
parent 514fa3204f
commit c61806974f
2 changed files with 32 additions and 4 deletions

View File

@ -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 => (

View File

@ -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: {}});
}
})();