Criar um tutorial de extensão, parte 2
Para ver a origem do pacote de extensão concluída para esta parte do tutorial, aceda a MicrosoftEdge-Extensions repo > extension-getting-started-part2.
Este tutorial abrange as seguintes tecnologias de extensão:
- Injetar bibliotecas JavaScript numa extensão.
- Expor recursos de extensão a separadores do browser.
- Incluindo páginas de conteúdo nos separadores do browser existentes.
- Fazer com que as páginas de conteúdo ouçam mensagens de pop-ups e respondam.
Irá aprender a atualizar o menu de pop-up para substituir a imagem de estrelas estáticas por um título e um botão HTML padrão. Esse botão, quando selecionado, transmite essa imagem de estrelas para a página de conteúdo. Esta imagem está agora incorporada na extensão e inserida no separador ativo do browser. Eis os passos.
Estes passos requerem que conclua os passos iniciais do pacote de extensão, em Criar um tutorial de extensão, parte 1.
Passo 1: Atualizar pop-up.html para incluir um botão
Na pasta de pop-up onde criou o popup.html
ficheiro, fará o seguinte:
- Adicione etiquetas que apresentem um título com um botão.
- Inclua uma referência a um ficheiro
popup.js
JavaScript vazio. - Programe esse botão.
Segue-se um ficheiro HTML atualizado de 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, é aberto um pop-up com um botão de visualização:
Passo 2: Atualizar popup.html para apresentar a imagem na parte superior do separador do browser
Depois de adicionar o botão, a tarefa seguinte é fazê-lo apresentar o images/stars.jpeg
ficheiro de imagem na parte superior da página do separador ativo.
Cada página de separador (e extensão) é executada no seu próprio thread. Crie um script de conteúdo que seja injetado na página de separador. Em seguida, envie uma mensagem do seu pop-up para esse script de conteúdo em execução na página de separador. O script de conteúdo receberá a mensagem, que descreve a imagem que deve ser apresentada.
Passo 3: Criar o JavaScript de pop-up para enviar uma mensagem
Crie o popup/popup.js
ficheiro e adicione código para enviar uma mensagem para o script de conteúdo ainda não criado que tem de criar e injetar momentaneamente no separador do browser. Para tal, o código seguinte adiciona um onclick
evento ao botão de apresentação de pop-up:
const sendMessageId = document.getElementById("sendmessageid");
if (sendMessageId) {
sendMessageId.onclick = function() {
// do something
};
}
onclick
No evento, localize o separador atual do browser. Em seguida, utilize a chrome.tabs.sendmessage
API de Extensão para enviar uma mensagem para esse separador.
Nessa mensagem, tem de incluir o URL na imagem que pretende apresentar. Certifique-se de que envia um ID exclusivo para atribuir à imagem inserida.
Para enviar um ID exclusivo para atribuir à imagem inserida, são possíveis algumas abordagens diferentes:
- Abordagem 1: Permitir que o JavaScript de inserção de conteúdo gere esse ID de imagem. Não vamos utilizar esta abordagem aqui, por razões que se tornam evidentes mais tarde.
- Abordagem 2: gere esse ID exclusivo aqui no e, em
popup.js
seguida, transmita esse ID para o script de conteúdo ainda não criado. Vamos utilizar esta abordagem.
O código seguinte descreve o código atualizado em popup/popup.js
. Também transmite o ID do separador atual, que é utilizado mais adiante 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());
}
});
};
}
Passo 4: Disponibilizar a partir stars.jpeg
de qualquer separador do browser
Para disponibilizar images/stars.jpeg
a partir de qualquer separador do browser, tem de utilizar a chrome.runtime.getURL
API.
Nota: se estiver a utilizar o Manifesto V2, utilize chrome.extension.getURL
. Esse prefixo adicional é devolvido com getURL
a imagem anexada e tem um aspeto semelhante ao seguinte: httpextension://inigobacliaghocjiapeaaoemkjifjhp/images/stars.jpeg
O motivo é que está a injetar 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. Tem de expor o ficheiro de imagem estática como um recurso Web para que funcione corretamente.
Adicione outra entrada no manifest.json
ficheiro para declarar que a imagem está disponível para todos os separadores do browser. Essa entrada é a seguinte (deverá vê-la no ficheiro completo manifest.json
abaixo quando adicionar a declaração de script de conteúdo a seguir):
"web_accessible_resources": [
{
"resources": ["images/*.jpeg"],
"matches": ["<all_urls>"]
}
]
Agora, escreveu o código no ficheiro popup.js
para enviar uma mensagem para a página de conteúdo incorporada na página do separador ativo atual, mas ainda não criou e injetou essa página de conteúdo. Faça-o agora.
Passo 5: Atualizar o seu manifest.json
para novos conteúdos 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 está definido como <all_urls>
, o que significa que todos os ficheiros no 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 e CSS. Também adicionou lib\jquery.min.js
. Pode incluí-lo a partir da transferência mencionada na parte superior da secção.
Adicionar jQuery
Nos scripts de conteúdo que está a injetar, planeie utilizar jQuery ($
). Adicionou uma versão mínima do jQuery e colocou-a no pacote de extensão como lib\jquery.min.js
. Estes scripts de conteúdo são executados em sandboxes individuais, o que significa que o jQuery injetado na popup.js
página não é partilhado com o conteúdo.
Compreender o tópico
Mesmo que o separador do browser tenha JavaScript em execução na página Web carregada, qualquer conteúdo que seja injetado não tem acesso a esse JavaScript. O JavaScript injetado só tem acesso ao DOM real que é carregado nesse separador do browser.
Passo 6: adicionar o serviço de escuta de mensagens de script de conteúdo
Eis o content-scripts\content.js
ficheiro que é injetado em todas as páginas de separadores do browser com base na sua manifest.json
content-scripts
secçã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" });
});
Repare que tudo o que o JavaScript acima faz é registar um listener
com o método da chrome.runtime.onMessage.addListener
API de Extensão. Este serviço de escuta aguarda mensagens como a que enviou a popup.js
partir do descrito anteriormente com o chrome.tabs.sendMessage
método da API de Extensão.
O primeiro parâmetro do addListener
método é uma função cujo primeiro parâmetro, pedido, são os detalhes da mensagem que está a ser transmitida. Lembre-se, em popup.js
, quando utilizou o sendMessage
método , esses atributos do primeiro parâmetro são url
e imageDivId
.
Quando um evento é processado pelo serviço de escuta, a função que é o primeiro parâmetro é executada. O primeiro parâmetro dessa função é um objeto que tem atributos atribuídos por sendMessage
. Essa função processa simplesmente as três linhas de script jQuery.
A primeira linha de script acrescenta um
img
elemento diretamente abaixo do separador dobody
browser que tem aslide-image
classe atribuída, bem como oimageDivId
ID desse elemento de imagem.A segunda linha de script insere dinamicamente no cabeçalho do DOM uma <secção de estilo> que tem de atribuir como uma
slide-image
classe ao seuimg
elemento.A terceira linha de script adiciona um
click
evento que abrange toda a imagem, permitindo ao utilizador selecionar qualquer parte da imagem e essa imagem é removida da página (juntamente com a mesma é o serviço de escuta de eventos).
- Adicionar funcionalidade para remover a imagem apresentada quando selecionada
Agora, quando navega para qualquer página e seleciona o ícone da Extensão , o menu de pop-up é apresentado da seguinte forma:
Quando seleciona o Display
botão, obtém o que está abaixo. Se selecionar qualquer parte da stars.jpeg
imagem, esse elemento de imagem é removido e as páginas de separador voltam ao que foi originalmente apresentado:
Parabéns! Criou uma extensão que envia com êxito uma mensagem a partir do pop-up do ícone de extensão e inseriu dinamicamente o JavaScript em execução como conteúdo no separador do browser. O conteúdo injetado define o elemento de imagem para apresentar o ficheiro de estrelas .jpeg
estáticas.
Confira também
- Criar um tutorial de extensão, parte 1
- MicrosoftEdge-Extensions repo > extension-getting-started-part2 - a origem do pacote de extensão concluída para a Parte 2 do tutorial.