fix(extensions): prune malformed browser overrides (#5094)
This commit is contained in:
parent
aef8e524fd
commit
7153e8d78f
2 changed files with 21 additions and 7 deletions
|
|
@ -143,17 +143,23 @@
|
|||
}
|
||||
}
|
||||
|
||||
function safeRead(key){
|
||||
function safeReadState(key){
|
||||
try{
|
||||
const raw=window.localStorage.getItem(key);
|
||||
if(!raw) return {};
|
||||
if(!raw) return {value:{},malformed:false};
|
||||
const parsed=JSON.parse(raw);
|
||||
return parsed&&typeof parsed==='object'&&!Array.isArray(parsed)?parsed:{};
|
||||
return parsed&&typeof parsed==='object'&&!Array.isArray(parsed)
|
||||
?{value:parsed,malformed:false}
|
||||
:{value:{},malformed:true};
|
||||
}catch(_e){
|
||||
return {};
|
||||
return {value:{},malformed:true};
|
||||
}
|
||||
}
|
||||
|
||||
function safeRead(key){
|
||||
return safeReadState(key).value;
|
||||
}
|
||||
|
||||
function safeWrite(key,value){
|
||||
const keys=Object.keys(value||{});
|
||||
try{
|
||||
|
|
@ -211,10 +217,10 @@
|
|||
}
|
||||
|
||||
function readSettingsState(schema,key){
|
||||
const stored=safeRead(key);
|
||||
const checked=validate(schema,stored);
|
||||
const stored=safeReadState(key);
|
||||
const checked=validate(schema,stored.value);
|
||||
const overrides=overridesFromValues(schema,checked.values);
|
||||
if(JSON.stringify(stored)!==JSON.stringify(overrides)) safeWrite(key,overrides);
|
||||
if(stored.malformed||JSON.stringify(stored.value)!==JSON.stringify(overrides)) safeWrite(key,overrides);
|
||||
return {values:checked.values,overrides};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -72,6 +72,14 @@ def test_extension_settings_runtime_normalizes_persists_resets_and_clears():
|
|||
assert.deepStrictEqual(settings.values, {{flag: false, mode: 'compact', count: 2}});
|
||||
assert.deepStrictEqual(settings.overrides, {{}});
|
||||
assert.strictEqual(store.has('hermes.ext.settings.demo.ext'), false);
|
||||
store.set('hermes.ext.settings.demo.ext', 'not-json');
|
||||
assert.deepStrictEqual(settings.values, {{flag: false, mode: 'compact', count: 2}});
|
||||
assert.deepStrictEqual(settings.overrides, {{}});
|
||||
assert.strictEqual(store.has('hermes.ext.settings.demo.ext'), false);
|
||||
store.set('hermes.ext.settings.demo.ext', JSON.stringify(['bad']));
|
||||
assert.deepStrictEqual(settings.values, {{flag: false, mode: 'compact', count: 2}});
|
||||
assert.deepStrictEqual(settings.overrides, {{}});
|
||||
assert.strictEqual(store.has('hermes.ext.settings.demo.ext'), false);
|
||||
assert.strictEqual(settings.set('mode', 'invalid').ok, false);
|
||||
assert.deepStrictEqual(settings.reset(), {{flag: false, mode: 'compact', count: 2}});
|
||||
assert.strictEqual(store.has('hermes.ext.settings.demo.ext'), false);
|
||||
|
|
|
|||
Loading…
Reference in a new issue