diff --git a/static/extension_settings.js b/static/extension_settings.js index 33903241..e73c21c3 100644 --- a/static/extension_settings.js +++ b/static/extension_settings.js @@ -229,10 +229,7 @@ return !!(meta&&meta.storage_owned&&Array.isArray(meta.settings_schema)&&meta.settings_schema.length); } - function settingsForExtension(id,metadata){ - const clean=extensionId(id); - const meta=metadata||schemas.get(clean)||{id:clean,name:clean,storage_owned:false,settings_schema:[]}; - const isTrusted=metadata?true:schemas.has(clean); + function settingsAccessor(clean,meta,isTrusted){ const schema=supportsSettings(meta)?meta.settings_schema:[]; const key=settingsKey(clean); function current(){ @@ -279,9 +276,13 @@ }; } - function storageForExtension(id,metadata){ + function settingsForExtension(id){ const clean=extensionId(id); - const meta=metadata||schemas.get(clean)||{id:clean,name:clean,storage_owned:false,settings_schema:[]}; + const meta=schemas.get(clean)||{id:clean,name:clean,storage_owned:false,settings_schema:[]}; + return settingsAccessor(clean,meta,schemas.has(clean)); + } + + function storageAccessor(clean,meta){ const allowed=!!meta.storage_owned; const key=storageKey(clean); return { @@ -311,6 +312,12 @@ }; } + function storageForExtension(id){ + const clean=extensionId(id); + const meta=schemas.get(clean)||{id:clean,name:clean,storage_owned:false,settings_schema:[]}; + return storageAccessor(clean,meta); + } + function registerExtension(id){ if(typeof id!=='string') return null; const clean=extensionId(id); @@ -321,8 +328,8 @@ if(!trusted) return null; const handle=Object.freeze({ id:clean, - settings:settingsForExtension(clean,trusted), - storage:storageForExtension(clean,trusted), + settings:settingsAccessor(clean,trusted,true), + storage:storageAccessor(clean,trusted), }); registrations.set(clean,handle); return handle; diff --git a/tests/test_extension_settings_runtime.py b/tests/test_extension_settings_runtime.py index a6cb53f1..4221e7f2 100644 --- a/tests/test_extension_settings_runtime.py +++ b/tests/test_extension_settings_runtime.py @@ -182,6 +182,24 @@ def test_hermes_ext_register_runtime_identity_and_reload_lifecycle(): }}; eval(fs.readFileSync({str(EXTENSION_SETTINGS_JS)!r}, 'utf8')); + const forgedMetadata = {{ + id: 'forged.ext', + name: 'Forged', + storage_owned: true, + settings_schema: [{{key: 'owned', type: 'boolean', default: false}}] + }}; + const forgedSettings = window.HermesExtensionSettings.settingsForExtension( + 'forged.ext', forgedMetadata + ); + const forgedStorage = window.HermesExtensionSettings.storageForExtension( + 'forged.ext', forgedMetadata + ); + assert.strictEqual(forgedSettings.trusted, false); + assert.strictEqual(forgedSettings.set('owned', true).ok, false); + assert.strictEqual(forgedStorage.set('owned', true), false); + assert.strictEqual(store.has('hermes.ext.settings.forged.ext'), false); + assert.strictEqual(store.has('hermes.ext.storage.forged.ext'), false); + const beforeUnknown = {{reads, writes, removes}}; assert.strictEqual(window.hermesExt.register(''), null); assert.strictEqual(window.hermesExt.register(' unknown.ext '), null);