aboutsummaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2019-11-02 17:37:53 -0400
committertoasted-nutbread <toasted-nutbread@users.noreply.github.com>2019-11-07 20:30:55 -0500
commitfcb922400add0b9ab5d5b5454c3d6042a2d5b256 (patch)
tree5102b3f49fb72c635cb75d49bc2f46b342a4066f /ext
parente5dcb418248667e3aa4627d5660ff2f951d58237 (diff)
Prevent page exit while database operations are in progress
Diffstat (limited to 'ext')
-rw-r--r--ext/bg/js/settings-dictionaries.js13
-rw-r--r--ext/bg/js/settings.js46
2 files changed, 59 insertions, 0 deletions
diff --git a/ext/bg/js/settings-dictionaries.js b/ext/bg/js/settings-dictionaries.js
index c40648e0..786fcbd5 100644
--- a/ext/bg/js/settings-dictionaries.js
+++ b/ext/bg/js/settings-dictionaries.js
@@ -222,7 +222,10 @@ class SettingsDictionaryEntryUI {
const progressBar = this.content.querySelector('.progress-bar');
this.isDeleting = true;
+ const prevention = new PageExitPrevention();
try {
+ prevention.start();
+
const onProgress = ({processed, count, storeCount, storesProcesed}) => {
let percent = 0.0;
if (count > 0 && storesProcesed > 0) {
@@ -235,6 +238,7 @@ class SettingsDictionaryEntryUI {
} catch (e) {
dictionaryErrorsShow([e]);
} finally {
+ prevention.end();
this.isDeleting = false;
progress.hidden = true;
@@ -479,7 +483,10 @@ async function onDictionaryPurge(e) {
const dictProgress = document.querySelector('#dict-purge');
dictProgress.hidden = false;
+ const prevention = new PageExitPrevention();
+
try {
+ prevention.start();
dictionaryErrorsShow(null);
dictionarySpinnerShow(true);
@@ -496,6 +503,8 @@ async function onDictionaryPurge(e) {
} catch (err) {
dictionaryErrorsShow([err]);
} finally {
+ prevention.end();
+
dictionarySpinnerShow(false);
dictControls.show();
@@ -513,7 +522,10 @@ async function onDictionaryImport(e) {
const dictProgress = $('#dict-import-progress').show();
const dictImportInfo = document.querySelector('#dict-import-info');
+ const prevention = new PageExitPrevention();
+
try {
+ prevention.start();
dictionaryErrorsShow(null);
dictionarySpinnerShow(true);
@@ -559,6 +571,7 @@ async function onDictionaryImport(e) {
} catch (err) {
dictionaryErrorsShow([err]);
} finally {
+ prevention.end();
dictionarySpinnerShow(false);
dictImportInfo.hidden = false;
diff --git a/ext/bg/js/settings.js b/ext/bg/js/settings.js
index e4446851..d4b1549e 100644
--- a/ext/bg/js/settings.js
+++ b/ext/bg/js/settings.js
@@ -212,6 +212,52 @@ $(document).ready(utilAsync(onReady));
/*
+ * Page exit prevention
+ */
+
+class PageExitPrevention {
+ constructor() {
+ }
+
+ start() {
+ PageExitPrevention._addInstance(this);
+ }
+
+ end() {
+ PageExitPrevention._removeInstance(this);
+ }
+
+ static _addInstance(instance) {
+ const size = PageExitPrevention._instances.size;
+ PageExitPrevention._instances.set(instance, true);
+ if (size === 0) {
+ window.addEventListener('beforeunload', PageExitPrevention._onBeforeUnload);
+ }
+ }
+
+ static _removeInstance(instance) {
+ if (
+ PageExitPrevention._instances.delete(instance) &&
+ PageExitPrevention._instances.size === 0
+ ) {
+ window.removeEventListener('beforeunload', PageExitPrevention._onBeforeUnload);
+ }
+ }
+
+ static _onBeforeUnload(e) {
+ if (PageExitPrevention._instances.size === 0) {
+ return;
+ }
+
+ e.preventDefault();
+ e.returnValue = '';
+ return '';
+ }
+}
+PageExitPrevention._instances = new Map();
+
+
+/*
* Appearance
*/