Aplicativo de extensões do navegador Firefox (WebExtensions)

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 Chromechrome. , — 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, .


- . . , , , . theme.



manifest.json MDN.



, — :



short_name. , .


description



. , , :



- developer. , .


,


browser_specific_settings.


- — applications

Firefox — 48 — , 42 applications. browser_specific_settings, applications, applications. , , . , applications MDN.



Firefox, . , , ID . ( ) , ID . ID , . , — .


ID

GUID , 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. , .


{
  //       2
  "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",

  //    ,  —  
  //    GitHub
  "homepage_url": "https://github.com/alexandersolovyov/habr_editor",


  //       Firefox
  "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 backgroundtrue. , , JavaScript .




:


Janela do navegador com ponteiros para controles
  1. Firefox, , ( ) , , , . . browser_action. , - — HTML, CSS JavaScript. , . — .addListener() - browser.browserAction.onClicked. — Toolbar Buttton MDN
  2. URL . — page_action. . , browser.pageAction.onClicked. — Address bar button.
  3. Firefox , -> . , sidebar_action. — , . , — . ( — ), . , -. Sidebars

Popups MDN


, , . — «», .



-


, -, , JavaScript CSS. , - , — , . .


- :



-, ,

HTML-, — browser.windows.create(). , (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() , .


.



, , , . , . - , . :


  1. , , sendMessage(). , browser.runtime.sendMessage(), — browser.tabs.sendMessage(). -, , , — , , .
  2. onMessage, — browser.runtime.onMessage. . - — browser.runtime.onMessage.addListener(). - -, .
  3. - , Promise. Promise . , , Promise resolve() reject(). , -, JSON. Error: !
  4. , , sendMessage() Promise, — .then() .catch(). - - — .

, , — . , ( ), , «» Promise «».



, « ». API , — , . . :


  1. connect(). , , browser.runtime.connect(), browser.tabs.connect(). , . , .
  2. connect() browser.runtime.Port, API «» . , - port1.
  3. , , browser.runtime.onConnect — , , . - — browser.runtime.onConnect.addListener(). , - browser.runtime.Port — , , , . , port2. , -.
  4. , . postMessage() ( port1.postMessage()) -.
  5. onMessage ( — port2.onMessage). , port2.onMessage.addListener(). - . , port2.postMessage().
  6. , «-». , , -, , : , «status» «error» «ok».
  7. « » .disconnect() -. , , . window.onclose() port1.disconnect(). .
  8. , - . 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 — , . , , , .



:


  1. browser.runtime.sendNativeMessage(). ( name ) -, .
  2. stdin , , .
  3. .
  4. stdout.
  5. ! .
  6. , (browser.runtime.sendNativeMessage()), Promise. : .then() .catch(). :
    • , . , .then(), - .
    • , , , , , (null undefined).
    • , , .catch(). Error .


, , — . , , , , , .



. :


  1. browser.runtime.connectNative() — ( ).
  2. . . , !
  3. browser.runtime.connectNative(), , browser.runtime.Port — , , . port.
  4. port.postMessage() .
  5. (stdin) .
  6. , — stdout.
  7. , . - port.onMessage.addListener(). - .
  8. :
    • , . , .
    • - , .
    • port.disconnect(), .

  9. 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. — , .



«» , :



:






All Articles