¿Qué y dónde son exactamente el código privilegiado, el código de Chrome, Gecko?

Al leer acerca de la API de archivos y querer escribir datos directamente desde una base de datos indexadaDB en el disco del cliente en lugar de primero construir y mantener un gran blob en RAM para descargar en el disco, hay algunos elementos básicos que no entiendo.

En los documentos de MDN se encuentran estas dos declaraciones:

En Gecko, el código privilegiado puede crear objetos de archivo que representen cualquier archivo local sin interacción del usuario.

Si desea utilizar la API del archivo DOM en código de Chrome, puede hacerlo sin restricciones. De hecho, obtienes una característica adicional: puedes crear objetos de archivo que especifican la ruta del archivo en la computadora del usuario. Esto solo funciona desde un código privilegiado, por lo que el contenido web no puede hacerlo.

¿Dónde se escribe exactamente el código de Chrome y / o el código privilegiado de Gecko? ¿Está esto más allá de una extensión web? He leído y experimentado con extensiones; entonces, no estoy preguntando específicamente sobre cómo acceder a ellos.

No me preocupa que una página web 'normal' y un servidor accedan al disco del cliente. Sé que no está permitido proteger al individuo.

Estoy interesado en lo que se puede hacer sin conexión a través del navegador, con la ayuda de extensiones web y / o un perfil separado que otorga permisos especiales pero sin node.js, electron, etc., por un individuo que a sabiendas quiere use el navegador para hacer tal vez lo que deberían haber construido en el sistema operativo en lugar del navegador.

Puesto de otra manera, si quiero usar el navegador solo para ejecutar mi código JavaScript para realizar tareas sin conexión en mi propia máquina, ¿dónde está escrito el código privilegiado que da acceso a este tipo de API que no están sujetas a la seguridad? problemas de una página web normal?

¿Sigue siendo JavaScript o C ++ en estas áreas?

Gracias

Esta vieja pregunta proporciona un enlace a suextensió, que incluye la API de archivo que escribe en el disco de una manera que parece proporcionar un medio para evitar la creación de una gran cantidad de datos. Tiene seis años, pero parece contener lo que se necesita, al menos para comenzar.

No me estoy refiriendo a su intento de moverse usando indexedDB, pero solo que usar este tipo de extensión podría permitir escribir cada objeto de la base de datos directamente en el disco del cliente sin tener que generar primero un blob grande para descargar.

Intento de emplear la sugerencia de Andrew Swan

Estoy tratando de juntar las piezas, pero he llegado a un punto en el que no estoy seguro de cómo continuar. Escribí el código a continuación en el script de fondo de una extensión. Al intentar emplear la sugerencia de Andrew Swan, el plan es iniciar una solicitud GET para un archivo de texto / csv, que es interceptada y reemplazada por datos extraídos de la base de datos y escritos en la solicitud GET por el filtro de flujo.

Primero, haga una solicitud GET a una URL falsa y escuche la respuesta de la siguiente manera:

 let request = new XMLHttpRequest();

 request.open("GET", url );

 request.setRequestHeader( "Content-Type", "text/csv" );

 request.send(null);

 request.onreadystatechange = () =>

  {

   portFromCS.postMessage( { 'func' : 'disp_result', 'args' : { 'msg' : "request.status :", 'value' : request.status + ' : ' + request.statusText} } );

  };

n segundo lugar, intercepte la solicitud y escriba al GET de la siguiente manera:

 browser.webRequest.onBeforeRequest.addListener(

  listener,

  { urls : ["<all_urls>"] },

 ["blocking"] );


 function listener( details ) 

 { 

   let filter = browser.webRequest.filterResponseData(details.requestId);
   let decoder = new TextDecoder("utf-8");
   let encoder = new TextEncoder();

   filter.onstart = event =>

    {

      let str = decoder.decode(event.data, {stream: true});

      str = '' +
      'HTTP/1.1 200 OK \r\n' +
      'Content-Length: 17 \r\n' +
      'Content-Type: text/csv \r\n\r\n\r\n' +
      'This is a string.';


      filter.write(encoder.encode(str));

      filter.disconnect();

   };

 }

El mensaje enviado desde el script de fondo en la función request.onreadystatechange se recibe en el script de contenido, y el request.status es '0'.

The filter.onstart se usa porque el evento ondata nunca se activará ya que la url es falsa. Además, eso significa que no habrá conversión de datos de la url, sino solo la escritura de nuevos datos a través del filtro.

Los datos str son escritos y recibidos por la solicitud, pero solo como respuestaTexto y no como encabezado de respuesta. Request.status permanece '0' en lugar de '200'.

Parece que no puede cambiar el encabezado de respuesta a menos que en onHeadersReceived, que nunca tendrá lugar, parece, para una URL falsa. Sin embargo, probé esto en una url real y, aunque se activó el evento, se produjo un error de webRequest.HttpHeaders no es una función. Tenía "responseHeaders" en webRequest extraInfoSpec en ese momento.

Mis preguntas son:

¿Se puede escribir un encabezado de respuesta para establecer request.status en '200' y luego comenzar a escribir los datos de la base de datos a través de una función asíncrona en bloques pequeños como se recupera?

Puede establecer la sección de Disposición de contenido de la respuesta del encabezado de modo que comience automáticamente la descarga de la respuesta.text y permita al usuario seleccionar el nombre del archivo y guardar la ubicación, y permanecer "abierto" mientras sigue escribiendo en el archivo como los datos se extraen de la base de datos y se pasan a la solicitud GET a través de filter.write ()?

Gracias

Conclusió

Fue una buena idea, pero no creo que sea posible por al menos dos razones.

One es que webRequest no parece interceptar una función downloads.download (), ni ningún evento de descarga; por lo tanto, no puede interceptar una descarga, y se necesita un evento con una Disposición de contenido de "archivo adjunto" para incluso intentar escribir en él con una secuencia. Podría interceptar un clic forzado en una etiqueta de anclaje href, pero ningún otro evento se disparó más allá de BeBeforeRequest.

El otro es que un encabezado de respuesta no se puede modificar hasta un evento onHeadersReceived, lo que significa que la URL falsa debe devolver algo. No puede cancelarlo en onBeforeRequest. Entonces, esto no funcionaría sin conexión. Pero, incluso si deja que se procese en línea a una URL existente que devuelve un encabezado de respuesta, no aceptará una modificación. Intenté en varias ocasiones modificar el encabezado de respuesta y simplemente no funcionará. Probé un XMLHttpRequest GET y puedo interceptar los eventos que se activan pero no puedo modificar el encabezado de respuesta; por lo tanto, no puedo establecer la Disposición de contenido en 'archivo adjunto', con o sin archivo, para iniciar una descarga. Puedo escribirle, pero no sirve de nada a menos que descargue lo que está escrito. Estaría bien si el contenido escrito fuera a una página web.

Además, si redirige la URL en el camino a otra cosa que no sea una URL aceptable de webRequest, los otros eventos no serán interceptables. Por lo tanto, si redirige a una URL de objeto en onBeforeRequest, no interceptará la etapa de encabezados de respuesta en webRequest, pero podrá ver threm en el evento onreadystatechange de XMLHttpRequest.

Entonces, el resultado es que parece que los encabezados de respuesta no se pueden modificar a pesar de que los documentos web de MDN dicen que es posible. Y, esta idea de usar un filtro de flujo awebRequest para transmitir datos generados en el cliente o extraídos de una base de datos indexada a DB, en lugar de construir un gran blob para descargar, no funcionará porque no puede interceptar una descarga o cambiar los encabezados de respuesta a desencadenar una descarga en la que escribir a través del filtro de flujo.

Sin embargo, fue una idea interesante. Todavía me pregunto si la descarga permanecería o no "abierta", por así decirlo, mientras los datos se escribían en el cliente y se pasaban en bloques o fragmentos. Quizás, si esa parte de los encabezados de respuesta que indica cómo se van a pasar y recibir los datos se modifique, también funcionaría.

Por ahora, ya no busco este enfoque. Uno de los documentos de Web Docs o de errores indicaba que está previsto permitir que se intercepte una URL de datos. Quizás, para una descarga sin conexión al cliente, eso sería preferible a una URL falsa.

Si alguien consigue que esto funcione, háganoslo saber. Gracias

Respuestas a la pregunta(1)

Su respuesta a la pregunta