From e9358997c03ee6ca2b5e9f26e8e416c8508c88e6 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sat, 13 Feb 2021 18:52:54 -0500 Subject: [PATCH] Move search mode (#1381) * Move mode handling to SearchDisplayController * Remove mode state info and handlers from Display --- ext/bg/js/search-display-controller.js | 71 +++++++++++++++++++++----- ext/mixed/js/display.js | 58 --------------------- 2 files changed, 59 insertions(+), 70 deletions(-) diff --git a/ext/bg/js/search-display-controller.js b/ext/bg/js/search-display-controller.js index b8ad2d52..a295346d 100644 --- a/ext/bg/js/search-display-controller.js +++ b/ext/bg/js/search-display-controller.js @@ -43,21 +43,27 @@ class SearchDisplayController { getText: async () => (await api.clipboardGet()) } }); + this._messageHandlers = new Map(); + this._mode = null; } async prepare() { + this._updateMode(); + await this._display.updateOptions(); + chrome.runtime.onMessage.addListener(this._onMessage.bind(this)); yomichan.on('optionsUpdated', this._onOptionsUpdated.bind(this)); this._display.on('optionsUpdated', this._onDisplayOptionsUpdated.bind(this)); this._display.on('contentUpdating', this._onContentUpdating.bind(this)); - this._display.on('modeChange', this._onModeChange.bind(this)); this._display.hotkeyHandler.registerActions([ ['focusSearchBox', this._onActionFocusSearchBox.bind(this)] ]); - this._display.registerMessageHandlers([ + this._registerMessageHandlers([ + ['getMode', {async: false, handler: this._onMessageGetMode.bind(this)}], + ['setMode', {async: false, handler: this._onMessageSetMode.bind(this)}], ['updateSearchQuery', {async: false, handler: this._onExternalSearchUpdate.bind(this)}] ]); @@ -73,7 +79,6 @@ class SearchDisplayController { this._clipboardMonitorEnableCheckbox.addEventListener('change', this._onClipboardMonitorEnableChange.bind(this)); this._display.hotkeyHandler.on('keydownNonHotkey', this._onKeyDown.bind(this)); - this._onModeChange(); this._onDisplayOptionsUpdated({options: this._display.getOptions()}); } @@ -85,8 +90,24 @@ class SearchDisplayController { this._queryInput.select(); } + // Messages + + _onMessageSetMode({mode}) { + this._setMode(mode, true); + } + + _onMessageGetMode() { + return this._mode; + } + // Private + _onMessage({action, params}, sender, callback) { + const messageHandler = this._messageHandlers.get(action); + if (typeof messageHandler === 'undefined') { return false; } + return yomichan.invokeMessageHandler(messageHandler, params, callback, sender); + } + _onKeyDown(e) { if ( document.activeElement !== this._queryInput && @@ -194,13 +215,6 @@ class SearchDisplayController { this._setClipboardMonitorEnabled(enabled); } - _onModeChange() { - let mode = this._display.mode; - if (mode === null) { mode = ''; } - document.documentElement.dataset.searchMode = mode; - this._updateClipboardMonitorEnabled(); - } - _setWanakanaEnabled(enabled) { if (this._queryInputEventsSetup && this._wanakanaEnabled === enabled) { return; } @@ -297,10 +311,9 @@ class SearchDisplayController { } _updateClipboardMonitorEnabled() { - const mode = this._display.mode; const enabled = this._clipboardMonitorEnabled; this._clipboardMonitorEnableCheckbox.checked = enabled; - if (enabled && mode !== 'popup') { + if (enabled && this._mode !== 'popup') { this._clipboardMonitor.start(); } else { this._clipboardMonitor.stop(); @@ -372,4 +385,38 @@ class SearchDisplayController { } return query; } + + _registerMessageHandlers(handlers) { + for (const [name, handlerInfo] of handlers) { + this._messageHandlers.set(name, handlerInfo); + } + } + + _updateMode() { + let mode = null; + try { + mode = sessionStorage.getItem('mode'); + } catch (e) { + // Browsers can throw a SecurityError when cookie blocking is enabled. + } + this._setMode(mode, false); + } + + _setMode(mode, save) { + if (mode === this._mode) { return; } + if (save) { + try { + if (mode === null) { + sessionStorage.removeItem('mode'); + } else { + sessionStorage.setItem('mode', mode); + } + } catch (e) { + // Browsers can throw a SecurityError when cookie blocking is enabled. + } + } + this._mode = mode; + document.documentElement.dataset.searchMode = (mode !== null ? mode : ''); + this._updateClipboardMonitorEnabled(); + } } diff --git a/ext/mixed/js/display.js b/ext/mixed/js/display.js index bfb5f8f7..8ddca54f 100644 --- a/ext/mixed/js/display.js +++ b/ext/mixed/js/display.js @@ -84,7 +84,6 @@ class Display extends EventDispatcher { getSearchContext: this._getSearchContext.bind(this), documentUtil: this._documentUtil }); - this._mode = null; this._ankiFieldTemplates = null; this._ankiFieldTemplatesDefault = null; this._ankiNoteBuilder = new AnkiNoteBuilder(true); @@ -138,10 +137,6 @@ class Display extends EventDispatcher { ['nextEntryDifferentDictionary', () => { this._focusEntryWithDifferentDictionary(1, true); }], ['previousEntryDifferentDictionary', () => { this._focusEntryWithDifferentDictionary(-1, true); }] ]); - this.registerMessageHandlers([ - ['setMode', {async: false, handler: this._onMessageSetMode.bind(this)}], - ['getMode', {async: false, handler: this._onMessageGetMode.bind(this)}] - ]); this.registerDirectMessageHandlers([ ['setOptionsContext', {async: false, handler: this._onMessageSetOptionsContext.bind(this)}], ['setContent', {async: false, handler: this._onMessageSetContent.bind(this)}], @@ -176,10 +171,6 @@ class Display extends EventDispatcher { this._updateQueryParser(); } - get mode() { - return this._mode; - } - get japaneseUtil() { return this._japaneseUtil; } @@ -215,7 +206,6 @@ class Display extends EventDispatcher { async prepare() { // State setup const {documentElement} = document; - this._updateMode(); const {browser} = await api.getEnvironmentInfo(); this._browser = browser; @@ -231,7 +221,6 @@ class Display extends EventDispatcher { this._queryParser.on('searched', this._onQueryParserSearch.bind(this)); this._progressIndicatorVisible.on('change', this._onProgressIndicatorVisibleChanged.bind(this)); yomichan.on('extensionUnloaded', this._onExtensionUnloaded.bind(this)); - chrome.runtime.onMessage.addListener(this._onMessage.bind(this)); api.crossFrame.registerHandlers([ ['popupMessage', {async: 'dynamic', handler: this._onDirectMessage.bind(this)}] ]); @@ -379,12 +368,6 @@ class Display extends EventDispatcher { } } - registerMessageHandlers(handlers) { - for (const [name, handlerInfo] of handlers) { - this._messageHandlers.set(name, handlerInfo); - } - } - registerDirectMessageHandlers(handlers) { for (const [name, handlerInfo] of handlers) { this._directMessageHandlers.set(name, handlerInfo); @@ -456,12 +439,6 @@ class Display extends EventDispatcher { // Message handlers - _onMessage({action, params}, sender, callback) { - const messageHandler = this._messageHandlers.get(action); - if (typeof messageHandler === 'undefined') { return false; } - return yomichan.invokeMessageHandler(messageHandler, params, callback, sender); - } - _onDirectMessage(data) { data = this.authenticateMessageData(data); const {action, params} = data; @@ -490,14 +467,6 @@ class Display extends EventDispatcher { yomichan.invokeMessageHandler(messageHandler, params, callback); } - _onMessageSetMode({mode}) { - this._setMode(mode, true); - } - - _onMessageGetMode() { - return this._mode; - } - _onMessageSetOptionsContext({optionsContext}) { this.setOptionsContext(optionsContext); this.searchLast(); @@ -1424,33 +1393,6 @@ class Display extends EventDispatcher { yomichan.trigger('closePopups'); } - _updateMode() { - let mode = null; - try { - mode = sessionStorage.getItem('mode'); - } catch (e) { - // Browsers can throw a SecurityError when cookie blocking is enabled. - } - this._setMode(mode, false); - } - - _setMode(mode, save) { - if (mode === this._mode) { return; } - if (save) { - try { - if (mode === null) { - sessionStorage.removeItem('mode'); - } else { - sessionStorage.setItem('mode', mode); - } - } catch (e) { - // Browsers can throw a SecurityError when cookie blocking is enabled. - } - } - this._mode = mode; - this.trigger('modeChange', {mode}); - } - async _getAnkiFieldTemplates(options) { let templates = options.anki.fieldTemplates; if (typeof templates === 'string') { return templates; }