view content_scripts/feed-readers.js @ 14:376a0e415bba

Properly handle non-text content in Atom feed elements The title, subtitle, summary and content elements of Atom feeds can all have non-text content. When parsing title and subtitle elements HTML and XHTML content will be stripped of any markup in order to keep it simple. In summary and content elements markup will be preserved. Element content of any other type as well as remote content in content elements will be ignored.
author Guido Berhoerster <guido+feed-preview@berhoerster.name>
date Mon, 10 Dec 2018 16:38:11 +0100
parents ff5e5e3eba32
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';

function updateFeedReaders(feedReaders) {
    let feedReaderSelectionElement = document.forms['feed-subscription']
            .elements['feed-reader-selection'];
    for (let optionElement of
            feedReaderSelectionElement.querySelectorAll('option')) {
        optionElement.remove();
    }

    for (let feedReader of feedReaders) {
        let optionElement = document.createElement('option');
        optionElement.value = feedReader.urlTemplate;
        optionElement.textContent = feedReader.title;
        feedReaderSelectionElement.append(optionElement);
    }

    document.forms['feed-subscription'].elements['main'].disabled =
            feedReaders.length === 0;
}

document.addEventListener('submit', ev => {
    if (ev.target.id !== 'feed-subscription') {
        return;
    }

    ev.preventDefault();
    let subscribeUrl = ev.target.elements['feed-reader-selection'].value
            .replace('%s', encodeURIComponent(document.documentURI));
    console.log(`subscribing to feed using ${subscribeUrl}`);
    window.location.href = subscribeUrl;
});

function onStorageChanged(changes, areaName) {
    if (areaName !== 'sync' || changes.feedReaders === 'undefined') {
        return;
    }

    // stored feed readers have been changed or deleted
    let feedReaders = typeof changes.feedReaders.newValue !== 'undefined' ?
            changes.feedReaders.newValue : [];
    console.log('feedReaders changed to', feedReaders);
    updateFeedReaders(feedReaders);
}

(async () => {
    // initialize subscription form
    let {feedReaders = []} = await browser.storage.sync.get('feedReaders');
    updateFeedReaders(feedReaders);

    browser.storage.onChanged.addListener(onStorageChanged);
})();