How to use Service Workers in Google Chrome extensions to modify an HTTP response body?

后端 未结 1 1370
遇见更好的自我
遇见更好的自我 2021-01-01 03:07

Now that Google Chrome extensions can register Service Workers, how can I use them in order to modify HTTP responses from all hosts, e.g. by replacing all occurrences of

相关标签:
1条回答
  • 2021-01-01 03:59

    Solution

    ≪manifest.json≫:

    {"manifest_version":2,"name":"","version":"0","background":{"scripts":["asd"]}}
    

    ≪asd≫:

    navigator.serviceWorker.register('sdf.js').then(x=>console.log('done', x))
    

    ≪sdf.js≫:

    addEventListener('fetch', e=> e.respondWith(fetch/*btw xhr is undefined*/(e.request).then(r=>{
      if(r.headers === undefined /*request not end with <.htm>, <.html>*/){}else{
        console.assert(r.headers.get('content-type')===null)/*for some odd reason this is empty*///[
          let h = new Headers()
          r.headers.forEach((v,k)=>h.append(k,v))
          Object.defineProperty(r,'headers',{'writable':true})
          r.headers = h
          r.headers.append('content-type','text/html'/*btw <htm> doesnt work*/)
        //]
      }
      return r.text().then(_=>new Response(_.replace(/cat/g,'dog'),r))
    })))
    

    Go to ≪page url≫ (≪chrome-extension://≪ext id≫/≪page path≫≫) and see the replacements.


    Standalone response

    ≪manifest.json≫ and ≪asd≫ same as above.

    ≪sdf.js≫:

    addEventListener('fetch', e=> e.respondWith(new Response('url: '+e.request.url,{headers:{'content-type':'text/html'/*, etc*/}})))
    


    Btw

    Serviceworker has other events that can be delved into eg:

    addEventListener('message', e=>{
      console.log('onmessage', e)
    })
    addEventListener('activate', e=>{
      console.log('onactivate', e)
    })
    addEventListener('install', e=>{
      console.log('oninstall', e)
    })
    


    Alternatives

    Note that currently serviceworker [–cf webNavigation, webRequest] is the only way to do this because some lamer in Google development team has decided that its "insecure" for response-modifying webNavigation and webRequest.


    Note

    Chrome bugs:

    • Extension ≪Reload≫ will not reload serviceworkers. You need to remove the extension and load it back in.
    • Page refresh does not refresh, even with chrome devtools disable cache hard reload. Use normal page visit.
    0 讨论(0)
提交回复
热议问题