Para las personas cuyo trabajo implica el uso de Internet, las extensiones del navegador pueden ser herramientas muy Ăştiles. Al usarlos, puede evitar que el usuario repita las mismas acciones y organizar mejor el flujo de trabajo. Puede componer una caja de herramientas a partir de extensiones existentes, pero esto no es suficiente.
Para alguien que conoce el desarrollo web, es fácil crear una nueva extensiĂłn de navegador. Ahora, la mayorĂa de los navegadores más populares son compatibles con el sistema de desarrollo estándar, que utiliza principalmente JavaScript, HTML y CSS, WebExtensions .
Puede ser difĂcil para una persona que nunca antes ha creado un complemento de navegador basado en WebExtensions comprender de inmediato en quĂ© partes básicas deberĂa consistir y quĂ© puede hacer. En Internet hay mucha informaciĂłn sobre este sistema, pero para crear una imagen general para usted, tendrá que pasar mucho tiempo. Este artĂculo le ayudará a comprender rápidamente la estructura del sistema WebExtensions y le mostrará cĂłmo navegar mejor por la documentaciĂłn de su API . AquĂ se describe la extensiĂłn para el navegador Firefox , por lo que casi toda la informaciĂłn utilizada en el artĂculo se toma del sitio web de MDN . Pero el artĂculo será Ăştil para aquellos que quieran crear una extensiĂłn para otros navegadores que admitan WebExtensions, - principalmente para Google Chrome y Chromium .
Esta secciĂłn cubre la creaciĂłn de extensiones solo para escritorio . Si necesita crear una extensiĂłn para el navegador mĂłvil Chrome o Firefox , este artĂculo tambiĂ©n puede ser algo Ăştil, pero tendrá que encontrar y estudiar la mayor parte de la informaciĂłn usted mismo.
IntroducciĂłn
Lo que necesitas para empezar
Y esto es lo que necesitas:
- Navegador Firefox : la mejor versiĂłn 60 o superior. A lo largo del artĂculo, se supone que se utiliza dicho navegador, a menos que se indique lo contrario. Pero puedes usar Google Chrome o Chromium en su lugar .
- 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. — , .
«» , :
: