aboutsummaryrefslogtreecommitdiff
path: root/ext/mixed/js/text-scanner.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/mixed/js/text-scanner.js')
-rw-r--r--ext/mixed/js/text-scanner.js71
1 files changed, 37 insertions, 34 deletions
diff --git a/ext/mixed/js/text-scanner.js b/ext/mixed/js/text-scanner.js
index 189afd07..5ab90de8 100644
--- a/ext/mixed/js/text-scanner.js
+++ b/ext/mixed/js/text-scanner.js
@@ -35,7 +35,7 @@ class TextScanner extends EventDispatcher {
this._isPrepared = false;
this._ignoreNodes = null;
- this._inputCurrent = null;
+ this._inputInfoCurrent = null;
this._scanTimerPromise = null;
this._textSourceCurrent = null;
this._textSourceCurrentSelected = false;
@@ -204,7 +204,7 @@ class TextScanner extends EventDispatcher {
}
this._textSourceCurrent = null;
this._textSourceCurrentSelected = false;
- this._inputCurrent = null;
+ this._inputInfoCurrent = null;
}
this.trigger('clearSelection', {passive});
}
@@ -224,20 +224,21 @@ class TextScanner extends EventDispatcher {
}
async searchLast() {
- if (this._textSourceCurrent !== null && this._inputCurrent !== null) {
- await this._search(this._textSourceCurrent, this._searchTerms, this._searchKanji, this._inputCurrent);
+ if (this._textSourceCurrent !== null && this._inputInfoCurrent !== null) {
+ await this._search(this._textSourceCurrent, this._searchTerms, this._searchKanji, this._inputInfoCurrent);
return true;
}
return false;
}
async search(textSource) {
- return await this._search(textSource, this._searchTerms, this._searchKanji, {cause: 'script', index: -1, empty: false});
+ const inputInfo = this._createInputInfo(-1, false, null, 'script', 'script', [], []);
+ return await this._search(textSource, this._searchTerms, this._searchKanji, inputInfo);
}
// Private
- async _search(textSource, searchTerms, searchKanji, input) {
+ async _search(textSource, searchTerms, searchKanji, inputInfo) {
let definitions = null;
let sentence = null;
let type = null;
@@ -256,7 +257,7 @@ class TextScanner extends EventDispatcher {
const result = await this._findDefinitions(textSource, searchTerms, searchKanji, optionsContext);
if (result !== null) {
({definitions, sentence, type} = result);
- this._inputCurrent = input;
+ this._inputInfoCurrent = inputInfo;
this.setCurrentTextSource(textSource);
}
} catch (e) {
@@ -270,7 +271,7 @@ class TextScanner extends EventDispatcher {
type,
definitions,
sentence,
- input,
+ inputInfo,
textSource,
optionsContext,
error
@@ -286,7 +287,7 @@ class TextScanner extends EventDispatcher {
_onMouseMove(e) {
this._scanTimerClear();
- const inputInfo = this._getMatchingInputGroupFromEvent(e, 'mouse');
+ const inputInfo = this._getMatchingInputGroupFromEvent('mouse', 'mouseMove', e);
if (inputInfo === null) { return; }
this._searchAtFromMouseMove(e.clientX, e.clientY, inputInfo);
@@ -322,7 +323,10 @@ class TextScanner extends EventDispatcher {
_onClick(e) {
if (this._searchOnClick) {
- this._searchAt(e.clientX, e.clientY, 'mouse', 'click', {index: -1, empty: false, input: null});
+ const modifiers = DocumentUtil.getActiveModifiersAndButtons(e);
+ const modifierKeys = DocumentUtil.getActiveModifiers(e);
+ const inputInfo = this._createInputInfo(-1, false, null, 'mouse', 'click', modifiers, modifierKeys);
+ this._searchAt(e.clientX, e.clientY, inputInfo);
}
if (this._preventNextClick) {
@@ -403,12 +407,11 @@ class TextScanner extends EventDispatcher {
return;
}
- const type = 'touch';
- const inputInfo = this._getMatchingInputGroupFromEvent(e, type);
+ const inputInfo = this._getMatchingInputGroupFromEvent('touch', 'touchMove', e);
if (inputInfo === null) { return; }
if (inputInfo.input.options.scanOnTouchMove) {
- this._searchAt(primaryTouch.clientX, primaryTouch.clientY, type, 'touchMove', inputInfo);
+ this._searchAt(primaryTouch.clientX, primaryTouch.clientY, inputInfo);
}
e.preventDefault(); // Disable scroll
@@ -513,10 +516,10 @@ class TextScanner extends EventDispatcher {
return;
}
- const inputInfo = this._getMatchingInputGroupFromEvent(e, 'touch');
+ const inputInfo = this._getMatchingInputGroupFromEvent('touch', 'touchMove', e);
if (inputInfo === null || !inputInfo.input.options.scanOnTouchMove) { return; }
- this._searchAt(e.clientX, e.clientY, 'touch', 'touchMove', inputInfo);
+ this._searchAt(e.clientX, e.clientY, inputInfo);
}
_onTouchPointerUp() {
@@ -707,11 +710,11 @@ class TextScanner extends EventDispatcher {
return {definitions, sentence, type: 'kanji'};
}
- async _searchAt(x, y, type, cause, inputInfo) {
+ async _searchAt(x, y, inputInfo) {
if (this._pendingLookup) { return; }
try {
- const {index, empty, input: sourceInput} = inputInfo;
+ const sourceInput = inputInfo.input;
let searchTerms = this._searchTerms;
let searchKanji = this._searchKanji;
if (sourceInput !== null) {
@@ -719,8 +722,6 @@ class TextScanner extends EventDispatcher {
if (searchKanji && !sourceInput.options.searchKanji) { searchKanji = false; }
}
- const input = {type, cause, index, empty};
-
this._pendingLookup = true;
this._scanTimerClear();
@@ -730,7 +731,7 @@ class TextScanner extends EventDispatcher {
const textSource = this._documentUtil.getRangeFromPoint(x, y, this._deepContentScan);
try {
- await this._search(textSource, searchTerms, searchKanji, input);
+ await this._search(textSource, searchTerms, searchKanji, inputInfo);
} finally {
if (textSource !== null) {
textSource.cleanup();
@@ -753,21 +754,19 @@ class TextScanner extends EventDispatcher {
}
}
- await this._searchAt(x, y, 'mouse', 'mouseMove', inputInfo);
+ await this._searchAt(x, y, inputInfo);
}
async _searchAtFromTouchStart(e, x, y) {
if (this._pendingLookup) { return; }
- const type = 'touch';
- const cause = 'touchStart';
- const inputInfo = this._getMatchingInputGroupFromEvent(e, type);
+ const inputInfo = this._getMatchingInputGroupFromEvent('touch', 'touchStart', e);
if (inputInfo === null) { return; }
const textSourceCurrentPrevious = this._textSourceCurrent !== null ? this._textSourceCurrent.clone() : null;
const preventScroll = inputInfo.input.options.preventTouchScrolling;
- await this._searchAt(x, y, type, cause, inputInfo);
+ await this._searchAt(x, y, inputInfo);
if (
this._textSourceCurrent !== null &&
@@ -782,8 +781,7 @@ class TextScanner extends EventDispatcher {
async _searchAtFromPen(e, x, y, cause, prevent) {
if (this._pendingLookup) { return; }
- const type = 'pen';
- const inputInfo = this._getMatchingInputGroupFromEvent(e, type);
+ const inputInfo = this._getMatchingInputGroupFromEvent('pen', cause, e);
if (inputInfo === null) { return; }
const {input: {options}} = inputInfo;
@@ -796,7 +794,7 @@ class TextScanner extends EventDispatcher {
const preventScroll = inputInfo.input.options.preventTouchScrolling;
- await this._searchAt(x, y, type, cause, inputInfo);
+ await this._searchAt(x, y, inputInfo);
if (
prevent &&
@@ -809,13 +807,14 @@ class TextScanner extends EventDispatcher {
}
}
- _getMatchingInputGroupFromEvent(event, type) {
+ _getMatchingInputGroupFromEvent(type, cause, event) {
const modifiers = DocumentUtil.getActiveModifiersAndButtons(event);
- this.trigger('activeModifiersChanged', {modifiers});
- return this._getMatchingInputGroup(modifiers, type);
+ const modifierKeys = DocumentUtil.getActiveModifiers(event);
+ this.trigger('activeModifiersChanged', {modifiers, modifierKeys});
+ return this._getMatchingInputGroup(type, cause, modifiers, modifierKeys);
}
- _getMatchingInputGroup(modifiers, type) {
+ _getMatchingInputGroup(type, cause, modifiers, modifierKeys) {
let fallback = null;
const modifiersSet = new Set(modifiers);
for (let i = 0, ii = this._inputs.length; i < ii; ++i) {
@@ -824,15 +823,19 @@ class TextScanner extends EventDispatcher {
if (!types.has(type)) { continue; }
if (this._setHasAll(modifiersSet, include) && (exclude.length === 0 || !this._setHasAll(modifiersSet, exclude))) {
if (include.length > 0) {
- return {index: i, empty: false, input};
+ return this._createInputInfo(i, false, input, type, cause, modifiers, modifierKeys);
} else if (fallback === null) {
- fallback = {index: i, empty: true, input};
+ fallback = this._createInputInfo(i, true, input, type, cause, modifiers, modifierKeys);
}
}
}
return fallback;
}
+ _createInputInfo(index, empty, input, type, cause, modifiers, modifierKeys) {
+ return {index, empty, input, type, cause, modifiers, modifierKeys};
+ }
+
_setHasAll(set, values) {
for (const value of values) {
if (!set.has(value)) {