Skip to content

Commit f71bfad

Browse files
committed
Fix settings not persisting
fixes #58
1 parent 870a62c commit f71bfad

File tree

3 files changed

+71
-58
lines changed

3 files changed

+71
-58
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "NflxMultiSubs",
33
"description": "Bilingual Subtitles for Netflix (fixed)",
44
"author": "Dan Chen, Gert Mertes",
5-
"version": "3.0.0",
5+
"version": "3.0.1",
66
"license": "MIT",
77
"private": true,
88
"scripts": {

src/service_worker.js

Lines changed: 68 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,54 @@
11
const kDefaultSettings = require('./default-settings');
2-
let gSettings = Object.assign({}, kDefaultSettings);
32

43
// return true if valid; otherwise return false
54
function validateSettings(settings) {
65
const keys = Object.keys(kDefaultSettings);
76
return keys.every(key => (key in settings));
87
}
98

10-
chrome.storage.local.get(['settings'], (result) => {
11-
console.log('Loaded: settings=', result.settings);
12-
if (result.settings && validateSettings(result.settings))
13-
gSettings = result.settings;
14-
else
15-
saveSettings();
16-
});
9+
const loadSettings = async () => {
10+
return new Promise((resolve, reject) => {
11+
chrome.storage.local.get(['settings'], function (result) {
12+
console.log('Loaded: settings=', result.settings);
13+
if (result.settings && validateSettings(result.settings)) {
14+
resolve(result.settings)
15+
}
16+
else {
17+
saveSettings(kDefaultSettings);
18+
resolve(kDefaultSettings);
19+
}
20+
});
21+
});
22+
};
1723

18-
function saveSettings() {
24+
function saveSettings(settings) {
1925
// hack to update opacity for existing users
20-
gSettings.primaryImageOpacity = 1
21-
gSettings.primaryTextOpacity = 1
22-
gSettings.secondaryImageOpacity = 1
23-
gSettings.secondaryTextOpacity = 1
24-
chrome.storage.local.set({ settings: gSettings }, () => {
25-
console.log('Settings: saved into local storage');
26+
settings.primaryImageOpacity = 1
27+
settings.primaryTextOpacity = 1
28+
settings.secondaryImageOpacity = 1
29+
settings.secondaryTextOpacity = 1
30+
chrome.storage.local.set({ settings: settings }, () => {
31+
console.log('Settings: saved into local storage', settings);
2632
});
2733
}
2834

35+
// TODO: revisit this logic.
36+
// The port is ephemeral in manifest v3, so keeping a map of ports is probably not useful.
37+
let gExtPorts = {}; // tabId -> msgPort; for config dispatching
38+
function dispatchSettings(settings) {
39+
try {
40+
const keys = Object.keys(gExtPorts);
41+
keys.map(k => gExtPorts[k]).forEach(port => {
42+
try {
43+
port.postMessage({ settings: settings });
44+
}
45+
catch (err) {
46+
console.error('Error: cannot dispatch settings,', err);
47+
}
48+
});
49+
} catch (err) { }
50+
}
51+
2952
function saturateActionIconForTab(tabId) {
3053
try {
3154
// v2
@@ -68,31 +91,15 @@ function desaturateActionIconForTab(tabId) {
6891
}
6992
}
7093

71-
// TODO: revisit this logic.
72-
// The port is ephemeral in manifest v3, so keeping a map of ports is probably not useful.
73-
let gExtPorts = {}; // tabId -> msgPort; for config dispatching
74-
function dispatchSettings() {
75-
try {
76-
const keys = Object.keys(gExtPorts);
77-
keys.map(k => gExtPorts[k]).forEach(port => {
78-
try {
79-
port.postMessage({ settings: gSettings });
80-
}
81-
catch (err) {
82-
console.error('Error: cannot dispatch settings,', err);
83-
}
84-
});
85-
} catch (err) { }
86-
}
87-
8894
// connected from target website (our injected agent)
89-
function handleExternalConnection(port) {
95+
async function handleExternalConnection(port) {
9096
const tabId = port.sender && port.sender.tab && port.sender.tab.id;
9197
if (!tabId) return;
9298

9399
gExtPorts[tabId] = port;
94100
console.log(`Connected: ${tabId} (tab)`);
95101

102+
var gSettings = await loadSettings();
96103
port.postMessage({ settings: gSettings });
97104

98105
port.onMessage.addListener(msg => {
@@ -107,8 +114,8 @@ function handleExternalConnection(port) {
107114
else {
108115
gSettings = settings;
109116
}
110-
saveSettings();
111-
dispatchSettings();
117+
saveSettings(gSettings);
118+
dispatchSettings(gSettings);
112119
}
113120
else if (msg.startPlayback) {
114121
console.log('Saturate icon')
@@ -130,37 +137,41 @@ function handleExternalConnection(port) {
130137
}
131138

132139
// connected from our pop-up page
133-
function handleInternalConnection(port) {
140+
async function handleInternalConnection(port) {
134141
const portName = port.name;
135142
console.log(`Connected: ${portName} (internal)`);
136143

137-
if (portName === 'settings') {
138-
port.postMessage({ settings: gSettings });
144+
port.onDisconnect.addListener(() => {
145+
console.log(`Disconnected: ${portName} (internal)`);
146+
});
147+
148+
if (portName !== 'settings') return;
149+
150+
var gSettings = await loadSettings();
151+
console.log('Dispatching settings to pop-up', gSettings);
152+
port.postMessage({ settings: gSettings });
139153

140-
port.onMessage.addListener(msg => {
141-
if (!msg.settings) {
154+
port.onMessage.addListener(msg => {
155+
// this logic is a mess, a leftover from when gSettings was a global variable
156+
// TODO: could use a refactor
157+
if (!msg.settings) {
158+
gSettings = Object.assign({}, kDefaultSettings);
159+
port.postMessage({ settings: gSettings });
160+
}
161+
else {
162+
console.log('Received: settings=', msg.settings);
163+
let settings = Object.assign({}, gSettings);
164+
settings = Object.assign(settings, msg.settings);
165+
if (!validateSettings(settings)) {
142166
gSettings = Object.assign({}, kDefaultSettings);
143167
port.postMessage({ settings: gSettings });
144168
}
145169
else {
146-
console.log('Received: settings=', msg.settings);
147-
let settings = Object.assign({}, gSettings);
148-
settings = Object.assign(settings, msg.settings);
149-
if (!validateSettings(settings)) {
150-
gSettings = Object.assign({}, kDefaultSettings);
151-
port.postMessage({ settings: gSettings });
152-
}
153-
else {
154-
gSettings = settings;
155-
}
170+
gSettings = settings;
156171
}
157-
saveSettings();
158-
dispatchSettings();
159-
});
160-
}
161-
162-
port.onDisconnect.addListener(() => {
163-
console.log(`Disconnected: ${portName} (internal)`);
172+
}
173+
saveSettings(gSettings);
174+
dispatchSettings(gSettings);
164175
});
165176
}
166177

src/settings.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ port.onMessage.addListener((msg) => {
2626

2727
primaryPicker?.setColor(settings.primaryTextColor || "#ffffff", true);
2828
secondaryPicker?.setColor(settings.secondaryTextColor || "#ffffff", true);
29+
console.log('Settings received:', settings);
2930
});
3031

3132
// -----------------------------------------------------------------------------
@@ -173,6 +174,7 @@ function renderVersion() {
173174
window.addEventListener('load', evt => {
174175
renderVersion();
175176
renderActiveSettings();
177+
console.log('Settings page loaded');
176178

177179
// handle click events
178180
// ---------------------------------------------------------------------------

0 commit comments

Comments
 (0)