view background.js @ 0:bc5cc170163c

Initial revision
author Guido Berhoerster <guido+feed-preview@berhoerster.name>
date Wed, 03 Oct 2018 23:40:57 +0200
parents
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);
});