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>
! , .
- -, .
window
HTML-.
- 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
, - . ID browser.tabs.executeScript()
. , , , permissions
activeTab
, , 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 . , , Promise
resolve()
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()
, .error
window.Error
. , . error
Firefox, , 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()
, - .
- , , , , , (
null
undefined
).
- , ,
.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:debugging
Enter . Firefox.
- .
- - , .
. about:debugging
. «» .
, :
about:debugging
, .
- , , .
- , .
- , , F12.
. , — , . , . , -. , , -, .
Firefox web-ext, , , , , ZIP. , : , GIT, NPM , , , Managed Storage PKCS#11.
Firefox . Extension Workshop.
, , , . , API WebExtensions. — , .
«» , :
: