Exemplo: Insertor de imagens com o script de conteúdo
Este exemplo utiliza código JavaScript para inserir a stars.jpeg
imagem na parte superior da página Web atual, dentro do <body>
elemento . O pop-up da extensão contém um título e um botão HTML com o nome Inserir imagem. Quando clica no botão Inserir imagem , o código JavaScript da extensão envia uma mensagem a partir do pop-up do ícone da extensão e insere dinamicamente JavaScript que é executado no separador do browser.
Este exemplo demonstra as seguintes funcionalidades de extensão:
- Injetar bibliotecas JavaScript numa extensão.
- Expor recursos de extensão a separadores do browser.
- Incluindo páginas Web de conteúdo em separadores de browser existentes.
- Fazer com que as páginas Web de conteúdo ouçam mensagens de pop-ups e respondam.
Pré-visualização do exemplo
Irá instalar o exemplo de extensão com o separador Gerir Extensões do browser, clicar no botão Extensões () para mostrar a lista de extensões instaladas e, em seguida, clicar nesta extensão de exemplo:
A extensão apresenta uma pequena página Web HTML num pop-up, que contém um título, um botão Inserir imagem e instruções:
Quando clica no botão Inserir imagem , o código JavaScript é inserido stars.jpeg
temporariamente na parte superior da página Web atual e envia o conteúdo da página Web para baixo para baixo da imagem. O conteúdo injetado define o elemento de imagem para apresentar a imagem stars.jpeg
estática na parte superior da página Web atual:
Quando clica na imagem, o JavaScript injetado remove a imagem da árvore do DOM e da página Web.
Obtenha, instale e execute o exemplo da seguinte forma.
Clonar o repositório de MicrosoftEdge-Extensions
Pode utilizar várias ferramentas para clonar um repositório do GitHub. Pode transferir um diretório selecionado ou clonar todo o repositório.
Clone o repositório MicrosoftEdge-Extensions para a unidade local e, em seguida, mude para um ramo de trabalho, da seguinte forma.
Numa linha de comandos, introduza
git
para marcar se o git está instalado.Se ainda não tiver terminado, transfira o git e instale-o.
Se ainda não tiver terminado, inicie uma linha de comandos onde o git está instalado.
Mude para o diretório para o qual pretende clonar o repositório MicrosoftEdge-Extensions . Por exemplo:
cd C:/Users/localAccount/GitHub/
No Microsoft Edge, aceda ao repositório MicrosoftEdge-Extensions .
Clique na seta para baixo no lado direito do botão verde Código e, em seguida, na secção Clonar com o URL da Web , clique no botão Copiar URL para a área de transferência junto a
https://github.com/microsoft/MicrosoftEdge-Extensions.git
.Na janela da linha de comandos, introduza o comando:
git clone https://github.com/microsoft/MicrosoftEdge-Extensions.git
O
/MicrosoftEdge-Extensions/
diretório é adicionado no diretório que especificou.
Criar um ramo de trabalho e mudar para o mesmo
Verifique a lista de diretórios:
ls
O
/MicrosoftEdge-Extensions/
diretório está listado.Mude para o novo diretório:
cd MicrosoftEdge-Extensions
Criar um ramo de trabalho:
git branch test
Mude para o ramo de trabalho:
git switch test
Devolve:
Switched to branch 'test'
Agora, pode modificar o código no ramo de trabalho, sem alterar o código que está no ramo "main" do repositório. Mais tarde, poderá querer mudar para o ramo "main" ou criar um ramo diferente com base no ramo "main".
Instalar o exemplo localmente
Em vez de instalar o exemplo a partir da Loja, irá instalar o exemplo localmente, para que possa modificá-lo e testar rapidamente as alterações. Por vezes, instalar localmente chama-se sideloading de uma extensão.
No Microsoft Edge, clique no botão Extensões (
junto à Barra de endereço, se este ícone for apresentado. Em alternativa, selecione Definições e muito mais (
) >
. O pop-up Extensions (Extensões ) é aberto:
Clique em Gerir extensões. A página Gestão de extensões é aberta num novo separador:
Ative o botão de alternar Modo de programador .
Ao instalar a extensão de exemplo pela primeira vez, clique no botão Carregar desembalado (
). É aberta a caixa de diálogo Selecionar o diretório de extensão .
Selecione o diretório que contém os ficheiros de origem da extensão, como
manifest.json
.Caminho de exemplo:
C:\Users\localAccount\GitHub\MicrosoftEdge-Extensions\Extension-samples\picture-inserter-content-script
Clique no botão Selecionar Pasta .
A caixa de diálogo Selecionar o diretório de extensão é fechada.
A extensão é instalada no browser, semelhante a uma extensão instalada a partir do arquivo:
Executar o exemplo
Aceda a uma página Web, como a aplicação TODO, numa nova janela ou separador. O separador não pode estar vazio e não pode ser a página Gerir Extensões, porque este exemplo insere conteúdo na página Web atual.
Atualize a página Web. Por vezes, isto é necessário depois de recarregar uma extensão.
No Microsoft Edge à direita da Barra de endereço, se este ícone for apresentado, clique no botão Extensões (
). Em alternativa, selecione Definições e muito mais (
) >Extensões.
O pop-up Extensions (Extensões ) é aberto:
Clique no ícone ou nome da extensão (Insertor de imagens com script de conteúdo).
A extensão é aberta e o ícone da extensão é adicionado junto ao ícone Barra de endereço e Extensões (
).
É aberto um pop-up que contém uma pequena página Web HTML com um título, um botão Inserir imagem e instruções:
Clique no botão Inserir imagem .
stars.jpeg
é inserido na parte superior da página Web atual no separador atual, ao enviar o conteúdo da página Web para baixo abaixo da imagem:Clique na
stars.jpeg
imagem que está a preencher a parte superior da página Web. Esse elemento de imagem é removido da árvore do DOM e da página Web e a página Web atual é restaurada, mudando o respetivo conteúdo de volta para a parte superior do separador.
A extensão envia uma mensagem a partir do pop-up do ícone de extensão e insere dinamicamente JavaScript em execução como conteúdo no separador do browser. O conteúdo injetado define o elemento de imagem a apresentar stars.jpeg
na parte superior da página Web atual e, em seguida, remove a imagem quando clica na imagem.
Veja também:
Estudar a amostra
Nas secções seguintes, vai estudar o exemplo. Depois disso, para desenvolver a sua própria extensão do Microsoft Edge, pode copiar e modificar o diretório do exemplo e instalar e testar a extensão resultante.
Ficheiros e diretórios
O exemplo tem a seguinte estrutura e ficheiros de diretório.
Caminho de exemplo para o exemplo:
C:\Users\localAccount\GitHub\MicrosoftEdge-Extensions\Extension-samples\picture-inserter-content-script
Diretórios e ficheiros no /picture-inserter-content-script/
diretório:
/content-scripts/
content.js
/icons/
extension-icon16x16.png
extension-icon32x32.png
extension-icon48x48.png
extension-icon128x128.png
/images/
stars.jpeg
/popup/
popup.html
popup.js
manifest.json
- O
/content-scripts/
diretório contémcontent.js
, que é o script que é injetado na página Web atual. - O
/icons/
diretório contém versões de um.png
ficheiro que é utilizado para representar a extensão perto da barra de Endereço do browser, no pop-up Extensões e na página Gestão de extensões . - O
/images/
diretório contémstars.jpeg
, que é apresentado no pop-up da extensão. - O
/popup/
diretório contém os ficheiros:-
popup.html
define o conteúdo na página Web de pop-up inicial da extensão (um título, botão e instruções). -
popup.js
para a página Web de pop-up inicial envia uma mensagem para o script de conteúdo (content.js
) que está em execução na página de separador, especificando o ficheiro de imagem a apresentar.
-
-
manifest.json
contém informações básicas sobre a extensão.
Estratégia para atualizar a página Web para inserir a imagem na parte superior (stars.jpeg
)
Este exemplo inclui um script de conteúdo que é injetado na página Web que é carregado no separador atual do browser.
Quando executa o exemplo de extensão, é apresentada a página HTML de pop-up inicial (
popup.html
), que mostra um título, instruções e o botão Inserir imagem .Quando clica no botão Inserir imagem , o JavaScript (
popup.js
) da página de pop-up inicial envia uma mensagem para o script de conteúdo (content.js
) que está em execução na página de separador. A mensagem especifica o ficheiro de imagem a apresentar.O script de conteúdo (
content.js
) em execução na página de separador recebe a mensagem e apresenta o ficheiro de imagem especificado (stars.jpeg
).
A página Web de pop-up inicial (popup.html
)
/popup/popup.html
é especificado no ficheiro de manifesto como a página Web a apresentar no pop-up inicial da extensão. O ficheiro de manifesto contém o campo "default_popup": "popup/popup.html"
de chave . O ficheiro deste popup.html
exemplo é uma pequena página Web que contém um título, um botão Inserir imagem e instruções.
popup.html
:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
body {
width: 500px;
}
button {
background-color: #336dab;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
font-size: 16px;
}
</style>
</head>
<body>
<h1>Picture inserter using a content script</h1>
<button id="sendmessageid">Insert picture</button>
<script src="popup.js"></script>
<p>Click the displayed image to remove it from the webpage.</p>
</body>
</html>
JavaScript (popup.js
) para a página de pop-up inicial, para enviar uma mensagem para o JavaScript injetado
/popup/popup.js
envia uma mensagem para o script de conteúdo (content.js
) que é temporariamente injetado no separador do browser. Para tal, popup.js
adiciona um onclick
evento ao botão Inserir imagem da página Web de pop-up, que tem o ID sendmessageid
:
popup.js
(porção):
const sendMessageId = document.getElementById("sendmessageid");
if (sendMessageId) {
sendMessageId.onclick = function() {
...
};
}
Em popup.js
, chrome.tabs.query
localiza o separador do browser atual e, em seguida chrome.tabs.sendMessage
, envia uma mensagem para esse separador. O exemplo passa no ID do separador atual. A mensagem tem de incluir o URL da imagem que será apresentada.
Tem de enviar um ID exclusivo para atribuir à imagem inserida, para encontrar o elemento de imagem novamente mais tarde e eliminá-lo. Para enviar um ID exclusivo para atribuir à imagem inserida, o ID exclusivo é gerado e popup.js
transmitido para o script de conteúdo.
popup.js
(concluído):
const sendMessageId = document.getElementById("sendmessageid");
if (sendMessageId) {
sendMessageId.onclick = function() {
chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) {
chrome.tabs.sendMessage(
tabs[0].id,
{
url: chrome.runtime.getURL("images/stars.jpeg"),
imageDivId: crypto.randomUUID(),
tabId: tabs[0].id
},
function(response) {
window.close();
}
);
});
};
}
O serviço de escuta de mensagens do script de conteúdo (content.js
)
Eis o content-scripts\content.js
ficheiro que é injetado em todas as páginas de separadores do browser. Este ficheiro está listado na content-scripts
secção em manifest.json
.
content.js
(concluído):
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
const img = document.createElement("img");
img.id = request.imageDivId;
img.src = request.url;
img.style = "height: auto; width: 90vw;";
document.body.prepend(img);
img.addEventListener("click", () => {
img.remove();
}, { once: true });
sendResponse({ fromcontent: "This message is from content.js" });
});
content.js
regista um serviço de escuta com o método da chrome.runtime.onMessage.addListener
API de Extensão. Este serviço de escuta aguarda a mensagem que é enviada quando popup.js
chama chrome.tabs.sendMessage
.
No content.js
, o addListener
método utiliza um único parâmetro que é uma função. O primeiro parâmetro dessa função, request
, contém os detalhes da mensagem que está a ser transmitida.
No content.js
, quando um evento é processado pelo serviço de escuta, a função de addListener
serviço de escuta transmitida é executada. O primeiro parâmetro da função de serviço de escuta transmitida é um request
objeto que tem atributos atribuídos por sendMessage
.
Em popup.js
, para a chamada de chrome.tabs.sendMessage
método, os atributos do segundo parâmetro para sendMessage
são url
, imageDivId
e tabId
.
Eis a função de serviço de escuta isolada que é transmitida para addListener
:
content.js
(porção)
function(request, sender, sendResponse) {
const img = document.createElement("img");
img.id = request.imageDivId;
img.src = request.url;
img.style = "height: auto; width: 90vw;";
document.body.prepend(img);
img.addEventListener("click", () => {
img.remove();
}, { once: true });
sendResponse({ fromcontent: "This message is from content.js" });
}
As primeiras cinco linhas na função de serviço de escuta acrescentam um img
elemento imediatamente abaixo do body
elemento no separador do browser.
A segunda linha na função do serviço de escuta, img.id = request.imageDivId;
, define o ID do img
elemento para o imageDivId
do pedido transmitido.
Na função de serviço de escuta, a addEventListener
chamada adiciona uma click
função de serviço de escuta de eventos que abrange toda a imagem, permitindo ao utilizador clicar em qualquer parte da imagem. Quando clica na imagem inserida, a imagem é removida da página Web atual pela linha img.remove();
e o serviço de escuta de eventos também é removido ao especificar { once: true }
.
Como stars.jpeg
é disponibilizado a partir de qualquer separador do browser
Para disponibilizar images/stars.jpeg
a partir de qualquer separador do browser:
-
popup.js
(acima) utiliza achrome.runtime.getURL
API. - O manifesto (abaixo) especifica que
web_accessible_resources
do tipo.jpeg
corresponde a todos os URLs.
O exemplo injeta a imagem com o src
atributo do img
elemento na página de conteúdo. A página de conteúdo está em execução num thread exclusivo que não é o mesmo que o thread que executa a extensão. O ficheiro de imagem estático tem de ser exposto como um recurso Web, para que funcione corretamente.
É adicionada outra entrada no manifest.json
ficheiro para declarar que a imagem está disponível para todos os separadores do browser:
/manifest.json
(porção):
"web_accessible_resources": [
{
"resources": ["images/*.jpeg"],
"matches": ["<all_urls>"]
}
]
O código no popup.js
ficheiro envia uma mensagem para a página de conteúdo incorporada na página do separador ativo atual.
Como os recursos são listados no manifesto (manifest.json
)
O exemplo cria e injeta a página de conteúdo incorporada na página do separador ativo atual.
manifest.json
inclui o content-scripts
e web_accessible_resources
, da seguinte forma:
/manifest.json
(concluído):
{
"name": "Picture inserter using content script",
"version": "0.0.0.1",
"manifest_version": 3,
"description": "A browser extension that uses JavaScript to insert an image at the top of the current webpage.",
"icons": {
"16": "icons/extension-icon16x16.png",
"32": "icons/extension-icon32x32.png",
"48": "icons/extension-icon48x48.png",
"128": "icons/extension-icon128x128.png"
},
"action": {
"default_popup": "popup/popup.html"
},
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": ["content-scripts/content.js"]
}
],
"web_accessible_resources": [
{
"resources": ["images/*.jpeg"],
"matches": ["<all_urls>"]
}
]
}
A secção do manifesto injeta JavaScript em todos os separadores do content_scripts
browser
content_scripts
Na secção de chave do ficheiro de manifesto, o atributo está definido como <all_urls>
, o matches
que significa que .js
os ficheiros (ou .css
) especificados na secção de chave são injetados em content_scripts
todas as páginas de separador do browser quando cada separador é carregado. Os tipos de ficheiro permitidos que podem ser injetados são JavaScript (.js
) e CSS (.css
).
O manifesto deste exemplo especifica um único script de conteúdo, content-scripts/content.js
.
Cada script de conteúdo é executado no seu próprio thread, em sandbox
Cada página de separador (e extensão) é executada no seu próprio thread. Mesmo que o separador do browser contenha uma página Web que execute código JavaScript, o content.js
script que é injetado nesse separador do browser pela extensão não tem acesso a esse código JavaScript. O script de conteúdo injetado só tem acesso ao DOM da página Web.
Próximas etapas
Para desenvolver a sua própria extensão do Microsoft Edge, pode copiar e modificar o diretório do exemplo e instalar e testar a extensão resultante.
Confira também
- Exemplo: página Web de pop-up do visualizador de imagens
- Fazer sideload de uma extensão para a instalar e testar localmente
GitHub:
-
Repositório MicrosoftEdge-Extensions .
- /picture-inserter-content-script/ - código fonte deste exemplo.