9

Estoy haciendo una extensión de Chrome que abrirá todos los enlaces en una página en pestañas nuevas.Content-Security-Policy error en google chrome extension making

Éstos son mis archivos de código:

manifest.json

{ 
    "name": "A browser action which changes its icon when clicked.", 
    "version": "1.1", 
    "permissions": [ 
    "tabs", "<all_urls>" 
    ], 
"browser_action": {  
    "default_title": "links",  // optional; shown in tooltip 
    "default_popup": "popup.html"  // optional 
    }, 
"content_scripts": [ 
    { 
    "matches": [ "<all_urls>" ], 
     "js": ["background.js"] 
    } 
    ], 
    "manifest_version": 2 
} 

popup.html

<!doctype html> 
<html> 
    <head> 
    <title>My Awesome Popup!</title> 
    <script> 
function getPageandSelectedTextIndex() 
    { 
    chrome.tabs.getSelected(null, function(tab) { 
    chrome.tabs.sendRequest(tab.id, {greeting: "hello"}, function (response) 
    { 
     console.log(response.farewell); 
    }); 
    }); 
     } 
chrome.browserAction.onClicked.addListener(function(tab) { 
     getPageandSelectedTextIndex(); 
}); 
     </script> 
    </head> 
    <body> 
    <button onclick="getPageandSelectedTextIndex()"> 
     </button> 
    </body> 
</html> 

background.js

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) { 
    console.log(sender.tab ? 
       "from a content script:" + sender.tab.url : 
       "from the extension"); 
    if (request.greeting == "hello") 
    updateIcon(); 

}); 
function updateIcon() { 
    var allLinks = document.links; 
    for (var i=0; i<allLinks.length; i++) { 
    alllinks[i].style.backgroundColor='#ffff00'; 

} 
} 

Inicialmente quería resaltar todo los enlaces en t él los pagina o los marca de alguna manera; pero recibo el error "Se negó a ejecutar el script en línea debido a Content-Security-Policy".

Cuando presiono el botón dentro de la ventana emergente, aparece este error: Refused to execute inline event handler because of Content-Security-Policy.

Por favor, ayúdame a corregir estos errores, así puedo abrir todos los enlaces en pestañas nuevas usando mi extensión de cromo.

Respuesta

18

Una de las consecuencias de "manifest_version": 2 es que Content Security Policy está habilitado de manera predeterminada. Y los desarrolladores de Chrome optaron por ser estrictos al respecto y siempre desaprobaron el código JavaScript en línea; solo el código colocado en un archivo JavaScript externo puede ejecutarse (para evitar el Cross-Site Scripting vulnerabilities en extensiones). Así que en lugar de definir getPageandSelectedTextIndex() función en popup.html usted debe ponerlo en un archivo popup.js e incluirlo en popup.html:

<script type="text/javascript" src="popup.js"></script> 

Y <button onclick="getPageandSelectedTextIndex()"> tiene que ser cambiado, así, onclick atributo es también una secuencia de comandos en línea. Debería asignar un atributo de ID en su lugar: <button id="button">. Luego, en popup.js, puede adjuntar un controlador de eventos a ese botón:

window.addEventListener("load", function() 
{ 
    document.getElementById("button") 
      .addEventListener("click", getPageandSelectedTextIndex, false); 
}, false); 
+0

Just beat me to it. La respuesta perfecta y es exactamente lo que necesitas hacer. – Alasdair

+0

k gracias ... lo intentaré – Saad

+0

Esto es tan estúpido. ¡¿Quién propuso esta idea?! Ahora tengo que cambiar todos mis onclicks en línea y ponerlos en un archivo js externo. Y tengo un montón de archivos que los incluyen. –

Cuestiones relacionadas