Preserve trusted extension identity across refresh

This commit is contained in:
Frank Song committed 2026-08-07 00:03:35 +08:00
1 parent f003b2d159
commit 693fbad5dc
2 files changed
+22 -7

No files matched your search

+8 -7
View File
@@ -229,9 +229,9 @@
return !!(meta&&meta.storage_owned&&Array.isArray(meta.settings_schema)&&meta.settings_schema.length);
}
function settingsForExtension(id){
function settingsForExtension(id,metadata){
const clean=extensionId(id);
const meta=schemas.get(clean)||{id:clean,name:clean,storage_owned:false,settings_schema:[]};
const meta=metadata||schemas.get(clean)||{id:clean,name:clean,storage_owned:false,settings_schema:[]};
const schema=supportsSettings(meta)?meta.settings_schema:[];
const key=settingsKey(clean);
function current(){
@@ -278,9 +278,9 @@
};
}
function storageForExtension(id){
function storageForExtension(id,metadata){
const clean=extensionId(id);
const meta=schemas.get(clean)||{id:clean,name:clean,storage_owned:false,settings_schema:[]};
const meta=metadata||schemas.get(clean)||{id:clean,name:clean,storage_owned:false,settings_schema:[]};
const allowed=!!meta.storage_owned;
const key=storageKey(clean);
return {
@@ -316,11 +316,12 @@
if(!clean) return null;
const existing=registrations.get(clean);
if(existing) return existing;
if(!schemas.has(clean)) return null;
const trusted=trustedExtensions.get(clean);
if(!trusted) return null;
const handle=Object.freeze({
id:clean,
settings:settingsForExtension(clean),
storage:storageForExtension(clean),
settings:settingsForExtension(clean,trusted),
storage:storageForExtension(clean,trusted),
});
registrations.set(clean,handle);
return handle;
+14
View File
@@ -164,6 +164,14 @@ def test_hermes_ext_register_runtime_identity_and_reload_lifecycle():
{{key: 'enabled', type: 'boolean', default: true}},
{{key: 'mode', type: 'string', default: 'beta'}}
]
}}, {{
id: 'deferred.ext',
name: 'Deferred',
storage_owned: true,
settings_schema: [
{{key: 'enabled', type: 'boolean', default: false}},
{{key: 'mode', type: 'string', default: 'deferred'}}
]
}}]
}},
localStorage: {{
@@ -232,6 +240,12 @@ def test_hermes_ext_register_runtime_identity_and_reload_lifecycle():
}}]
}});
const deferred = window.hermesExt.register('deferred.ext');
assert.ok(deferred);
assert.deepStrictEqual(deferred.settings.values, {{enabled: false, mode: 'deferred'}});
assert.strictEqual(deferred.storage.set('note', 'deferred-note'), true);
assert.strictEqual(deferred.storage.get('note'), 'deferred-note');
assert.strictEqual(window.hermesExt.register('alpha.ext'), alpha);
assert.strictEqual(alpha.settings.get('enabled'), true);
assert.strictEqual(alpha.storage.get('note'), 'alpha-note');