diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2020-11-22 15:29:51 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-22 15:29:51 -0500 |
commit | 2971f262f9851d588f815d5ea03de69f9594de5a (patch) | |
tree | 965d3f3a219c411a87f68d4991c4920f52def12a /ext/fg/js | |
parent | 7234cce4ae528db3e6177da1dbd499abd3c83837 (diff) |
Merge float into display (#1053)
* Update audio play delay
* Move frame endpoint to Display
* Move _invokeOwner and close implementation
* Move browser info assignment
* Move window message handler setup
* Move copy implementation
* Move document title function
* Move extension unload handler
* Move close handler
* Move history event handlers
* Remove DisplayFloat
* Remove unused
* Organize
* Move event listeners into prepare
Diffstat (limited to 'ext/fg/js')
-rw-r--r-- | ext/fg/js/float-main.js | 5 | ||||
-rw-r--r-- | ext/fg/js/float.js | 184 |
2 files changed, 3 insertions, 186 deletions
diff --git a/ext/fg/js/float-main.js b/ext/fg/js/float-main.js index 85f605a2..6b4daebb 100644 --- a/ext/fg/js/float-main.js +++ b/ext/fg/js/float-main.js @@ -16,7 +16,7 @@ */ /* global - * DisplayFloat + * Display * api */ @@ -25,8 +25,9 @@ api.forwardLogsToBackend(); await yomichan.backendReady(); - const display = new DisplayFloat(); + const display = new Display('popup'); await display.prepare(); + display.initializeState(); yomichan.ready(); } catch (e) { diff --git a/ext/fg/js/float.js b/ext/fg/js/float.js deleted file mode 100644 index 195861a3..00000000 --- a/ext/fg/js/float.js +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (C) 2016-2020 Yomichan Authors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. - */ - -/* global - * Display - * FrameEndpoint - * api - */ - -class DisplayFloat extends Display { - constructor() { - super('popup'); - this._frameEndpoint = new FrameEndpoint(); - this._windowMessageHandlers = new Map([ - ['extensionUnloaded', {async: false, handler: this._onMessageExtensionUnloaded.bind(this)}] - ]); - this._browser = null; - this._copyTextarea = null; - - this.registerActions([ - ['copyHostSelection', () => this._copySelection()] - ]); - this.registerHotkeys([ - {key: 'C', modifiers: ['ctrl'], action: 'copyHostSelection'} - ]); - - this.autoPlayAudioDelay = 400; - } - - async prepare() { - await super.prepare(); - - const {browser} = await api.getEnvironmentInfo(); - this._browser = browser; - - window.addEventListener('message', this._onWindowMessage.bind(this), false); - document.documentElement.addEventListener('mouseup', this._onMouseUp.bind(this), false); - document.documentElement.addEventListener('click', this._onClick.bind(this), false); - document.documentElement.addEventListener('auxclick', this._onClick.bind(this), false); - - this.initializeState(); - - this._frameEndpoint.signal(); - } - - onEscape() { - this.close(); - } - - async getDocumentTitle() { - try { - const targetFrameId = 0; - const {title} = await api.crossFrame.invoke(targetFrameId, 'getDocumentInformation'); - return title; - } catch (e) { - return ''; - } - } - - authenticateMessageData(data) { - if (!this._frameEndpoint.authenticate(data)) { - throw new Error('Invalid authentication'); - } - return data.data; - } - - close() { - this._invokeOwner('closePopup'); - } - - // Message handling - - _onWindowMessage(e) { - const data = e.data; - if (!this._frameEndpoint.authenticate(data)) { return; } - - const {action, params} = data.data; - const messageHandler = this._windowMessageHandlers.get(action); - if (typeof messageHandler === 'undefined') { return; } - - const callback = () => {}; // NOP - yomichan.invokeMessageHandler(messageHandler, params, callback); - } - - _onMessageExtensionUnloaded() { - if (yomichan.isExtensionUnloaded) { return; } - yomichan.triggerExtensionUnloaded(); - } - - // Private - - _onMouseUp(e) { - switch (e.button) { - case 3: // Back - if (this._history.hasPrevious()) { - e.preventDefault(); - } - break; - case 4: // Forward - if (this._history.hasNext()) { - e.preventDefault(); - } - break; - } - } - - _onClick(e) { - switch (e.button) { - case 3: // Back - if (this._history.hasPrevious()) { - e.preventDefault(); - this._history.back(); - } - break; - case 4: // Forward - if (this._history.hasNext()) { - e.preventDefault(); - this._history.forward(); - } - break; - } - } - - _copySelection() { - if (window.getSelection().toString()) { return false; } - this._copyHostSelection(); - return true; - } - - async _copyHostSelection() { - switch (this._browser) { - case 'firefox': - case 'firefox-mobile': - { - let text; - try { - text = await this._invokeOwner('getSelectionText'); - } catch (e) { - break; - } - this._copyText(text); - } - break; - default: - this._invokeOwner('copySelection'); - break; - } - } - - _copyText(text) { - const parent = document.body; - if (parent === null) { return; } - - let textarea = this._copyTextarea; - if (textarea === null) { - textarea = document.createElement('textarea'); - this._copyTextarea = textarea; - } - - textarea.value = text; - parent.appendChild(textarea); - textarea.select(); - document.execCommand('copy'); - parent.removeChild(textarea); - } - - _invokeOwner(action, params={}) { - return api.crossFrame.invoke(this.ownerFrameId, action, params); - } -} |