summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortoasted-nutbread <toasted-nutbread@users.noreply.github.com>2022-08-20 11:31:50 -0400
committerGitHub <noreply@github.com>2022-08-20 11:31:50 -0400
commit5c267f4bb772bb6c67576f2b40234a356c040550 (patch)
tree47ed99f483dcbb558f1976551cb511775a241001
parent9436928e3d89110d042e39067f5591c48e8500ea (diff)
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
-rw-r--r--ext/js/display/display.js18
-rw-r--r--ext/js/display/search-display-controller.js2
-rw-r--r--ext/js/pages/info-main.js2
-rw-r--r--ext/js/pages/permissions-main.js4
-rw-r--r--ext/js/pages/settings/profile-controller.js6
-rw-r--r--ext/js/pages/settings/settings-controller.js37
-rw-r--r--ext/js/pages/settings/settings-main.js6
-rw-r--r--ext/js/pages/welcome-main.js6
8 files changed, 47 insertions, 34 deletions
diff --git a/ext/js/display/display.js b/ext/js/display/display.js
index 923c9dd2..8905d304 100644
--- a/ext/js/display/display.js
+++ b/ext/js/display/display.js
@@ -178,7 +178,7 @@ class Display extends EventDispatcher {
['previousEntryDifferentDictionary', () => { this._focusEntryWithDifferentDictionary(-1, true); }]
]);
this.registerDirectMessageHandlers([
- ['Display.setOptionsContext', {async: false, handler: this._onMessageSetOptionsContext.bind(this)}],
+ ['Display.setOptionsContext', {async: true, handler: this._onMessageSetOptionsContext.bind(this)}],
['Display.setContent', {async: false, handler: this._onMessageSetContent.bind(this)}],
['Display.setCustomCss', {async: false, handler: this._onMessageSetCustomCss.bind(this)}],
['Display.setContentScale', {async: false, handler: this._onMessageSetContentScale.bind(this)}],
@@ -459,21 +459,25 @@ class Display extends EventDispatcher {
this._documentFocusController.blurElement(element);
}
- searchLast() {
+ searchLast(updateOptionsContext) {
const type = this._contentType;
if (type === 'clear') { return; }
const query = this._query;
+ const hasState = this._historyHasState();
const state = (
- this._historyHasState() ?
+ hasState ?
clone(this._history.state) :
{
focusEntry: 0,
- optionsContext: this._optionsContext,
+ optionsContext: null,
url: window.location.href,
sentence: {text: query, offset: 0},
documentTitle: document.title
}
);
+ if (!hasState || updateOptionsContext) {
+ state.optionsContext = clone(this._optionsContext);
+ }
const details = {
focus: false,
historyMode: 'clear',
@@ -551,9 +555,9 @@ class Display extends EventDispatcher {
invokeMessageHandler(messageHandler, params, callback);
}
- _onMessageSetOptionsContext({optionsContext}) {
- this.setOptionsContext(optionsContext);
- this.searchLast();
+ async _onMessageSetOptionsContext({optionsContext}) {
+ await this.setOptionsContext(optionsContext);
+ this.searchLast(true);
}
_onMessageSetContent({details}) {
diff --git a/ext/js/display/search-display-controller.js b/ext/js/display/search-display-controller.js
index cd35481d..6131e0db 100644
--- a/ext/js/display/search-display-controller.js
+++ b/ext/js/display/search-display-controller.js
@@ -135,7 +135,7 @@ class SearchDisplayController {
await this._display.updateOptions();
const query = this._queryInput.value;
if (query) {
- this._display.searchLast();
+ this._display.searchLast(false);
}
}
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();