diff options
| author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2022-05-28 21:57:25 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-28 21:57:25 -0400 | 
| commit | 0d82c52a7624d80ec48dc774fb23db5244bc14f9 (patch) | |
| tree | ce8f7c24250d24c2c4d1eae6c48dfe319de46d57 /ext/js | |
| parent | 4e4fa49b0b1fd6ec5a018e742eb9910aa32e7637 (diff) | |
HTML page script refactoring (#2162)
* Move some common functionality
* Move setupEnvironmentInfo into ExtensionContentController
* Move background/environment.js to extension/environment.js
Diffstat (limited to 'ext/js')
| -rw-r--r-- | ext/js/extension/environment.js (renamed from ext/js/background/environment.js) | 0 | ||||
| -rw-r--r-- | ext/js/pages/common/extension-content-controller.js | 131 | ||||
| -rw-r--r-- | ext/js/pages/generic-page-main.js | 11 | ||||
| -rw-r--r-- | ext/js/pages/permissions-main.js | 15 | ||||
| -rw-r--r-- | ext/js/pages/settings/settings-display-controller.js | 59 | ||||
| -rw-r--r-- | ext/js/pages/settings/settings-main.js | 20 | ||||
| -rw-r--r-- | ext/js/pages/welcome-main.js | 4 | 
7 files changed, 148 insertions, 92 deletions
| diff --git a/ext/js/background/environment.js b/ext/js/extension/environment.js index d9ca502c..d9ca502c 100644 --- a/ext/js/background/environment.js +++ b/ext/js/extension/environment.js diff --git a/ext/js/pages/common/extension-content-controller.js b/ext/js/pages/common/extension-content-controller.js new file mode 100644 index 00000000..12adf41b --- /dev/null +++ b/ext/js/pages/common/extension-content-controller.js @@ -0,0 +1,131 @@ +/* + * Copyright (C) 2022  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 + * Environment + */ + +class ExtensionContentController { +    prepare() { +        this._prepareSpecialUrls(); +        this._prepareExtensionIdExamples(); +        this._prepareEnvironmentInfo(); +    } + +    // Private + +    async _prepareEnvironmentInfo() { +        const {dataset} = document.documentElement; +        const {manifest_version: manifestVersion} = chrome.runtime.getManifest(); +        dataset.manifestVersion = `${manifestVersion}`; + +        const environment = new Environment(); +        await environment.prepare(); + +        const {browser, platform} = environment.getInfo(); +        dataset.browser = browser; +        dataset.os = platform.os; +    } + +    _prepareExtensionIdExamples() { +        const nodes = document.querySelectorAll('.extension-id-example'); +        let url = ''; +        try { +            url = chrome.runtime.getURL('/'); +        } catch (e) { +            // NOP +        } +        for (const node of nodes) { +            node.textContent = url; +        } +    } + +    _prepareSpecialUrls() { +        const nodes = document.querySelectorAll('[data-special-url]'); +        if (nodes.length === 0) { return; } + +        let extensionId = ''; +        try { +            extensionId = chrome.runtime.id; +        } catch (e) { +            // NOP +        } + +        const idPattern = /\{id\}/g; +        const onSpecialUrlLinkClick = this._onSpecialUrlLinkClick.bind(this); +        const onSpecialUrlLinkMouseDown = this._onSpecialUrlLinkMouseDown.bind(this); +        for (const node of nodes) { +            let {specialUrl} = node.dataset; +            if (typeof specialUrl !== 'string') { specialUrl = ''; } +            node.dataset.specialUrl = specialUrl.replace(idPattern, extensionId); +            node.addEventListener('click', onSpecialUrlLinkClick, false); +            node.addEventListener('auxclick', onSpecialUrlLinkClick, false); +            node.addEventListener('mousedown', onSpecialUrlLinkMouseDown, false); +        } +    } + +    _onSpecialUrlLinkClick(e) { +        switch (e.button) { +            case 0: +            case 1: +                e.preventDefault(); +                this._createTab(e.currentTarget.dataset.specialUrl, true); +                break; +        } +    } + +    _onSpecialUrlLinkMouseDown(e) { +        switch (e.button) { +            case 0: +            case 1: +                e.preventDefault(); +                break; +        } +    } + +    async _createTab(url, useOpener) { +        let openerTabId; +        if (useOpener) { +            try { +                const tab = await new Promise((resolve, reject) => { +                    chrome.tabs.getCurrent((result) => { +                        const e = chrome.runtime.lastError; +                        if (e) { +                            reject(new Error(e.message)); +                        } else { +                            resolve(result); +                        } +                    }); +                }); +                openerTabId = tab.id; +            } catch (e) { +                // NOP +            } +        } + +        return await new Promise((resolve, reject) => { +            chrome.tabs.create({url, openerTabId}, (tab2) => { +                const e = chrome.runtime.lastError; +                if (e) { +                    reject(new Error(e.message)); +                } else { +                    resolve(tab2); +                } +            }); +        }); +    } +} diff --git a/ext/js/pages/generic-page-main.js b/ext/js/pages/generic-page-main.js index cfb89609..bde7394b 100644 --- a/ext/js/pages/generic-page-main.js +++ b/ext/js/pages/generic-page-main.js @@ -17,16 +17,15 @@  /* global   * DocumentFocusController + * ExtensionContentController   */ -function setupEnvironmentInfo() { -    const {manifest_version: manifestVersion} = chrome.runtime.getManifest(); -    document.documentElement.dataset.manifestVersion = `${manifestVersion}`; -} -  (() => {      const documentFocusController = new DocumentFocusController();      documentFocusController.prepare(); + +    const extensionContentController = new ExtensionContentController(); +    extensionContentController.prepare(); +      document.documentElement.dataset.loaded = 'true'; -    setupEnvironmentInfo();  })(); diff --git a/ext/js/pages/permissions-main.js b/ext/js/pages/permissions-main.js index 718b77ae..df4b07ee 100644 --- a/ext/js/pages/permissions-main.js +++ b/ext/js/pages/permissions-main.js @@ -17,6 +17,7 @@  /* global   * DocumentFocusController + * ExtensionContentController   * ModalController   * PermissionsOriginController   * PermissionsToggleController @@ -66,18 +67,10 @@ function setupPermissionsToggles() {          const documentFocusController = new DocumentFocusController();          documentFocusController.prepare(); -        setupPermissionsToggles(); - -        for (const node of document.querySelectorAll('.extension-id-example')) { -            node.textContent = chrome.runtime.getURL('/'); -        } +        const extensionContentController = new ExtensionContentController(); +        extensionContentController.prepare(); -        const extensionId = chrome.runtime.id; -        const idPattern = /\{id\}/g; -        for (const node of document.querySelectorAll('.extension-settings-link[data-special-url]')) { -            const {specialUrl} = node.dataset; -            node.dataset.specialUrl = `${specialUrl}`.replace(idPattern, extensionId); -        } +        setupPermissionsToggles();          await yomichan.prepare(); diff --git a/ext/js/pages/settings/settings-display-controller.js b/ext/js/pages/settings/settings-display-controller.js index 783d5bec..1b70843f 100644 --- a/ext/js/pages/settings/settings-display-controller.js +++ b/ext/js/pages/settings/settings-display-controller.js @@ -55,14 +55,6 @@ class SettingsDisplayController {              node.addEventListener('keydown', onInputTabActionKeyDown, false);          } -        const onSpecialUrlLinkClick = this._onSpecialUrlLinkClick.bind(this); -        const onSpecialUrlLinkMouseDown = this._onSpecialUrlLinkMouseDown.bind(this); -        for (const node of document.querySelectorAll('[data-special-url]')) { -            node.addEventListener('click', onSpecialUrlLinkClick, false); -            node.addEventListener('auxclick', onSpecialUrlLinkClick, false); -            node.addEventListener('mousedown', onSpecialUrlLinkMouseDown, false); -        } -          for (const node of document.querySelectorAll('.defer-load-iframe')) {              this._setupDeferLoadIframe(node);          } @@ -229,57 +221,6 @@ class SettingsDisplayController {          }      } -    _onSpecialUrlLinkClick(e) { -        switch (e.button) { -            case 0: -            case 1: -                e.preventDefault(); -                this._createTab(e.currentTarget.dataset.specialUrl, true); -                break; -        } -    } - -    _onSpecialUrlLinkMouseDown(e) { -        switch (e.button) { -            case 0: -            case 1: -                e.preventDefault(); -                break; -        } -    } - -    async _createTab(url, useOpener) { -        let openerTabId; -        if (useOpener) { -            try { -                const tab = await new Promise((resolve, reject) => { -                    chrome.tabs.getCurrent((result) => { -                        const e = chrome.runtime.lastError; -                        if (e) { -                            reject(new Error(e.message)); -                        } else { -                            resolve(result); -                        } -                    }); -                }); -                openerTabId = tab.id; -            } catch (e) { -                // NOP -            } -        } - -        return await new Promise((resolve, reject) => { -            chrome.tabs.create({url, openerTabId}, (tab2) => { -                const e = chrome.runtime.lastError; -                if (e) { -                    reject(new Error(e.message)); -                } else { -                    resolve(tab2); -                } -            }); -        }); -    } -      _updateScrollTarget() {          const hash = window.location.hash;          if (!hash.startsWith('#!')) { return; } diff --git a/ext/js/pages/settings/settings-main.js b/ext/js/pages/settings/settings-main.js index 5aab25f7..a3dcf357 100644 --- a/ext/js/pages/settings/settings-main.js +++ b/ext/js/pages/settings/settings-main.js @@ -24,7 +24,7 @@   * DictionaryController   * DictionaryImportController   * DocumentFocusController - * Environment + * ExtensionContentController   * ExtensionKeyboardShortcutController   * GenericSettingController   * KeyboardShortcutController @@ -48,19 +48,6 @@   * TranslationTextReplacementsController   */ -async function setupEnvironmentInfo() { -    const {dataset} = document.documentElement; -    const {manifest_version: manifestVersion} = chrome.runtime.getManifest(); -    dataset.manifestVersion = `${manifestVersion}`; - -    const environment = new Environment(); -    await environment.prepare(); -    const {browser, platform} = environment.getInfo(); - -    dataset.browser = browser; -    dataset.os = platform.os; -} -  async function setupGenericSettingsController(genericSettingController) {      await genericSettingController.prepare();      await genericSettingController.refresh(); @@ -71,11 +58,12 @@ async function setupGenericSettingsController(genericSettingController) {          const documentFocusController = new DocumentFocusController();          documentFocusController.prepare(); +        const extensionContentController = new ExtensionContentController(); +        extensionContentController.prepare(); +          const statusFooter = new StatusFooter(document.querySelector('.status-footer-container'));          statusFooter.prepare(); -        setupEnvironmentInfo(); -          let prepareTimer = setTimeout(() => {              prepareTimer = null;              document.documentElement.dataset.loadingStalled = 'true'; diff --git a/ext/js/pages/welcome-main.js b/ext/js/pages/welcome-main.js index c6c7911d..16ef7b52 100644 --- a/ext/js/pages/welcome-main.js +++ b/ext/js/pages/welcome-main.js @@ -19,6 +19,7 @@   * DictionaryController   * DictionaryImportController   * DocumentFocusController + * ExtensionContentController   * GenericSettingController   * ModalController   * ScanInputsSimpleController @@ -45,6 +46,9 @@ async function setupGenericSettingsController(genericSettingController) {          const documentFocusController = new DocumentFocusController();          documentFocusController.prepare(); +        const extensionContentController = new ExtensionContentController(); +        extensionContentController.prepare(); +          const statusFooter = new StatusFooter(document.querySelector('.status-footer-container'));          statusFooter.prepare(); |