view content_scripts/feed-probe.js @ 51:dc25aa2bc628

Revert flexbox layout from extension.css in the entry style sheet This reverts laying out the contents of the body according to the flexbox model since it has, among other things, the unwanted effect of stretching images.
author Guido Berhoerster <guido+feed-preview@berhoerster.name>
date Fri, 06 Sep 2019 13:16:48 +0200
parents 76e23b361e92
children ede87e1004f9
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';

const TIMEOUT_MAX = 800; // ms

function getFeeds() {
    let urlsFeeds = new Map();
    let elements = document.querySelectorAll(':-moz-any(link, a)[href]' +
            '[rel~=alternate]:-moz-any([type="application/atom+xml"], ' +
            '[type="application/rss+xml"])');

    for (let element of elements) {
        if (element.href === document.URL) {
            // do not indicate the availability of a feed if the current
            // document is already a feed preview
            continue;
        }

        if (!element.href.match(/^https?:\/\//)) {
            continue;
        }

        urlsFeeds.set(element.href, {
            href: element.href,
            title: element.title || browser.i18n.getMessage('defaultFeedTitle'),
            type: element.type
        })
    }

    return Array.from(urlsFeeds.values());
}

function probeLinkedFeeds() {
    if (document.documentElement.nodeName.toUpperCase() !== 'HTML') {
        return;
    }

    let feeds = getFeeds();
    if (feeds.length === 0) {
        return;
    }

    // the listener on the background page might not be ready, keep trying to
    // send the message with an exponential backoff until TIMEOUT_MAX is
    // reached
    let timeout = 0;
    let sendFeeds = () => {
        browser.runtime.sendMessage(feeds).catch(e => {
            timeout = (timeout > 0) ? timeout * 2 : 100;
            if (timeout > TIMEOUT_MAX) {
                console.log(`Error: failed to message the background page: ` +
                        ` ${e.message}`);
                return;
            }
            setTimeout(sendFeeds, timeout);
        });
    };
    setTimeout(sendFeeds, timeout);
}

probeLinkedFeeds();