Estoy intentando acceder al contenido DOM de activeTab desde mi ventana emergente. Aquí está mi manifiesto:
{
"manifest_version": 2,
"name": "Test",
"description": "Test script",
"version": "0.1",
"permissions": [
"activeTab",
"https://api.domain.com/"
],
"background": {
"scripts": ["background.js"],
"persistent": false
},
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"browser_action": {
"default_icon": "icon.png",
"default_title": "Chrome Extension test",
"default_popup": "index.html"
}
}
Estoy realmente confundido si los scripts en segundo plano (páginas de eventos con persistencia: falso) o content_scripts son el camino a seguir. He leído toda la documentación y otras publicaciones de SO y todavía no tiene sentido para mí.
¿Alguien puede explicar por qué podría usar uno sobre el otro?
Aquí está el background.js que he estado probando:
chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
// LOG THE CONTENTS HERE
console.log(request.content);
}
);
Y solo estoy ejecutando esto desde la consola emergente:
chrome.tabs.getSelected(null, function(tab) {
chrome.tabs.sendMessage(tab.id, { }, function(response) {
console.log(response);
});
});
Me estoy poniendo:
Port: Could not establish connection. Receiving end does not exist.
ACTUALIZAR:
{
"manifest_version": 2,
"name": "test",
"description": "test",
"version": "0.1",
"permissions": [
"tabs",
"activeTab",
"https://api.domain.com/"
],
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
],
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"browser_action": {
"default_icon": "icon.png",
"default_title": "Test",
"default_popup": "index.html"
}
}
content.js
chrome.extension.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.text && (request.text == "getDOM")) {
sendResponse({ dom: document.body.innerHTML });
}
}
);
popup.html
chrome.tabs.getSelected(null, function(tab) {
chrome.tabs.sendMessage(tab.id, { action: "getDOM" }, function(response) {
console.log(response);
});
});
Cuando lo ejecuto, sigo recibiendo el mismo error:
undefined
Port: Could not establish connection. Receiving end does not exist. lastError:30
undefined
fuente
chrome.runtime.sendMessage
envía mensajes a BackgroundPage y a Popups.chrome.tabs.sendMessage
envía mensajes a ContentScripts.No es necesario que utilice el paso de mensajes para obtener o modificar DOM. Usé en su
chrome.tabs.executeScript
lugar. En mi ejemplo, estoy usando solo el permiso activeTab, por lo tanto, el script se ejecuta solo en la pestaña activa.parte de manifest.json
index.html
test.js
fuente
activeTab
permiso es inexacta. Claramente está obteniendo<all_urls>
además deactiveTab
.Para aquellos que probaron la respuesta de gkalpak y no funcionó,
Tenga en cuenta que Chrome agregará el script de contenido a una página necesaria solo cuando su extensión esté habilitada durante el inicio de Chrome y también es una buena idea reiniciar el navegador después de realizar estos cambios.
fuente