Criar um tutorial de extensão, parte 2
Para ver a fonte de pacote de extensão concluída para esta parte do tutorial, acesse MicrosoftEdge-Extensions repo > extension-getting-started-part2.
O código-fonte foi atualizado do Manifesto V2 para o Manifesto V3.
Este tutorial aborda as seguintes tecnologias de extensão:
- Injetando bibliotecas JavaScript em uma extensão.
- Expondo ativos de extensão às guias do navegador.
- Incluindo páginas de conteúdo em guias de navegador existentes.
- Fazer com que as páginas de conteúdo ouçam mensagens de pop-ups e respondam.
Você aprenderá a atualizar seu menu pop-up para substituir sua imagem de estrelas estáticas por um título e um botão HTML padrão. Esse botão, quando selecionado, passa essa imagem de estrelas para a página de conteúdo. Essa imagem agora está inserida na extensão e inserida na guia navegador ativo. Aqui estão as etapas.
Essas etapas exigem que você conclua as etapas para as etapas iniciais do pacote de extensão. Para o tutorial, acesse MicrosoftEdge-Extensions repo > extension-getting-started-part1.
Etapa 1: atualizar pop-up.html para incluir um botão
Na pasta pop-up em que você criou o popup.html
arquivo a partir da parte inicial do tutorial, você adicionará a marcação que exibe um título com um botão. Posteriormente, você programará esse botão em uma etapa diferente, mas por enquanto inclui uma referência a um arquivo popup.js
JavaScript vazio.
Veja abaixo um arquivo HTML atualizado por exemplo:
<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>Display the NASA picture of the day</h1>
<h2>(select the image to remove)</h2>
<button id="sendmessageid">Display</button>
<script src="popup.js"></script>
</body>
</html>
Depois de atualizar e abrir a extensão, um pop-up será aberto com um botão de exibição.
Etapa 2: atualizar popup.html para exibir a imagem na parte superior da guia do navegador
Depois de adicionar o botão, a próxima tarefa é fazer com que ele traga o images/stars.jpeg
arquivo de imagem na parte superior da página da guia ativa.
Cada página de guia (e extensão) é executada em seu próprio thread. Crie um script de conteúdo que seja injetado na página de guias. Em seguida, envie uma mensagem do pop-up para esse script de conteúdo em execução na página de guias. O script de conteúdo receberá a mensagem, que descreve qual imagem deve ser exibida.
Etapa 3: criar o JavaScript pop-up para enviar uma mensagem
Crie o popup/popup.js
arquivo e adicione o código para enviar uma mensagem ao script de conteúdo ainda não criado que você deve criar e injetar momentaneamente na guia do navegador. Para fazer isso, o código a seguir adiciona um onclick
evento ao botão de exibição pop-up:
const sendMessageId = document.getElementById("sendmessageid");
if (sendMessageId) {
sendMessageId.onclick = function() {
// do something
};
}
onclick
No evento, localize a guia navegador atual. Em seguida, use a chrome.tabs.sendmessage
API de Extensão para enviar uma mensagem para essa guia.
Nessa mensagem, você deve incluir a URL na imagem que deseja exibir. Certifique-se de enviar uma ID exclusiva para atribuir à imagem inserida.
Para enviar uma ID exclusiva para atribuir à imagem inserida, algumas abordagens diferentes são possíveis:
- Abordagem 1: deixe a inserção de conteúdo JavaScript gerar essa ID de imagem. Não usaremos essa abordagem aqui, por razões que se tornam aparentes mais tarde.
- Abordagem 2: gere essa ID exclusiva aqui no e, em
popup.js
seguida, passe essa ID para o script de conteúdo ainda não criado. Usaremos essa abordagem.
O código a seguir descreve o código atualizado em popup/popup.js
. Você também passa a ID da guia atual, que é usada posteriormente neste artigo:
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: `${guidGenerator()}`,
tabId: tabs[0].id
},
function(response) {
window.close();
}
);
function guidGenerator() {
const S4 = function () {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
};
return (S4() + S4() + "-" + S4() + "-" + S4() + "-" + S4() + "-" + S4() + S4() + S4());
}
});
};
}
Etapa 4: disponibilizá-lo stars.jpeg
em qualquer guia do navegador
Para disponibilizar images/stars.jpeg
em qualquer guia do navegador, você deve usar a chrome.runtime.getURL
API.
Observação: se você estiver usando o Manifesto V2, em vez disso, use chrome.extension.getURL
. Esse prefixo extra é retornado com getURL
a imagem anexada e se parece com o seguinte: httpextension://inigobacliaghocjiapeaaoemkjifjhp/images/stars.jpeg
O motivo é que você está injetando a imagem usando o src
atributo do img
elemento na página de conteúdo. A página de conteúdo está em execução em um thread exclusivo que não é o mesmo que o thread que executa a Extensão. Você deve expor o arquivo de imagem estático como um ativo Web para que ele funcione corretamente.
Adicione outra entrada no manifest.json
arquivo para declarar que a imagem está disponível para todas as guias do navegador. Essa entrada é a seguinte (você deve vê-la no arquivo completo manifest.json
abaixo ao adicionar a declaração de script de conteúdo que está chegando):
"web_accessible_resources": [
{
"resources": ["images/*.jpeg"],
"matches": ["<all_urls>"]
}
]
Você já escreveu o código em seu popup.js
arquivo para enviar uma mensagem para a página de conteúdo inserida na página da guia ativa atual, mas você não criou e injetou essa página de conteúdo. Faça isso agora.
Etapa 5: atualizar seu manifest.json
para novo conteúdo e acesso à Web
A atualização manifest.json
que inclui o e web_accessible_resources
é a content-scripts
seguinte:
{
"name": "NASA picture of the day viewer",
"version": "0.0.0.1",
"manifest_version": 3,
"description": "An extension to display the NASA picture of the day.",
"icons": {
"16": "icons/nasapod16x16.png",
"32": "icons/nasapod32x32.png",
"48": "icons/nasapod48x48.png",
"128": "icons/nasapod128x128.png"
},
"action": {
"default_popup": "popup/popup.html"
},
"content_scripts": [
{
"matches": [
"<all_urls>"
],
"js": ["lib/jquery.min.js","content-scripts/content.js"]
}
],
"web_accessible_resources": [
{
"resources": ["images/*.jpeg"],
"matches": ["<all_urls>"]
}
]
}
O matches
atributo é definido como <all_urls>
, o que significa que todos os arquivos em são injetados em content_scripts
todas as páginas da guia do navegador quando cada guia é carregada. Os tipos de arquivos permitidos que podem ser injetados são JavaScript e CSS. Você também adicionou lib\jquery.min.js
. Você pode incluir isso no download mencionado na parte superior da seção.
Adicionar jQuery
Nos scripts de conteúdo que você está injetando, planeje o uso de jQuery ($
). Você adicionou uma versão minificada do jQuery e a colocou em seu pacote de extensão como lib\jquery.min.js
. Esses scripts de conteúdo são executados em áreas restritas individuais, o que significa que o jQuery injetado na popup.js
página não é compartilhado com o conteúdo.
Entendendo o Thread
Tenha em mente que, mesmo que a guia do navegador tenha JavaScript em execução na página da Web carregada, qualquer conteúdo injetado não terá acesso a esse JavaScript. O JavaScript injetado só tem acesso ao DOM real carregado nessa guia do navegador.
Etapa 6: Adicionar o ouvinte de mensagens de script de conteúdo
Aqui está o content-scripts\content.js
arquivo que é injetado em cada página de guia do navegador com base em sua manifest.json
content-scripts
seção:
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
$("body").prepend(
`<img src="${request.url}" id="${request.imageDivId}"
class="slide-image" /> `
);
$("head").prepend(
`<style>
.slide-image {
height: auto;
width: 100vw;
}
</style>`
);
$(`#${request.imageDivId}`).click(function() {
$(`#${request.imageDivId}`).remove(`#${request.imageDivId}`);
});
sendResponse({ fromcontent: "This message is from content.js" });
});
Observe que todo o JavaScript acima faz é registrar um listener
usando o chrome.runtime.onMessage.addListener
método de API de Extensão. Esse ouvinte aguarda mensagens como a que você enviou do popup.js
descrito anteriormente com o método de API de chrome.tabs.sendMessage
Extensão.
O primeiro parâmetro do addListener
método é uma função cujo primeiro parâmetro, a solicitação, são os detalhes da mensagem que está sendo passada. Lembre-se, de popup.js
, quando você usou o sendMessage
método, esses atributos do primeiro parâmetro são url
e imageDivId
.
Quando um evento é processado pelo ouvinte, a função que é o primeiro parâmetro é executada. O primeiro parâmetro dessa função é um objeto que tem atributos conforme atribuído por sendMessage
. Essa função simplesmente processa as três linhas de script jQuery.
A primeira linha de script acrescenta um
img
elemento logo abaixo dabody
guia do navegador que tem aslide-image
classe atribuída, bem como aimageDivId
ID desse elemento de imagem.A segunda linha de script insere dinamicamente no cabeçalho DOM uma <seção de estilo> que você deve atribuir como uma
slide-image
classe ao seuimg
elemento.A terceira linha de script adiciona um
click
evento que abrange toda a imagem, permitindo que o usuário selecione em qualquer lugar da imagem e essa imagem seja removida da página (juntamente com ela é ouvinte de eventos).
- Adicionar funcionalidade para remover a imagem exibida quando selecionado
Agora, quando você navega até qualquer página e seleciona o ícone Extensão , o menu pop-up é exibido da seguinte maneira:
Ao selecionar o Display
botão, você obtém o que está abaixo. Se você selecionar em qualquer lugar da imagem, esse stars.jpeg
elemento de imagem será removido e as páginas da guia retornarão ao que foi exibido originalmente:
Parabéns! Você criou uma Extensão que envia com êxito uma mensagem do ícone de extensão pop-up e inseriu dinamicamente o JavaScript em execução como conteúdo na guia navegador. O conteúdo injetado define o elemento de imagem para exibir seu arquivo de estrelas .jpeg
estáticas.