diff options
Diffstat (limited to 'ext/fg/js')
| -rw-r--r-- | ext/fg/js/content-script-main.js | 7 | ||||
| -rw-r--r-- | ext/fg/js/frontend.js | 36 | 
2 files changed, 41 insertions, 2 deletions
| diff --git a/ext/fg/js/content-script-main.js b/ext/fg/js/content-script-main.js index 80a600e2..42f95e24 100644 --- a/ext/fg/js/content-script-main.js +++ b/ext/fg/js/content-script-main.js @@ -17,6 +17,7 @@  /* global   * Frontend + * HotkeyHandler   * PopupFactory   * api   */ @@ -31,6 +32,9 @@              throw new Error('Failed to get frameId');          } +        const hotkeyHandler = new HotkeyHandler(); +        hotkeyHandler.prepare(); +          const popupFactory = new PopupFactory(frameId);          popupFactory.prepare(); @@ -42,7 +46,8 @@              parentFrameId: null,              useProxyPopup: false,              pageType: 'web', -            allowRootFramePopupProxy: true +            allowRootFramePopupProxy: true, +            hotkeyHandler          });          await frontend.prepare(); diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js index d789c4f0..e9b57eb5 100644 --- a/ext/fg/js/frontend.js +++ b/ext/fg/js/frontend.js @@ -19,6 +19,7 @@   * DocumentUtil   * TextScanner   * TextSourceElement + * TextSourceRange   * api   */ @@ -32,7 +33,8 @@ class Frontend {          parentFrameId,          useProxyPopup,          allowRootFramePopupProxy, -        childrenSupported=true +        childrenSupported=true, +        hotkeyHandler      }) {          this._pageType = pageType;          this._popupFactory = popupFactory; @@ -43,6 +45,7 @@ class Frontend {          this._useProxyPopup = useProxyPopup;          this._allowRootFramePopupProxy = allowRootFramePopupProxy;          this._childrenSupported = childrenSupported; +        this._hotkeyHandler = hotkeyHandler;          this._popup = null;          this._disabledOverride = false;          this._options = null; @@ -71,6 +74,10 @@ class Frontend {              ['setAllVisibleOverride',         {async: true,  handler: this._onApiSetAllVisibleOverride.bind(this)}],              ['clearAllVisibleOverride',       {async: true,  handler: this._onApiClearAllVisibleOverride.bind(this)}]          ]); + +        this._hotkeyHandler.registerActions([ +            ['scanSelectedText', this._onActionScanSelectedText.bind(this)] +        ]);      }      get canClearSelection() { @@ -161,6 +168,12 @@ class Frontend {          this._signalFrontendReady(frameId);      } +    // Action handlers + +    _onActionScanSelectedText() { +        this._scanSelectedText(); +    } +      // API message handlers      _onApiGetUrl() { @@ -319,6 +332,8 @@ class Frontend {          const {scanning: scanningOptions, sentenceParsing: sentenceParsingOptions} = options;          this._options = options; +        this._hotkeyHandler.setHotkeys('web', options.inputs.hotkeys); +          await this._updatePopup();          const preventMiddleMouse = this._getPreventMiddleMouseValueForPageType(scanningOptions.preventMiddleMouse); @@ -646,4 +661,23 @@ class Frontend {              detail: {documentTitle}          };      } + +    async _scanSelectedText() { +        const range = this._getFirstNonEmptySelectionRange(); +        if (range === null) { return false; } +        const source = new TextSourceRange(range, range.toString(), null, null); +        await this._textScanner.search(source, {focus: true}); +        return true; +    } + +    _getFirstNonEmptySelectionRange() { +        const selection = window.getSelection(); +        for (let i = 0, ii = selection.rangeCount; i < ii; ++i) { +            const range = selection.getRangeAt(i); +            if (range.toString().length > 0) { +                return range; +            } +        } +        return null; +    }  } |