diff options
Diffstat (limited to 'ext/fg/js')
| -rw-r--r-- | ext/fg/js/frontend.js | 27 | 
1 files changed, 26 insertions, 1 deletions
| diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js index 76ad27e0..d979246d 100644 --- a/ext/fg/js/frontend.js +++ b/ext/fg/js/frontend.js @@ -50,6 +50,9 @@ class Frontend {          );          this._textScanner.onSearchSource = this.onSearchSource.bind(this); +        this._activeModifiers = new Set(); +        this._optionsUpdatePending = false; +          this._windowMessageHandlers = new Map([              ['popupClose', () => this._textScanner.clearSelection(false)],              ['selectionCopy', () => document.execCommand('copy')] @@ -90,6 +93,7 @@ class Frontend {              chrome.runtime.onMessage.addListener(this.onRuntimeMessage.bind(this));              this._textScanner.on('clearSelection', this.onClearSelection.bind(this)); +            this._textScanner.on('activeModifiersChanged', this.onActiveModifiersChanged.bind(this));              this._updateContentScale();              this._broadcastRootPopupInformation(); @@ -173,12 +177,21 @@ class Frontend {          }      } +    async updatePendingOptions() { +        if (this._optionsUpdatePending) { +            this._optionsUpdatePending = false; +            await this.updateOptions(); +        } +    } +      async setTextSource(textSource) {          await this.onSearchSource(textSource, 'script');          this._textScanner.setCurrentTextSource(textSource);      }      async onSearchSource(textSource, cause) { +        await this.updatePendingOptions(); +          let results = null;          try { @@ -254,12 +267,24 @@ class Frontend {      onClearSelection({passive}) {          this.popup.hide(!passive);          this.popup.clearAutoPlayTimer(); +        this.updatePendingOptions(); +    } + +    async onActiveModifiersChanged({modifiers}) { +        if (areSetsEqual(modifiers, this._activeModifiers)) { return; } +        this._activeModifiers = modifiers; +        if (await this.popup.isVisible()) { +            this._optionsUpdatePending = true; +            return; +        } +        await this.updateOptions();      }      async getOptionsContext() {          const url = this._getUrl !== null ? await this._getUrl() : window.location.href;          const depth = this.popup.depth; -        return {depth, url}; +        const modifierKeys = [...this._activeModifiers]; +        return {depth, url, modifierKeys};      }      _showPopupContent(textSource, optionsContext, type=null, details=null) { |