70 lines
1.6 KiB
TypeScript
70 lines
1.6 KiB
TypeScript
import browser from 'webextension-polyfill';
|
|
|
|
let awaitingResponse = false
|
|
|
|
const onFeedDownloaded = (req: XMLHttpRequest) => {
|
|
return async () => {
|
|
awaitingResponse = false
|
|
if (req.status >= 400) {
|
|
console.error(
|
|
`Could not load URL feed: ${req.responseURL}: ` +
|
|
`${req.status}: ${req.statusText}`
|
|
)
|
|
|
|
return
|
|
}
|
|
|
|
const [tab] = await browser.tabs.query({
|
|
active: true,
|
|
currentWindow: true
|
|
})
|
|
|
|
if (!tab || tab.id === -1)
|
|
return
|
|
|
|
await browser.tabs.sendMessage(
|
|
tab.id, {
|
|
type: 'renderFeed',
|
|
document: req.responseText
|
|
}
|
|
)
|
|
}
|
|
}
|
|
|
|
const renderFeed = (url: string) => {
|
|
awaitingResponse = true
|
|
const req = new XMLHttpRequest()
|
|
req.onload = onFeedDownloaded(req)
|
|
req.open('GET', url)
|
|
req.responseType = 'text'
|
|
req.send()
|
|
}
|
|
|
|
browser.webNavigation.onCompleted.addListener(
|
|
async (event: {tabId: Number}) => {
|
|
const { tabId } = event
|
|
await browser.tabs.sendMessage(tabId, {type: 'renderFeed'})
|
|
}
|
|
)
|
|
|
|
browser.webRequest.onHeadersReceived.addListener(
|
|
async (event: {
|
|
url: string,
|
|
responseHeaders: Array<{name: string, value: string}>
|
|
}) => {
|
|
if (awaitingResponse)
|
|
return
|
|
|
|
const {url, responseHeaders} = event
|
|
const contentType = responseHeaders.find(
|
|
h => h.name.toLowerCase() === 'content-type'
|
|
)?.value || ''
|
|
|
|
if (contentType.startsWith('application/rss+xml'))
|
|
renderFeed(url)
|
|
},
|
|
{urls: ['<all_urls>']},
|
|
['blocking', 'responseHeaders']
|
|
)
|
|
|