diff --git a/pages/options/options.js b/pages/options/options.js index ed6e8e20c36ddd796def5c630d57ce27c266c74c..fb459b96898675717ebef5a250e2ab2d73ccc1c4 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -23,120 +23,147 @@ var options = {}; * Private Methods */ -options._getOptionElement = function (optionKey) { - return document.querySelector(`[data-option=${optionKey}]`); -}; +options._renderContents = function () { -function _normalizeDomain (domain) { + document.body.setAttribute('dir', options._scriptDirection); + helpers.insertI18nContentIntoDocument(document); - domain = domain.toLowerCase().trim(); + options._determineOptionDetails() + .then(options._renderOptionsPanel); +}; - if (domain.startsWith(Address.WWW_PREFIX)) { - domain = domain.slice(Address.WWW_PREFIX_LENGTH); - } +options._renderOptionsPanel = function () { - return domain; -} + let whitelistedDomains, domainWhitelist, elements; -/** - * Initializations - */ + whitelistedDomains = options._optionValues.whitelistedDomains; + domainWhitelist = ''; -document.addEventListener('DOMContentLoaded', function () { + elements = options._optionElements; - let scriptDirection, languageSupported, optionElements; + Object.keys(whitelistedDomains).forEach(function (domain) { + domainWhitelist = `${domainWhitelist}${domain};`; + }); - scriptDirection = helpers.determineScriptDirection(navigator.language); - document.body.setAttribute('dir', scriptDirection); + domainWhitelist = domainWhitelist.slice(0, -1); + domainWhitelist = domainWhitelist.replace(Whitelist.TRIM_EXPRESSION, ''); - languageSupported = helpers.languageIsFullySupported(navigator.language); + 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; - if (languageSupported === false) { + options._registerOptionChangedEventListeners(elements); - let localeNoticeElement = document.getElementById('notice-locale'); - localeNoticeElement.setAttribute('class', 'notice'); + if (options._languageSupported === false) { + options._renderLocaleNotice(); } +}; - helpers.insertI18nContentIntoDocument(document); +options._renderLocaleNotice = function () { + + let localeNoticeElement = document.getElementById('notice-locale'); + localeNoticeElement.setAttribute('class', 'notice'); +}; - 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) - }; +options._registerOptionChangedEventListeners = function (elements) { - chrome.storage.local.get(Object.keys(optionElements), function (items) { + 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); +}; - let whitelistedDomains, domainWhitelist; +options._determineOptionDetails = function () { - whitelistedDomains = items.whitelistedDomains; - domainWhitelist = ''; + return new Promise((resolve) => { - Object.keys(whitelistedDomains).forEach(function (domain) { - domainWhitelist = `${domainWhitelist}${domain};`; - }); + 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) { - domainWhitelist = domainWhitelist.slice(0, -1); - domainWhitelist = domainWhitelist.replace(Whitelist.TRIM_EXPRESSION, ''); + options._optionElements = optionElements; + options._optionValues = items; - optionElements.showIconBadge.checked = items.showIconBadge; - optionElements.blockMissing.checked = items.blockMissing; - optionElements.disablePrefetch.checked = items.disablePrefetch; - optionElements.stripMetadata.checked = items.stripMetadata; - optionElements.whitelistedDomains.value = domainWhitelist; + resolve(); + }); }); +}; - let optionChangedHandler = function ({target}) { +options._getOptionElement = function (optionKey) { + return document.querySelector(`[data-option=${optionKey}]`); +}; - let optionKey, optionType, optionValue; +/** + * Event Handlers + */ - optionKey = target.getAttribute('data-option'); - optionType = target.getAttribute('type'); +options._onDocumentLoaded = function () { - switch (optionType) { - case 'checkbox': - optionValue = target.checked; - break; - default: - optionValue = target.value; - } + let language = navigator.language; - if (optionKey === Setting.DISABLE_PREFETCH) { + options._languageSupported = helpers.languageIsFullySupported(language); + options._scriptDirection = helpers.determineScriptDirection(language); - if (optionValue === false) { + options._renderContents(); +}; - // Restore default values of related preference values. - chrome.privacy.network.networkPredictionEnabled.clear({}); +options._onOptionChanged = function ({target}) { - } else { + let optionKey, optionType, optionValue; - chrome.privacy.network.networkPredictionEnabled.set({ - 'value': false - }); - } - } + optionKey = target.getAttribute('data-option'); + optionType = target.getAttribute('type'); - if (optionKey === Setting.WHITELISTED_DOMAINS) { + switch (optionType) { + case 'checkbox': + optionValue = target.checked; + break; + default: + optionValue = target.value; + } - let domainWhitelist = optionValue; + if (optionKey === Setting.DISABLE_PREFETCH) { - optionValue = {}; + if (optionValue === false) { - domainWhitelist.split(Whitelist.VALUE_SEPARATOR).forEach(function (domain) { - optionValue[_normalizeDomain(domain)] = true; + // 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; - chrome.storage.local.set({ - [optionKey]: optionValue + optionValue = {}; + + domainWhitelist.split(Whitelist.VALUE_SEPARATOR).forEach(function (domain) { + optionValue[helpers.normalizeDomain(domain)] = true; }); - }; - - optionElements.showIconBadge.addEventListener('change', optionChangedHandler); - optionElements.blockMissing.addEventListener('change', optionChangedHandler); - optionElements.disablePrefetch.addEventListener('change', optionChangedHandler); - optionElements.stripMetadata.addEventListener('change', optionChangedHandler); - optionElements.whitelistedDomains.addEventListener('keyup', optionChangedHandler); -}); + } + + chrome.storage.local.set({ + [optionKey]: optionValue + }); +}; + +/** + * Initializations + */ + +document.addEventListener('DOMContentLoaded', options._onDocumentLoaded);