Skip to content
Snippets Groups Projects
options.js 4.63 KiB
Newer Older
/**
 * Main 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/.
 */

'use strict';

/**
 * Options
 */

var options = {};

/**
 * Private Methods
 */

options._renderContents = function () {
    document.body.setAttribute('dir', options._scriptDirection);
    helpers.insertI18nContentIntoDocument(document);
    options._determineOptionDetails()
        .then(options._renderOptionsPanel);
};
options._renderOptionsPanel = function () {
    let whitelistedDomains, domainWhitelist, elements;
    whitelistedDomains = options._optionValues.whitelistedDomains;
    domainWhitelist = '';
    elements = options._optionElements;
    Object.keys(whitelistedDomains).forEach(function (domain) {
        domainWhitelist = `${domainWhitelist}${domain};`;
    });
    domainWhitelist = domainWhitelist.slice(0, -1);
    domainWhitelist = domainWhitelist.replace(Whitelist.TRIM_EXPRESSION, '');
    elements.showIconBadge.checked = options._optionValues.showIconBadge;
    elements.blockMissing.checked = options._optionValues.blockMissing;
    elements.disablePrefetch.checked = options._optionValues.disablePrefetch;
    elements.stripMetadata.checked = options._optionValues.stripMetadata;
    elements.whitelistedDomains.value = domainWhitelist;
    options._registerOptionChangedEventListeners(elements);
    if (options._languageSupported === false) {
        options._renderLocaleNotice();
options._renderLocaleNotice = function () {

    let localeNoticeElement = document.getElementById('notice-locale');
    localeNoticeElement.setAttribute('class', 'notice');
};
options._registerOptionChangedEventListeners = function (elements) {
    elements.showIconBadge.addEventListener('change', options._onOptionChanged);
    elements.blockMissing.addEventListener('change', options._onOptionChanged);
    elements.disablePrefetch.addEventListener('change', options._onOptionChanged);
    elements.stripMetadata.addEventListener('change', options._onOptionChanged);
    elements.whitelistedDomains.addEventListener('keyup', options._onOptionChanged);
};
options._determineOptionDetails = function () {
    return new Promise((resolve) => {
        let optionElements = {
            'showIconBadge': options._getOptionElement(Setting.SHOW_ICON_BADGE),
            'blockMissing': options._getOptionElement(Setting.BLOCK_MISSING),
            'disablePrefetch': options._getOptionElement(Setting.DISABLE_PREFETCH),
            'stripMetadata': options._getOptionElement(Setting.STRIP_METADATA),
            'whitelistedDomains': options._getOptionElement(Setting.WHITELISTED_DOMAINS)
        };

        chrome.storage.local.get(Object.keys(optionElements), function (items) {
            options._optionElements = optionElements;
            options._optionValues = items;
            resolve();
        });
options._getOptionElement = function (optionKey) {
    return document.querySelector(`[data-option=${optionKey}]`);
};
/**
 * Event Handlers
 */
options._onDocumentLoaded = function () {
    let language = navigator.language;
    options._languageSupported = helpers.languageIsFullySupported(language);
    options._scriptDirection = helpers.determineScriptDirection(language);
    options._renderContents();
};
options._onOptionChanged = function ({target}) {
    let optionKey, optionType, optionValue;
    optionKey = target.getAttribute('data-option');
    optionType = target.getAttribute('type');
    switch (optionType) {
    case 'checkbox':
        optionValue = target.checked;
        break;
    default:
        optionValue = target.value;
    }
    if (optionKey === Setting.DISABLE_PREFETCH) {
        if (optionValue === false) {
            // Restore default values of related preference values.
            chrome.privacy.network.networkPredictionEnabled.clear({});

        } else {

            chrome.privacy.network.networkPredictionEnabled.set({
                'value': false
    }

    if (optionKey === Setting.WHITELISTED_DOMAINS) {

        let domainWhitelist = optionValue;
        optionValue = {};

        domainWhitelist.split(Whitelist.VALUE_SEPARATOR).forEach(function (domain) {
            optionValue[helpers.normalizeDomain(domain)] = true;
    }

    chrome.storage.local.set({
        [optionKey]: optionValue
    });
};

/**
 * Initializations
 */

document.addEventListener('DOMContentLoaded', options._onDocumentLoaded);