From 6a0f1ae82998edbd43ebd7d98fdd3076f55473ef Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Sun, 22 Sep 2024 16:18:39 +0700 Subject: [PATCH 01/13] Remove scanAltText, exclude selector based on pointer event --- ext/data/schemas/options-schema.json | 5 ----- ext/js/app/frontend.js | 1 - ext/js/data/options-util.js | 11 ++++++++++ ext/js/display/display.js | 2 -- ext/js/language/text-scanner.js | 30 ++++++++++------------------ ext/settings.html | 9 --------- test/options-util.test.js | 3 +-- types/ext/settings.d.ts | 1 - types/ext/text-scanner.d.ts | 1 - 9 files changed, 23 insertions(+), 40 deletions(-) diff --git a/ext/data/schemas/options-schema.json b/ext/data/schemas/options-schema.json index 66befefe3..acbee8eee 100644 --- a/ext/data/schemas/options-schema.json +++ b/ext/data/schemas/options-schema.json @@ -462,7 +462,6 @@ "hideDelay", "length", "deepDomScan", - "scanAltText", "popupNestingMaxDepth", "enablePopupSearch", "enableOnPopupExpressions", @@ -716,10 +715,6 @@ "type": "boolean", "default": false }, - "scanAltText": { - "type": "boolean", - "default": true - }, "popupNestingMaxDepth": { "type": "integer", "minimum": 0, diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index 858f690d5..20c76d4f0 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -513,7 +513,6 @@ export class Frontend { matchTypePrefix: scanningOptions.matchTypePrefix, preventMiddleMouse, sentenceParsingOptions, - scanAltText: scanningOptions.scanAltText, scanWithoutMousemove: scanningOptions.scanWithoutMousemove, scanResolution: scanningOptions.scanResolution, }); diff --git a/ext/js/data/options-util.js b/ext/js/data/options-util.js index 9ee0e16c2..ad49ab788 100644 --- a/ext/js/data/options-util.js +++ b/ext/js/data/options-util.js @@ -563,6 +563,7 @@ export class OptionsUtil { this._updateVersion49, this._updateVersion50, this._updateVersion51, + this._updateVersion52, ]; /* eslint-enable @typescript-eslint/unbound-method */ if (typeof targetVersion === 'number' && targetVersion < result.length) { @@ -1487,6 +1488,16 @@ export class OptionsUtil { } } + /** + * - Remove scanning.scanAltText + * @type {import('options-util').UpdateFunction} + */ + async _updateVersion52(options) { + for (const profile of options.profiles) { + delete profile.options.scanning.scanAltText; + } + } + /** * @param {string} url * @returns {Promise} diff --git a/ext/js/display/display.js b/ext/js/display/display.js index b121b1631..be0c7fddc 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -464,7 +464,6 @@ export class Display extends EventDispatcher { preventMiddleMouse: scanningOptions.preventMiddleMouse.onSearchQuery, matchTypePrefix: false, sentenceParsingOptions, - scanAltText: scanningOptions.scanAltText, scanWithoutMousemove: scanningOptions.scanWithoutMousemove, scanResolution: scanningOptions.scanResolution, }, @@ -2033,7 +2032,6 @@ export class Display extends EventDispatcher { layoutAwareScan: scanningOptions.layoutAwareScan, preventMiddleMouse: false, sentenceParsingOptions, - scanAltText: scanningOptions.scanAltText, }); this._contentTextScanner.setEnabled(true); diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index 5282f6d2a..6cea8e834 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -124,8 +124,6 @@ export class TextScanner extends EventDispatcher { this._sentenceBackwardQuoteMap = new Map(); /** @type {import('text-scanner').InputConfig[]} */ this._inputs = []; - /** @type {boolean} */ - this._scanAltText = true; /** @type {boolean} */ this._enabled = false; @@ -257,7 +255,6 @@ export class TextScanner extends EventDispatcher { preventMiddleMouse, sentenceParsingOptions, matchTypePrefix, - scanAltText, scanWithoutMousemove, scanResolution, }) { @@ -294,9 +291,6 @@ export class TextScanner extends EventDispatcher { if (typeof matchTypePrefix === 'boolean') { this._matchTypePrefix = matchTypePrefix; } - if (typeof scanAltText === 'boolean') { - this._scanAltText = scanAltText; - } if (typeof scanWithoutMousemove === 'boolean') { this._scanWithoutMousemove = scanWithoutMousemove; } @@ -348,9 +342,9 @@ export class TextScanner extends EventDispatcher { clonedTextSource.setEndOffset(length, false, layoutAwareScan); const includeSelector = this._includeSelector; - const excludeSelector = this._excludeSelector; - if (includeSelector !== null || excludeSelector !== null) { - this._constrainTextSource(clonedTextSource, includeSelector, excludeSelector, layoutAwareScan, pointerType); + const excludeSelector = this._getExcludeSelectorForPointerType(pointerType); + if (includeSelector !== null || excludeSelector !== null ) { + this._constrainTextSource(clonedTextSource, includeSelector, excludeSelector, layoutAwareScan); } return clonedTextSource.text(); @@ -460,7 +454,8 @@ export class TextScanner extends EventDispatcher { async _search(textSource, searchTerms, searchKanji, inputInfo, showEmpty = false) { try { const isAltText = textSource instanceof TextSourceElement; - if (isAltText && !this._scanAltText) { + // Prevent scanning of alt text on touch event + if (isAltText && inputInfo.pointerType === 'touch') { return; } @@ -1637,11 +1632,9 @@ export class TextScanner extends EventDispatcher { * @param {?string} includeSelector * @param {?string} excludeSelector * @param {boolean} layoutAwareScan - * @param {import('input').PointerType | undefined} pointerType */ - _constrainTextSource(textSource, includeSelector, excludeSelector, layoutAwareScan, pointerType) { + _constrainTextSource(textSource, includeSelector, excludeSelector, layoutAwareScan) { let length = textSource.text().length; - excludeSelector = this._createExcludeSelectorForPointerType(excludeSelector, pointerType); while (length > 0) { const nodes = textSource.getNodesInRange(); @@ -1658,17 +1651,16 @@ export class TextScanner extends EventDispatcher { } /** - * @param {?string} excludeSelector * @param {import('input').PointerType | undefined} pointerType * @returns {?string} */ - _createExcludeSelectorForPointerType(excludeSelector, pointerType) { + _getExcludeSelectorForPointerType(pointerType) { if (pointerType === 'touch') { - // Avoid trigger search with tapping on popup link, tag and inflection. - const popupClickableSelector = '.gloss-link, .gloss-link *, .tag, .tag *, .inflection'; - return excludeSelector ? `${excludeSelector},${popupClickableSelector}` : popupClickableSelector; + // Avoid trigger search with tapping on interactive elements. + const popupClickableSelector = '.gloss-link,.gloss-link *,.tag, .tag *, .inflection, a, a *, input, textarea, textarea *'; + return this._excludeSelector ? `${this._excludeSelector},${popupClickableSelector}` : popupClickableSelector; } - return excludeSelector; + return this._excludeSelector; } /** diff --git a/ext/settings.html b/ext/settings.html index dc751d929..e42a91cb9 100644 --- a/ext/settings.html +++ b/ext/settings.html @@ -477,15 +477,6 @@

Yomitan Settings

-
-
-
Scan alt text
-
Scan text that is used for image and button descriptions.
-
-
- -
-
diff --git a/test/options-util.test.js b/test/options-util.test.js index 0eca28cea..d4ac27f66 100644 --- a/test/options-util.test.js +++ b/test/options-util.test.js @@ -348,7 +348,6 @@ function createProfileOptionsUpdatedTestData1() { hidePopupOnCursorExit: false, hidePopupOnCursorExitDelay: 0, normalizeCssZoom: true, - scanAltText: true, preventMiddleMouse: { onWebPages: false, onPopupPages: false, @@ -645,7 +644,7 @@ function createOptionsUpdatedTestData1() { }, ], profileCurrent: 0, - version: 51, + version: 52, global: { database: { prefixWildcardsSupported: false, diff --git a/types/ext/settings.d.ts b/types/ext/settings.d.ts index dbc19c437..ceffe1e00 100644 --- a/types/ext/settings.d.ts +++ b/types/ext/settings.d.ts @@ -197,7 +197,6 @@ export type ScanningOptions = { hidePopupOnCursorExit: boolean; hidePopupOnCursorExitDelay: number; normalizeCssZoom: boolean; - scanAltText: boolean; scanWithoutMousemove: boolean; scanResolution: string; }; diff --git a/types/ext/text-scanner.d.ts b/types/ext/text-scanner.d.ts index 73a9a6cc6..36cff9a4a 100644 --- a/types/ext/text-scanner.d.ts +++ b/types/ext/text-scanner.d.ts @@ -41,7 +41,6 @@ export type Options = { preventMiddleMouse?: boolean; matchTypePrefix?: boolean; sentenceParsingOptions?: SentenceParsingOptions; - scanAltText?: boolean; scanWithoutMousemove?: boolean; scanResolution?: string; }; From 4fd5558b5aefd4eb030b3e000a3628bced00f996 Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Tue, 24 Sep 2024 14:37:31 +0700 Subject: [PATCH 02/13] input and textarea don't work --- ext/js/language/text-scanner.js | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index 6cea8e834..31ea9812a 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -1658,6 +1658,7 @@ export class TextScanner extends EventDispatcher { if (pointerType === 'touch') { // Avoid trigger search with tapping on interactive elements. const popupClickableSelector = '.gloss-link,.gloss-link *,.tag, .tag *, .inflection, a, a *, input, textarea, textarea *'; + const popupClickableSelector = '.gloss-link,.gloss-link *,.tag, .tag *, .inflection, a, a *' return this._excludeSelector ? `${this._excludeSelector},${popupClickableSelector}` : popupClickableSelector; } return this._excludeSelector; From 83d9d809a62a0bc5d635b28b7faa8d60ab5a0e5d Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Tue, 24 Sep 2024 14:37:54 +0700 Subject: [PATCH 03/13] Update text-scanner.js --- ext/js/language/text-scanner.js | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index 31ea9812a..f0201b08f 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -1657,7 +1657,6 @@ export class TextScanner extends EventDispatcher { _getExcludeSelectorForPointerType(pointerType) { if (pointerType === 'touch') { // Avoid trigger search with tapping on interactive elements. - const popupClickableSelector = '.gloss-link,.gloss-link *,.tag, .tag *, .inflection, a, a *, input, textarea, textarea *'; const popupClickableSelector = '.gloss-link,.gloss-link *,.tag, .tag *, .inflection, a, a *' return this._excludeSelector ? `${this._excludeSelector},${popupClickableSelector}` : popupClickableSelector; } From 92aa0510ef4fd48712f263b70d39c2da641dad4e Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Tue, 24 Sep 2024 15:01:02 +0700 Subject: [PATCH 04/13] Prevent touch scan on input or text area --- ext/js/dom/text-source-range.js | 11 +++++++++++ ext/js/language/text-scanner.js | 5 +++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/ext/js/dom/text-source-range.js b/ext/js/dom/text-source-range.js index 4450d3284..4bcb59700 100644 --- a/ext/js/dom/text-source-range.js +++ b/ext/js/dom/text-source-range.js @@ -95,6 +95,17 @@ export class TextSourceRange { return this._imposterSourceElement; } + /** + * Determines whether the imposter source element is an input or textarea element. + * @return {boolean} `true` if the imposter source element is an input or textarea element, `false` otherwise. + */ + isImposterInputOrTextArea() { + if (this._imposterSourceElement) { + return this._imposterSourceElement.tagName === 'INPUT' || this._imposterSourceElement.tagName === 'TEXTAREA'; + } + return false; + } + /** * Creates a clone of the instance. * @returns {TextSourceRange} The new clone. diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index f0201b08f..03f7aef55 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -23,6 +23,7 @@ import {log} from '../core/log.js'; import {clone} from '../core/utilities.js'; import {anyNodeMatchesSelector, everyNodeMatchesSelector, getActiveModifiers, getActiveModifiersAndButtons, isPointInSelection} from '../dom/document-util.js'; import {TextSourceElement} from '../dom/text-source-element.js'; +import {TextSourceRange} from '../dom/text-source-range.js'; /** * @augments EventDispatcher @@ -454,8 +455,8 @@ export class TextScanner extends EventDispatcher { async _search(textSource, searchTerms, searchKanji, inputInfo, showEmpty = false) { try { const isAltText = textSource instanceof TextSourceElement; - // Prevent scanning of alt text on touch event - if (isAltText && inputInfo.pointerType === 'touch') { + const isInputOrTextArea = textSource instanceof TextSourceRange && textSource.isImposterInputOrTextArea(); + if (inputInfo.pointerType === 'touch' && (isAltText || isInputOrTextArea)) { return; } From fca99c449663e74fc88ba4170c228e83a028dd25 Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Tue, 24 Sep 2024 15:05:19 +0700 Subject: [PATCH 05/13] Update text-source-range.js --- ext/js/dom/text-source-range.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/js/dom/text-source-range.js b/ext/js/dom/text-source-range.js index 4bcb59700..42032786d 100644 --- a/ext/js/dom/text-source-range.js +++ b/ext/js/dom/text-source-range.js @@ -101,7 +101,8 @@ export class TextSourceRange { */ isImposterInputOrTextArea() { if (this._imposterSourceElement) { - return this._imposterSourceElement.tagName === 'INPUT' || this._imposterSourceElement.tagName === 'TEXTAREA'; + const type = this._imposterSourceElement.nodeName.toUpperCase(); + return type === 'INPUT' || type === 'TEXTAREA'; } return false; } From cb0afec26850468d2d53dc490166b752b41fbc0a Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Tue, 24 Sep 2024 15:17:50 +0700 Subject: [PATCH 06/13] lint --- ext/js/dom/text-source-range.js | 6 +++--- ext/js/language/text-scanner.js | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ext/js/dom/text-source-range.js b/ext/js/dom/text-source-range.js index 42032786d..86b0041a4 100644 --- a/ext/js/dom/text-source-range.js +++ b/ext/js/dom/text-source-range.js @@ -97,15 +97,15 @@ export class TextSourceRange { /** * Determines whether the imposter source element is an input or textarea element. - * @return {boolean} `true` if the imposter source element is an input or textarea element, `false` otherwise. + * @returns {boolean} `true` if the imposter source element is an input or textarea element, `false` otherwise. */ - isImposterInputOrTextArea() { + isImposterInputOrTextArea() { if (this._imposterSourceElement) { const type = this._imposterSourceElement.nodeName.toUpperCase(); return type === 'INPUT' || type === 'TEXTAREA'; } return false; - } + } /** * Creates a clone of the instance. diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index 03f7aef55..c04c7f7f8 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -344,7 +344,7 @@ export class TextScanner extends EventDispatcher { const includeSelector = this._includeSelector; const excludeSelector = this._getExcludeSelectorForPointerType(pointerType); - if (includeSelector !== null || excludeSelector !== null ) { + if (includeSelector !== null || excludeSelector !== null) { this._constrainTextSource(clonedTextSource, includeSelector, excludeSelector, layoutAwareScan); } @@ -1658,7 +1658,7 @@ export class TextScanner extends EventDispatcher { _getExcludeSelectorForPointerType(pointerType) { if (pointerType === 'touch') { // Avoid trigger search with tapping on interactive elements. - const popupClickableSelector = '.gloss-link,.gloss-link *,.tag, .tag *, .inflection, a, a *' + const popupClickableSelector = '.gloss-link,.gloss-link *,.tag, .tag *, .inflection, a, a *'; return this._excludeSelector ? `${this._excludeSelector},${popupClickableSelector}` : popupClickableSelector; } return this._excludeSelector; From 9ed80f6d496c00dd52cd78f52885d7f072ef2526 Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Tue, 24 Sep 2024 15:29:21 +0700 Subject: [PATCH 07/13] Prevent exclude .tag and .gloss-link from website --- ext/js/app/frontend.js | 3 +++ ext/js/display/display.js | 1 + ext/js/language/text-scanner.js | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index 20c76d4f0..cb2b216be 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -518,13 +518,16 @@ export class Frontend { }); this._updateTextScannerEnabled(); + const touchEventExcludeSelectors = ['a', 'a *'] if (this._pageType !== 'web') { const excludeSelectors = ['.scan-disable', '.scan-disable *']; if (!scanningOptions.enableOnPopupExpressions) { excludeSelectors.push('.source-text', '.source-text *'); } + touchEventExcludeSelectors.push('.gloss-link', '.gloss-link *', '.tag', '.tag *'); this._textScanner.excludeSelector = excludeSelectors.join(','); } + this._textScanner.touchEventExcludeSelector = touchEventExcludeSelectors.join(','); this._updateContentScale(); diff --git a/ext/js/display/display.js b/ext/js/display/display.js index be0c7fddc..e03d16d09 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -1993,6 +1993,7 @@ export class Display extends EventDispatcher { }); this._contentTextScanner.includeSelector = '.click-scannable,.click-scannable *'; this._contentTextScanner.excludeSelector = '.scan-disable,.scan-disable *'; + this._contentTextScanner.touchEventExcludeSelector = 'a,.a *' this._contentTextScanner.prepare(); this._contentTextScanner.on('clear', this._onContentTextScannerClear.bind(this)); this._contentTextScanner.on('searchSuccess', this._onContentTextScannerSearchSuccess.bind(this)); diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index c04c7f7f8..c2f610f24 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -73,6 +73,8 @@ export class TextScanner extends EventDispatcher { /** @type {?string} */ this._excludeSelector = null; /** @type {?string} */ + this._touchExcludeSelector = null; + /** @type {?string} */ this._language = null; /** @type {?import('text-scanner').InputInfo} */ @@ -197,6 +199,15 @@ export class TextScanner extends EventDispatcher { this._excludeSelector = value; } + /** @type {?string} */ + get touchEventExcludeSelector() { + return this._touchExcludeSelector; + } + + set touchEventExcludeSelector(value) { + this._touchExcludeSelector = value; + } + /** @type {?string} */ get language() { return this._language; } set language(value) { this._language = value; } @@ -1657,9 +1668,7 @@ export class TextScanner extends EventDispatcher { */ _getExcludeSelectorForPointerType(pointerType) { if (pointerType === 'touch') { - // Avoid trigger search with tapping on interactive elements. - const popupClickableSelector = '.gloss-link,.gloss-link *,.tag, .tag *, .inflection, a, a *'; - return this._excludeSelector ? `${this._excludeSelector},${popupClickableSelector}` : popupClickableSelector; + return this._excludeSelector ? `${this._excludeSelector},${this.touchEventExcludeSelector}` : this.touchEventExcludeSelector; } return this._excludeSelector; } From d4a62a40cccc8ac993ce4791899106c47c916b9a Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Tue, 24 Sep 2024 15:30:35 +0700 Subject: [PATCH 08/13] exclude inflection --- ext/js/app/frontend.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index cb2b216be..8d9a584b4 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -524,7 +524,7 @@ export class Frontend { if (!scanningOptions.enableOnPopupExpressions) { excludeSelectors.push('.source-text', '.source-text *'); } - touchEventExcludeSelectors.push('.gloss-link', '.gloss-link *', '.tag', '.tag *'); + touchEventExcludeSelectors.push('.gloss-link', '.gloss-link *', '.tag', '.tag *', '.inflection'); this._textScanner.excludeSelector = excludeSelectors.join(','); } this._textScanner.touchEventExcludeSelector = touchEventExcludeSelectors.join(','); From a40ac193604d9024b1b971d229fd7bbfbf1098b1 Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Tue, 24 Sep 2024 15:34:44 +0700 Subject: [PATCH 09/13] lint --- ext/js/display/display.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/js/display/display.js b/ext/js/display/display.js index e03d16d09..9789eaa2f 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -1993,7 +1993,7 @@ export class Display extends EventDispatcher { }); this._contentTextScanner.includeSelector = '.click-scannable,.click-scannable *'; this._contentTextScanner.excludeSelector = '.scan-disable,.scan-disable *'; - this._contentTextScanner.touchEventExcludeSelector = 'a,.a *' + this._contentTextScanner.touchEventExcludeSelector = 'a,.a *'; this._contentTextScanner.prepare(); this._contentTextScanner.on('clear', this._onContentTextScannerClear.bind(this)); this._contentTextScanner.on('searchSuccess', this._onContentTextScannerSearchSuccess.bind(this)); From 6d841f6f521f65770a3a7e1331cd5cd5d6079d3e Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Tue, 24 Sep 2024 15:35:20 +0700 Subject: [PATCH 10/13] lint --- ext/js/app/frontend.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index 8d9a584b4..65c38cf3b 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -518,7 +518,7 @@ export class Frontend { }); this._updateTextScannerEnabled(); - const touchEventExcludeSelectors = ['a', 'a *'] + const touchEventExcludeSelectors = ['a', 'a *']; if (this._pageType !== 'web') { const excludeSelectors = ['.scan-disable', '.scan-disable *']; if (!scanningOptions.enableOnPopupExpressions) { From ba8cd7c26c6ef6bc629cf4370e8d44592de9dadc Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Wed, 25 Sep 2024 23:54:39 +0700 Subject: [PATCH 11/13] refactor --- ext/js/dom/text-source-range.js | 12 ------------ ext/js/language/text-scanner.js | 12 ++++++++---- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/ext/js/dom/text-source-range.js b/ext/js/dom/text-source-range.js index 86b0041a4..4450d3284 100644 --- a/ext/js/dom/text-source-range.js +++ b/ext/js/dom/text-source-range.js @@ -95,18 +95,6 @@ export class TextSourceRange { return this._imposterSourceElement; } - /** - * Determines whether the imposter source element is an input or textarea element. - * @returns {boolean} `true` if the imposter source element is an input or textarea element, `false` otherwise. - */ - isImposterInputOrTextArea() { - if (this._imposterSourceElement) { - const type = this._imposterSourceElement.nodeName.toUpperCase(); - return type === 'INPUT' || type === 'TEXTAREA'; - } - return false; - } - /** * Creates a clone of the instance. * @returns {TextSourceRange} The new clone. diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index c2f610f24..797ce4922 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -23,7 +23,6 @@ import {log} from '../core/log.js'; import {clone} from '../core/utilities.js'; import {anyNodeMatchesSelector, everyNodeMatchesSelector, getActiveModifiers, getActiveModifiersAndButtons, isPointInSelection} from '../dom/document-util.js'; import {TextSourceElement} from '../dom/text-source-element.js'; -import {TextSourceRange} from '../dom/text-source-range.js'; /** * @augments EventDispatcher @@ -466,9 +465,14 @@ export class TextScanner extends EventDispatcher { async _search(textSource, searchTerms, searchKanji, inputInfo, showEmpty = false) { try { const isAltText = textSource instanceof TextSourceElement; - const isInputOrTextArea = textSource instanceof TextSourceRange && textSource.isImposterInputOrTextArea(); - if (inputInfo.pointerType === 'touch' && (isAltText || isInputOrTextArea)) { - return; + if (inputInfo.pointerType === 'touch') { + if (isAltText) { + return; + } + const {imposterSourceElement} = textSource; + if (imposterSourceElement instanceof HTMLTextAreaElement || imposterSourceElement instanceof HTMLInputElement) { + return; + } } const inputInfoDetail = inputInfo.detail; From e2d050c76108469135319f24d193a275b9c4bfdf Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Thu, 26 Sep 2024 00:28:31 +0700 Subject: [PATCH 12/13] allow scan input text when tapping on same position --- ext/js/language/text-scanner.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/ext/js/language/text-scanner.js b/ext/js/language/text-scanner.js index 797ce4922..58c6b1f29 100644 --- a/ext/js/language/text-scanner.js +++ b/ext/js/language/text-scanner.js @@ -469,9 +469,12 @@ export class TextScanner extends EventDispatcher { if (isAltText) { return; } - const {imposterSourceElement} = textSource; + const {imposterSourceElement, rangeStartOffset} = textSource; if (imposterSourceElement instanceof HTMLTextAreaElement || imposterSourceElement instanceof HTMLInputElement) { - return; + const isFocused = imposterSourceElement === document.activeElement; + if (!isFocused || imposterSourceElement.selectionStart !== rangeStartOffset) { + return; + } } } From 5afdb9466ae4f0db5a1bb3e4bf476a2b51cc6dfa Mon Sep 17 00:00:00 2001 From: Khai Truong Date: Sat, 5 Oct 2024 13:34:28 +0700 Subject: [PATCH 13/13] allow scan hyperlink on tap --- ext/js/app/frontend.js | 4 +--- ext/js/display/display.js | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/js/app/frontend.js b/ext/js/app/frontend.js index 65c38cf3b..ff6dc5f22 100644 --- a/ext/js/app/frontend.js +++ b/ext/js/app/frontend.js @@ -518,16 +518,14 @@ export class Frontend { }); this._updateTextScannerEnabled(); - const touchEventExcludeSelectors = ['a', 'a *']; if (this._pageType !== 'web') { const excludeSelectors = ['.scan-disable', '.scan-disable *']; if (!scanningOptions.enableOnPopupExpressions) { excludeSelectors.push('.source-text', '.source-text *'); } - touchEventExcludeSelectors.push('.gloss-link', '.gloss-link *', '.tag', '.tag *', '.inflection'); this._textScanner.excludeSelector = excludeSelectors.join(','); + this._textScanner.touchEventExcludeSelector = 'gloss-link, gloss-link *, tag, tag *, inflection'; } - this._textScanner.touchEventExcludeSelector = touchEventExcludeSelectors.join(','); this._updateContentScale(); diff --git a/ext/js/display/display.js b/ext/js/display/display.js index 9789eaa2f..2f90189d9 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -1993,7 +1993,7 @@ export class Display extends EventDispatcher { }); this._contentTextScanner.includeSelector = '.click-scannable,.click-scannable *'; this._contentTextScanner.excludeSelector = '.scan-disable,.scan-disable *'; - this._contentTextScanner.touchEventExcludeSelector = 'a,.a *'; + this._contentTextScanner.touchEventExcludeSelector = null; this._contentTextScanner.prepare(); this._contentTextScanner.on('clear', this._onContentTextScannerClear.bind(this)); this._contentTextScanner.on('searchSuccess', this._onContentTextScannerSearchSuccess.bind(this));