Installs and enables a theme extension from the given URL.

This API requires the "management" API permission and will only work with signed themes.

This is an asynchronous function that returns a Promise.




An object that includes the URL of the XPI file of the theme at and an optional a hash of the XPI file, using sha256 or stronger.

Return value

A Promise that will be fulfilled with an object, containing the ExtensionID defined for the theme in manifest.json.

Browser compatibility

BCD tables only load in the browser


Cycle through a list of themes:

"use strict";

const themes = [

let current;

async function install(url) {
  try {
    current = url;
    const { id } = await{ url });
    console.log(`Theme installed: ${id}`);
  } catch (e) {
    console.error(`Installation failed: ${e}`);

browser.browserAction.onClicked.addListener(() => {
  const id = themes.indexOf(current);
  install(themes[(id + 1) % themes.length]);

for (const url of themes) {
    title: url,
    onclick: () => install(url),
    contexts: ["browser_action"],