Firefox WebExtension: `browser.permissions` равно` undefined`
Системные настройки
- Firefox 88.0.1 (64-разрядная версия)
Проблема
Я разрабатываю веб-расширение, в котором пользователь может определить собственный API-интерфейс для использования на странице настроек. Таким образом, расширение должно запрашивать разрешение во время выполнения для
https://self-hosted-api.tld
. И, как говорит MDN, все дело в API разрешений, особенно в его
request()
метод.
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/permissionshttps://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions / API / разрешения / запрос
Проблема в том, что
browser.permissions
является
undefined
.
Итак, пожалуйста, как решить эту проблему?
Код
НастройкиДанные
class SettingsData
{
constructor()
{
this.apiBaseUri = '';
this.apiUserId = '';
this.apiKey = '';
}
get permissions()
{
return {
permissions: [],
origins: [
this.apiBaseUri
]
}
}
}
Настройки (строка 25)
class Settings
{
constructor()
{
this._settingsData = new SettingsData();
}
has( name )
{
return undefined !== this._settingsData[ name ];
}
get( name )
{
return this._settingsData[ name ];
}
set( name, value )
{
this._settingsData[ name ] = value;
}
_updatePermissions()
{
browser.permissions.request( this._settingsData.permissions );
}
async load()
{
const loadHandler = ( resolvedHandler, storedSettings ) =>
{
storedSettings.forEach(
( name, value ) =>
{
if ( undefined !== this._settingsData[ name ] )
{
this._settingsData[ name ] = value;
}
}
);
this._updatePermissions();
resolvedHandler( this );
};
return await new Promise(
( resolvedHandler, rejectedHandler ) =>
{
browser
.storage
.local
.get( 'settings' )
.then(
( storage ) =>
{
const storedSettings = storage.settings;
if ( undefined === storedSettings )
{
this
.save()
.then(
( settings ) =>
{
loadHandler( resolvedHandler, this._settingsData );
}
);
}
else
{
loadHandler( resolvedHandler, storedSettings );
}
}
);
}
);
}
async save()
{
return await new Promise(
( resolvedHandler, rejectedHandler ) =>
{
browser
.storage
.local
.get( 'settings' )
.then(
( storage ) =>
{
const storedSettings = storage.settings ?? {};
{
this._settingsData.forEach(
( name, value ) =>
{
storedSettings[ name ] = this._settingsData[ name ];
}
);
}
browser
.storage
.local
.set(
{ settings: storedSettings }
)
.then(
( settings ) =>
{
resolvedHandler( this );
}
)
}
);
}
);
}
}
бутстрап
( new Settings() )
.load()
.then(
( settings ) =>
{
/**
* do something after the settings has been loaded
*/
}
);