diff --git a/js/background.js b/js/background.js index fc597112c1..1377d09c9c 100644 --- a/js/background.js +++ b/js/background.js @@ -197,11 +197,15 @@ const cancelInitializationMessage = Views.Initialization.setMessage(); - const isIndexedDBPresent = await doesDatabaseExist(); - if (isIndexedDBPresent) { - window.installStorage(window.legacyStorage); - window.log.info('Start IndexedDB migrations'); - await runMigrations(); + const version = await window.Signal.Data.getItemById('version'); + let isIndexedDBPresent = false; + if (!version) { + isIndexedDBPresent = await doesDatabaseExist(); + if (isIndexedDBPresent) { + window.installStorage(window.legacyStorage); + window.log.info('Start IndexedDB migrations'); + await runMigrations(); + } } window.log.info('Storage fetch'); @@ -327,6 +331,24 @@ }, }; + if (isIndexedDBPresent) { + await mandatoryMessageUpgrade({ upgradeMessageSchema }); + await migrateAllToSQLCipher({ writeNewAttachmentData, Views }); + await removeDatabase(); + try { + await window.Signal.Data.removeIndexedDBFiles(); + } catch (error) { + window.log.error( + 'Failed to remove IndexedDB files:', + error && error.stack ? error.stack : error + ); + } + + window.installStorage(window.newStorage); + await window.storage.fetch(); + await storage.put('indexeddb-delete-needed', true); + } + const currentVersion = window.getVersion(); const lastVersion = storage.get('version'); newVersion = !lastVersion || currentVersion !== lastVersion; @@ -362,27 +384,10 @@ if (window.isBeforeVersion(lastVersion, 'v1.15.0-beta.5')) { await window.Signal.Logs.deleteAll(); window.restart(); + return; } } - if (isIndexedDBPresent) { - await mandatoryMessageUpgrade({ upgradeMessageSchema }); - await migrateAllToSQLCipher({ writeNewAttachmentData, Views }); - await removeDatabase(); - try { - await window.Signal.Data.removeIndexedDBFiles(); - } catch (error) { - window.log.error( - 'Failed to remove IndexedDB files:', - error && error.stack ? error.stack : error - ); - } - - window.installStorage(window.newStorage); - await window.storage.fetch(); - await storage.put('indexeddb-delete-needed', true); - } - Views.Initialization.setMessage(window.i18n('optimizingApplication')); if (newVersion) { diff --git a/js/modules/indexeddb.js b/js/modules/indexeddb.js index 9bdceb5367..e92e2d5e19 100644 --- a/js/modules/indexeddb.js +++ b/js/modules/indexeddb.js @@ -1,4 +1,4 @@ -/* global window, Whisper, textsecure */ +/* global window, Whisper, textsecure, setTimeout */ const { isFunction } = require('lodash'); @@ -142,12 +142,20 @@ async function migrateAllToSQLCipher({ writeNewAttachmentData, Views } = {}) { } async function doesDatabaseExist() { + window.log.info('Checking for the existence of IndexedDB data...'); return new Promise((resolve, reject) => { const { id } = Whisper.Database; const req = window.indexedDB.open(id); let existed = true; + setTimeout(() => { + window.log.warn( + 'doesDatabaseExist: Timed out attempting to check IndexedDB status' + ); + return resolve(false); + }, 5000); + req.onerror = reject; req.onsuccess = () => { req.result.close();