Para pessoas cujo trabalho envolve o uso da Internet, as extensões do navegador podem ser ferramentas muito úteis. Com eles, você pode salvar o usuário de repetir as mesmas ações e organizar melhor o fluxo de trabalho. Você pode compor uma caixa de ferramentas a partir de extensões existentes, mas isso não é suficiente.
Para alguém que conhece o desenvolvimento da Web, é fácil criar uma nova extensão do navegador. Agora, a maioria dos navegadores mais populares suporta o sistema de desenvolvimento padrão, que usa principalmente JavaScript, HTML e CSS, - WebExtensions .
Pode ser difícil para uma pessoa que nunca criou um complemento de navegador baseado em WebExtensions antes entender imediatamente em que partes básicas ele deve consistir e o que pode fazer. Na Internet, há muitas informações sobre esse sistema, mas para criar uma imagem geral para você, você precisará gastar muito tempo. Este artigo ajudará você a entender rapidamente a estrutura do sistema WebExtensions e mostrará como navegar melhor na documentação para sua API . A extensão para o navegador Firefox é descrita aqui , então quase todas as informações usadas no artigo são obtidas no site da MDN . Mas o artigo será útil para quem deseja criar uma extensão para outros navegadores que suportam extensões da Web, - principalmente para Google Chrome e Chromium .
Esta seção aborda a criação de extensões somente para desktop . Se você precisar criar uma extensão para o navegador móvel Chrome ou Firefox , este artigo também poderá ser útil, mas você deverá encontrar e estudar a maioria das informações.
Introdução
O que você precisa para começar
E aqui está o que você precisa:
- Navegador Firefox - melhor versão 60 ou superior. Ao longo do artigo, presume-se que esse navegador seja usado, a menos que seja indicado de outra forma. Mas você pode usar o Google Chrome ou o Chromium .
 
- HTML CSS, -.
 
- Javascript. ECMA, Promise .
 
- , API. , , ( ), . - «» MDN — , .
 
- Python Node.js.
 
- , , - .
 
Firefox 60 WebExtensions — . - Firefox 52.
Google Chrome Chromium WebExtensions , . , , . API Firefox , Building a cross-browser extension. , , Firefox, Chrome.
, , API Chrome.
«», Google Chrome. -, Opera, Microsoft Edge. , Chrome. API WebExtensions Chrome, , , , Firefox.
- Opera. , , API , . , - Opera, API Opera.
Edge, API Microsoft.
, . , . , , .
— . — manifest.json. — -, . - , , , , , . — Javascript, HTML, CSS, (, ).
, :
- . , , . , . .
 
- - .
 
- , , . , , .
 
- , .
 
- , .
 
- , .
 
- , , . . , -.
 
- .
 
, — . . , , -, — .
— , .
«» , API WebExtensions. API, .
:
WebExtensions
, WebExtensions, , MDN. .
API WebExtensions:
, API WebExtensions, . Firefox browser, Google Chrome — chrome. , — window, — -.
, . — window. — API WebExtensions, — browser. window . , , , — , window, «window.» . API WebExtensions «browser.» . , WebExtensions MDN, , runtime.id . , —
var myAddonId = browser.runtime.id;
browser , . , API WebExtensions , .
— . , . . , .
DOM . -, HTML-, , HTML-! , , — window browser.
. — -. , -. , , . , . , . , , , ( « ») — .
:
- API WebExtensions, . MDN .
 
- HTML-, CSS JavaScript, JavaScript. HTML- . , , -. : HTML- JavaScript, <script>, —<script src="my_script.js"></script>! , .
 
- -, . windowHTML-.
 
- JavaScript -, . . , HTML, , . — .
 
( )
- :
- API WebExtensions, .
 
- -. HTML — -. JavaScript CSS.
 
- DOM , — , API window. «» -. , , -. , -window, — .
 
, — -. , , , .
. , : window HTML- browser. , — , — - ( , ) . .
, , .
, : — , («Extension»), — , («Design»), — , («Native»). «Build», -. , , . , , : , «icons», «_locales» ( ). :
My_project
|--Design
|  |--concept.md
|
|--Build
|  |--my_extension-1.0.0.zip
|
|--Native
|  |--native_program.py
|  |--native_program_manifest.json
|  |--run.bat
|  |--install.sh
|  |--install.bat
|
|--Extension
   |--manifest.json
   |--background.js
   |--content.js
   |--browser_popup
   |  |--menu.html
   |  |--menu.css
   |  |--menu.js
   |
   |--icons
      |--my_extension.svg
manifest.json, . , . JSON. JavaScript, .
manifest.json MDN.
, — :
— short_name. , .
— description
. , , :
- developer. , .
,
browser_specific_settings.
- — applicationsFirefox — 48 — , 42 applications. browser_specific_settings, applications, applications. , , . , applications MDN.
 Firefox, . , , ID . ( ) , ID . ID , . , — .
IDGUID , e-mail. GUID — . _@.org. , . : , - , . ID , , . e-mail. , — my_extension, — user, , ID :
my_extension@user.habr.com
my_extension@user.github.com
my_extension@user.addons.mozilla.org
 -
-, . , : ( -> -> ) , . icons.
MDN , — 48x48 , 32x32. — , Retina display Apple. , , : 32x32, 64x64, 48x48 96x96 .
PNG SVG. SVG , — . , Google Chrome SVG .
manifest.json. , .
{
  
  "manifest_version": 2,
  
  "name": "Habr article editor",
  "short_name": "Habr Editor",
  
  "version": "1.0.0",
  
  "description": "Enhances editor of articles on habr.com site to support Markdown Extra",
  
  "author": "Aleksandr Solovyov",
  
  
  "homepage_url": "https://github.com/alexandersolovyov/habr_editor",
  
  "browser_specific_settings": {
    "gecko": {
      "id": "habr_editor@alexandersolovyov.github.com",
      "strict_min_version": "52.0"
    }
  },
  
  "icons": {
    "32": "icons/habr_editor.svg",
    "64": "icons/habr_editor.svg",
    "48": "icons/habr_editor.svg",
    "96": "icons/habr_editor.svg"
  },
  ...
}
, , , , - . .
API
, API WebExtensions. , «» API, - .
permissions . , , , , , . , , « », .
, . , , . , , . optional_permissions. , , , permissions. API.
— permissions, optional_permissions. API . API, . , , permissions, optional_permissions. : — , ! API, , API WebExtensions. API , — , API, , .
-
- . , (host permissions) (activeTab). , .
activeTab . , -. , , URL, . , <all_urls> tabs, , .
host permissions . URL -, URL . , AJAX — , , HTTP- cookie. <all_urls> host permissions. , .
(options page)
, — . , -> ( ), . , ( , ) , . , , , . — - .
, -: HTML, CSS JavaScript.
HTML- options_ui. , . , , "open_in_tab": true options_ui.
, , , . — .
Options page.
storage API.
«», . Firefox ( 68) , , . . - - . Firefox.
 . , — , .
JavaScript, HTML- ( CSS!). background . , , DOM . HTML .
HTML-HTML , . HTML- — , .
API WebExtensions — browser.runtime.getBackgroundPage(). , DOM JavaScript. , -, : , - , . -, — , HTML-.
WebExtensions HTML- . , HTML , DOM ( StackOverflow). HTML- , , , HTML.
, user_scripts , Firefox 68. JavaScript .
 : , . WebExtensions . — , . persistent background — true. , , JavaScript .
:

- Firefox, , ( ) , , , . . browser_action. , - — HTML, CSS JavaScript. , . — .addListener()- browser.browserAction.onClicked. — Toolbar Buttton MDN
 
- URL . — page_action. . , browser.pageAction.onClicked. — Address bar button.
 
- Firefox , -> . , sidebar_action. — , . , — . ( — ), . , -. Sidebars
 
Popups MDN
, , . — «», .
-
, -, , JavaScript CSS. , - , — , . .
- :
- content_scripts. JavaScript, CSS. , URL- . - , URL- . ( ) , , . (permissions).
 
- . : URL . , . . JavaScript, CSS, , . API browser.contentScripts. browser.contentScripts.register() URL . Promise. «» ( .then()) browser.contentScripts.RegisteredContentScript, « »..unregister(). , -, . permissions - (host permissions), -, .
 
- . JavaScript — , . browser.tabs.executeScript(). , , (ID). Promise. , URL , browser.tabs.query().Promise, - . IDbrowser.tabs.executeScript(). , , ,permissionsactiveTab, , URL- (host permissions).
 
, . , , : , HTML- , . API: content_scripts , run_at, JavaScript, , — runAt .
, , , «» ( , ).
CSS , - <link>. JavaScript :
, «» DOM , window, :
- JavaScript, «» -.
 
- , , «» .
 
- , «» -, , DOM. , , -, «» , .
 
MDN.
, - CSS JavaScript. , , - HTML. , — , StackOverflow.
, - . commands -.
. — , . — , . . — browser.commands.onCommand.addListener().
- , . context_menus. , — .
Firefox API browser.menus. - — browser.contextMenus. Firefox, , . .
, browser.menus.create(). ( ). , , , — , — .
, . , browser.menus.onClicked. , , , : , HTML-, .
DOM -, , JavaScript — browser.tabs.executeScript(). : , HTML-, . browser.menus.getTargetElement().
API
API WebExtensions. browser.runtime . API . — browser.tabs. . API .
API WebExtensions , :
- API browser.runtime.
 
- API browser.tabs.
 
- , - ( ), .
 
JavaScript, , , JSON . . JSON. , , , undefined, Symbol . , DOM . , , JSON JSON.stringify() , .
.
, , , . , . - , . :
- , , sendMessage(). , browser.runtime.sendMessage(), — browser.tabs.sendMessage(). -, , , — , , .
 
- onMessage, — browser.runtime.onMessage. . - —- browser.runtime.onMessage.addListener(). - -, .
 
- - , Promise. Promise . , ,Promiseresolve()reject(). , -, JSON.Error: !
 
- , , sendMessage()Promise, —.then().catch(). - - — .
 
, , — . , ( ), , «» Promise «».
, « ». API , — , . . :
- connect(). , , browser.runtime.connect(), — browser.tabs.connect(). , . , .
 
- connect()browser.runtime.Port, API «» . , -- port1.
 
- , , browser.runtime.onConnect — , , . - — browser.runtime.onConnect.addListener(). , -browser.runtime.Port— , , , . ,port2. , -.
 
- , . postMessage()(port1.postMessage()) -.
 
- onMessage( —- port2.onMessage). ,- port2.onMessage.addListener(). - . ,- port2.postMessage().
 
- , «-». , , -, , : , «status» «error» «ok».
 
- « » .disconnect()-. , , .window.onclose()port1.disconnect(). .
 
- , - . port2.onDisconnect.addListener(). - - . -.disconnect(),.errorwindow.Error. , .errorFirefox, , browser.runtime.lastError.
 
, API WebExtensions , , ( «» «native»), , . .
, API . — , (, Python, Node.js Java), . — . , . .
— Python Node.js, . , , . . , -, , .
Native messaging. , — .
, , , . , , , - , - ( ). , «», . , -. , , Native Manifests.
API WebExtensions . , . .
.
, , JavaScript, JSON. UTF-8. (), 4 . — . ( stdin). (stdout) JSON , . JavaScript, .
, , . , , , JSON — , . , , , .
:
- browser.runtime.sendNativeMessage(). ( name) -, .
 
- stdin , , .
 
- .
 
- stdout.
 
- ! .
 
- , (browser.runtime.sendNativeMessage()),Promise. :.then().catch(). :
 - , . , .then(), - .
 
- , , , , , (nullundefined).
 
- , , .catch().Error.
 
 
 
, , — . , , , , , .
. :
- browser.runtime.connectNative() — ( ).
 
- . . , !
 
- browser.runtime.connectNative(), , browser.runtime.Port — , , .- port.
 
- port.postMessage().
 
- (stdin) .
 
- , — stdout.
 
- , . - port.onMessage.addListener(). - .
 
- :
 - , . , .
 
- - , .
 
- port.disconnect(), .
 
 
 
- port.onDisconnect. -. ,- .error, . , Chromium, - — Firefox. browser.runtime.lastError.
 
, , .
API WebExtensions . :
web-ext
WebExtensions MDN web-ext. , Node.js, , , , Mozilla. , , , , «» . «» Firefox , , , .
web-ext Extension Workshop. , , «».
, , , :
- about:debuggingEnter . Firefox.
 
- .
 
- - , .
 
. about:debugging . «» .
, :
- about:debugging, .
 
- , , .
 
- , .
 
- , , F12.
 
. , — , . , . , -. , , -, .
Firefox web-ext, , , , , ZIP. , : , GIT, NPM , , , Managed Storage PKCS#11.
Firefox . Extension Workshop.
, , , . , API WebExtensions. — , .
«» , :
: