Разработка расширения для браузера Firefox (Firefox Add-on)

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка расширения для браузера Firefox (Firefox Add-on)
Средняя
~1-2 недели
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Разработка расширения для браузера Firefox (Firefox Add-on)

Firefox Add-ons основаны на WebExtensions API — той же спецификации, что и Chrome Extensions. Большинство Chrome-расширений можно перенести на Firefox с минимальными правками. Но есть различия в деталях: поддержка API, процедура подписи, движок расширений.

Отличия Firefox от Chrome

Аспект Firefox Chrome
API namespace browser.* (Promise) + chrome.* chrome.* (Callback)
Manifest MV2 и MV3 (MV3 добавлен в Firefox 109+) Только MV3 (MV2 устарел)
Background Persistent background page (MV2) или SW (MV3) Только Service Worker
Подпись Обязательна через AMO Не требуется
browser_style Поддерживается Не поддерживается

Manifest V2 (Firefox — наиболее стабильный вариант)

{
  "manifest_version": 2,
  "name": "My Firefox Add-on",
  "version": "1.0.0",
  "description": "Описание дополнения",
  "permissions": [
    "storage",
    "tabs",
    "activeTab",
    "https://*.example.com/*"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_popup": "popup.html",
    "default_icon": {
      "48": "icons/icon48.png",
      "96": "icons/icon96.png"
    }
  },
  "content_scripts": [{
    "matches": ["https://*.target-site.com/*"],
    "js": ["content.js"]
  }],
  "options_ui": {
    "page": "options.html",
    "open_in_tab": false
  }
}

Promise-based API

Firefox поддерживает нативные Promise в browser.*. Полифил webextension-polyfill делает код совместимым с Chrome:

import browser from 'webextension-polyfill';

// Firefox — нативные промисы
const tabs = await browser.tabs.query({ active: true, currentWindow: true });
const tab = tabs[0];

// Выполнить скрипт (MV2)
await browser.tabs.executeScript(tab.id, {
  code: 'document.body.style.background = "yellow"',
});

// Хранилище
await browser.storage.local.set({ key: 'value' });
const result = await browser.storage.local.get('key');

Content Script: ограничения и обходы

В Firefox Content Scripts работают в изолированном мире (Xray wrapper) — они не имеют доступа к JavaScript-объектам страницы напрямую. Для взаимодействия со страницей нужен window.postMessage или CustomEvent:

// Content script -> Page script
window.postMessage({ source: 'myExtension', type: 'REQUEST_DATA' }, '*');

// Page script обработчик
window.addEventListener('message', (e) => {
  if (e.data?.source === 'myExtension' && e.data?.type === 'REQUEST_DATA') {
    window.postMessage({
      source: 'myPage',
      type: 'RESPONSE_DATA',
      payload: window.__MY_APP_STATE__,
    }, '*');
  }
});

Подпись и публикация

Firefox требует подписи от Mozilla для любого расширения, распространяемого не через AMO:

# web-ext — официальный CLI от Mozilla
npm install -g web-ext

# Разработка с hot reload
web-ext run --source-dir ./dist --firefox-binary "/path/to/firefox"

# Сборка
web-ext build --source-dir ./dist --artifacts-dir ./artifacts

# Подпись (нужны AMO API ключи)
web-ext sign \
  --source-dir ./dist \
  --api-key $AMO_JWT_ISSUER \
  --api-secret $AMO_JWT_SECRET

Для получения API ключей: addons.mozilla.org/developers/addon/api/key/.

Временная установка для тестирования

Без подписи расширение можно установить только через about:debugging:

  1. Открыть about:debugging#/runtime/this-firefox
  2. «Загрузить временное дополнение»
  3. Выбрать manifest.json
  4. Работает до перезапуска браузера

Для корпоративного деплоя без AMO — использовать policies.json в Firefox Enterprise.

Специфика Firefox: contextualIdentities (контейнеры)

Firefox поддерживает Containers — изолированные контексты с разными куки. Доступ через API:

const containers = await browser.contextualIdentities.query({});
// { cookieStoreId, name, color, icon }

// Открыть вкладку в конкретном контейнере
await browser.tabs.create({
  url: 'https://example.com',
  cookieStoreId: 'firefox-container-1',
});

Сроки

Firefox Add-on, адаптированный из Chrome-расширения, с подписью и публикацией на AMO — 2–3 рабочих дня дополнительно к готовому Chrome-расширению. Разработка нового дополнения с нуля — 4–8 дней в зависимости от функциональности.