diff options
author | toasted-nutbread <toasted-nutbread@users.noreply.github.com> | 2023-12-28 22:17:38 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-29 03:17:38 +0000 |
commit | 1e254fd1d4423b984e176547ef36a14383bbd7f5 (patch) | |
tree | 8aae2c47f80265d5f1f39c927e19455ec3986387 /ext/js/pages | |
parent | a51ae1533c54162f14785652e9128f90afb86aed (diff) |
Event dispatcher refactor (#463)
* Refactor EventDispatcher template type
* Update core types
* Update log
* Update clipboard monitor
* Update application events
* Update popup events
* Update text scanner
* Update cross frame API
* Update display events
* Type updates
* Update display history
* Update query parser
* Update search persistent state controller
* Update panel element
* Update popup menu
* Update audio system
* Update hotkey handler
* Update settings controller
* Update audio controller
* Update types
* Update types
* Update types
* Add event handler types
* Update type
* Fix issues
* Remove error suppression
* Fix typo
Diffstat (limited to 'ext/js/pages')
25 files changed, 56 insertions, 67 deletions
diff --git a/ext/js/pages/settings/anki-controller.js b/ext/js/pages/settings/anki-controller.js index aea94b65..d64034a5 100644 --- a/ext/js/pages/settings/anki-controller.js +++ b/ext/js/pages/settings/anki-controller.js @@ -221,7 +221,7 @@ export class AnkiController { } /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ async _onOptionsChanged({options: {anki}}) { /** @type {?string} */ @@ -964,7 +964,7 @@ class AnkiCardController { } /** - * @param {import('settings-controller').PermissionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'permissionsChanged'>} details */ _onPermissionsChanged({permissions: {permissions}}) { const permissionsSet = new Set(permissions); diff --git a/ext/js/pages/settings/anki-templates-controller.js b/ext/js/pages/settings/anki-templates-controller.js index ac0cc9c2..56e992b0 100644 --- a/ext/js/pages/settings/anki-templates-controller.js +++ b/ext/js/pages/settings/anki-templates-controller.js @@ -94,7 +94,7 @@ export class AnkiTemplatesController { // Private /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { let templates = options.anki.fieldTemplates; diff --git a/ext/js/pages/settings/audio-controller.js b/ext/js/pages/settings/audio-controller.js index af05ee70..2b46455f 100644 --- a/ext/js/pages/settings/audio-controller.js +++ b/ext/js/pages/settings/audio-controller.js @@ -21,7 +21,7 @@ import {querySelectorNotNull} from '../../dom/query-selector.js'; import {AudioSystem} from '../../media/audio-system.js'; /** - * @augments EventDispatcher<import('audio-controller').EventType> + * @augments EventDispatcher<import('audio-controller').Events> */ export class AudioController extends EventDispatcher { /** @@ -117,7 +117,7 @@ export class AudioController extends EventDispatcher { // Private /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { for (const entry of this._audioSourceEntries) { @@ -163,7 +163,7 @@ export class AudioController extends EventDispatcher { ); voices.sort(this._textToSpeechVoiceCompare.bind(this)); this._voices = voices; - this.trigger('voicesUpdated'); + this.trigger('voicesUpdated', {}); } /** diff --git a/ext/js/pages/settings/backup-controller.js b/ext/js/pages/settings/backup-controller.js index c0e56e96..2ae52925 100644 --- a/ext/js/pages/settings/backup-controller.js +++ b/ext/js/pages/settings/backup-controller.js @@ -290,7 +290,7 @@ export class BackupController { modal.setVisible(false); }; /** - * @param {import('panel-element').VisibilityChangedEvent} details + * @param {import('panel-element').EventArgument<'visibilityChanged'>} details */ const onModalVisibilityChanged = ({visible}) => { if (visible) { return; } @@ -644,7 +644,7 @@ export class BackupController { await yomitan.api.purgeDatabase(); await Dexie.import(file, {progressCallback: this._databaseImportProgressCallback}); yomitan.api.triggerDatabaseUpdated('dictionary', 'import'); - yomitan.trigger('storageChanged'); + yomitan.triggerStorageChanged(); } /** */ diff --git a/ext/js/pages/settings/collapsible-dictionary-controller.js b/ext/js/pages/settings/collapsible-dictionary-controller.js index cff3ad20..341522cf 100644 --- a/ext/js/pages/settings/collapsible-dictionary-controller.js +++ b/ext/js/pages/settings/collapsible-dictionary-controller.js @@ -70,7 +70,7 @@ export class CollapsibleDictionaryController { } /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { this._eventListeners.removeAllEventListeners(); diff --git a/ext/js/pages/settings/dictionary-controller.js b/ext/js/pages/settings/dictionary-controller.js index db6a73d4..0132fe9e 100644 --- a/ext/js/pages/settings/dictionary-controller.js +++ b/ext/js/pages/settings/dictionary-controller.js @@ -473,7 +473,7 @@ export class DictionaryController { value: dictionaries }]); - /** @type {import('settings-controller').DictionarySettingsReorderedEvent} */ + /** @type {import('settings-controller').EventArgument<'dictionarySettingsReordered'>} */ const event = {source: this}; this._settingsController.trigger('dictionarySettingsReordered', event); @@ -577,7 +577,7 @@ export class DictionaryController { // Private /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { this._updateDictionariesEnabledWarnings(options); @@ -930,7 +930,7 @@ export class DictionaryController { /** */ _triggerStorageChanged() { - yomitan.trigger('storageChanged'); + yomitan.triggerStorageChanged(); } /** */ diff --git a/ext/js/pages/settings/dictionary-import-controller.js b/ext/js/pages/settings/dictionary-import-controller.js index 79a62d32..eadfcb91 100644 --- a/ext/js/pages/settings/dictionary-import-controller.js +++ b/ext/js/pages/settings/dictionary-import-controller.js @@ -398,6 +398,6 @@ export class DictionaryImportController { /** */ _triggerStorageChanged() { - yomitan.trigger('storageChanged'); + yomitan.triggerStorageChanged(); } } diff --git a/ext/js/pages/settings/extension-keyboard-shortcuts-controller.js b/ext/js/pages/settings/extension-keyboard-shortcuts-controller.js index e92d9e93..e3d84ac2 100644 --- a/ext/js/pages/settings/extension-keyboard-shortcuts-controller.js +++ b/ext/js/pages/settings/extension-keyboard-shortcuts-controller.js @@ -313,7 +313,7 @@ class ExtensionKeyboardShortcutHotkeyEntry { // Private /** - * @param {import('keyboard-mouse-input-field').ChangeEvent} e + * @param {import('keyboard-mouse-input-field').EventArgument<'change'>} e */ _onInputFieldChange(e) { const {key, modifiers} = e; diff --git a/ext/js/pages/settings/keyboard-mouse-input-field.js b/ext/js/pages/settings/keyboard-mouse-input-field.js index f50ca112..0628d065 100644 --- a/ext/js/pages/settings/keyboard-mouse-input-field.js +++ b/ext/js/pages/settings/keyboard-mouse-input-field.js @@ -21,7 +21,7 @@ import {DocumentUtil} from '../../dom/document-util.js'; import {HotkeyUtil} from '../../input/hotkey-util.js'; /** - * @augments EventDispatcher<import('keyboard-mouse-input-field').EventType> + * @augments EventDispatcher<import('keyboard-mouse-input-field').Events> */ export class KeyboardMouseInputField extends EventDispatcher { /** @@ -308,9 +308,7 @@ export class KeyboardMouseInputField extends EventDispatcher { this._updateDisplayString(); if (changed) { - /** @type {import('keyboard-mouse-input-field').ChangeEvent} */ - const event = {modifiers: this._modifiers, key: this._key}; - this.trigger('change', event); + this.trigger('change', {modifiers: this._modifiers, key: this._key}); } } diff --git a/ext/js/pages/settings/keyboard-shortcuts-controller.js b/ext/js/pages/settings/keyboard-shortcuts-controller.js index cbdae77d..b45c656a 100644 --- a/ext/js/pages/settings/keyboard-shortcuts-controller.js +++ b/ext/js/pages/settings/keyboard-shortcuts-controller.js @@ -160,7 +160,7 @@ export class KeyboardShortcutController { // Private /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { for (const entry of this._entries) { @@ -395,7 +395,7 @@ class KeyboardShortcutHotkeyEntry { } /** - * @param {import('keyboard-mouse-input-field').ChangeEvent} details + * @param {import('keyboard-mouse-input-field').EventArgument<'change'>} details */ _onInputFieldChange({key, modifiers}) { /** @type {import('input').ModifierKey[]} */ diff --git a/ext/js/pages/settings/nested-popups-controller.js b/ext/js/pages/settings/nested-popups-controller.js index 7eb78148..4f0aa761 100644 --- a/ext/js/pages/settings/nested-popups-controller.js +++ b/ext/js/pages/settings/nested-popups-controller.js @@ -50,7 +50,7 @@ export class NestedPopupsController { // Private /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { this._updatePopupNestingMaxDepth(options.scanning.popupNestingMaxDepth); diff --git a/ext/js/pages/settings/permissions-origin-controller.js b/ext/js/pages/settings/permissions-origin-controller.js index 6dacced8..3a9db602 100644 --- a/ext/js/pages/settings/permissions-origin-controller.js +++ b/ext/js/pages/settings/permissions-origin-controller.js @@ -60,7 +60,7 @@ export class PermissionsOriginController { // Private /** - * @param {import('settings-controller').PermissionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'permissionsChanged'>} details */ _onPermissionsChanged({permissions}) { this._eventListeners.removeAllEventListeners(); diff --git a/ext/js/pages/settings/permissions-toggle-controller.js b/ext/js/pages/settings/permissions-toggle-controller.js index 85752a7e..055ce1f4 100644 --- a/ext/js/pages/settings/permissions-toggle-controller.js +++ b/ext/js/pages/settings/permissions-toggle-controller.js @@ -47,7 +47,7 @@ export class PermissionsToggleController { // Private /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { let accessor = null; @@ -104,7 +104,7 @@ export class PermissionsToggleController { } /** - * @param {import('settings-controller').PermissionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'permissionsChanged'>} details */ _onPermissionsChanged({permissions}) { const permissions2 = permissions.permissions; diff --git a/ext/js/pages/settings/persistent-storage-controller.js b/ext/js/pages/settings/persistent-storage-controller.js index 7386edd7..70c9a177 100644 --- a/ext/js/pages/settings/persistent-storage-controller.js +++ b/ext/js/pages/settings/persistent-storage-controller.js @@ -82,7 +82,7 @@ export class PersistentStorageController { const node = document.querySelector('#storage-persistent-fail-warning'); if (node !== null) { node.hidden = isStoragePeristent; } - yomitan.trigger('storageChanged'); + yomitan.triggerStorageChanged(); } /** diff --git a/ext/js/pages/settings/popup-preview-frame.js b/ext/js/pages/settings/popup-preview-frame.js index 7828a025..609710ba 100644 --- a/ext/js/pages/settings/popup-preview-frame.js +++ b/ext/js/pages/settings/popup-preview-frame.js @@ -140,7 +140,7 @@ export class PopupPreviewFrame { } /** - * @param {import('popup').CustomOuterCssChangedEvent} details + * @param {import('popup').EventArgument<'customOuterCssChanged'>} details */ _onCustomOuterCssChanged({node, inShadow}) { if (node === null || inShadow) { return; } diff --git a/ext/js/pages/settings/profile-conditions-ui.js b/ext/js/pages/settings/profile-conditions-ui.js index 29e7460f..22e47a9b 100644 --- a/ext/js/pages/settings/profile-conditions-ui.js +++ b/ext/js/pages/settings/profile-conditions-ui.js @@ -22,7 +22,7 @@ import {querySelectorNotNull} from '../../dom/query-selector.js'; import {KeyboardMouseInputField} from './keyboard-mouse-input-field.js'; /** - * @augments EventDispatcher<import('profile-conditions-ui').EventType> + * @augments EventDispatcher<import('profile-conditions-ui').Events> */ export class ProfileConditionsUI extends EventDispatcher { /** @@ -440,9 +440,7 @@ export class ProfileConditionsUI extends EventDispatcher { * @param {number} count */ _triggerConditionGroupCountChanged(count) { - /** @type {import('profile-conditions-ui').ConditionGroupCountChangedEvent} */ - const event = {count, profileIndex: this._profileIndex}; - this.trigger('conditionGroupCountChanged', event); + this.trigger('conditionGroupCountChanged', {count, profileIndex: this._profileIndex}); } } @@ -747,7 +745,7 @@ class ProfileConditionUI { /** * @param {import('profile-conditions-ui').InputData} details - * @param {import('keyboard-mouse-input-field').ChangeEvent} event + * @param {import('keyboard-mouse-input-field').EventArgument<'change'>} event */ _onModifierInputChange({validate, normalize}, event) { const modifiers = this._joinModifiers(event.modifiers); @@ -863,10 +861,6 @@ class ProfileConditionUI { let inputValue = value; let inputStep = null; let showMouseButton = false; - /** @type {import('event-listener-collection').AddEventListenerArgs[]} */ - const events1 = []; - /** @type {import('event-listener-collection').OnArgs[]} */ - const events2 = []; /** @type {import('profile-conditions-ui').InputData} */ const inputData = {validate, normalize}; const node = this._valueInput; @@ -875,7 +869,6 @@ class ProfileConditionUI { case 'integer': inputType = 'number'; inputStep = '1'; - events1.push([node, 'change', this._onValueInputChange.bind(this, inputData), false]); break; case 'modifierKeys': case 'modifierInputs': @@ -883,10 +876,6 @@ class ProfileConditionUI { showMouseButton = (type === 'modifierInputs'); this._kbmInputField = this._parent.parent.createKeyboardMouseInputField(node, this._mouseButton); this._kbmInputField.prepare(null, this._splitModifiers(value), showMouseButton, false); - events2.push([this._kbmInputField, 'change', this._onModifierInputChange.bind(this, inputData)]); - break; - default: // 'string' - events1.push([node, 'change', this._onValueInputChange.bind(this, inputData), false]); break; } @@ -902,11 +891,17 @@ class ProfileConditionUI { node.removeAttribute('step'); } this._mouseButtonContainer.hidden = !showMouseButton; - for (const args of events1) { - this._inputEventListeners.addEventListener(...args); - } - for (const args of events2) { - this._inputEventListeners.on(...args); + + switch (type) { + case 'modifierKeys': + case 'modifierInputs': + if (this._kbmInputField !== null) { + this._inputEventListeners.on(this._kbmInputField, 'change', this._onModifierInputChange.bind(this, inputData)); + } + break; + default: // 'integer', 'string' + this._inputEventListeners.addEventListener(node, 'change', this._onValueInputChange.bind(this, inputData), false); + break; } return this._validateValue(value, validate); diff --git a/ext/js/pages/settings/profile-controller.js b/ext/js/pages/settings/profile-controller.js index c54bfe73..54a41058 100644 --- a/ext/js/pages/settings/profile-controller.js +++ b/ext/js/pages/settings/profile-controller.js @@ -475,7 +475,7 @@ export class ProfileController { } /** - * @param {import('profile-conditions-ui').ConditionGroupCountChangedEvent} details + * @param {import('profile-conditions-ui').EventArgument<'conditionGroupCountChanged'>} details */ _onConditionGroupCountChanged({count, profileIndex}) { if (profileIndex >= 0 && profileIndex < this._profileEntryList.length) { diff --git a/ext/js/pages/settings/recommended-permissions-controller.js b/ext/js/pages/settings/recommended-permissions-controller.js index b19311aa..a870de50 100644 --- a/ext/js/pages/settings/recommended-permissions-controller.js +++ b/ext/js/pages/settings/recommended-permissions-controller.js @@ -48,7 +48,7 @@ export class RecommendedPermissionsController { // Private /** - * @param {import('settings-controller').PermissionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'permissionsChanged'>} details */ _onPermissionsChanged({permissions}) { this._eventListeners.removeAllEventListeners(); diff --git a/ext/js/pages/settings/scan-inputs-controller.js b/ext/js/pages/settings/scan-inputs-controller.js index eb526863..4854c28f 100644 --- a/ext/js/pages/settings/scan-inputs-controller.js +++ b/ext/js/pages/settings/scan-inputs-controller.js @@ -110,7 +110,7 @@ export class ScanInputsController { // Private /** - * @param {import('settings-controller').ScanInputsChangedEvent} details + * @param {import('settings-controller').EventArgument<'scanInputsChanged'>} details */ _onScanInputsChanged({source}) { if (source === this) { return; } @@ -118,7 +118,7 @@ export class ScanInputsController { } /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { const {inputs} = options.scanning; @@ -190,7 +190,7 @@ export class ScanInputsController { /** */ _triggerScanInputsChanged() { - /** @type {import('settings-controller').ScanInputsChangedEvent} */ + /** @type {import('settings-controller').EventArgument<'scanInputsChanged'>} */ const event = {source: this}; this._settingsController.trigger('scanInputsChanged', event); } @@ -312,7 +312,7 @@ class ScanInputField { // Private /** - * @param {import('keyboard-mouse-input-field').ChangeEvent} details + * @param {import('keyboard-mouse-input-field').EventArgument<'change'>} details */ _onIncludeValueChange({modifiers}) { const modifiers2 = this._joinModifiers(modifiers); @@ -320,7 +320,7 @@ class ScanInputField { } /** - * @param {import('keyboard-mouse-input-field').ChangeEvent} details + * @param {import('keyboard-mouse-input-field').EventArgument<'change'>} details */ _onExcludeValueChange({modifiers}) { const modifiers2 = this._joinModifiers(modifiers); diff --git a/ext/js/pages/settings/scan-inputs-simple-controller.js b/ext/js/pages/settings/scan-inputs-simple-controller.js index ddb68825..f0255595 100644 --- a/ext/js/pages/settings/scan-inputs-simple-controller.js +++ b/ext/js/pages/settings/scan-inputs-simple-controller.js @@ -67,7 +67,7 @@ export class ScanInputsSimpleController { // Private /** - * @param {import('settings-controller').ScanInputsChangedEvent} details + * @param {import('settings-controller').EventArgument<'scanInputsChanged'>} details */ _onScanInputsChanged({source}) { if (source === this) { return; } @@ -75,7 +75,7 @@ export class ScanInputsSimpleController { } /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { const {scanning: {inputs}} = options; @@ -236,7 +236,7 @@ export class ScanInputsSimpleController { */ async _modifyProfileSettings(targets) { await this._settingsController.modifyProfileSettings(targets); - /** @type {import('settings-controller').ScanInputsChangedEvent} */ + /** @type {import('settings-controller').EventArgument<'scanInputsChanged'>} */ const event = {source: this}; this._settingsController.trigger('scanInputsChanged', event); } diff --git a/ext/js/pages/settings/secondary-search-dictionary-controller.js b/ext/js/pages/settings/secondary-search-dictionary-controller.js index f24f6ea3..7f0882b8 100644 --- a/ext/js/pages/settings/secondary-search-dictionary-controller.js +++ b/ext/js/pages/settings/secondary-search-dictionary-controller.js @@ -66,7 +66,7 @@ export class SecondarySearchDictionaryController { } /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { this._eventListeners.removeAllEventListeners(); diff --git a/ext/js/pages/settings/sentence-termination-characters-controller.js b/ext/js/pages/settings/sentence-termination-characters-controller.js index 7fd90b28..f7793943 100644 --- a/ext/js/pages/settings/sentence-termination-characters-controller.js +++ b/ext/js/pages/settings/sentence-termination-characters-controller.js @@ -105,7 +105,7 @@ export class SentenceTerminationCharactersController { // Private /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { for (const entry of this._entries) { diff --git a/ext/js/pages/settings/settings-controller.js b/ext/js/pages/settings/settings-controller.js index 1b46c745..52b777a3 100644 --- a/ext/js/pages/settings/settings-controller.js +++ b/ext/js/pages/settings/settings-controller.js @@ -23,7 +23,7 @@ import {HtmlTemplateCollection} from '../../dom/html-template-collection.js'; import {yomitan} from '../../yomitan.js'; /** - * @augments EventDispatcher<import('settings-controller').EventType> + * @augments EventDispatcher<import('settings-controller').Events> */ export class SettingsController extends EventDispatcher { constructor() { @@ -234,7 +234,7 @@ export class SettingsController extends EventDispatcher { */ _setProfileIndex(value, canUpdateProfileIndex) { this._profileIndex = value; - this.trigger('optionsContextChanged'); + this.trigger('optionsContextChanged', {}); this._onOptionsUpdatedInternal(canUpdateProfileIndex); } @@ -253,9 +253,7 @@ export class SettingsController extends EventDispatcher { const optionsContext = this.getOptionsContext(); try { const options = await this.getOptions(); - /** @type {import('settings-controller').OptionsChangedEvent} */ - const event = {options, optionsContext}; - this.trigger('optionsChanged', event); + this.trigger('optionsChanged', {options, optionsContext}); } catch (e) { if (canUpdateProfileIndex) { this._setProfileIndex(0, false); @@ -339,9 +337,7 @@ export class SettingsController extends EventDispatcher { if (!this.hasListeners(eventName)) { return; } const permissions = await this._permissionsUtil.getAllPermissions(); - /** @type {import('settings-controller').PermissionsChangedEvent} */ - const event = {permissions}; - this.trigger(eventName, event); + this.trigger(eventName, {permissions}); } /** diff --git a/ext/js/pages/settings/sort-frequency-dictionary-controller.js b/ext/js/pages/settings/sort-frequency-dictionary-controller.js index 2c56f023..3fdd66c7 100644 --- a/ext/js/pages/settings/sort-frequency-dictionary-controller.js +++ b/ext/js/pages/settings/sort-frequency-dictionary-controller.js @@ -68,7 +68,7 @@ export class SortFrequencyDictionaryController { } /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { const {sortFrequencyDictionary, sortFrequencyDictionaryOrder} = options.general; diff --git a/ext/js/pages/settings/translation-text-replacements-controller.js b/ext/js/pages/settings/translation-text-replacements-controller.js index ebd1b58d..9f3fda00 100644 --- a/ext/js/pages/settings/translation-text-replacements-controller.js +++ b/ext/js/pages/settings/translation-text-replacements-controller.js @@ -110,7 +110,7 @@ export class TranslationTextReplacementsController { // Private /** - * @param {import('settings-controller').OptionsChangedEvent} details + * @param {import('settings-controller').EventArgument<'optionsChanged'>} details */ _onOptionsChanged({options}) { for (const entry of this._entries) { |