diff --git a/core/main.js b/core/main.js index 0c7ead82399ec3491e0943bd01acc1414a06b874..de7a7b6107afad7fcf06d58826fb096868a33a16 100644 --- a/core/main.js +++ b/core/main.js @@ -19,10 +19,43 @@ var main = {}; +/** + * Private Methods + */ + +main._initializeOptions = function () { + + let optionDefaults = { + 'showIconBadge': true, + 'blockMissing': false, + 'disablePrefetch': true, + 'stripMetadata': true, + 'whitelistedDomains': {} + }; + + chrome.storage.local.get(optionDefaults, function (options) { + + if (options === null) { + options = optionDefaults; + } + + if (options.disablePrefetch !== false) { + + chrome.privacy.network.networkPredictionEnabled.set({ + 'value': false + }); + } + + chrome.storage.local.set(options); + }); +}; + /** * Initializations */ +main._initializeOptions(); + chrome.runtime.getPlatformInfo(function (information) { main.operatingSystem = information.os; }); @@ -41,8 +74,6 @@ if (typeof chrome.browserAction.setBadgeBackgroundColor !== 'function') { }); } -chrome.privacy.network.networkPredictionEnabled.set({'value': false}); - chrome.browserAction.setBadgeBackgroundColor({ 'color': [74, 130, 108, 255] }); diff --git a/pages/options/options.css b/pages/options/options.css index d089cfb6c17958d47c51f88638777ee6928da611..f362a0c3bb396843bf5177e0741a04095da74bd6 100644 --- a/pages/options/options.css +++ b/pages/options/options.css @@ -4,8 +4,14 @@ body { color: #555; + cursor: default; font-family: 'Noto Sans', Arial, sans-serif !important; font-size: 12px; + padding: 10px !important; +} + +.option { + margin-bottom: 22px; } /** @@ -13,27 +19,27 @@ body { */ @font-face { - font-family: 'Noto Sans'; - font-style: normal; - font-weight: 400; - src: url('../../modules/noto-sans/noto-sans.woff2') - format('woff2'); + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 400; + src: url('../../modules/noto-sans/noto-sans.woff2') + format('woff2'); } @font-face { - font-family: 'Noto Sans'; - font-style: normal; - font-weight: 600; - src: url('../../modules/noto-sans/noto-sans-bold.woff2') - format('woff2'); + font-family: 'Noto Sans'; + font-style: normal; + font-weight: 600; + src: url('../../modules/noto-sans/noto-sans-bold.woff2') + format('woff2'); } @font-face { - font-family: 'Noto Sans'; - font-style: italic; - font-weight: 400; - src: url('../../modules/noto-sans/noto-sans-italic.woff2') - format('woff2'); + font-family: 'Noto Sans'; + font-style: italic; + font-weight: 400; + src: url('../../modules/noto-sans/noto-sans-italic.woff2') + format('woff2'); } /** @@ -52,6 +58,7 @@ body { .input-checkbox { margin: 0 4px 0 0; + outline: 0; } .input-text { @@ -65,11 +72,10 @@ body { .description-option { color: #777; font-style: italic; - margin-bottom: 18px; padding-left: 29px; } -.label { +.badge { border-radius: 3px; color: #fff; font-size: 8px; @@ -78,6 +84,11 @@ body { text-transform: uppercase; } -.label-warning { +.badge-warning { background-color: #ffa500; } + +.label-checkbox { + align-items: center; + display: flex; +} diff --git a/pages/options/options.html b/pages/options/options.html index 14b295251ac2411cb0b744f7f0a0abca91ab361e..f974728fe535c0df70810d161644f5e793d20bc7 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -17,25 +17,85 @@ <script src="options.js"></script> - <section> + <section class="option"> - <label class="title-option"> + <div class="title-option"> - <input class="input-checkbox" data-option="blockMissing" type="checkbox"> - <span data-i18n-content="blockMissingTitle"></span> - <span class="label label-warning" data-i18n-content="advancedLabel"></span> + <label class="label-checkbox"> - </label> + <input class="input-checkbox" data-option="showIconBadge" type="checkbox" disabled> + <span data-i18n-content="showIconBadgeTitle"></span> + + </label> + + </div> + + <div class="description-option" data-i18n-content="showIconBadgeDescription"></div> + + </section> + + <section class="option"> + + <div class="title-option"> + + <label class="label-checkbox"> + + <input class="input-checkbox" data-option="blockMissing" type="checkbox"> + <span data-i18n-content="blockMissingTitle"></span> + + </label> + + <span class="badge badge-warning" data-i18n-content="advancedLabel"></span> + + </div> <div class="description-option" data-i18n-content="blockMissingDescription"></div> </section> - <section> + <section class="option"> + + <div class="title-option"> + + <label class="label-checkbox"> + + <input class="input-checkbox" data-option="disablePrefetch" type="checkbox"> + <span data-i18n-content="disablePrefetchTitle"></span> + + </label> + + <span class="badge badge-warning" data-i18n-content="advancedLabel"></span> + + </div> + + <div class="description-option" data-i18n-content="disablePrefetchDescription"></div> + + </section> + + <section class="option"> + + <div class="title-option"> + + <label class="label-checkbox"> + + <input class="input-checkbox" data-option="stripMetadata" type="checkbox" disabled> + <span data-i18n-content="stripMetadataTitle"></span> + + </label> + + <span class="badge badge-warning" data-i18n-content="advancedLabel"></span> + + </div> + + <div class="description-option" data-i18n-content="stripMetadataDescription"></div> + + </section> + + <section class="option"> - <div class="title-option" data-i18n-content="domainWhitelistTitle"></div> - <input class="input-text" data-option="domainWhitelist" type="text"> - <div class="description-option" data-i18n-content="domainWhitelistDescription"></div> + <div class="title-option" data-i18n-content="whitelistedDomainsTitle"></div> + <input class="input-text" data-option="whitelistedDomains" type="text"> + <div class="description-option" data-i18n-content="whitelistedDomainsDescription"></div> </section> diff --git a/pages/options/options.js b/pages/options/options.js index 22c35323e244329e580e2496158d58bf64e86fa4..6d6773b276ce2bdc3d5b9147f48a16018cde00e4 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -13,6 +13,12 @@ 'use strict'; +/** + * Options + */ + +var options = {}; + /** * Constants */ @@ -21,13 +27,21 @@ const WEB_PREFIX_VALUE = 'www.'; const WEB_PREFIX_LENGTH = WEB_PREFIX_VALUE.length; const VALUE_SEPARATOR = ';'; +/** + * Private Methods + */ + +options._getOptionElement = function (optionKey) { + return document.querySelector('[data-option=' + optionKey + ']'); +}; + /** * Initializations */ document.addEventListener('DOMContentLoaded', function () { - let i18nElements, blockMissingElement, domainWhitelistElement; + let i18nElements, optionElements; i18nElements = document.querySelectorAll('[data-i18n-content]'); @@ -37,41 +51,86 @@ document.addEventListener('DOMContentLoaded', function () { i18nElement.innerText = chrome.i18n.getMessage(i18nMessageName); }); - blockMissingElement = document.querySelector('[data-option=blockMissing]'); - domainWhitelistElement = document.querySelector('[data-option=domainWhitelist]'); + optionElements = { + 'showIconBadge': options._getOptionElement('showIconBadge'), + 'blockMissing': options._getOptionElement('blockMissing'), + 'disablePrefetch': options._getOptionElement('disablePrefetch'), + 'stripMetadata': options._getOptionElement('stripMetadata'), + 'whitelistedDomains': options._getOptionElement('whitelistedDomains') + }; + + chrome.storage.local.get(Object.keys(optionElements), function (items) { - chrome.storage.local.get(['blockMissing', 'whitelistedDomains'], function (items) { + let whitelistedDomains, domainWhitelist; - let whitelistedDomains = items.whitelistedDomains || {}; - let domainWhitelist = ''; + whitelistedDomains = items.whitelistedDomains; + domainWhitelist = ''; Object.keys(whitelistedDomains).forEach(function (domain) { domainWhitelist = domainWhitelist + domain + ';'; }); domainWhitelist = domainWhitelist.slice(0, -1); + domainWhitelist = domainWhitelist.replace(/^;+|;+$/g, ''); - blockMissingElement.checked = items.blockMissing || false; - domainWhitelistElement.value = domainWhitelist || ''; + optionElements.showIconBadge.checked = items.showIconBadge; + optionElements.blockMissing.checked = items.blockMissing; + optionElements.disablePrefetch.checked = items.disablePrefetch; + optionElements.stripMetadata.checked = items.stripMetadata; + optionElements.whitelistedDomains.value = domainWhitelist; }); - let optionChangedHandler = function () { + let optionChangedHandler = function ({target}) { - let whitelistedDomains = {}; + let optionKey, optionType, optionValue; - domainWhitelistElement.value.split(VALUE_SEPARATOR).forEach(function (domain) { - whitelistedDomains[_normalizeDomain(domain)] = true; - }); + optionKey = target.getAttribute('data-option'); + optionType = target.getAttribute('type'); - chrome.storage.local.set({ + switch (optionType) { + case 'checkbox': + optionValue = target.checked; + break; + default: + optionValue = target.value; + } + + if (optionKey === 'disablePrefetch') { + + if (optionValue === false) { + + // Restore default values of related preference values. + chrome.privacy.network.networkPredictionEnabled.clear({}); + + } else { - 'blockMissing': blockMissingElement.checked, - 'whitelistedDomains': whitelistedDomains + chrome.privacy.network.networkPredictionEnabled.set({ + 'value': false + }); + } + } + + if (optionKey === 'whitelistedDomains') { + + let domainWhitelist = optionValue; + + optionValue = {}; + + domainWhitelist.split(VALUE_SEPARATOR).forEach(function (domain) { + optionValue[_normalizeDomain(domain)] = true; + }); + } + + chrome.storage.local.set({ + [optionKey]: optionValue }); }; - blockMissingElement.addEventListener('change', optionChangedHandler); - domainWhitelistElement.addEventListener('keyup', optionChangedHandler); + 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); }); /**