diff --git a/src-main/l10n/en.json b/src-main/l10n/en.json index f4a79b20..6501acde 100644 --- a/src-main/l10n/en.json +++ b/src-main/l10n/en.json @@ -283,6 +283,10 @@ "string": "Finalizing...", "developer_comment": "Status message that appears while finishing an update." }, + "migrate.delete-legacy": { + "string": "Deleting old data...", + "developer_comment": "Status message that appears while finishing an update. Old data refers to data stored by old versions of the app that is now redundant after updates." + }, "update.window-title": { "string": "Update Available", "developer_comment": "Title of update available window" diff --git a/src-main/windows/migrate.js b/src-main/windows/migrate.js index 5754b253..dcbac3de 100644 --- a/src-main/windows/migrate.js +++ b/src-main/windows/migrate.js @@ -8,19 +8,22 @@ const {APP_NAME} = require('../brand'); const EMAIL = 'contact@turbowarp.org'; class MigrateWindow extends BaseWindow { - static LATEST_VERSION = 2; + static LATEST_VERSION = 3; constructor () { super(); + const oldDataVersion = settings.dataVersion; + this.promise = new Promise((resolve) => { this.resolveCallback = resolve; }); const ipc = this.window.webContents.ipc; - ipc.on('get-strings', (event) => { + ipc.on('get-info', (event) => { event.returnValue = { + oldDataVersion, locale: getLocale(), strings: getStrings() }; diff --git a/src-preload/migrate.js b/src-preload/migrate.js index cd361c96..45f7e8e3 100644 --- a/src-preload/migrate.js +++ b/src-preload/migrate.js @@ -1,7 +1,7 @@ const {contextBridge, ipcRenderer} = require('electron'); contextBridge.exposeInMainWorld('MigratePreload', { - getStrings: () => ipcRenderer.sendSync('get-strings'), + getInfo: () => ipcRenderer.sendSync('get-info'), done: () => ipcRenderer.invoke('done'), continueAnyways: () => ipcRenderer.invoke('continue-anyways') }); diff --git a/src-renderer/migrate/migrate.html b/src-renderer/migrate/migrate.html index 00e7e715..d4aa259b 100644 --- a/src-renderer/migrate/migrate.html +++ b/src-renderer/migrate/migrate.html @@ -152,7 +152,7 @@
TW_AutoSave -> abandon (likely to be very large) */ - const {strings, locale} = MigratePreload.getStrings(); + const {oldDataVersion, strings, locale} = MigratePreload.getInfo(); document.documentElement.lang = locale; document.querySelector('.title').textContent = strings['migrate.title']; @@ -360,6 +360,31 @@ }); }; + const deleteDatabase = (databaseName) => new Promise((resolve, reject) => { + const request = indexedDB.deleteDatabase(databaseName); + request.onerror = () => { + reject(new Error(`Failed to delete IDB database ${databaseName}: ${request.error}`)); + }; + request.onsuccess = () => { + resolve(); + }; + }); + + const deleteLegacyData = async () => { + localStorage.clear(); + sessionStorage.clear(); + + for (let i = 0; i < databases.length; i++) { + await deleteDatabase(databases[i].name); + + // i starts from 0, so add 1 for the database we just deleted + setStepProgress(i + 1, databases.length); + + // Give the browser some time to clean up; deleting large databases might be intensive + await new Promise((resolve) => setTimeout(resolve, 250)) + } + }; + const finish = async () => { await MigratePreload.done(); }; @@ -423,13 +448,18 @@ await runStep(strings['migrate.preparing'], gatherMetadata); - if (!anyError) { - // Preparing must succeed for both of these, but each of these can fail - // independently. + if (!anyError && oldDataVersion < 2) { + // V2: Migrate data from file:// to tw-*:// + // Preparing must succeed for both of these, but each can fail independently. await runStep(strings['migrate.transfer-editor'], migrateEditor); await runStep(strings['migrate.transfer-packager'], migratePackager); } + if (!anyError && oldDataVersion < 3) { + // V3: Removing leftover data on file:// + await runStep(strings['migrate.delete-legacy'], deleteLegacyData); + } + if (!anyError) { await runStep(strings['migrate.finalizing'], finish); }