diff options
| author | Kuuuube <61125188+Kuuuube@users.noreply.github.com> | 2024-05-14 13:02:33 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-14 17:02:33 +0000 | 
| commit | 266c8c3a3f0d6f8c39832bfdc0cc88b88c2b710b (patch) | |
| tree | 360198d216a15b828714a40435a6139b28c28d2b /ext/js | |
| parent | ba288277a5e73026f7b0c07d993aa00a5e66c332 (diff) | |
Make Scan selected text lazy and add Scan text at selection (#915)
* Add Scan selected text lazy
* Remove extra spaces
* Improve naming
* Use disallowExpandSelection instead of "lazy"
* Use "keyword arguments" for _scanSelectedText
* Revert Use "keyword arguments" for _scanSelectedText
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: ''}}]          ]); |