From 4e23076ef8a8707ecdbc89a2add88b3340795bed Mon Sep 17 00:00:00 2001 From: pbaykalov <54845956+pbaykalov@users.noreply.github.com> Date: Wed, 21 Sep 2022 23:35:09 +0300 Subject: [PATCH 1/9] add proper window state handling, wip. did not touch the actual toggling yet --- uct-background.js | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/uct-background.js b/uct-background.js index 5e7baa7..b5ae9a5 100644 --- a/uct-background.js +++ b/uct-background.js @@ -24,7 +24,20 @@ this.defaultSettings = { settingsVersion: 1.1, allowMultiple: false, notifyMe: true - } + }, + per_window_toggles: new Map() +} + +async function windowCreated(window){ + let settings = await browser.storage.local.get(); + settings.per_window_toggles[window.id]=defaultSettings.toggles; + await updateSettings(settings); +} + +async function windowDestroyed(windowId){ + let settings = await browser.storage.local.get(); + settings.per_window_toggles.delete(window.id); + await updateSettings(settings); } @@ -41,6 +54,10 @@ async function main() { // Trigger on registered hotkeys browser.commands.onCommand.addListener(userToggle); + + // Proper window state handling + browser.windows.onCreated.addListener(windowCreated); + browser.windows.onRemoved.addListener(windowDestroyed); console.log('Init complete'); } @@ -195,4 +212,4 @@ async function userToggle(styleId, newState) { } -main(); \ No newline at end of file +main(); From e6c2ee807a621cc051ebf3cd09efb40905013d62 Mon Sep 17 00:00:00 2001 From: pbaykalov <54845956+pbaykalov@users.noreply.github.com> Date: Sat, 24 Sep 2022 12:43:55 +0300 Subject: [PATCH 2/9] store current windowId for popup --- uct-background.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/uct-background.js b/uct-background.js index b5ae9a5..49b5793 100644 --- a/uct-background.js +++ b/uct-background.js @@ -36,7 +36,13 @@ async function windowCreated(window){ async function windowDestroyed(windowId){ let settings = await browser.storage.local.get(); - settings.per_window_toggles.delete(window.id); + settings.per_window_toggles.delete(windowId); + await updateSettings(settings); +} + +async function windowFocusChanged(windowId){ + let settings = await browser.storage.local.get(); + settings.current_windowId=windowId; await updateSettings(settings); } @@ -58,6 +64,7 @@ async function main() { // Proper window state handling browser.windows.onCreated.addListener(windowCreated); browser.windows.onRemoved.addListener(windowDestroyed); + browser.windows.onFocusChanged.addListener(windowFocusChanged); console.log('Init complete'); } From ced7b710f477647ad0052de05d8359205256bcb7 Mon Sep 17 00:00:00 2001 From: pbaykalov <54845956+pbaykalov@users.noreply.github.com> Date: Sat, 24 Sep 2022 12:54:13 +0300 Subject: [PATCH 3/9] button status updated on each focus change not sure if "focusChanged" is fired on browser start btw. --- uct-background.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/uct-background.js b/uct-background.js index 49b5793..5176186 100644 --- a/uct-background.js +++ b/uct-background.js @@ -44,12 +44,12 @@ async function windowFocusChanged(windowId){ let settings = await browser.storage.local.get(); settings.current_windowId=windowId; await updateSettings(settings); + await updateButtonStatus(); } async function main() { await initializeSettings(); - await updateButtonStatus(); await updateTitlePrefixes(); // Always toggle style 1 on button click @@ -86,10 +86,10 @@ async function updateButtonStatus() { let settings = await browser.storage.local.get('toggles'); // Use reduce function on array to count all enabled toggles - let togglesEnabled = settings.toggles.reduce((count, toggle) => toggle.enabled ? count + 1 : count, 0); + let togglesEnabled = settings.per_window_toggles[settings.current_windowId].reduce((count, toggle) => toggle.enabled ? count + 1 : count, 0); if (togglesEnabled < 2) { - let toggle = settings.toggles[0]; + let toggle = (settings.per_window_toggles[settings.current_windowId])[0]; browser.browserAction.setTitle({ title: `Turn ${toggle.name} ` + (toggle.state ? 'off' : 'on') }); From 1ed798b67954f64aeed0949c015aaf977caca6b3 Mon Sep 17 00:00:00 2001 From: pbaykalov <54845956+pbaykalov@users.noreply.github.com> Date: Sat, 24 Sep 2022 13:12:22 +0300 Subject: [PATCH 4/9] all "background" code now uses per-window toggle handling. Default state is "off" for each browser restart. New window inherits toggles from last active window --- uct-background.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/uct-background.js b/uct-background.js index 5176186..f398e66 100644 --- a/uct-background.js +++ b/uct-background.js @@ -25,12 +25,13 @@ this.defaultSettings = { allowMultiple: false, notifyMe: true }, + //unused, written for for clarity. this is done in initializeSettings() per_window_toggles: new Map() } async function windowCreated(window){ let settings = await browser.storage.local.get(); - settings.per_window_toggles[window.id]=defaultSettings.toggles; + settings.per_window_toggles[window.id]=(settings.per_window_toggles[settings.current_windowId]); await updateSettings(settings); } @@ -110,11 +111,12 @@ async function updateButtonStatus() { async function getStyleSettings(styleId) { let settings = await browser.storage.local.get('toggles'); - return settings.toggles[styleId - 1].prefix; + return (settings.per_window_toggles[settings.current_windowId])[styleId - 1].prefix; } async function initializeSettings() { let settings = await browser.storage.local.get(); + settings.per_window_toggles=new Map(); if (settings.toggles) { console.log('Loading user settings', settings); settings = await updateSettings(settings); @@ -144,7 +146,7 @@ async function updateTitlePrefixes() { // Only change current window const windowId = await browser.windows.getCurrent(); const settings = await browser.storage.local.get(['toggles', 'general']); - const toggles = settings.toggles; + const toggles = (settings.per_window_toggles[settings.current_windowId]); let titlePrefix = ''; // Loop through all toggles @@ -172,17 +174,17 @@ async function userToggle(styleId, newState) { let hrState = 'off'; let toggle = { name: 'all styles' } - if (styleId && !settings.toggles[styleId[0] - 1].enabled) { - console.log('Style is disabled', settings.toggles[styleId[0] - 1]); + if (styleId && !(settings.per_window_toggles[settings.current_windowId])[styleId[0] - 1].enabled) { + console.log('Style is disabled', (settings.per_window_toggles[settings.current_windowId])[styleId[0] - 1]); return } // When only one option allowed or no valid style is selected, reset all others // Also do this when no valid style has been found if (!settings.general.allowMultiple || !styleId) { - for (let i = 0; i < settings.toggles.length; i++) { + for (let i = 0; i < (settings.per_window_toggles[settings.current_windowId]).length; i++) { if (!styleId || styleId[0] - 1 != i) - settings.toggles[i].state = false; + (settings.per_window_toggles[settings.current_windowId])[i].state = false; } } @@ -190,12 +192,12 @@ async function userToggle(styleId, newState) { if (styleId) { styleId = styleId[0]; // Invert toggle state or set requested state and save in settings - toggle = settings.toggles[styleId - 1]; + toggle = (settings.per_window_toggles[settings.current_windowId])[styleId - 1]; if (typeof(newState) == 'undefined') newState = !toggle.state; - settings.toggles[styleId - 1].state = newState; + (settings.per_window_toggles[settings.current_windowId])[styleId - 1].state = newState; if (newState) hrState = 'on'; From dd764b357164dfd02a9fbd7dd8404d3a3787bb90 Mon Sep 17 00:00:00 2001 From: pbaykalov <54845956+pbaykalov@users.noreply.github.com> Date: Sat, 24 Sep 2022 13:29:35 +0300 Subject: [PATCH 5/9] using state maintained by background script --- popup/popup.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/popup/popup.js b/popup/popup.js index 93f3999..d80daf9 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -9,7 +9,7 @@ async function documentLoaded() { const settings = await browser.storage.local.get(['toggles', 'general']); - const toggles = settings.toggles; + const toggles = settings.per_window_toggles[settings.current_windowId]; const type = settings.general.allowMultiple ? 'checkbox' : 'radio'; for (let i = 0; i < toggles.length; i++) { @@ -44,4 +44,4 @@ function addSelectRow(type, styleId, name) { document.getElementById('content').appendChild(container); } -document.addEventListener('DOMContentLoaded', documentLoaded); \ No newline at end of file +document.addEventListener('DOMContentLoaded', documentLoaded); From e1601b6ff7fb3791d90a4e2ca192ada5fbd71281 Mon Sep 17 00:00:00 2001 From: pbaykalov <54845956+pbaykalov@users.noreply.github.com> Date: Sat, 24 Sep 2022 13:32:19 +0300 Subject: [PATCH 6/9] first window after browser start defaults to "off" --- uct-background.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/uct-background.js b/uct-background.js index f398e66..5d784ee 100644 --- a/uct-background.js +++ b/uct-background.js @@ -31,7 +31,11 @@ this.defaultSettings = { async function windowCreated(window){ let settings = await browser.storage.local.get(); - settings.per_window_toggles[window.id]=(settings.per_window_toggles[settings.current_windowId]); + if(!settings.current_windowId===undefined){ + settings.per_window_toggles[window.id]=(settings.per_window_toggles[settings.current_windowId]); + } else { + settings.per_window_toggles[window.id]=defaultSettings.toggles; + } await updateSettings(settings); } From 2e87afb8b8728ae4fb0847ead23d4fdb4fc223b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=91=D1=82=D1=80?= Date: Mon, 10 Oct 2022 03:10:58 +0300 Subject: [PATCH 7/9] debugged --- options/options.js | 7 +++ popup/popup.js | 4 +- uct-background.js | 137 +++++++++++++++++++++++++++++---------------- 3 files changed, 98 insertions(+), 50 deletions(-) diff --git a/options/options.js b/options/options.js index b8e8639..5ea6350 100644 --- a/options/options.js +++ b/options/options.js @@ -89,6 +89,13 @@ async function saveChanges(prefixId) { console.log('Save', prefixId, settings); await browser.storage.local.set(settings); + settings.per_window_toggles.forEach( t => { + t.enabled = settings.toggles[prefixId - 1].enabled; + if(!settings.toggles[prefixId - 1].enabled){ + t.state = false; + } + }); + // Let the toolbar button reflect the changes browser.extension.getBackgroundPage().updateButtonStatus(); diff --git a/popup/popup.js b/popup/popup.js index d80daf9..4f4f0ea 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -8,8 +8,8 @@ async function documentLoaded() { }) - const settings = await browser.storage.local.get(['toggles', 'general']); - const toggles = settings.per_window_toggles[settings.current_windowId]; + const settings = await browser.storage.local.get(); + const toggles = settings.per_window_toggles.get((await browser.windows.getLastFocused()).id); const type = settings.general.allowMultiple ? 'checkbox' : 'radio'; for (let i = 0; i < toggles.length; i++) { diff --git a/uct-background.js b/uct-background.js index 5d784ee..651d2ad 100644 --- a/uct-background.js +++ b/uct-background.js @@ -29,27 +29,48 @@ this.defaultSettings = { per_window_toggles: new Map() } +this.lastWindowId=undefined; +this.secondToLastWindowId=undefined; + async function windowCreated(window){ + console.log(`Created: ${window.id}, last: ${lastWindowId}, secondLast: ${secondToLastWindowId}, current: ${(await browser.windows.getCurrent()).id}`); + let lastId=lastWindowId; + if(lastId===window.id){ + lastId=secondToLastWindowId; + } let settings = await browser.storage.local.get(); - if(!settings.current_windowId===undefined){ - settings.per_window_toggles[window.id]=(settings.per_window_toggles[settings.current_windowId]); + let pwt; + if(lastId!==undefined){ + pwt=settings.per_window_toggles.get(lastId); } else { - settings.per_window_toggles[window.id]=defaultSettings.toggles; + pwt=structuredClone(defaultSettings.toggles); } - await updateSettings(settings); + settings.per_window_toggles.set(window.id,pwt); + await browser.storage.local.set(settings); + await updateTitlePrefixes(); } async function windowDestroyed(windowId){ let settings = await browser.storage.local.get(); settings.per_window_toggles.delete(windowId); - await updateSettings(settings); + await browser.storage.local.set(settings); } async function windowFocusChanged(windowId){ - let settings = await browser.storage.local.get(); - settings.current_windowId=windowId; - await updateSettings(settings); - await updateButtonStatus(); + if(windowId===browser.windows.WINDOW_ID_NONE) return; + + let settings = await browser.storage.local.get(); + let toggles=settings.per_window_toggles.get(windowId); + + if(toggles===undefined){ + //if extension was just loaded for example + settings.per_window_toggles.set(windowId,structuredClone(defaultSettings.toggles)); + await browser.storage.local.set(settings); + } + + secondToLastWindowId=lastWindowId; + lastWindowId=windowId; + await updateButtonStatus(); } @@ -81,20 +102,19 @@ async function updateSettings(settings) { } settings.general.settingsVersion < defaultSettings.general.settingsVersion - await browser.storage.local.set(settings); } - return settings; } async function updateButtonStatus() { - let settings = await browser.storage.local.get('toggles'); + let settings = await browser.storage.local.get(); // Use reduce function on array to count all enabled toggles - let togglesEnabled = settings.per_window_toggles[settings.current_windowId].reduce((count, toggle) => toggle.enabled ? count + 1 : count, 0); + let togglesEnabled = settings.per_window_toggles.get((await browser.windows.getCurrent()).id) + .reduce((count, toggle) => toggle.enabled ? count + 1 : count, 0); if (togglesEnabled < 2) { - let toggle = (settings.per_window_toggles[settings.current_windowId])[0]; + let toggle = (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[0]; browser.browserAction.setTitle({ title: `Turn ${toggle.name} ` + (toggle.state ? 'off' : 'on') }); @@ -114,8 +134,8 @@ async function updateButtonStatus() { } async function getStyleSettings(styleId) { - let settings = await browser.storage.local.get('toggles'); - return (settings.per_window_toggles[settings.current_windowId])[styleId - 1].prefix; + let settings = await browser.storage.local.get(); + return (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[styleId - 1].prefix; } async function initializeSettings() { @@ -123,7 +143,7 @@ async function initializeSettings() { settings.per_window_toggles=new Map(); if (settings.toggles) { console.log('Loading user settings', settings); - settings = await updateSettings(settings); + await updateSettings(settings); } else { console.log('Initializing default settings', defaultSettings); @@ -132,7 +152,7 @@ async function initializeSettings() { // Open settings page for the user browser.runtime.openOptionsPage(); } - + await browser.storage.local.set(settings); } // Detect current window title prefix to allow toggling @@ -147,26 +167,28 @@ async function toggleTitlePrefix(windowId, titlePrefix) { // Update prefix for specified window async function updateTitlePrefixes() { - // Only change current window - const windowId = await browser.windows.getCurrent(); - const settings = await browser.storage.local.get(['toggles', 'general']); - const toggles = (settings.per_window_toggles[settings.current_windowId]); - let titlePrefix = ''; - - // Loop through all toggles - for (let i = 0; i < toggles.length; i++) { - if (toggles[i].state) { - titlePrefix += String(toggles[i].prefix); - - // When only one toggle may be active at once, stop after the first - if (!settings.general.allowMultiple) - break; - } - } - - browser.windows.update(windowId.id, { - titlePreface: titlePrefix - }); + let settings = await browser.storage.local.get(); + settings.per_window_toggles.forEach((toggles,windowId) => { + console.log(`updating: ${windowId} ${toggles}`); + let titlePrefix = ''; + + // Loop through all toggles + for (let i = 0; i < toggles.length; i++) { + if (toggles[i].state) { + titlePrefix += String(toggles[i].prefix); + + // When only one toggle may be active at once, stop after the first + if (!settings.general.allowMultiple){ + break; + } + } + } + + browser.windows.update(windowId, { + titlePreface: titlePrefix + }); + }); + await browser.storage.local.set(settings); } // Respond to button clicks and registered hotkeys @@ -174,21 +196,40 @@ async function userToggle(styleId, newState) { // Extract style number from end of string styleId = String(styleId).match(/[0-9]+$/); - let settings = await browser.storage.local.get(['toggles', 'general']); + let settings = await browser.storage.local.get(); let hrState = 'off'; let toggle = { name: 'all styles' } - if (styleId && !(settings.per_window_toggles[settings.current_windowId])[styleId[0] - 1].enabled) { - console.log('Style is disabled', (settings.per_window_toggles[settings.current_windowId])[styleId[0] - 1]); + if( + settings.per_window_toggles.get( + (await browser.windows.getCurrent()).id + )===undefined + ){ + settings.per_window_toggles.set( + (await browser.windows.getCurrent()).id, + structuredClone(defaultSettings.toggles) + ); + } + + if ( + styleId + && !( + settings.per_window_toggles.get( + (await browser.windows.getCurrent()).id + ) + )[styleId[0] - 1].enabled + ) { + console.log('Style is disabled', (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[styleId[0] - 1]); return } // When only one option allowed or no valid style is selected, reset all others // Also do this when no valid style has been found if (!settings.general.allowMultiple || !styleId) { - for (let i = 0; i < (settings.per_window_toggles[settings.current_windowId]).length; i++) { - if (!styleId || styleId[0] - 1 != i) - (settings.per_window_toggles[settings.current_windowId])[i].state = false; + for (let i = 0; i < (settings.per_window_toggles.get((await browser.windows.getCurrent()).id)).length; i++) { + if (!styleId || styleId[0] - 1 != i){ + (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[i].state = false; + } } } @@ -196,12 +237,12 @@ async function userToggle(styleId, newState) { if (styleId) { styleId = styleId[0]; // Invert toggle state or set requested state and save in settings - toggle = (settings.per_window_toggles[settings.current_windowId])[styleId - 1]; + toggle = (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[styleId - 1]; if (typeof(newState) == 'undefined') newState = !toggle.state; - (settings.per_window_toggles[settings.current_windowId])[styleId - 1].state = newState; + (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[styleId - 1].state = newState; if (newState) hrState = 'on'; @@ -220,8 +261,8 @@ async function userToggle(styleId, newState) { await browser.storage.local.set(settings); // Update title to reflect new truth - updateTitlePrefixes(); - updateButtonStatus(); + await updateTitlePrefixes(); + await updateButtonStatus(); } From ef0a3e4997965862e37e35549e4faa0ddb8207ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=91=D1=82=D1=80?= Date: Mon, 10 Oct 2022 03:48:04 +0300 Subject: [PATCH 8/9] fixed entanglement :3 --- uct-background.js | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/uct-background.js b/uct-background.js index 651d2ad..70f6654 100644 --- a/uct-background.js +++ b/uct-background.js @@ -41,7 +41,7 @@ async function windowCreated(window){ let settings = await browser.storage.local.get(); let pwt; if(lastId!==undefined){ - pwt=settings.per_window_toggles.get(lastId); + pwt=structuredClone(settings.per_window_toggles.get(lastId)); } else { pwt=structuredClone(defaultSettings.toggles); } @@ -195,40 +195,29 @@ async function updateTitlePrefixes() { async function userToggle(styleId, newState) { // Extract style number from end of string styleId = String(styleId).match(/[0-9]+$/); - + let windowId = (await browser.windows.getCurrent()).id; let settings = await browser.storage.local.get(); let hrState = 'off'; let toggle = { name: 'all styles' } - if( - settings.per_window_toggles.get( - (await browser.windows.getCurrent()).id - )===undefined - ){ - settings.per_window_toggles.set( - (await browser.windows.getCurrent()).id, - structuredClone(defaultSettings.toggles) - ); - } - if ( styleId && !( settings.per_window_toggles.get( - (await browser.windows.getCurrent()).id + windowId ) )[styleId[0] - 1].enabled ) { - console.log('Style is disabled', (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[styleId[0] - 1]); + console.log('Style is disabled', (settings.per_window_toggles.get(windowId))[styleId[0] - 1]); return } // When only one option allowed or no valid style is selected, reset all others // Also do this when no valid style has been found if (!settings.general.allowMultiple || !styleId) { - for (let i = 0; i < (settings.per_window_toggles.get((await browser.windows.getCurrent()).id)).length; i++) { + for (let i = 0; i < (settings.per_window_toggles.get(windowId)).length; i++) { if (!styleId || styleId[0] - 1 != i){ - (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[i].state = false; + (settings.per_window_toggles.get(windowId))[i].state = false; } } } @@ -237,12 +226,12 @@ async function userToggle(styleId, newState) { if (styleId) { styleId = styleId[0]; // Invert toggle state or set requested state and save in settings - toggle = (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[styleId - 1]; + toggle = (settings.per_window_toggles.get(windowId))[styleId - 1]; if (typeof(newState) == 'undefined') newState = !toggle.state; - (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[styleId - 1].state = newState; + (settings.per_window_toggles.get(windowId))[styleId - 1].state = newState; if (newState) hrState = 'on'; From ee00ebe7349ad340d440e1210fa2a3a778f2191b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=91=D1=82=D1=80?= Date: Mon, 10 Oct 2022 04:04:08 +0300 Subject: [PATCH 9/9] runtime state stored outside of settings --- options/options.js | 6 +++--- popup/popup.js | 2 +- uct-background.js | 47 +++++++++++++++++----------------------------- 3 files changed, 21 insertions(+), 34 deletions(-) diff --git a/options/options.js b/options/options.js index 5ea6350..e90784e 100644 --- a/options/options.js +++ b/options/options.js @@ -89,10 +89,10 @@ async function saveChanges(prefixId) { console.log('Save', prefixId, settings); await browser.storage.local.set(settings); - settings.per_window_toggles.forEach( t => { - t.enabled = settings.toggles[prefixId - 1].enabled; + browser.extension.getBackgroundPage().per_window_toggles.forEach( (toggs,key) => { + toggs[prefixId].enabled = settings.toggles[prefixId - 1].enabled; if(!settings.toggles[prefixId - 1].enabled){ - t.state = false; + toggs[prefixId].state = false; } }); diff --git a/popup/popup.js b/popup/popup.js index 4f4f0ea..ed3abab 100644 --- a/popup/popup.js +++ b/popup/popup.js @@ -9,7 +9,7 @@ async function documentLoaded() { const settings = await browser.storage.local.get(); - const toggles = settings.per_window_toggles.get((await browser.windows.getLastFocused()).id); + const toggles = browser.extension.getBackgroundPage().per_window_toggles.get((await browser.windows.getLastFocused()).id); const type = settings.general.allowMultiple ? 'checkbox' : 'radio'; for (let i = 0; i < toggles.length; i++) { diff --git a/uct-background.js b/uct-background.js index 70f6654..3428e14 100644 --- a/uct-background.js +++ b/uct-background.js @@ -24,11 +24,10 @@ this.defaultSettings = { settingsVersion: 1.1, allowMultiple: false, notifyMe: true - }, - //unused, written for for clarity. this is done in initializeSettings() - per_window_toggles: new Map() + } } +this.per_window_toggles=new Map(); this.lastWindowId=undefined; this.secondToLastWindowId=undefined; @@ -38,34 +37,28 @@ async function windowCreated(window){ if(lastId===window.id){ lastId=secondToLastWindowId; } - let settings = await browser.storage.local.get(); let pwt; if(lastId!==undefined){ - pwt=structuredClone(settings.per_window_toggles.get(lastId)); + pwt=structuredClone(per_window_toggles.get(lastId)); } else { pwt=structuredClone(defaultSettings.toggles); } - settings.per_window_toggles.set(window.id,pwt); - await browser.storage.local.set(settings); + per_window_toggles.set(window.id,pwt); await updateTitlePrefixes(); } async function windowDestroyed(windowId){ - let settings = await browser.storage.local.get(); - settings.per_window_toggles.delete(windowId); - await browser.storage.local.set(settings); + per_window_toggles.delete(windowId); } async function windowFocusChanged(windowId){ if(windowId===browser.windows.WINDOW_ID_NONE) return; - let settings = await browser.storage.local.get(); - let toggles=settings.per_window_toggles.get(windowId); + let toggles=per_window_toggles.get(windowId); if(toggles===undefined){ //if extension was just loaded for example - settings.per_window_toggles.set(windowId,structuredClone(defaultSettings.toggles)); - await browser.storage.local.set(settings); + per_window_toggles.set(windowId,structuredClone(defaultSettings.toggles)); } secondToLastWindowId=lastWindowId; @@ -107,14 +100,13 @@ async function updateSettings(settings) { } async function updateButtonStatus() { - let settings = await browser.storage.local.get(); // Use reduce function on array to count all enabled toggles - let togglesEnabled = settings.per_window_toggles.get((await browser.windows.getCurrent()).id) + let togglesEnabled = per_window_toggles.get((await browser.windows.getCurrent()).id) .reduce((count, toggle) => toggle.enabled ? count + 1 : count, 0); if (togglesEnabled < 2) { - let toggle = (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[0]; + let toggle = (per_window_toggles.get((await browser.windows.getCurrent()).id))[0]; browser.browserAction.setTitle({ title: `Turn ${toggle.name} ` + (toggle.state ? 'off' : 'on') }); @@ -134,19 +126,16 @@ async function updateButtonStatus() { } async function getStyleSettings(styleId) { - let settings = await browser.storage.local.get(); - return (settings.per_window_toggles.get((await browser.windows.getCurrent()).id))[styleId - 1].prefix; + return (per_window_toggles.get((await browser.windows.getCurrent()).id))[styleId - 1].prefix; } async function initializeSettings() { let settings = await browser.storage.local.get(); - settings.per_window_toggles=new Map(); if (settings.toggles) { console.log('Loading user settings', settings); await updateSettings(settings); } else { console.log('Initializing default settings', defaultSettings); - await browser.storage.local.set(defaultSettings); // Open settings page for the user @@ -168,7 +157,7 @@ async function toggleTitlePrefix(windowId, titlePrefix) { // Update prefix for specified window async function updateTitlePrefixes() { let settings = await browser.storage.local.get(); - settings.per_window_toggles.forEach((toggles,windowId) => { + per_window_toggles.forEach((toggles,windowId) => { console.log(`updating: ${windowId} ${toggles}`); let titlePrefix = ''; @@ -203,21 +192,21 @@ async function userToggle(styleId, newState) { if ( styleId && !( - settings.per_window_toggles.get( + per_window_toggles.get( windowId ) )[styleId[0] - 1].enabled ) { - console.log('Style is disabled', (settings.per_window_toggles.get(windowId))[styleId[0] - 1]); + console.log('Style is disabled', (per_window_toggles.get(windowId))[styleId[0] - 1]); return } // When only one option allowed or no valid style is selected, reset all others // Also do this when no valid style has been found if (!settings.general.allowMultiple || !styleId) { - for (let i = 0; i < (settings.per_window_toggles.get(windowId)).length; i++) { + for (let i = 0; i < (per_window_toggles.get(windowId)).length; i++) { if (!styleId || styleId[0] - 1 != i){ - (settings.per_window_toggles.get(windowId))[i].state = false; + (per_window_toggles.get(windowId))[i].state = false; } } } @@ -226,12 +215,12 @@ async function userToggle(styleId, newState) { if (styleId) { styleId = styleId[0]; // Invert toggle state or set requested state and save in settings - toggle = (settings.per_window_toggles.get(windowId))[styleId - 1]; + toggle = (per_window_toggles.get(windowId))[styleId - 1]; if (typeof(newState) == 'undefined') newState = !toggle.state; - (settings.per_window_toggles.get(windowId))[styleId - 1].state = newState; + (per_window_toggles.get(windowId))[styleId - 1].state = newState; if (newState) hrState = 'on'; @@ -247,8 +236,6 @@ async function userToggle(styleId, newState) { }); } - await browser.storage.local.set(settings); - // Update title to reflect new truth await updateTitlePrefixes(); await updateButtonStatus();