O que e onde exatamente são códigos privilegiados, código chrome, Gecko?

Ao ler sobre a API do arquivo e desejar gravar dados diretamente de um banco de dados indexado do DB no disco do cliente, em vez de criar e manter um blob grande na RAM para fazer o download no disco, existem alguns itens básicos que não estou entendendo.

Nos documentos MDN, essas duas instruções são encontradas:

No Gecko, o código privilegiado pode criar objetos File que representam qualquer arquivo local sem a interação do usuário.

Se você quiser usar a API do arquivo DOM no código chrome, poderá fazê-lo sem restrições. De fato, você obtém um recurso de bônus: você pode criar objetos File especificando o caminho do arquivo no computador do usuário. Isso funciona apenas com código privilegiado, portanto, o conteúdo da Web não pode fazê-lo.

Onde exatamente se escreve o código chrome e / ou o código privativo do Gecko? Isso está além de uma extensão da web? Eu li e experimentei extensões; então, não estou perguntando especificamente sobre como acessá-los.

Não estou preocupado com uma página da Web 'normal' e um servidor acessando o disco do cliente. Eu sei que não é permitido, a fim de proteger o indivíduo.

Estou interessado no que pode ser feito offline através do navegador - com a ajuda de extensões da web e / ou um perfil separado que concede permissões especiais, mas sem o node.js, elétron, etc. - de uma pessoa que deseja usar conscientemente talvez o navegador faça o que eles deveriam ter construído no sistema operacional e não no navegador.

Dito de outra forma, se eu quiser usar o navegador apenas para executar meu código javascript para executar tarefas todas offline no meu próprio computador, onde está o código privilegiado escrito que dá acesso a esses tipos de APIs que não estão sujeitos a problemas de segurança de uma página da web normal?

Ainda é javascript ou C ++ nessas áreas?

Obrigado.

Esta velha pergunta fornece um link para suaextensão que inclui a API do arquivo que grava no disco de uma maneira que parece fornecer um meio de ignorar a criação de um grande blob de dados. Ele tem seis anos, mas parece conter o que é necessário, pelo menos para começar.

Não estou me referindo à tentativa deles de se locomover usando o indexedDB, mas apenas o fato de usar esse tipo de extensão pode permitir a gravação de cada objeto do banco de dados diretamente no disco do cliente, sem primeiro gerar um blob grande para o download.

Tentativa de empregar a sugestão de Andrew Swan

Estou tentando juntar as peças, mas cheguei a um ponto em que não sei como continuar. Eu escrevi o código abaixo no script de segundo plano de uma extensão. Ao tentar empregar a sugestão de Andrew Swan, o plano é iniciar uma solicitação GET para um arquivo de texto / csv, que é interceptado e substituído por dados extraídos do banco de dados e gravados na solicitação GET pelo filtro de fluxo.

Primeiro, faça uma solicitação GET para um URL falso e ouça a resposta, da seguinte maneira:

 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} } );

  };

Segundo, intercepte a solicitação e escreva no GET, da seguinte maneira:

 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();

   };

 }

A mensagem enviada do script em segundo plano na função request.onreadystatechange é recebida no script de conteúdo e o request.status é '0'.

O filter.onstart é usado porque o evento ondata nunca será acionado, pois o URL é falso. Além disso, isso significa que não haverá conversão de dados a partir da URL, mas apenas a gravação de novos dados através do filtro.

Os dados str são gravados e recebidos pela solicitação, mas apenas como responseText e não como um cabeçalho de resposta. O status request.status permanece '0' em vez de '200'.

Parece que não é possível alterar o cabeçalho da resposta, a menos que em onHeadersReceived que nunca ocorrerá, ao que parece, para um URL falso. No entanto, tentei isso em um URL real e, mesmo que o evento tenha sido disparado, um erro de webRequest.HttpHeaders não é uma função foi lançada. Eu tinha "responseHeaders" no webRequest extraInfoSpec naquele momento.

Minhas perguntas são:

Um cabeçalho de resposta pode ser gravado para definir o request.status como '200' e, em seguida, começar a gravar os dados do banco de dados por meio de uma função assíncrona em pequenos blocos, conforme recuperado?

A seção Disposição de conteúdo da resposta do cabeçalho pode ser configurada de forma que inicie automaticamente o download do response.text e permita que o usuário selecione o nome do arquivo e salve o local e permaneça "aberto" enquanto continua gravando no arquivo como dados é extraído do banco de dados e passado para a solicitação GET através do filter.write ()?

Obrigado.

Conclusão

Foi uma boa ideia, mas não acho que seja possível por pelo menos duas razões.

Uma é que o webRequest parece não interceptar a função downloads.download () ou qualquer evento de download; portanto, não é possível interceptar um download e é necessário um evento com uma disposição de conteúdo de 'anexo' para tentar gravar nele com um fluxo. Eu pude interceptar um clique forçado em uma marca âncora href, mas nenhum outro evento foi disparado além do onBeforeRequest.

A outra é que um cabeçalho de resposta não pode ser modificado até um evento onHeadersReceived, o que significa que a URL falsa precisa retornar algo. Você não pode simplesmente cancelá-lo no onBeforeRequest. Portanto, isso não funcionaria offline. Porém, mesmo que você o processe on-line para um URL existente que retorne um cabeçalho de resposta, ele não aceitará uma modificação. Tentei repetidamente modificar o cabeçalho da resposta e simplesmente não funcionou. Tentei um XMLHttpRequest GET e posso interceptar os eventos que são acionados, mas não podem modificar o cabeçalho da resposta; portanto, não é possível definir a disposição do conteúdo como 'anexo', com ou sem arquivo, para iniciar um download. Eu posso escrever para ele, mas não é bom, a menos que ele baixe o que está escrito. Seria bom se o conteúdo escrito fosse para uma página da web.

Além disso, se você redirecionar o URL ao longo do caminho para algo diferente de um URL aceitável pelo webRequest, os outros eventos não serão interceptáveis. Portanto, se você redirecionar para uma URL de objeto no onBeforeRequest, não interceptará o estágio de cabeçalhos de resposta no webRequest, mas poderá vê-los no evento onreadystatechange do XMLHttpRequest.

Portanto, o resultado é que parece que os cabeçalhos de resposta não podem ser modificados, embora os Documentos da Web da MDN digam que isso é possível. E, essa ideia de usar o filtro de fluxo awebRequest para transmitir dados gerados no cliente ou extraídos de um banco de dados indexedDB, em vez de criar um blob grande para download, não funcionará porque não pode interceptar um download ou alterar os cabeçalhos de resposta para acionar um download no qual gravar através do filtro de fluxo.

Foi uma ideia interessante. Ainda me pergunto se o download permaneceria ou não 'aberto', por assim dizer, enquanto os dados estavam sendo gravados no cliente e passados em blocos ou blocos. Talvez, se essa parte dos cabeçalhos de resposta que declara como os dados devem ser transmitidos e recebidos foi modificada, ela também funcionaria.

Por enquanto, não estou mais adotando essa abordagem. Um dos documentos da Web ou de um bug afirmou que está planejado permitir a interceptação de um URL de dados. Talvez, para um download offline para o cliente, isso seja preferível a um URL falso.

Se alguém fizer isso funcionar, informe-nos. Obrigado.