Skip to content
Snippets Groups Projects
options.js 5.84 KiB
Newer Older
 * Options Page
 * Belongs to Decentraleyes.
 *
 * @author      Thomas Rientjes
 * @since       2016-08-09
 * @license     MPL 2.0
 *
 * 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/.
 */

import Helpers from '../shared/code/helpers.js';
 * Private Constants
const _whitelistTrimExpression = /^;+|;+$/g;
const _whitelistValueSeparator = ';';

const _timeouts = {
    'whitelistedDomains': null
};
 * Private Functions
const _getOptionElement = (key) => {
    return document.querySelector(`[data-option=${key}]`);
};

const _getOptionElements = () => {
    return document.querySelectorAll('[data-option]');
};
const _renderLocaleNotice = () => {
    const localeNoticeElement = document.getElementById('notice-locale');
    localeNoticeElement.classList.remove('hidden');
const _serializeWhitelistedDomains = (whitelistedDomains) => {
    const domainWhitelist = Object.keys(whitelistedDomains).join(_whitelistValueSeparator);
    return domainWhitelist.replace(_whitelistTrimExpression, '');
};
const _parseDomainWhitelist = async (domainWhitelist) => {
    const whitelistedDomains = {};
    domainWhitelist = domainWhitelist.split(_whitelistValueSeparator);
    for (const domain of domainWhitelist) {
        const normalizedDomain = await Helpers.delegateAction('domain:normalize', domain);
        if (normalizedDomain !== '') {
            whitelistedDomains[normalizedDomain] = true;
        }

    return whitelistedDomains;
const _onHelpTranslate = () => {
    chrome.tabs.create({
        'url': 'https://crowdin.com/project/decentraleyes'
    });
const _setBlockMissingNoticeVisibility = (visible) => {
    const blockMissingNoticeElement = document.getElementById('notice-block-missing');

    if (visible) {
        blockMissingNoticeElement.classList.remove('hidden');
    } else {
        blockMissingNoticeElement.classList.add('hidden');
    }
const _getOptionElementValue = (optionElement) => {
    if (optionElement.getAttribute('type') === 'checkbox') {
        return optionElement.checked;
    } else {
        return optionElement.value;
    }
const _onOptionChanged = async ({target}) => {
    let optionKey, optionValue;
    optionKey = target.getAttribute('data-option');
    optionValue = _getOptionElementValue(target);
    if (optionKey === 'whitelistedDomains') {
        clearTimeout(_timeouts.whitelistedDomains);
        _timeouts.whitelistedDomains = await setTimeout(async () => {
            Helpers.delegateAction('whitelisted-domains:update', await _parseDomainWhitelist(optionValue));
        }, 100);
    if (optionKey === 'blockMissing') {
        _setBlockMissingNoticeVisibility(optionValue);
    }
    Helpers.delegateAction('setting:update', {
        'key': optionKey, 'value': optionValue
const _registerOptionChangedEventListeners = (optionElements) => {
    for (const optionElement of Object.values(optionElements)) {
        if (optionElement.getAttribute('type') === 'checkbox') {
            optionElement.addEventListener('change', _onOptionChanged);
        } else {
            optionElement.addEventListener('keyup', _onOptionChanged);
const _initializeOptionElements = (settings) => {
    const optionElements = _getOptionElements();
    for (const optionElement of optionElements) {
        const optionKey = optionElement.getAttribute('data-option');
        if (optionElement.getAttribute('type') === 'checkbox') {
            optionElement.checked = settings[optionKey].value;
        } else if (optionKey === 'whitelistedDomains') {
            optionElement.value = _serializeWhitelistedDomains(settings[optionKey].value);
        }
    }
    _registerOptionChangedEventListeners(optionElements);
const _onDisableBlockMissing = () => {
    const blockMissingElement = _getOptionElement('blockMissing');
    blockMissingElement.checked = false;
    blockMissingElement.dispatchEvent(new Event('change'));
const _registerMiscellaneousEventListeners = () => {
    let blockMissingButtonElement, helpTranslateButtonElement;
    blockMissingButtonElement = document.getElementById('button-block-missing');
    helpTranslateButtonElement = document.getElementById('button-help-translate');
    blockMissingButtonElement.addEventListener('click', _onDisableBlockMissing);
    helpTranslateButtonElement.addEventListener('click', _onHelpTranslate);
    blockMissingButtonElement.addEventListener('keydown', (event) => {
        if (Helpers.enterOrSpaceKeyPressed(event)) {
            _onDisableBlockMissing();
        }
    });
    helpTranslateButtonElement.addEventListener('keydown', (event) => {
        if (Helpers.enterOrSpaceKeyPressed(event)) {
            _onHelpTranslate();
        }
const _renderContents = async () => {
    const settings = await Helpers.delegateAction('settings:get', {'concise': false});
    _registerMiscellaneousEventListeners();
    _initializeOptionElements(settings);
    _setBlockMissingNoticeVisibility(settings.blockMissing.value);
    if (! Helpers.languageIsFullySupported()) {
        _renderLocaleNotice();
const _onDocumentLoaded = async () => {
    document.body.setAttribute('dir', Helpers.determineScriptDirection());
    Helpers.applyI18nContentToDocument(document);
    await _renderContents();
    Helpers.unhideDocumentContents(document);
/**
 * Event Handlers
 */
chrome.runtime.onMessage.addListener((message) => {
    if (message.topic === 'domain:added-to-whitelist' || message.topic === 'domain:removed-from-whitelist') {
        _getOptionElement('whitelistedDomains').value = _serializeWhitelistedDomains(message.value);
    }
});
/**
 * Initializations
 */

document.addEventListener('DOMContentLoaded', _onDocumentLoaded);