diff options
Diffstat (limited to 'ext/js')
-rw-r--r-- | ext/js/app/frontend.js | 17 | ||||
-rw-r--r-- | ext/js/dom/text-source-range.js | 24 | ||||
-rw-r--r-- | ext/js/pages/settings/keyboard-shortcuts-controller.js | 1 |
3 files changed, 33 insertions, 9 deletions
diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index 4c0faef1..cc71311d 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -119,6 +119,7 @@ export class Frontend { this._hotkeyHandler.registerActions([ ['scanSelectedText', this._onActionScanSelectedText.bind(this)], + ['scanTextAtSelection', this._onActionScanTextAtSelection.bind(this)], ['scanTextAtCaret', this._onActionScanTextAtCaret.bind(this)] ]); /* eslint-enable @stylistic/no-multi-spaces */ @@ -256,14 +257,21 @@ export class Frontend { * @returns {void} */ _onActionScanSelectedText() { - void this._scanSelectedText(false); + void this._scanSelectedText(false, true); + } + + /** + * @returns {void} + */ + _onActionScanTextAtSelection() { + void this._scanSelectedText(false, false); } /** * @returns {void} */ _onActionScanTextAtCaret() { - void this._scanSelectedText(true); + void this._scanSelectedText(true, false); } // API message handlers @@ -919,12 +927,13 @@ export class Frontend { /** * @param {boolean} allowEmptyRange + * @param {boolean} disallowExpandSelection * @returns {Promise<boolean>} */ - async _scanSelectedText(allowEmptyRange) { + async _scanSelectedText(allowEmptyRange, disallowExpandSelection) { const range = this._getFirstSelectionRange(allowEmptyRange); if (range === null) { return false; } - const source = TextSourceRange.create(range); + const source = disallowExpandSelection ? TextSourceRange.createLazy(range) : TextSourceRange.create(range); await this._textScanner.search(source, {focus: true, restoreSelection: true}); return true; } diff --git a/ext/js/dom/text-source-range.js b/ext/js/dom/text-source-range.js index 2012af7a..68ba208a 100644 --- a/ext/js/dom/text-source-range.js +++ b/ext/js/dom/text-source-range.js @@ -42,8 +42,9 @@ export class TextSourceRange { * @param {?DOMRect} cachedSourceRect A cached `DOMRect` representing the rect of the `imposterSourceElement`, * which can be used after the imposter element is removed from the page. * Must not be `null` if imposterElement is specified. + * @param {boolean} disallowExpandSelection */ - constructor(range, rangeStartOffset, content, imposterElement, imposterSourceElement, cachedRects, cachedSourceRect) { + constructor(range, rangeStartOffset, content, imposterElement, imposterSourceElement, cachedRects, cachedSourceRect, disallowExpandSelection) { /** @type {Range} */ this._range = range; /** @type {number} */ @@ -58,6 +59,8 @@ export class TextSourceRange { this._cachedRects = cachedRects; /** @type {?DOMRect} */ this._cachedSourceRect = cachedSourceRect; + /** @type {boolean} */ + this._disallowExpandSelection = disallowExpandSelection; } /** @@ -104,7 +107,8 @@ export class TextSourceRange { this._imposterElement, this._imposterSourceElement, this._cachedRects, - this._cachedSourceRect + this._cachedSourceRect, + this._disallowExpandSelection ); } @@ -145,7 +149,8 @@ export class TextSourceRange { } const state = new DOMTextScanner(node, offset, !layoutAwareScan, layoutAwareScan).seek(length); this._range.setEnd(state.node, state.offset); - this._content = (fromEnd ? this._content + state.content : state.content); + const expandedContent = fromEnd ? this._content + state.content : state.content; + this._content = this._disallowExpandSelection ? expandedContent : this._content; return length - state.remainder; } @@ -252,7 +257,16 @@ export class TextSourceRange { * @returns {TextSourceRange} A new instance of the class corresponding to the range. */ static create(range) { - return new TextSourceRange(range, range.startOffset, range.toString(), null, null, null, null); + return new TextSourceRange(range, range.startOffset, range.toString(), null, null, null, null, true); + } + + /** + * Creates a new instance for a given range without expanding the search. + * @param {Range} range The source range. + * @returns {TextSourceRange} A new instance of the class corresponding to the range. + */ + static createLazy(range) { + return new TextSourceRange(range, range.startOffset, range.toString(), null, null, null, null, false); } /** @@ -265,7 +279,7 @@ export class TextSourceRange { static createFromImposter(range, imposterElement, imposterSourceElement) { const cachedRects = convertMultipleRectZoomCoordinates(range.getClientRects(), range.startContainer); const cachedSourceRect = convertRectZoomCoordinates(imposterSourceElement.getBoundingClientRect(), imposterSourceElement); - return new TextSourceRange(range, range.startOffset, range.toString(), imposterElement, imposterSourceElement, cachedRects, cachedSourceRect); + return new TextSourceRange(range, range.startOffset, range.toString(), imposterElement, imposterSourceElement, cachedRects, cachedSourceRect, true); } /** diff --git a/ext/js/pages/settings/keyboard-shortcuts-controller.js b/ext/js/pages/settings/keyboard-shortcuts-controller.js index 1e00d907..a6d23d82 100644 --- a/ext/js/pages/settings/keyboard-shortcuts-controller.js +++ b/ext/js/pages/settings/keyboard-shortcuts-controller.js @@ -69,6 +69,7 @@ export class KeyboardShortcutController { ['playAudioFromSource', {scopes: new Set(['popup', 'search']), argument: {template: 'hotkey-argument-audio-source', default: 'jpod101'}}], ['copyHostSelection', {scopes: new Set(['popup'])}], ['scanSelectedText', {scopes: new Set(['web'])}], + ['scanTextAtSelection', {scopes: new Set(['web'])}], ['scanTextAtCaret', {scopes: new Set(['web'])}], ['toggleOption', {scopes: new Set(['popup', 'search']), argument: {template: 'hotkey-argument-setting-path', default: ''}}] ]); |