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();