Envío de mensaje desde un script en segundo plano a un script de contenido y luego a un script inyectado
Problema:
A pesar de intentar enviar mensajes desde la página en segundo plano a un script de contenido y luego a un script inyectado, el proceso no funcionó según lo previsto. La secuencia de comandos de contenido no puede recibir mensajes de la secuencia de comandos en segundo plano.
Solución:
El problema surge de la manera en que se inyectan las secuencias de comandos de contenido. Cuando se carga una extensión, no inyecta automáticamente secuencias de comandos de contenido en las pestañas existentes. La inyección solo ocurre cuando se crea una nueva pestaña o se navega por una pestaña existente después de cargar la extensión.
Solución 1: Inyección de script condicional
Para garantizar la comunicación entre el fondo y el contenido scripts, se puede emplear una inyección de script condicional. El script en segundo plano puede verificar si la pestaña está lista para recibir mensajes e inyectar el script de contenido solo si aún no está inyectado.
Código:
// Background script
function ensureSendMessage(tabId, message, callback) {
chrome.tabs.sendMessage(tabId, { ping: true }, function (response) {
if (response && response.pong) { // Content script ready
chrome.tabs.sendMessage(tabId, message, callback);
} else { // No listener on the other end
chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError);
throw Error("Unable to inject script into tab " tabId);
}
// OK, now it's injected and ready
chrome.tabs.sendMessage(tabId, message, callback);
});
}
});
}
Script de contenido:
chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
if (request.ping) {
sendResponse({ pong: true });
return;
}
// Content script action
});
Solución 2: Prevención de doble ejecución
Otra solución implica inyectar el script de contenido en la pestaña pero implementar medidas para evitar su ejecución más de una vez.
Código:
// Background script
function ensureSendMessage(tabId, message, callback) {
chrome.tabs.executeScript(tabId, { file: "content_script.js" }, function () {
if (chrome.runtime.lastError) {
console.error(chrome.runtime.lastError);
throw Error("Unable to inject script into tab " tabId);
}
// OK, now it's injected and ready
chrome.tabs.sendMessage(tabId, message, callback);
});
}
Script de contenido:
var injected;
if (!injected) {
injected = true;
// Your toplevel code
}
Solución 3: Inyección indiscriminada de scripts
Por último, puede optar por inyectar el script de contenido en todas las pestañas al inicializar la extensión. Esto solo es recomendable si su secuencia de comandos no interfiere consigo misma cuando se ejecuta varias veces o después de que la página se haya cargado.
Código:
chrome.tabs.query({}, function (tabs) {
for (var i in tabs) {
// Filter by URL if needed
chrome.tabs.executeScript(tabs[i].id, { file: "content_script.js" }, function () {
// Now you can use normal messaging
});
}
});
Una vez implementada cualquiera de estas soluciones, los mensajes se pueden transmitir exitosamente desde el script en segundo plano al script de contenido y, finalmente, al script inyectado.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3