diff options
Diffstat (limited to 'ext/fg/js')
| -rw-r--r-- | ext/fg/js/frontend.js | 73 | 
1 files changed, 51 insertions, 22 deletions
| diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js index 4ad78aa7..39433afb 100644 --- a/ext/fg/js/frontend.js +++ b/ext/fg/js/frontend.js @@ -38,6 +38,9 @@ class Frontend {          this.mouseDownPrevent = false;          this.clickPrevent = false;          this.scrollPrevent = false; + +        this.enabled = false; +        this.eventListeners = [];      }      static create() { @@ -53,23 +56,7 @@ class Frontend {      async prepare() {          try { -            this.options = await apiOptionsGet(this.getOptionsContext()); - -            window.addEventListener('message', this.onWindowMessage.bind(this)); -            window.addEventListener('mousedown', this.onMouseDown.bind(this)); -            window.addEventListener('mousemove', this.onMouseMove.bind(this)); -            window.addEventListener('mouseover', this.onMouseOver.bind(this)); -            window.addEventListener('mouseout', this.onMouseOut.bind(this)); -            window.addEventListener('resize', this.onResize.bind(this)); - -            if (this.options.scanning.touchInputEnabled) { -                window.addEventListener('click', this.onClick.bind(this)); -                window.addEventListener('touchstart', this.onTouchStart.bind(this)); -                window.addEventListener('touchend', this.onTouchEnd.bind(this)); -                window.addEventListener('touchcancel', this.onTouchCancel.bind(this)); -                window.addEventListener('touchmove', this.onTouchMove.bind(this), {passive: false}); -                window.addEventListener('contextmenu', this.onContextMenu.bind(this)); -            } +            await this.updateOptions();              chrome.runtime.onMessage.addListener(this.onRuntimeMessage.bind(this));          } catch (e) { @@ -88,7 +75,6 @@ class Frontend {          if (              this.pendingLookup || -            !this.options.general.enable ||              (e.buttons & 0x1) !== 0x0 // Left mouse button          ) {              return; @@ -245,13 +231,56 @@ class Frontend {          console.log(error);      } -    async updateOptions() { -        this.options = await apiOptionsGet(this.getOptionsContext()); -        if (!this.options.enable) { +    setEnabled(enabled) { +        if (enabled) { +            if (!this.enabled) { +                this.hookEvents(); +                this.enabled = true; +            } +        } else { +            if (this.enabled) { +                this.clearEventListeners(); +                this.enabled = false; +            }              this.searchClear(false);          }      } +    hookEvents() { +        this.addEventListener(window, 'message', this.onWindowMessage.bind(this)); +        this.addEventListener(window, 'mousedown', this.onMouseDown.bind(this)); +        this.addEventListener(window, 'mousemove', this.onMouseMove.bind(this)); +        this.addEventListener(window, 'mouseover', this.onMouseOver.bind(this)); +        this.addEventListener(window, 'mouseout', this.onMouseOut.bind(this)); +        this.addEventListener(window, 'resize', this.onResize.bind(this)); + +        if (this.options.scanning.touchInputEnabled) { +            this.addEventListener(window, 'click', this.onClick.bind(this)); +            this.addEventListener(window, 'touchstart', this.onTouchStart.bind(this)); +            this.addEventListener(window, 'touchend', this.onTouchEnd.bind(this)); +            this.addEventListener(window, 'touchcancel', this.onTouchCancel.bind(this)); +            this.addEventListener(window, 'touchmove', this.onTouchMove.bind(this), {passive: false}); +            this.addEventListener(window, 'contextmenu', this.onContextMenu.bind(this)); +        } +    } + +    addEventListener(node, type, listener, options) { +        node.addEventListener(type, listener, options); +        this.eventListeners.push([node, type, listener, options]); +    } + +    clearEventListeners() { +        for (const [node, type, listener, options] of this.eventListeners) { +            node.removeEventListener(type, listener, options); +        } +        this.eventListeners = []; +    } + +    async updateOptions() { +        this.options = await apiOptionsGet(this.getOptionsContext()); +        this.setEnabled(this.options.general.enable); +    } +      popupTimerSet(callback) {          const delay = this.options.scanning.delay;          if (delay > 0) { @@ -452,7 +481,7 @@ class Frontend {      searchFromTouch(x, y, cause) {          this.popupTimerClear(); -        if (!this.options.general.enable || this.pendingLookup) { +        if (this.pendingLookup) {              return;          } |