2010-10-22 17 views
9

Estoy intentando bloquear un archivo de script para que no se cargue en sitios web definidos por el usuario. Para bloquear un archivo de script, estoy usando beforeload event y event.preventDefault(); en el script de contenido, que funciona bien siempre y cuando ya conozca la lista de sitios web. Mi problema es que no conozco la lista de sitios web por adelantado, por lo que para obtener la lista de sitios web, estoy enviando una solicitud a la página de fondo, pero la respuesta es asincrónica e inutilizable.mensaje síncrono que pasa en las extensiones de cromo?

¿Hay algún mensaje síncrono que pase las extensiones de Chrome que posiblemente haya omitido en los documentos de Google?

// my (simplified) code from content script: 
document.addEventListener("beforeload", function(event) 
{ 
    chrome.extension.sendRequest({fnc:"is_owner"}, function(response) 
    { 
    // asynchronous response is not usable because 
    // all scripts have already been loaded 
    if (response.is_owner) event.preventDefault(); 
    }); 
}, true); 
+1

Otro [informe de problema] (https://code.google.com/p/chromium/issues/detail?id=135095&thanks=135095&ts=1340923674) del mismo problema –

Respuesta

6

Lamentablemente no es así. Hay un bug report abierto acerca de la falta de mensajes sincrónicos, tal vez si suficientes personas lo protagonizan harán algo al respecto.

+0

Gracias por el enlace, lo miré. –

+0

El problema se ha cerrado como WontFix :( – cprcrack

1

Puede usar la API de archivos HTML5 (navigator.webkitTemporaryStorage o la ventana obsoleta más antigua.webkitStorageInfo con la opción TEMPORARY) para almacenar configuraciones en un archivo. Esta parte es asíncrona, pero puede hacerlo desde el fondo o desde la página de opciones o ventana emergente. Esta API puede cambiar en ti ya que aún no está estandarizada. Debido a que es un almacenamiento temporal, es posible que su página de fondo deba ejecutarse persistentemente para evitar que Chrome elimine el archivo.

Luego, desde su secuencia de comandos de contenido, puede usar XMLHttpRequest sincrónico para obtener el archivo de "filesystem:" + chrome.extension.getURL ("temporary /" + filename). El prefijo "filesystem:" en la url es bastante importante.

La mejor opción es utilizar la API chrome.storage (o localStorage) para su configuración y enganchar el evento onChanged para actualizar el archivo temporal. Si necesita volver a cargar la página después de cambiar una configuración, querrá hacer eso en la devolución de llamada de la operación de escritura FileSystem para que sepa que el script de contenido puede ver el cambio.

No requiere ningún permiso especial en el manifiesto. Personalmente he probado esto en Chrome 35, pero sé que también funcionó en versiones anteriores. Sin embargo, no conozco el requisito de la versión mínima. Recuerdo haber visto mencionar una regresión relacionada con el cambio de seguridad en Chrome 33, donde no funcionó, pero se solucionó rápidamente.

He visto algunas otras soluciones (por ejemplo, redirigir a blob url o datos uri desde onBeforeWebRequest) para obtener configuraciones en secuencias de comandos de contenido antes de que se ejecuten las secuencias de comandos de la página, pero hasta donde sé han sido todas intencionalmente roto en las versiones recientes de Chrome debido a XSS general y mejoras de seguridad de extensión.

+0

según su leal saber y entender, ¿sigue siendo una solución viable? –

Cuestiones relacionadas