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
             */
        }
    );

0 ответов

Другие вопросы по тегам