parent
cb8c201b95
commit
d32b0243d8
@ -1,8 +1,69 @@
|
||||
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: string;}) => {
|
||||
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']
|
||||
)
|
||||
|
||||
|
Loading…
Reference in new issue