aboutsummaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2020-04-27 18:10:37 -0400
committerGitHub <noreply@github.com>2020-04-27 18:10:37 -0400
commit48c7010f4ea8daafd30e5650625c377affa0cecd (patch)
tree2b652062128c31eda340a0ac84e102c2106136b5 /ext
parent887d769786f2909dbd74e3465cef3551b780a49b (diff)
Frontend refactor (part 1) (#484)
* Remove _getVisualViewportScale * Use super's mouse event listener definitions * Remove redundant override * Remove getTouchEventListeners override * Rename Display.onSearchClear to onEscape * Change onSearchClear to clearSelection and use an event * Update how text is marked for selection and deselection * Replace onError with yomichan.logError * Update setEnabled to refresh all event listeners
Diffstat (limited to 'ext')
-rw-r--r--ext/bg/js/search-query-parser.js25
-rw-r--r--ext/bg/js/search.js2
-rw-r--r--ext/bg/js/settings/popup-preview-frame.js2
-rw-r--r--ext/fg/js/float.js2
-rw-r--r--ext/fg/js/frontend.js26
-rw-r--r--ext/mixed/js/display.js4
-rw-r--r--ext/mixed/js/text-scanner.js46
7 files changed, 42 insertions, 65 deletions
diff --git a/ext/bg/js/search-query-parser.js b/ext/bg/js/search-query-parser.js
index 0001c9ff..3215f8e4 100644
--- a/ext/bg/js/search-query-parser.js
+++ b/ext/bg/js/search-query-parser.js
@@ -44,12 +44,7 @@ class QueryParser extends TextScanner {
await this.queryParserGenerator.prepare();
}
- onError(error) {
- yomichan.logError(error);
- }
-
- onClick(e) {
- super.onClick(e);
+ onClick2(e) {
this.searchAt(e.clientX, e.clientY, 'click');
}
@@ -84,22 +79,8 @@ class QueryParser extends TextScanner {
getMouseEventListeners() {
return [
- [this.node, 'click', this.onClick.bind(this)],
- [this.node, 'mousedown', this.onMouseDown.bind(this)],
- [this.node, 'mousemove', this.onMouseMove.bind(this)],
- [this.node, 'mouseover', this.onMouseOver.bind(this)],
- [this.node, 'mouseout', this.onMouseOut.bind(this)]
- ];
- }
-
- getTouchEventListeners() {
- return [
- [this.node, 'auxclick', this.onAuxClick.bind(this)],
- [this.node, 'touchstart', this.onTouchStart.bind(this)],
- [this.node, 'touchend', this.onTouchEnd.bind(this)],
- [this.node, 'touchcancel', this.onTouchCancel.bind(this)],
- [this.node, 'touchmove', this.onTouchMove.bind(this), {passive: false}],
- [this.node, 'contextmenu', this.onContextMenu.bind(this)]
+ ...super.getMouseEventListeners(),
+ [this.node, 'click', this.onClick2.bind(this)]
];
}
diff --git a/ext/bg/js/search.js b/ext/bg/js/search.js
index cbd7b562..b7d2eed8 100644
--- a/ext/bg/js/search.js
+++ b/ext/bg/js/search.js
@@ -125,7 +125,7 @@ class DisplaySearch extends Display {
yomichan.logError(error);
}
- onSearchClear() {
+ onEscape() {
if (this.query === null) {
return;
}
diff --git a/ext/bg/js/settings/popup-preview-frame.js b/ext/bg/js/settings/popup-preview-frame.js
index 05a2a41b..e73c04a0 100644
--- a/ext/bg/js/settings/popup-preview-frame.js
+++ b/ext/bg/js/settings/popup-preview-frame.js
@@ -69,7 +69,7 @@ class SettingsPopupPreview {
this.frontend.getOptionsContext = async () => this.optionsContext;
this.frontend.setEnabled = () => {};
- this.frontend.onSearchClear = () => {};
+ this.frontend.clearSelection = () => {};
await this.frontend.prepare();
diff --git a/ext/fg/js/float.js b/ext/fg/js/float.js
index fd3b92cc..294093cd 100644
--- a/ext/fg/js/float.js
+++ b/ext/fg/js/float.js
@@ -92,7 +92,7 @@ class DisplayFloat extends Display {
this._orphaned = true;
}
- onSearchClear() {
+ onEscape() {
window.parent.postMessage('popupClose', '*');
}
diff --git a/ext/fg/js/frontend.js b/ext/fg/js/frontend.js
index 46921d36..50f52724 100644
--- a/ext/fg/js/frontend.js
+++ b/ext/fg/js/frontend.js
@@ -49,7 +49,7 @@ class Frontend extends TextScanner {
this._lastShowPromise = Promise.resolve();
this._windowMessageHandlers = new Map([
- ['popupClose', () => this.onSearchClear(true)],
+ ['popupClose', () => this.clearSelection(false)],
['selectionCopy', () => document.execCommand('copy')]
]);
@@ -79,10 +79,12 @@ class Frontend extends TextScanner {
yomichan.on('zoomChanged', this.onZoomChanged.bind(this));
chrome.runtime.onMessage.addListener(this.onRuntimeMessage.bind(this));
+ this.on('clearSelection', this.onClearSelection.bind(this));
+
this._updateContentScale();
this._broadcastRootPopupInformation();
} catch (e) {
- this.onError(e);
+ yomichan.logError(e);
}
}
@@ -140,7 +142,7 @@ class Frontend extends TextScanner {
}
async setPopup(popup) {
- this.onSearchClear(false);
+ this.clearSelection(true);
this.popup = popup;
await popup.setOptionsContext(await this.getOptionsContext(), this._id);
}
@@ -186,11 +188,11 @@ class Frontend extends TextScanner {
this._showPopupContent(textSource, await this.getOptionsContext(), 'orphaned');
}
} else {
- this.onError(e);
+ yomichan.logError(e);
}
} finally {
if (results === null && this.options.scanning.autoHideResults) {
- this.onSearchClear(true);
+ this.clearSelection(false);
}
}
@@ -238,10 +240,9 @@ class Frontend extends TextScanner {
return {definitions, type: 'kanji'};
}
- onSearchClear(changeFocus) {
- this.popup.hide(changeFocus);
+ onClearSelection({passive}) {
+ this.popup.hide(!passive);
this.popup.clearAutoPlayTimer();
- super.onSearchClear(changeFocus);
}
async getOptionsContext() {
@@ -269,7 +270,9 @@ class Frontend extends TextScanner {
contentScale /= this._pageZoomFactor;
}
if (popupScaleRelativeToVisualViewport) {
- contentScale /= Frontend._getVisualViewportScale();
+ const visualViewport = window.visualViewport;
+ const visualViewportScale = (visualViewport !== null && typeof visualViewport === 'object' ? visualViewport.scale : 1.0);
+ contentScale /= visualViewportScale;
}
if (contentScale === this._contentScale) { return; }
@@ -302,9 +305,4 @@ class Frontend extends TextScanner {
this._showPopupContent(textSource, await this.getOptionsContext());
}
}
-
- static _getVisualViewportScale() {
- const visualViewport = window.visualViewport;
- return visualViewport !== null && typeof visualViewport === 'object' ? visualViewport.scale : 1.0;
- }
}
diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js
index 70b7fcd3..32081c70 100644
--- a/ext/mixed/js/display.js
+++ b/ext/mixed/js/display.js
@@ -69,7 +69,7 @@ class Display {
this._onKeyDownHandlers = new Map([
['Escape', () => {
- this.onSearchClear();
+ this.onEscape();
return true;
}],
['PageUp', (e) => {
@@ -183,7 +183,7 @@ class Display {
throw new Error('Override me');
}
- onSearchClear() {
+ onEscape() {
throw new Error('Override me');
}
diff --git a/ext/mixed/js/text-scanner.js b/ext/mixed/js/text-scanner.js
index 1c32714b..c582ccd8 100644
--- a/ext/mixed/js/text-scanner.js
+++ b/ext/mixed/js/text-scanner.js
@@ -21,8 +21,9 @@
* docRangeFromPoint
*/
-class TextScanner {
+class TextScanner extends EventDispatcher {
constructor(node, ignoreElements, ignorePoints) {
+ super();
this.node = node;
this.ignoreElements = ignoreElements;
this.ignorePoints = ignorePoints;
@@ -32,6 +33,7 @@ class TextScanner {
this.scanTimerPromise = null;
this.causeCurrent = null;
this.textSourceCurrent = null;
+ this.textSourceCurrentSelected = false;
this.pendingLookup = false;
this.options = null;
@@ -92,7 +94,7 @@ class TextScanner {
if (DOM.isMouseButtonDown(e, 'primary')) {
this.scanTimerClear();
- this.onSearchClear(true);
+ this.clearSelection(false);
}
}
@@ -200,10 +202,6 @@ class TextScanner {
throw new Error('Override me');
}
- onError(error) {
- yomichan.logError(error);
- }
-
async scanTimerWait() {
const delay = this.options.scanning.delay;
const promise = promiseTimeout(delay, true);
@@ -225,17 +223,12 @@ class TextScanner {
}
setEnabled(enabled, canEnable) {
- if (enabled && canEnable) {
- if (!this.enabled) {
- this.hookEvents();
- this.enabled = true;
- }
+ this.eventListeners.removeAllEventListeners();
+ this.enabled = enabled && canEnable;
+ if (this.enabled) {
+ this.hookEvents();
} else {
- if (this.enabled) {
- this.eventListeners.removeAllEventListeners();
- this.enabled = false;
- }
- this.onSearchClear(false);
+ this.clearSelection(true);
}
}
@@ -300,10 +293,7 @@ class TextScanner {
const result = await this.onSearchSource(textSource, cause);
if (result !== null) {
this.causeCurrent = cause;
- this.textSourceCurrent = textSource;
- if (this.options.scanning.selectText) {
- textSource.select();
- }
+ this.setCurrentTextSource(textSource);
}
this.pendingLookup = false;
} finally {
@@ -312,7 +302,7 @@ class TextScanner {
}
}
} catch (e) {
- this.onError(e);
+ yomichan.logError(e);
}
}
@@ -333,13 +323,15 @@ class TextScanner {
}
}
- onSearchClear(_) {
+ clearSelection(passive) {
if (this.textSourceCurrent !== null) {
- if (this.options.scanning.selectText) {
+ if (this.textSourceCurrentSelected) {
this.textSourceCurrent.deselect();
}
this.textSourceCurrent = null;
+ this.textSourceCurrentSelected = false;
}
+ this.trigger('clearSelection', {passive});
}
getCurrentTextSource() {
@@ -347,7 +339,13 @@ class TextScanner {
}
setCurrentTextSource(textSource) {
- return this.textSourceCurrent = textSource;
+ this.textSourceCurrent = textSource;
+ if (this.options.scanning.selectText) {
+ this.textSourceCurrent.select();
+ this.textSourceCurrentSelected = true;
+ } else {
+ this.textSourceCurrentSelected = false;
+ }
}
static isScanningModifierPressed(scanningModifier, mouseEvent) {