diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-07-03 11:56:26 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-03 11:56:26 -0400 |
commit | c13160d784caf5ca2803081171d1c01eb91f49c6 (patch) | |
tree | 88526d4c338cea194cc3d5a998d6cab17d12e23d /ext/bg/js/settings/settings-controller.js | |
parent | 1d02013642df825f3539b03c325dc51d9fd00e83 (diff) |
Page exit prevention refactor (#637)
* Add page exit prevention functionality to SettingsController
* Update dictionary controller to use new page exit prevention system
* Remove page-exit-prevention.js
Diffstat (limited to 'ext/bg/js/settings/settings-controller.js')
-rw-r--r-- | ext/bg/js/settings/settings-controller.js | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/ext/bg/js/settings/settings-controller.js b/ext/bg/js/settings/settings-controller.js index 87dea408..6479714d 100644 --- a/ext/bg/js/settings/settings-controller.js +++ b/ext/bg/js/settings/settings-controller.js @@ -26,6 +26,8 @@ class SettingsController extends EventDispatcher { super(); this._profileIndex = profileIndex; this._source = yomichan.generateId(16); + this._pageExitPreventions = new Set(); + this._pageExitPreventionEventListeners = new EventListenerCollection(); } get source() { @@ -109,6 +111,16 @@ class SettingsController extends EventDispatcher { return {index: this._profileIndex}; } + preventPageExit() { + const obj = {end: null}; + obj.end = this._endPreventPageExit.bind(this, obj); + if (this._pageExitPreventionEventListeners.size === 0) { + this._pageExitPreventionEventListeners.addEventListener(window, 'beforeunload', this._onBeforeUnload.bind(this), false); + } + this._pageExitPreventions.add(obj); + return obj; + } + // Private _setProfileIndex(value) { @@ -147,4 +159,21 @@ class SettingsController extends EventDispatcher { targets = this._setupTargets(targets, extraFields); return await api.modifySettings(targets, this._source); } + + _onBeforeUnload(e) { + if (this._pageExitPreventions.size === 0) { + return; + } + + e.preventDefault(); + e.returnValue = ''; + return ''; + } + + _endPreventPageExit(obj) { + this._pageExitPreventions.delete(obj); + if (this._pageExitPreventions.size === 0) { + this._pageExitPreventionEventListeners.removeAllEventListeners(); + } + } } |