From 5c267f4bb772bb6c67576f2b40234a356c040550 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sat, 20 Aug 2022 11:31:50 -0400 Subject: Profile index fixes (#2207) * Update settings controller to consistently initialize * Allow profile index to be reset if an error occurs * Update message handler to be async * Fix error when deleting the current profile --- ext/js/pages/info-main.js | 2 +- ext/js/pages/permissions-main.js | 4 +-- ext/js/pages/settings/profile-controller.js | 6 ++--- ext/js/pages/settings/settings-controller.js | 37 +++++++++++++++++++--------- ext/js/pages/settings/settings-main.js | 6 ++--- ext/js/pages/welcome-main.js | 6 ++--- 6 files changed, 35 insertions(+), 26 deletions(-) (limited to 'ext/js/pages') diff --git a/ext/js/pages/info-main.js b/ext/js/pages/info-main.js index 8e83b4e8..54e6ff45 100644 --- a/ext/js/pages/info-main.js +++ b/ext/js/pages/info-main.js @@ -111,7 +111,7 @@ function getOperatingSystemDisplayName(os) { })(); const settingsController = new SettingsController(); - settingsController.prepare(); + await settingsController.prepare(); const backupController = new BackupController(settingsController, null); await backupController.prepare(); diff --git a/ext/js/pages/permissions-main.js b/ext/js/pages/permissions-main.js index df4b07ee..acfecbad 100644 --- a/ext/js/pages/permissions-main.js +++ b/ext/js/pages/permissions-main.js @@ -93,8 +93,8 @@ function setupPermissionsToggles() { const modalController = new ModalController(); modalController.prepare(); - const settingsController = new SettingsController(0); - settingsController.prepare(); + const settingsController = new SettingsController(); + await settingsController.prepare(); const permissionsToggleController = new PermissionsToggleController(settingsController); permissionsToggleController.prepare(); diff --git a/ext/js/pages/settings/profile-controller.js b/ext/js/pages/settings/profile-controller.js index e31bc07e..018c9ec1 100644 --- a/ext/js/pages/settings/profile-controller.js +++ b/ext/js/pages/settings/profile-controller.js @@ -215,13 +215,13 @@ class ProfileController { this._updateProfileSelectOptions(); - // Modify settings - await this._settingsController.modifyGlobalSettings(modifications); - // Update profile index if (settingsProfileIndex === profileIndex) { this._settingsController.profileIndex = profileCurrentNew; } + + // Modify settings + await this._settingsController.modifyGlobalSettings(modifications); } async swapProfiles(index1, index2) { diff --git a/ext/js/pages/settings/settings-controller.js b/ext/js/pages/settings/settings-controller.js index b0180827..111b98e4 100644 --- a/ext/js/pages/settings/settings-controller.js +++ b/ext/js/pages/settings/settings-controller.js @@ -22,9 +22,9 @@ */ class SettingsController extends EventDispatcher { - constructor(profileIndex=0) { + constructor() { super(); - this._profileIndex = profileIndex; + this._profileIndex = 0; this._source = generateId(16); this._pageExitPreventions = new Set(); this._pageExitPreventionEventListeners = new EventListenerCollection(); @@ -42,23 +42,28 @@ class SettingsController extends EventDispatcher { set profileIndex(value) { if (this._profileIndex === value) { return; } - this._setProfileIndex(value); + this._setProfileIndex(value, true); } get permissionsUtil() { return this._permissionsUtil; } - prepare() { + async prepare() { yomichan.on('optionsUpdated', this._onOptionsUpdated.bind(this)); if (this._canObservePermissionsChanges()) { chrome.permissions.onAdded.addListener(this._onPermissionsChanged.bind(this)); chrome.permissions.onRemoved.addListener(this._onPermissionsChanged.bind(this)); } + const optionsFull = await this.getOptionsFull(); + const {profiles, profileCurrent} = optionsFull; + if (profileCurrent >= 0 && profileCurrent < profiles.length) { + this._profileIndex = profileCurrent; + } } async refresh() { - await this._onOptionsUpdatedInternal(); + await this._onOptionsUpdatedInternal(true); } async getOptions() { @@ -73,7 +78,7 @@ class SettingsController extends EventDispatcher { async setAllSettings(value) { const profileIndex = value.profileCurrent; await yomichan.api.setAllSettings(value, this._source); - this._setProfileIndex(profileIndex); + this._setProfileIndex(profileIndex, true); } async getSettings(targets) { @@ -143,21 +148,29 @@ class SettingsController extends EventDispatcher { // Private - _setProfileIndex(value) { + _setProfileIndex(value, canUpdateProfileIndex) { this._profileIndex = value; this.trigger('optionsContextChanged'); - this._onOptionsUpdatedInternal(); + this._onOptionsUpdatedInternal(canUpdateProfileIndex); } _onOptionsUpdated({source}) { if (source === this._source) { return; } - this._onOptionsUpdatedInternal(); + this._onOptionsUpdatedInternal(true); } - async _onOptionsUpdatedInternal() { + async _onOptionsUpdatedInternal(canUpdateProfileIndex) { const optionsContext = this.getOptionsContext(); - const options = await this.getOptions(); - this.trigger('optionsChanged', {options, optionsContext}); + try { + const options = await this.getOptions(); + this.trigger('optionsChanged', {options, optionsContext}); + } catch (e) { + if (canUpdateProfileIndex) { + this._setProfileIndex(0, false); + return; + } + throw e; + } } _setupTargets(targets, extraFields) { diff --git a/ext/js/pages/settings/settings-main.js b/ext/js/pages/settings/settings-main.js index a3dcf357..aa94ef46 100644 --- a/ext/js/pages/settings/settings-main.js +++ b/ext/js/pages/settings/settings-main.js @@ -77,15 +77,13 @@ async function setupGenericSettingsController(genericSettingController) { } delete document.documentElement.dataset.loadingStalled; - const optionsFull = await yomichan.api.optionsGetFull(); - const preparePromises = []; const modalController = new ModalController(); modalController.prepare(); - const settingsController = new SettingsController(optionsFull.profileCurrent); - settingsController.prepare(); + const settingsController = new SettingsController(); + await settingsController.prepare(); const persistentStorageController = new PersistentStorageController(); persistentStorageController.prepare(); diff --git a/ext/js/pages/welcome-main.js b/ext/js/pages/welcome-main.js index 16ef7b52..72eef995 100644 --- a/ext/js/pages/welcome-main.js +++ b/ext/js/pages/welcome-main.js @@ -56,15 +56,13 @@ async function setupGenericSettingsController(genericSettingController) { setupEnvironmentInfo(); - const optionsFull = await yomichan.api.optionsGetFull(); - const preparePromises = []; const modalController = new ModalController(); modalController.prepare(); - const settingsController = new SettingsController(optionsFull.profileCurrent); - settingsController.prepare(); + const settingsController = new SettingsController(); + await settingsController.prepare(); const dictionaryController = new DictionaryController(settingsController, modalController, statusFooter); dictionaryController.prepare(); -- cgit v1.2.3