From fe875bbd99980b175fc366a2bfd4395be9cbad72 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Tue, 20 Feb 2024 10:13:57 -0500 Subject: Constructor simplification (#713) * Update AudioDownloader * Update Translator * Update ClipboardMonitor * Update ClipboardReader * Update PanelElement * Update QueryParser * Update DisplayGenerator * Update DisplayHistory * Update DOMDataBinder * Remove unnecessary cast * Update Popup types * One declaration per line * Remove optionals from Frontend constructor * Fix Translator constructor --- ext/js/app/popup-factory.js | 28 +++++++++++----------- ext/js/app/popup-proxy.js | 15 +++++------- ext/js/app/popup-window.js | 13 ++++------ ext/js/app/popup.js | 17 ++++++------- ext/js/background/backend.js | 22 +++++++---------- ext/js/background/offscreen.js | 14 +++++------ ext/js/comm/clipboard-monitor.js | 4 ++-- ext/js/comm/clipboard-reader.js | 7 +++--- ext/js/display/display-generator.js | 5 ++-- ext/js/display/display-history.js | 5 ++-- ext/js/display/display-profile-selection.js | 5 +--- ext/js/display/display.js | 23 ++++++------------ ext/js/display/query-parser.js | 6 +++-- ext/js/display/search-display-controller.js | 10 ++++---- ext/js/dom/dom-data-binder.js | 13 ++++++---- ext/js/dom/panel-element.js | 5 ++-- ext/js/dom/selector-observer.js | 9 ++++++- ext/js/language/translator.js | 5 ++-- ext/js/media/audio-downloader.js | 4 ++-- .../pages/settings/generic-setting-controller.js | 14 +++++------ ext/js/pages/settings/modal.js | 5 +--- ext/js/pages/settings/status-footer.js | 5 +--- 22 files changed, 108 insertions(+), 126 deletions(-) (limited to 'ext/js') diff --git a/ext/js/app/popup-factory.js b/ext/js/app/popup-factory.js index 4338bb3a..9cada2c8 100644 --- a/ext/js/app/popup-factory.js +++ b/ext/js/app/popup-factory.js @@ -120,12 +120,12 @@ export class PopupFactory { if (id === null) { id = generateId(16); } - const popup = new PopupWindow({ - application: this._application, + const popup = new PopupWindow( + this._application, id, depth, - frameId: currentFrameId - }); + currentFrameId + ); this._popups.set(id, popup); return popup; } else if (frameId === currentFrameId) { @@ -133,13 +133,13 @@ export class PopupFactory { if (id === null) { id = generateId(16); } - const popup = new Popup({ - application: this._application, + const popup = new Popup( + this._application, id, depth, - frameId: currentFrameId, + currentFrameId, childrenSupported - }); + ); if (parent !== null) { if (parent.child !== null) { throw new Error('Parent popup already has a child'); @@ -162,13 +162,13 @@ export class PopupFactory { childrenSupported }); id = info.id; - const popup = new PopupProxy({ - application: this._application, + const popup = new PopupProxy( + this._application, id, - depth: info.depth, - frameId: info.frameId, - frameOffsetForwarder: useFrameOffsetForwarder ? this._frameOffsetForwarder : null - }); + info.depth, + info.frameId, + useFrameOffsetForwarder ? this._frameOffsetForwarder : null + ); this._popups.set(id, popup); return popup; } diff --git a/ext/js/app/popup-proxy.js b/ext/js/app/popup-proxy.js index 910b2f06..40baf65b 100644 --- a/ext/js/app/popup-proxy.js +++ b/ext/js/app/popup-proxy.js @@ -26,16 +26,13 @@ import {log} from '../core/log.js'; */ export class PopupProxy extends EventDispatcher { /** - * Creates a new instance. - * @param {import('popup').PopupProxyConstructorDetails} details Details about how to set up the instance. + * @param {import('../application.js').Application} application The main application instance. + * @param {string} id The identifier of the popup. + * @param {number} depth The depth of the popup. + * @param {number} frameId The frameId of the host frame. + * @param {?import('../comm/frame-offset-forwarder.js').FrameOffsetForwarder} frameOffsetForwarder A `FrameOffsetForwarder` instance which is used to determine frame positioning. */ - constructor({ - application, - id, - depth, - frameId, - frameOffsetForwarder - }) { + constructor(application, id, depth, frameId, frameOffsetForwarder) { super(); /** @type {import('../application.js').Application} */ this._application = application; diff --git a/ext/js/app/popup-window.js b/ext/js/app/popup-window.js index 32c4d67b..01696676 100644 --- a/ext/js/app/popup-window.js +++ b/ext/js/app/popup-window.js @@ -24,15 +24,12 @@ import {EventDispatcher} from '../core/event-dispatcher.js'; */ export class PopupWindow extends EventDispatcher { /** - * Creates a new instance. - * @param {import('popup').PopupWindowConstructorDetails} details Details about how to set up the instance. + * @param {import('../application.js').Application} application The main application instance. + * @param {string} id The identifier of the popup. + * @param {number} depth The depth of the popup. + * @param {number} frameId The frameId of the host frame. */ - constructor({ - application, - id, - depth, - frameId - }) { + constructor(application, id, depth, frameId) { super(); /** @type {import('../application.js').Application} */ this._application = application; diff --git a/ext/js/app/popup.js b/ext/js/app/popup.js index 4caf8241..e9c37d00 100644 --- a/ext/js/app/popup.js +++ b/ext/js/app/popup.js @@ -32,16 +32,13 @@ import {ThemeController} from './theme-controller.js'; */ export class Popup extends EventDispatcher { /** - * Creates a new instance. - * @param {import('popup').PopupConstructorDetails} details The details used to construct the new instance. - */ - constructor({ - application, - id, - depth, - frameId, - childrenSupported - }) { + * @param {import('../application.js').Application} application The main application instance. + * @param {string} id The identifier of the popup. + * @param {number} depth The depth of the popup. + * @param {number} frameId The frameId of the host frame. + * @param {boolean} childrenSupported Whether or not the popup is able to show child popups. + */ + constructor(application, id, depth, frameId, childrenSupported) { super(); /** @type {import('../application.js').Application} */ this._application = application; diff --git a/ext/js/background/backend.js b/ext/js/background/backend.js index 8b0853d2..03c0b5fe 100644 --- a/ext/js/background/backend.js +++ b/ext/js/background/backend.js @@ -68,16 +68,14 @@ export class Backend { /** @type {DictionaryDatabase|DictionaryDatabaseProxy} */ this._dictionaryDatabase = new DictionaryDatabase(); /** @type {Translator|TranslatorProxy} */ - this._translator = new Translator({ - database: this._dictionaryDatabase - }); + this._translator = new Translator(this._dictionaryDatabase); /** @type {ClipboardReader|ClipboardReaderProxy} */ - this._clipboardReader = new ClipboardReader({ + this._clipboardReader = new ClipboardReader( // eslint-disable-next-line no-undef - document: (typeof document === 'object' && document !== null ? document : null), - pasteTargetSelector: '#clipboard-paste-target', - richContentPasteTargetSelector: '#clipboard-rich-content-paste-target' - }); + (typeof document === 'object' && document !== null ? document : null), + '#clipboard-paste-target', + '#clipboard-rich-content-paste-target' + ); } else { /** @type {?OffscreenProxy} */ this._offscreen = new OffscreenProxy(webExtension); @@ -90,9 +88,7 @@ export class Backend { } /** @type {ClipboardMonitor} */ - this._clipboardMonitor = new ClipboardMonitor({ - clipboardReader: this._clipboardReader - }); + this._clipboardMonitor = new ClipboardMonitor(this._clipboardReader); /** @type {?import('settings').Options} */ this._options = null; /** @type {import('../data/json-schema.js').JsonSchema[]} */ @@ -102,9 +98,7 @@ export class Backend { /** @type {RequestBuilder} */ this._requestBuilder = new RequestBuilder(); /** @type {AudioDownloader} */ - this._audioDownloader = new AudioDownloader({ - requestBuilder: this._requestBuilder - }); + this._audioDownloader = new AudioDownloader(this._requestBuilder); /** @type {OptionsUtil} */ this._optionsUtil = new OptionsUtil(); /** @type {AccessibilityController} */ diff --git a/ext/js/background/offscreen.js b/ext/js/background/offscreen.js index dbdb9773..3b8b6a3e 100644 --- a/ext/js/background/offscreen.js +++ b/ext/js/background/offscreen.js @@ -34,15 +34,13 @@ export class Offscreen { /** @type {DictionaryDatabase} */ this._dictionaryDatabase = new DictionaryDatabase(); /** @type {Translator} */ - this._translator = new Translator({ - database: this._dictionaryDatabase - }); + this._translator = new Translator(this._dictionaryDatabase); /** @type {ClipboardReader} */ - this._clipboardReader = new ClipboardReader({ - document: (typeof document === 'object' && document !== null ? document : null), - pasteTargetSelector: '#clipboard-paste-target', - richContentPasteTargetSelector: '#clipboard-rich-content-paste-target' - }); + this._clipboardReader = new ClipboardReader( + (typeof document === 'object' && document !== null ? document : null), + '#clipboard-paste-target', + '#clipboard-rich-content-paste-target' + ); /* eslint-disable @stylistic/no-multi-spaces */ diff --git a/ext/js/comm/clipboard-monitor.js b/ext/js/comm/clipboard-monitor.js index a7cd8833..d101b467 100644 --- a/ext/js/comm/clipboard-monitor.js +++ b/ext/js/comm/clipboard-monitor.js @@ -24,9 +24,9 @@ import {isStringPartiallyJapanese} from '../language/ja/japanese.js'; */ export class ClipboardMonitor extends EventDispatcher { /** - * @param {{clipboardReader: import('clipboard-monitor').ClipboardReaderLike}} details + * @param {import('clipboard-monitor').ClipboardReaderLike} clipboardReader */ - constructor({clipboardReader}) { + constructor(clipboardReader) { super(); /** @type {import('clipboard-monitor').ClipboardReaderLike} */ this._clipboardReader = clipboardReader; diff --git a/ext/js/comm/clipboard-reader.js b/ext/js/comm/clipboard-reader.js index b040d6ca..c09e9ff2 100644 --- a/ext/js/comm/clipboard-reader.js +++ b/ext/js/comm/clipboard-reader.js @@ -23,10 +23,11 @@ import {getFileExtensionFromImageMediaType} from '../media/media-util.js'; */ export class ClipboardReader { /** - * Creates a new instances of a clipboard reader. - * @param {{document: ?Document, pasteTargetSelector: ?string, richContentPasteTargetSelector: ?string}} details Details about how to set up the instance. + * @param {?Document} document + * @param {?string} pasteTargetSelector + * @param {?string} richContentPasteTargetSelector */ - constructor({document = null, pasteTargetSelector = null, richContentPasteTargetSelector = null}) { + constructor(document, pasteTargetSelector, richContentPasteTargetSelector) { /** @type {?Document} */ this._document = document; /** @type {?import('environment').Browser} */ diff --git a/ext/js/display/display-generator.js b/ext/js/display/display-generator.js index 65736759..22912e9f 100644 --- a/ext/js/display/display-generator.js +++ b/ext/js/display/display-generator.js @@ -26,9 +26,10 @@ import {StructuredContentGenerator} from './sandbox/structured-content-generator export class DisplayGenerator { /** - * @param {import('display').DisplayGeneratorConstructorDetails} details + * @param {import('./display-content-manager.js').DisplayContentManager} contentManager + * @param {?import('../input/hotkey-help-controller.js').HotkeyHelpController} hotkeyHelpController */ - constructor({contentManager, hotkeyHelpController = null}) { + constructor(contentManager, hotkeyHelpController) { /** @type {import('./display-content-manager.js').DisplayContentManager} */ this._contentManager = contentManager; /** @type {?import('../input/hotkey-help-controller.js').HotkeyHelpController} */ diff --git a/ext/js/display/display-history.js b/ext/js/display/display-history.js index 255a8536..67690219 100644 --- a/ext/js/display/display-history.js +++ b/ext/js/display/display-history.js @@ -24,9 +24,10 @@ import {generateId, isObject} from '../core/utilities.js'; */ export class DisplayHistory extends EventDispatcher { /** - * @param {{clearable?: boolean, useBrowserHistory?: boolean}} details + * @param {boolean} clearable + * @param {boolean} useBrowserHistory */ - constructor({clearable = true, useBrowserHistory = false}) { + constructor(clearable, useBrowserHistory) { super(); /** @type {boolean} */ this._clearable = clearable; diff --git a/ext/js/display/display-profile-selection.js b/ext/js/display/display-profile-selection.js index 0aa08b00..6fd25835 100644 --- a/ext/js/display/display-profile-selection.js +++ b/ext/js/display/display-profile-selection.js @@ -35,10 +35,7 @@ export class DisplayProfileSelection { /** @type {HTMLElement} */ const profilePanelElement = querySelectorNotNull(document, '#profile-panel'); /** @type {PanelElement} */ - this._profilePanel = new PanelElement({ - node: profilePanelElement, - closingAnimationDuration: 375 // Milliseconds; includes buffer - }); + this._profilePanel = new PanelElement(profilePanelElement, 375); // Milliseconds; includes buffer /** @type {boolean} */ this._profileListNeedsUpdate = false; /** @type {EventListenerCollection} */ diff --git a/ext/js/display/display.js b/ext/js/display/display.js index d0edd0bd..750e0d69 100644 --- a/ext/js/display/display.js +++ b/ext/js/display/display.js @@ -83,16 +83,13 @@ export class Display extends EventDispatcher { /** @type {HotkeyHelpController} */ this._hotkeyHelpController = new HotkeyHelpController(); /** @type {DisplayGenerator} */ - this._displayGenerator = new DisplayGenerator({ - contentManager: this._contentManager, - hotkeyHelpController: this._hotkeyHelpController - }); + this._displayGenerator = new DisplayGenerator(this._contentManager, this._hotkeyHelpController); /** @type {import('display').DirectApiMap} */ this._directApiMap = new Map(); /** @type {import('api-map').ApiMap} */ // import('display').WindowApiMap this._windowApiMap = new Map(); /** @type {DisplayHistory} */ - this._history = new DisplayHistory({clearable: true, useBrowserHistory: false}); + this._history = new DisplayHistory(true, false); /** @type {boolean} */ this._historyChangeIgnore = false; /** @type {boolean} */ @@ -126,11 +123,7 @@ export class Display extends EventDispatcher { /** @type {TextSourceGenerator} */ this._textSourceGenerator = new TextSourceGenerator(); /** @type {QueryParser} */ - this._queryParser = new QueryParser({ - api: application.api, - getSearchContext: this._getSearchContext.bind(this), - textSourceGenerator: this._textSourceGenerator - }); + this._queryParser = new QueryParser(application.api, this._textSourceGenerator, this._getSearchContext.bind(this)); /** @type {HTMLElement} */ this._contentScrollElement = querySelectorNotNull(document, '#content-scroll'); /** @type {HTMLElement} */ @@ -1712,8 +1705,7 @@ export class Display extends EventDispatcher { const popupFactory = new PopupFactory(this._application); popupFactory.prepare(); - /** @type {import('frontend').ConstructorDetails} */ - const setupNestedPopupsOptions = { + const frontend = new Frontend({ application: this._application, useProxyPopup, parentPopupId, @@ -1723,10 +1715,9 @@ export class Display extends EventDispatcher { pageType: this._pageType, allowRootFramePopupProxy: true, childrenSupported: this._childrenSupported, - hotkeyHandler: this._hotkeyHandler - }; - - const frontend = new Frontend(setupNestedPopupsOptions); + hotkeyHandler: this._hotkeyHandler, + canUseWindowPopup: true + }); this._frontend = frontend; await frontend.prepare(); } diff --git a/ext/js/display/query-parser.js b/ext/js/display/query-parser.js index 875d9d5a..d27b9394 100644 --- a/ext/js/display/query-parser.js +++ b/ext/js/display/query-parser.js @@ -27,9 +27,11 @@ import {TextScanner} from '../language/text-scanner.js'; */ export class QueryParser extends EventDispatcher { /** - * @param {import('display').QueryParserConstructorDetails} details + * @param {import('../comm/api.js').API} api + * @param {import('../dom/text-source-generator').TextSourceGenerator} textSourceGenerator + * @param {import('display').GetSearchContextCallback} getSearchContext */ - constructor({api, getSearchContext, textSourceGenerator}) { + constructor(api, textSourceGenerator, getSearchContext) { super(); /** @type {import('../comm/api.js').API} */ this._api = api; diff --git a/ext/js/display/search-display-controller.js b/ext/js/display/search-display-controller.js index d8126027..e23d5d50 100644 --- a/ext/js/display/search-display-controller.js +++ b/ext/js/display/search-display-controller.js @@ -63,12 +63,12 @@ export class SearchDisplayController { this._introAnimationTimer = null; /** @type {boolean} */ this._clipboardMonitorEnabled = false; + /** @type {import('clipboard-monitor').ClipboardReaderLike} */ + const clipboardReader = { + getText: this._display.application.api.clipboardGet.bind(this._display.application.api) + }; /** @type {ClipboardMonitor} */ - this._clipboardMonitor = new ClipboardMonitor({ - clipboardReader: { - getText: this._display.application.api.clipboardGet.bind(this._display.application.api) - } - }); + this._clipboardMonitor = new ClipboardMonitor(clipboardReader); /** @type {import('application').ApiMap} */ this._apiMap = createApiMap([ ['searchDisplayControllerGetMode', this._onMessageGetMode.bind(this)], diff --git a/ext/js/dom/dom-data-binder.js b/ext/js/dom/dom-data-binder.js index d33f1a2b..14b3b2cd 100644 --- a/ext/js/dom/dom-data-binder.js +++ b/ext/js/dom/dom-data-binder.js @@ -25,9 +25,14 @@ import {SelectorObserver} from './selector-observer.js'; */ export class DOMDataBinder { /** - * @param {import('dom-data-binder').ConstructorDetails} details + * @param {string} selector + * @param {import('dom-data-binder').CreateElementMetadataCallback} createElementMetadata + * @param {import('dom-data-binder').CompareElementMetadataCallback} compareElementMetadata + * @param {import('dom-data-binder').GetValuesCallback} getValues + * @param {import('dom-data-binder').SetValuesCallback} setValues + * @param {import('dom-data-binder').OnErrorCallback|null} [onError] */ - constructor({selector, createElementMetadata, compareElementMetadata, getValues, setValues, onError = null}) { + constructor(selector, createElementMetadata, compareElementMetadata, getValues, setValues, onError = null) { /** @type {string} */ this._selector = selector; /** @type {import('dom-data-binder').CreateElementMetadataCallback} */ @@ -45,14 +50,14 @@ export class DOMDataBinder { /** @type {TaskAccumulator, import('dom-data-binder').AssignTaskValue>} */ this._assignTasks = new TaskAccumulator(this._onBulkAssign.bind(this)); /** @type {SelectorObserver>} */ - this._selectorObserver = /** @type {SelectorObserver>} */ (new SelectorObserver({ + this._selectorObserver = new SelectorObserver({ selector, ignoreSelector: null, onAdded: this._createObserver.bind(this), onRemoved: this._removeObserver.bind(this), onChildrenUpdated: this._onObserverChildrenUpdated.bind(this), isStale: this._isObserverStale.bind(this) - })); + }); } /** diff --git a/ext/js/dom/panel-element.js b/ext/js/dom/panel-element.js index 0f2801e6..97b05599 100644 --- a/ext/js/dom/panel-element.js +++ b/ext/js/dom/panel-element.js @@ -23,9 +23,10 @@ import {EventDispatcher} from '../core/event-dispatcher.js'; */ export class PanelElement extends EventDispatcher { /** - * @param {import('panel-element').ConstructorDetails} details + * @param {HTMLElement} node + * @param {number} closingAnimationDuration */ - constructor({node, closingAnimationDuration}) { + constructor(node, closingAnimationDuration) { super(); /** @type {HTMLElement} */ this._node = node; diff --git a/ext/js/dom/selector-observer.js b/ext/js/dom/selector-observer.js index 86607130..032805e8 100644 --- a/ext/js/dom/selector-observer.js +++ b/ext/js/dom/selector-observer.js @@ -25,7 +25,14 @@ export class SelectorObserver { * Creates a new instance. * @param {import('selector-observer').ConstructorDetails} details The configuration for the object. */ - constructor({selector, ignoreSelector = null, onAdded = null, onRemoved = null, onChildrenUpdated = null, isStale = null}) { + constructor({ + selector, + ignoreSelector = null, + onAdded = null, + onRemoved = null, + onChildrenUpdated = null, + isStale = null + }) { /** @type {string} */ this._selector = selector; /** @type {?string} */ diff --git a/ext/js/language/translator.js b/ext/js/language/translator.js index 4f9304b5..568c12bd 100644 --- a/ext/js/language/translator.js +++ b/ext/js/language/translator.js @@ -27,10 +27,9 @@ import {getAllLanguageTextPreprocessors} from './languages.js'; */ export class Translator { /** - * Creates a new Translator instance. - * @param {import('translator').ConstructorDetails} details The details for the class. + * @param {import('../dictionary/dictionary-database.js').DictionaryDatabase} database */ - constructor({database}) { + constructor(database) { /** @type {import('../dictionary/dictionary-database.js').DictionaryDatabase} */ this._database = database; /** @type {LanguageTransformer} */ diff --git a/ext/js/media/audio-downloader.js b/ext/js/media/audio-downloader.js index b594db7f..d3bec75a 100644 --- a/ext/js/media/audio-downloader.js +++ b/ext/js/media/audio-downloader.js @@ -27,9 +27,9 @@ import {isStringEntirelyKana} from '../language/ja/japanese.js'; export class AudioDownloader { /** - * @param {{requestBuilder: RequestBuilder}} details + * @param {RequestBuilder} requestBuilder */ - constructor({requestBuilder}) { + constructor(requestBuilder) { /** @type {RequestBuilder} */ this._requestBuilder = requestBuilder; /** @type {?JsonSchema} */ diff --git a/ext/js/pages/settings/generic-setting-controller.js b/ext/js/pages/settings/generic-setting-controller.js index 54d87f8d..812520e4 100644 --- a/ext/js/pages/settings/generic-setting-controller.js +++ b/ext/js/pages/settings/generic-setting-controller.js @@ -31,13 +31,13 @@ export class GenericSettingController { /** @type {import('settings-modifications').OptionsScopeType} */ this._defaultScope = 'profile'; /** @type {DOMDataBinder} */ - this._dataBinder = new DOMDataBinder({ - selector: '[data-setting]', - createElementMetadata: this._createElementMetadata.bind(this), - compareElementMetadata: this._compareElementMetadata.bind(this), - getValues: this._getValues.bind(this), - setValues: this._setValues.bind(this) - }); + this._dataBinder = new DOMDataBinder( + '[data-setting]', + this._createElementMetadata.bind(this), + this._compareElementMetadata.bind(this), + this._getValues.bind(this), + this._setValues.bind(this) + ); /** @type {Map} */ this._transforms = new Map(/** @type {[key: import('generic-setting-controller').TransformType, value: import('generic-setting-controller').TransformFunction][]} */ ([ ['setAttribute', this._setAttribute.bind(this)], diff --git a/ext/js/pages/settings/modal.js b/ext/js/pages/settings/modal.js index 7e20dcb4..1eee00d7 100644 --- a/ext/js/pages/settings/modal.js +++ b/ext/js/pages/settings/modal.js @@ -23,10 +23,7 @@ export class Modal extends PanelElement { * @param {HTMLElement} node */ constructor(node) { - super({ - node, - closingAnimationDuration: 375 // Milliseconds; includes buffer - }); + super(node, 375); // Milliseconds; includes buffer /** @type {?Element} */ this._contentNode = null; /** @type {boolean} */ diff --git a/ext/js/pages/settings/status-footer.js b/ext/js/pages/settings/status-footer.js index 786e1d55..420dd044 100644 --- a/ext/js/pages/settings/status-footer.js +++ b/ext/js/pages/settings/status-footer.js @@ -24,10 +24,7 @@ export class StatusFooter extends PanelElement { * @param {HTMLElement} node */ constructor(node) { - super({ - node, - closingAnimationDuration: 375 // Milliseconds; includes buffer - }); + super(node, 375); // Milliseconds; includes buffer /** @type {HTMLElement} */ this._body = querySelectorNotNull(node, '.status-footer'); } -- cgit v1.2.3