diff options
Diffstat (limited to 'ext/bg')
| -rw-r--r-- | ext/bg/js/search-display-controller.js | 71 | 
1 files changed, 59 insertions, 12 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(); +    }  } |