Mercurial > addons > firefox-addons > feed-preview
diff content_scripts/feed-probe.js @ 0:bc5cc170163c
Initial revision
author | Guido Berhoerster <guido+feed-preview@berhoerster.name> |
---|---|
date | Wed, 03 Oct 2018 23:40:57 +0200 |
parents | |
children | da483ce3832d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/content_scripts/feed-probe.js Wed Oct 03 23:40:57 2018 +0200 @@ -0,0 +1,62 @@ +/* + * 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.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();