view background.js @ 4:086ee559acbb

Remove unused parameter from xpathQuery and rename functions Remove unused xpathMapping parameter from xpathQuery. Rename xpathQuery to feedQueryXPath, xpathQueryAll to feedQueryXPathAll, and nsMapper to feedNSResolver which better reflects their purpose.
author Guido Berhoerster <guido+feed-preview@berhoerster.name>
date Sun, 04 Nov 2018 09:54:37 +0100
parents bc5cc170163c
children
line wrap: on
line source

/*
 * Copyright (C) 2018 Guido Berhoerster <guido+feed-preview@berhoerster.name>
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

'use strict';

var tabsFeeds = new Map();

// until content handlers become available to webextensions
// (https://bugzilla.mozilla.org/show_bug.cgi?id=1457500) intercept all
// responses and change the content type from application/atom+xml or
// application/rss+xml to application/xml which will then be handled by a
// content script
browser.webRequest.onHeadersReceived.addListener(details => {
    if (details.statusCode != 200 ||
            typeof details.responseHeaders === 'undefined') {
        return;
    }

    let contentTypeHeader = details.responseHeaders.find(element => {
        return element.name.toLowerCase() === 'content-type';
    });
    if (typeof contentTypeHeader !== 'undefined') {
        let contentType = contentTypeHeader.value.split(';');
        let mediaType = contentType[0].trim().toLowerCase();
        if (mediaType === 'application/atom+xml' ||
                mediaType === 'application/rss+xml') {
            contentType[0] = 'application/xml';
            contentTypeHeader.value = contentType.join(';');
        }
    }

    return {responseHeaders: details.responseHeaders};
}, {urls: ['http://*/*', 'https://*/*'], types: ['main_frame']},
['blocking', 'responseHeaders']);

browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
    let tab = sender.tab;
    if (typeof tab !== 'undefined') {
        // content script sending feeds
        tabsFeeds.set(tab.id, request);
        browser.pageAction.show(tab.id);
    } else {
        let response = tabsFeeds.get(request);
        // popup querying feeds
        sendResponse(tabsFeeds.get(request));
    }
});

browser.tabs.onUpdated.addListener((id, changeInfo, tab) => {
    if (typeof changeInfo.url === 'undefined') {
        // filter out updates which do not change the URL
        return;
    }

    // hide the page action when the URL changes since it is no longer valid,
    // it will be shown again if the content script detects a feed
    browser.pageAction.hide(tab.id);
});

browser.tabs.onRemoved.addListener((tabId, removeInfo) => {
    tabsFeeds.delete(tabId);
});