webrequest.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. md.webrequest = ({storage: {state}, detect}) => {
  2. var permissions = ['webRequest', 'webRequestBlocking']
  3. var filter = {
  4. urls: ['<all_urls>'],
  5. types: ['main_frame', 'sub_frame']
  6. }
  7. var options = ['blocking', 'responseHeaders']
  8. var onHeadersReceived = ({method, url, responseHeaders}) => {
  9. if (method !== 'GET') {
  10. return {responseHeaders}
  11. }
  12. var header = responseHeaders.find(({name}) => /^content-type/i.test(name)) || {}
  13. var origin = detect.match(url)
  14. if (!detect.header(header.value) && !origin) {
  15. return {responseHeaders}
  16. }
  17. if (origin.csp) {
  18. responseHeaders = responseHeaders
  19. .filter(({name}) => !/content-security-policy/i.test(name))
  20. }
  21. // ff: markdown `content-type` is not allowed
  22. if (/Firefox/.test(navigator.userAgent) && detect.header(header.value)) {
  23. header.value = 'text/plain'
  24. }
  25. if (origin.encoding && header.name) {
  26. var [media] = header.value.split(';')
  27. header.value = `${media}; charset=${origin.encoding}`
  28. }
  29. return {responseHeaders}
  30. }
  31. var onCompleted = ({ip, tabId}) => {
  32. if (ip && ip !== '127.0.0.1' && ip !== '::1') {
  33. setTimeout(() => {
  34. chrome.tabs.sendMessage(tabId, {message: 'autoreload'})
  35. }, 500)
  36. }
  37. }
  38. var events = () => {
  39. var headers = false
  40. for (var key in state.origins) {
  41. if (state.origins[key].csp || state.origins[key].encoding) {
  42. headers = true
  43. break
  44. }
  45. }
  46. // ff: webRequest is required permission
  47. if (/Firefox/.test(navigator.userAgent)) {
  48. headers = true
  49. }
  50. var completed = false
  51. if (state.content.autoreload) {
  52. completed = true
  53. }
  54. return {headers, completed}
  55. }
  56. var perm = (headers, completed, done) => {
  57. // ff: webRequest is required permission
  58. if (/Firefox/.test(navigator.userAgent)) {
  59. done()
  60. }
  61. // request permissions
  62. else if ((headers || completed) && !chrome.webRequest) {
  63. chrome.permissions.request({permissions}, done)
  64. }
  65. // remove permissions
  66. else if (!headers && !completed && chrome.webRequest) {
  67. chrome.permissions.remove({permissions}, () => {
  68. chrome.webRequest = null
  69. done()
  70. })
  71. }
  72. else {
  73. done()
  74. }
  75. }
  76. return () => {
  77. var {headers, completed} = events()
  78. // remove listeners
  79. if (chrome.webRequest) {
  80. if (!headers && !/Firefox/.test(navigator.userAgent)) {
  81. chrome.webRequest.onHeadersReceived.removeListener(onHeadersReceived)
  82. }
  83. if (!completed) {
  84. chrome.webRequest.onCompleted.removeListener(onCompleted)
  85. }
  86. }
  87. perm(headers, completed, () => {
  88. // add listeners
  89. if (headers && !chrome.webRequest.onHeadersReceived.hasListener(onHeadersReceived)) {
  90. chrome.webRequest.onHeadersReceived.addListener(onHeadersReceived, filter, options)
  91. }
  92. if (completed && !chrome.webRequest.onCompleted.hasListener(onCompleted)) {
  93. chrome.webRequest.onCompleted.addListener(onCompleted, filter)
  94. }
  95. })
  96. }
  97. }