Crear un tutorial de extensión, parte 2
Para ver el origen del paquete de extensión completado para esta parte del tutorial, vaya a Extensión del repositorio > MicrosoftEdge-Extensions-getting-started-part2.
En este tutorial se tratan las siguientes tecnologías de extensión:
- Inserción de bibliotecas de JavaScript en una extensión.
- Exposición de recursos de extensión a pestañas del explorador.
- Incluir páginas de contenido en pestañas de explorador existentes.
- Hacer que las páginas de contenido escuchen los mensajes de los elementos emergentes y respondan.
Aprenderá a actualizar el menú emergente para reemplazar la imagen de estrellas estáticas por un título y un botón HTML estándar. Ese botón, cuando se selecciona, pasa esa imagen de estrellas a la página de contenido. Esta imagen ahora se inserta en la extensión y se inserta en la pestaña del explorador activo. Estos son los pasos.
Estos pasos requieren que complete los pasos iniciales del paquete de extensión, en el tutorial Creación de una extensión, parte 1.
Paso 1: Actualizar pop-up.html para incluir un botón
En la carpeta emergente donde creó el popup.html
archivo, hará lo siguiente:
- Agregue el etiquetado que muestra un título con un botón.
- Incluya una referencia a un archivo
popup.js
JavaScript vacío. - Programe ese botón.
A continuación se muestra un archivo HTML actualizado de ejemplo:
<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>
Después de actualizar y abrir la extensión, se abre un elemento emergente con un botón para mostrar:
Paso 2: Actualizar popup.html para mostrar la imagen en la parte superior de la pestaña del explorador
Después de agregar el botón, la siguiente tarea consiste en hacer que aparezca el images/stars.jpeg
archivo de imagen en la parte superior de la página de pestaña activa.
Cada página de tabulación (y extensión) se ejecuta en su propio subproceso. Cree un script de contenido que se inserte en la página de tabulación. A continuación, envíe un mensaje desde el elemento emergente a ese script de contenido que se ejecuta en la página de pestaña. El script de contenido recibirá el mensaje, que describe qué imagen se debe mostrar.
Paso 3: Crear el javaScript emergente para enviar un mensaje
Cree el popup/popup.js
archivo y agregue código para enviar un mensaje al script de contenido no creado aún que debe crear e insertar momentáneamente en la pestaña del explorador. Para ello, el código siguiente agrega un onclick
evento al botón mostrar emergente:
const sendMessageId = document.getElementById("sendmessageid");
if (sendMessageId) {
sendMessageId.onclick = function() {
// do something
};
}
En el onclick
evento , busque la pestaña del explorador actual. A continuación, use la chrome.tabs.sendmessage
API de extensión para enviar un mensaje a esa pestaña.
En ese mensaje, debe incluir la dirección URL de la imagen que desea mostrar. Asegúrese de enviar un identificador único para asignarlo a la imagen insertada.
Para enviar un identificador único para asignar a la imagen insertada, es posible un par de enfoques diferentes:
- Enfoque 1: permita que la inserción de contenido de JavaScript genere ese identificador de imagen. No usaremos ese enfoque aquí, por razones que se vuelven evidentes más adelante.
- Enfoque 2: genere ese identificador único aquí en
popup.js
y, a continuación, pase ese identificador al script de contenido que aún no se ha creado. Usaremos este enfoque.
En el código siguiente se describe el código actualizado en popup/popup.js
. También se pasa el identificador de pestaña actual, que se usará más adelante en este artículo:
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());
}
});
};
}
Paso 4: Hacer que esté stars.jpeg
disponible desde cualquier pestaña del explorador
Para que esté images/stars.jpeg
disponible desde cualquier pestaña del explorador, debe usar la chrome.runtime.getURL
API.
Nota: Si usa Manifiesto V2, use chrome.extension.getURL
en su lugar . Ese prefijo adicional lo devuelve getURL
con la imagen adjunta y tiene un aspecto similar al siguiente: httpextension://inigobacliaghocjiapeaaoemkjifjhp/images/stars.jpeg
El motivo es que va a insertar la imagen mediante el src
atributo del img
elemento en la página de contenido. La página de contenido se ejecuta en un subproceso único que no es el mismo que el subproceso que ejecuta la extensión. Debe exponer el archivo de imagen estática como un recurso web para que funcione correctamente.
Agregue otra entrada en el manifest.json
archivo para declarar que la imagen está disponible para todas las pestañas del explorador. Esa entrada es la siguiente (debería verla en el archivo completo manifest.json
siguiente cuando agregue la declaración de script de contenido que aparece):
"web_accessible_resources": [
{
"resources": ["images/*.jpeg"],
"matches": ["<all_urls>"]
}
]
Ahora ha escrito el código en popup.js
el archivo para enviar un mensaje a la página de contenido que está incrustada en la página de pestaña activa actual, pero no ha creado ni insertado esa página de contenido. Hazlo ahora.
Paso 5: Actualización del manifest.json
nuevo contenido y acceso web
La actualización manifest.json
que incluye y web_accessible_resources
es la content-scripts
siguiente:
{
"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>"]
}
]
}
El matches
atributo se establece <all_urls>
en , lo que significa que todos los archivos de se insertan en content_scripts
todas las páginas de pestaña del explorador cuando se carga cada pestaña. Los tipos de archivos permitidos que se pueden insertar son JavaScript y CSS. También agregó lib\jquery.min.js
. Puede incluirlo en la descarga mencionada en la parte superior de la sección.
Agregar jQuery
En los scripts de contenido que va a insertar, planee el uso de jQuery ($
). Ha agregado una versión minificada de jQuery y la ha colocado en el paquete de extensión como lib\jquery.min.js
. Estos scripts de contenido se ejecutan en espacios aislados individuales, lo que significa que jQuery insertado en la popup.js
página no se comparte con el contenido.
Descripción del subproceso
Incluso si la pestaña del explorador tiene JavaScript en ejecución en la página web cargada, cualquier contenido insertado no tiene acceso a ese JavaScript. JavaScript insertado solo tiene acceso al DOM real que se carga en esa pestaña del explorador.
Paso 6: Agregar el agente de escucha del mensaje de script de contenido
Este es el content-scripts\content.js
archivo que se inserta en cada página de pestaña del explorador en función de la manifest.json
content-scripts
sección:
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" });
});
Tenga en cuenta que lo único que hace javaScript anterior es registrar mediante listener
el método de la chrome.runtime.onMessage.addListener
API de extensión. Este agente de escucha espera mensajes como el que envió desde el popup.js
descrito anteriormente con el chrome.tabs.sendMessage
método de la API de extensión.
El primer parámetro del addListener
método es una función cuyo primer parámetro, request, es los detalles del mensaje que se pasa. Recuerde que, desde popup.js
, cuando usó el sendMessage
método , esos atributos del primer parámetro son url
y imageDivId
.
Cuando el agente de escucha procesa un evento, se ejecuta la función que es el primer parámetro. El primer parámetro de esa función es un objeto que tiene atributos asignados por sendMessage
. Esa función simplemente procesa las tres líneas de script de jQuery.
La primera línea de script anexa un
img
elemento justo debajo de labody
pestaña del explorador que tiene laslide-image
clase asignada, así como elimageDivId
identificador de ese elemento de imagen.La segunda línea de script inserta dinámicamente en el encabezado DOM una <sección de estilo> que debe asignar como clase
slide-image
alimg
elemento.La tercera línea de script agrega un
click
evento que cubre toda la imagen, lo que permite al usuario seleccionar en cualquier lugar de la imagen y esa imagen se quita de la página (junto con ella es agente de escucha de eventos).
- Agregar funcionalidad para quitar la imagen mostrada cuando se selecciona
Ahora, cuando vaya a cualquier página y seleccione el icono De extensión , el menú emergente se muestra de la siguiente manera:
Al seleccionar el Display
botón, obtendrá lo que se muestra a continuación. Si selecciona en cualquier lugar de la stars.jpeg
imagen, ese elemento de imagen se quita y las páginas de tabulación se contraen a lo que se mostró originalmente:
Enhorabuena. Ha creado una extensión que envía correctamente un mensaje desde la ventana emergente del icono de extensión e inserta dinámicamente JavaScript que se ejecuta como contenido en la pestaña del explorador. El contenido insertado establece el elemento de imagen para mostrar el archivo de estrellas .jpeg
estáticas.
Vea también
- Creación de un tutorial de extensión, parte 1
- Extensión del repositorio > MicrosoftEdge-Extensions-getting-started-part2 : el origen del paquete de extensión completado para la parte 2 del tutorial.