Newer
Older
* 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';
const _whitelistTrimExpression = /^;+|;+$/g;
const _whitelistValueSeparator = ';';
const _timeouts = {
'whitelistedDomains': null
};
const _getOptionElement = (key) => {
return document.querySelector(`[data-option=${key}]`);
};
const _getOptionElements = () => {
return document.querySelectorAll('[data-option]');
};
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) => {
domainWhitelist = domainWhitelist.split(_whitelistValueSeparator);
for (const domain of domainWhitelist) {
const normalizedDomain = await Helpers.delegateAction('domain:normalize', domain);
if (normalizedDomain !== '') {
whitelistedDomains[normalizedDomain] = true;
}
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}) => {
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);
Helpers.unhideDocumentContents(document);
chrome.runtime.onMessage.addListener((message) => {
if (message.topic === 'domain:added-to-whitelist' || message.topic === 'domain:removed-from-whitelist') {
_getOptionElement('whitelistedDomains').value = _serializeWhitelistedDomains(message.value);
}
});
document.addEventListener('DOMContentLoaded', _onDocumentLoaded);