javascript - plugin - Mensaje síncrono que pasa en las extensiones de Chrome
javascript extension chrome (2)
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.
¿Hay algún mensaje síncrono que pase en 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);
Desafortunadamente no hay. Se ha abierto un informe de error acerca de la falta de mensajes sincrónicos, tal vez si suficientes personas lo protagonizan, hagan algo al respecto.
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 asincrónica, 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 script 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 usar 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 funcionaba, pero se solucionó rápidamente.
He visto algunas otras soluciones (por ejemplo, redireccionar a blob url o uri de datos 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é, todas se han roto intencionalmente en versiones recientes de Chrome debido a XSS general y mejoras de seguridad de extensión.