diff options
-rw-r--r-- | dev/data/manifest-variants.json | 1 | ||||
-rw-r--r-- | ext/bg/data/options-schema.json | 2 | ||||
-rw-r--r-- | ext/bg/js/settings/popup-preview-frame-main.js | 6 | ||||
-rw-r--r-- | ext/bg/js/settings/popup-preview-frame.js | 6 | ||||
-rw-r--r-- | ext/bg/popup-preview.html | 1 | ||||
-rw-r--r-- | ext/bg/settings2.html | 5 | ||||
-rw-r--r-- | ext/fg/js/content-script-main.js | 7 | ||||
-rw-r--r-- | ext/fg/js/frontend.js | 36 | ||||
-rw-r--r-- | ext/manifest.json | 1 | ||||
-rw-r--r-- | ext/mixed/js/display.js | 3 |
10 files changed, 61 insertions, 7 deletions
diff --git a/dev/data/manifest-variants.json b/dev/data/manifest-variants.json index d94ed9ab..757066f0 100644 --- a/dev/data/manifest-variants.json +++ b/dev/data/manifest-variants.json @@ -47,6 +47,7 @@ "mixed/js/frame-client.js", "mixed/js/text-scanner.js", "mixed/js/document-util.js", + "mixed/js/hotkey-handler.js", "fg/js/dom-text-scanner.js", "fg/js/popup.js", "fg/js/text-source-range.js", diff --git a/ext/bg/data/options-schema.json b/ext/bg/data/options-schema.json index def279cc..a140d3e9 100644 --- a/ext/bg/data/options-schema.json +++ b/ext/bg/data/options-schema.json @@ -1011,7 +1011,7 @@ "type": "array", "items": { "type": "string", - "enum": ["popup", "search"], + "enum": ["popup", "search", "web"], "default": "popup" }, "default": ["popup", "search"] diff --git a/ext/bg/js/settings/popup-preview-frame-main.js b/ext/bg/js/settings/popup-preview-frame-main.js index a639ced7..71454017 100644 --- a/ext/bg/js/settings/popup-preview-frame-main.js +++ b/ext/bg/js/settings/popup-preview-frame-main.js @@ -16,6 +16,7 @@ */ /* global + * HotkeyHandler * PopupFactory * PopupPreviewFrame * api @@ -27,10 +28,13 @@ const {frameId} = await api.frameInformationGet(); + const hotkeyHandler = new HotkeyHandler(); + hotkeyHandler.prepare(); + const popupFactory = new PopupFactory(frameId); popupFactory.prepare(); - const preview = new PopupPreviewFrame(frameId, popupFactory); + const preview = new PopupPreviewFrame(frameId, popupFactory, hotkeyHandler); await preview.prepare(); document.documentElement.dataset.loaded = 'true'; diff --git a/ext/bg/js/settings/popup-preview-frame.js b/ext/bg/js/settings/popup-preview-frame.js index 73d8882a..92b57c7a 100644 --- a/ext/bg/js/settings/popup-preview-frame.js +++ b/ext/bg/js/settings/popup-preview-frame.js @@ -23,9 +23,10 @@ */ class PopupPreviewFrame { - constructor(frameId, popupFactory) { + constructor(frameId, popupFactory, hotkeyHandler) { this._frameId = frameId; this._popupFactory = popupFactory; + this._hotkeyHandler = hotkeyHandler; this._frontend = null; this._apiOptionsGetOld = null; this._popupShown = false; @@ -74,7 +75,8 @@ class PopupPreviewFrame { useProxyPopup: false, pageType: 'web', allowRootFramePopupProxy: false, - childrenSupported: false + childrenSupported: false, + hotkeyHandler: this._hotkeyHandler }); this._frontend.setOptionsContextOverride(this._optionsContext); await this._frontend.prepare(); diff --git a/ext/bg/popup-preview.html b/ext/bg/popup-preview.html index 75386e24..d8855946 100644 --- a/ext/bg/popup-preview.html +++ b/ext/bg/popup-preview.html @@ -45,6 +45,7 @@ <script src="/mixed/js/text-scanner.js"></script> <script src="/mixed/js/document-util.js"></script> +<script src="/mixed/js/hotkey-handler.js"></script> <script src="/fg/js/dom-text-scanner.js"></script> <script src="/fg/js/popup.js"></script> <script src="/fg/js/text-source-range.js"></script> diff --git a/ext/bg/settings2.html b/ext/bg/settings2.html index 0fd3feb0..128bd5ef 100644 --- a/ext/bg/settings2.html +++ b/ext/bg/settings2.html @@ -3014,10 +3014,15 @@ <option value="viewNote" data-scopes="popup search">View note</option> <option value="playAudio" data-scopes="popup search">Play audio</option> <option value="copyHostSelection" data-scopes="popup search">Copy selection</option> + <option value="scanSelectedText" data-scopes="web">Scan selected text</option> </select> <div class="hotkey-list-item-flex-row"> <div class="hotkey-list-item-flex-row-label">Scopes:</div> <div class="hotkey-list-item-flex-row"> + <label class="hotkey-scope-checkbox-container" data-scope="web"> + <label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="web"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label> + <span>Web</span> + </label> <label class="hotkey-scope-checkbox-container" data-scope="popup"> <label class="checkbox"><input type="checkbox" class="hotkey-scope-checkbox" data-scope="popup"><span class="checkbox-body"><span class="checkbox-fill"></span><span class="checkbox-border"></span><span class="checkbox-check"></span></span></label> <span>Popup</span> 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; + } } diff --git a/ext/manifest.json b/ext/manifest.json index 97f77dde..495044a4 100644 --- a/ext/manifest.json +++ b/ext/manifest.json @@ -46,6 +46,7 @@ "mixed/js/frame-client.js", "mixed/js/text-scanner.js", "mixed/js/document-util.js", + "mixed/js/hotkey-handler.js", "fg/js/dom-text-scanner.js", "fg/js/popup.js", "fg/js/text-source-range.js", diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index c017a2f1..3c7deefe 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -1640,7 +1640,8 @@ class Display extends EventDispatcher { popupFactory, pageType: this._pageType, allowRootFramePopupProxy: true, - childrenSupported: this._childrenSupported + childrenSupported: this._childrenSupported, + hotkeyHandler: this._hotkeyHandler }); const frontend = new Frontend(setupNestedPopupsOptions); |