Fix: make sure all errors are caught when initializing

This commit is contained in:
eight 2018-12-14 14:06:48 +08:00
parent 4c11c8324e
commit a76d28daf5

View File

@ -18,7 +18,7 @@ const db = (() => {
}; };
function prepare() { function prepare() {
return shouldUseIndexedDB().then( return withPromise(shouldUseIndexedDB).then(
ok => { ok => {
if (ok) { if (ok) {
useIndexedDB(); useIndexedDB();
@ -37,16 +37,18 @@ const db = (() => {
// which, once detected on the first run, is remembered in chrome.storage.local // which, once detected on the first run, is remembered in chrome.storage.local
// for reliablility and in localStorage for fast synchronous access // for reliablility and in localStorage for fast synchronous access
// (FF may block localStorage depending on its privacy options) // (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') { if (typeof indexedDB === 'undefined') {
return Promise.reject(new Error('indexedDB is undefined')); throw new Error('indexedDB is undefined');
} }
// test localStorage // test localStorage
const fallbackSet = localStorage.dbInChromeStorage; const fallbackSet = localStorage.dbInChromeStorage;
if (fallbackSet === 'true') { if (fallbackSet === 'true') {
return Promise.resolve(false); return false;
} }
if (fallbackSet === 'false') { if (fallbackSet === 'false') {
return Promise.resolve(true); return true;
} }
// test storage.local // test storage.local
return chromeLocal.get('dbInChromeStorage') 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() { function testDBSize() {
return dbExecIndexedDB('getAllKeys', IDBKeyRange.lowerBound(1), 1) return dbExecIndexedDB('getAllKeys', IDBKeyRange.lowerBound(1), 1)
.then(event => ( .then(event => (