| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- md.webrequest = ({storage: {state}, detect}) => {
- var permissions = ['webRequest', 'webRequestBlocking']
- var filter = {
- urls: ['<all_urls>'],
- types: ['main_frame', 'sub_frame']
- }
- var options = ['blocking', 'responseHeaders']
- var onHeadersReceived = ({method, url, statusCode, responseHeaders}) => {
- if (method !== 'GET') {
- return {responseHeaders}
- }
- var header = responseHeaders.find(({name}) => /^content-type/i.test(name))
- var origin = detect.match(url)
- if (/Firefox/.test(navigator.userAgent)) {
- // ff: markdown `content-type` is not allowed
- if (header && detect.header(header.value)) {
- var [_, charset] = header.value.split(';')
- header.value = `text/plain${charset ? `; ${charset}` : ''}`
- }
- // ff: missing `content-type` is not allowed
- else if (!header && origin && statusCode === 200) {
- header = {name: 'Content-Type', value: 'text/plain'}
- responseHeaders.push(header)
- }
- }
- if (!origin) {
- return {responseHeaders}
- }
- if (origin.csp) {
- responseHeaders = responseHeaders
- .filter(({name}) => !/content-security-policy/i.test(name))
- }
- if (origin.encoding && header && (
- /charset/.test(header.value) ||
- // ff: won't decode correctly by default
- /Firefox/.test(navigator.userAgent)
- )) {
- var [media] = header.value.split(';')
- header.value = `${media}; charset=${origin.encoding}`
- }
- return {responseHeaders}
- }
- var onCompleted = ({ip, tabId}) => {
- if (ip && ip !== '127.0.0.1' && ip !== '::1') {
- setTimeout(() => {
- chrome.tabs.sendMessage(tabId, {message: 'autoreload'})
- }, 500)
- }
- }
- var events = () => {
- var headers = false
- for (var key in state.origins) {
- if (state.origins[key].csp || state.origins[key].encoding) {
- headers = true
- break
- }
- }
- // ff: webRequest is required permission
- if (/Firefox/.test(navigator.userAgent)) {
- headers = true
- }
- var completed = false
- if (state.content.autoreload) {
- completed = true
- }
- return {headers, completed}
- }
- var perm = (headers, completed, done) => {
- // ff: webRequest is required permission
- if (/Firefox/.test(navigator.userAgent)) {
- done()
- }
- // request permissions
- else if ((headers || completed) && !chrome.webRequest) {
- chrome.permissions.request({permissions}, done)
- }
- // remove permissions
- else if (!headers && !completed && chrome.webRequest) {
- chrome.permissions.remove({permissions}, () => {
- chrome.webRequest = null
- done()
- })
- }
- else {
- done()
- }
- }
- var webrequest = () => {
- var {headers, completed} = events()
- // remove listeners
- if (chrome.webRequest) {
- if (!headers && !/Firefox/.test(navigator.userAgent)) {
- chrome.webRequest.onHeadersReceived.removeListener(onHeadersReceived)
- }
- if (!completed) {
- chrome.webRequest.onCompleted.removeListener(onCompleted)
- }
- }
- perm(headers, completed, () => {
- // add listeners
- if (headers && !chrome.webRequest.onHeadersReceived.hasListener(onHeadersReceived)) {
- chrome.webRequest.onHeadersReceived.addListener(onHeadersReceived, filter, options)
- }
- if (completed && !chrome.webRequest.onCompleted.hasListener(onCompleted)) {
- chrome.webRequest.onCompleted.addListener(onCompleted, filter)
- }
- })
- }
- webrequest.init = () => {
- chrome.webRequest.onHeadersReceived.addListener(onHeadersReceived, filter, options)
- chrome.webRequest.onCompleted.addListener(onCompleted, filter)
- }
- return webrequest
- }
|