From 668c42afbd9c4c5645dc128d1557ac8a6e6093bb Mon Sep 17 00:00:00 2001 From: nobody Date: Thu, 25 Jun 2020 07:54:17 +0200 Subject: [PATCH] Implemented: Option to enable HTML-Filter by default (#33) --- core/constants.js | 3 ++- core/main.js | 3 ++- core/manipulate-dom.js | 24 ++++++++++++++++-------- core/state-manager.js | 4 ++++ pages/options/options.css | 33 +++++++++++++++++++++++++++++++-- pages/options/options.html | 19 +++++++++++++++++++ pages/options/options.js | 25 ++++++++++++++++++++++--- pages/popup/popup.js | 16 +++++++++++++++- pages/updates/updates.html | 1 + 9 files changed, 112 insertions(+), 16 deletions(-) diff --git a/core/constants.js b/core/constants.js index 0d7054dc..0f45d295 100644 --- a/core/constants.js +++ b/core/constants.js @@ -71,7 +71,8 @@ const Setting = { 'XHR_TEST_DOMAIN': 'xhrTestDomain', 'LOGGING': 'enableLogging', 'DOMAINS_MANIPULATE_DOM': 'domainsManipulateDOM', - 'STATISTIC_DATA': 'statisticData' + 'STATISTIC_DATA': 'statisticData', + 'NEGATE_HTML_FILTER_LIST': 'negateHtmlFilterList' }; const WebRequest = { diff --git a/core/main.js b/core/main.js index cb841676..9a2bf517 100644 --- a/core/main.js +++ b/core/main.js @@ -35,7 +35,8 @@ main._initializeSettings = function () { [Setting.STRIP_METADATA]: true, [Setting.WHITELISTED_DOMAINS]: {}, [Setting.LOGGING]: false, - [Setting.DOMAINS_MANIPULATE_DOM]: {} + [Setting.DOMAINS_MANIPULATE_DOM]: {}, + [Setting.NEGATE_HTML_FILTER_LIST]: false }; chrome.storage.sync.get(settingDefaults, function (items) { diff --git a/core/manipulate-dom.js b/core/manipulate-dom.js index 8ec687d3..3c33127a 100644 --- a/core/manipulate-dom.js +++ b/core/manipulate-dom.js @@ -28,15 +28,29 @@ var manipulateDOM = {}; manipulateDOM._removeCrossOriginAndIntegrityAttr = function (details) { + if(BrowserType.CHROMIUM) { + // Chromium browsers do not support webRequest.filterResponseData + // https://bugs.chromium.org/p/chromium/issues/detail?id=487422 + console.warn('[ LocalCDN ] browser.webRequest.filterResponseData not supported by your browser.'); + return; + } + + let initiatorDomain, listedToManipulateDOM, negateHtmlFilter, filtering; - let initiatorDomain, listedToManipulateDOM; initiatorDomain = helpers.extractDomainFromUrl(details.url, true) || Address.EXAMPLE; listedToManipulateDOM = stateManager._domainIsListed(initiatorDomain, "manipulate-dom"); + negateHtmlFilter = stateManager.getInvertOption; + + if( ( negateHtmlFilter || listedToManipulateDOM ) && !( negateHtmlFilter && listedToManipulateDOM ) ) { + filtering = true; + } else { + filtering = false; + } // by Jaap (https://gitlab.com/Jaaap) let header = details.responseHeaders.find(h => h.name.toLowerCase() === 'content-type'); - if (header && BrowserType.FIREFOX && listedToManipulateDOM) { + if (header && filtering) { let mimeType, isWhitelisted; @@ -92,12 +106,6 @@ manipulateDOM._removeCrossOriginAndIntegrityAttr = function (details) { } return {responseHeaders: details.responseHeaders}; - } else if(BrowserType.CHROMIUM) { - - // Chromium browsers do not support webRequest.filterResponseData - // https://bugs.chromium.org/p/chromium/issues/detail?id=487422 - console.warn('[ LocalCDN ] browser.webRequest.filterResponseData not supported by your browser.'); - } }; diff --git a/core/state-manager.js b/core/state-manager.js index 1de7e892..1b82f415 100644 --- a/core/state-manager.js +++ b/core/state-manager.js @@ -267,6 +267,9 @@ stateManager._handleStorageChanged = function (changes) { requestSanitizer.enable(); } } + if (Setting.NEGATE_HTML_FILTER_LIST in changes) { + stateManager.getInvertOption = changes.negateHtmlFilterList.newValue; + } }; stateManager._clearBadgeText = function (tabIdentifier) { @@ -317,6 +320,7 @@ stateManager._setIconDisabled = function (tabIdentifier) { stateManager.requests = {}; stateManager.tabs = {}; +stateManager.getInvertOption; stateManager.disabledIconPath = { '16': chrome.runtime.getURL('icons/action/icon16-disabled.png'), '18': chrome.runtime.getURL('icons/action/icon18-disabled.png'), diff --git a/pages/options/options.css b/pages/options/options.css index 3a403328..719da448 100644 --- a/pages/options/options.css +++ b/pages/options/options.css @@ -14,7 +14,18 @@ body { .option { display: flex; flex-direction: column; - margin-top: 25px; + margin-top: 15px; + padding: 5px; +} + +.html-filter-section { + background-color: lightgrey; + margin-top: 15px; + border-radius: 3px; +} + +.html-filter-section > .option { + margin-top: 0px; } .notice { @@ -125,7 +136,7 @@ body { padding: 5px 22px; text-decoration: none; user-select: none; - white-space: nowrap; + text-align: center; } .button:hover { @@ -194,6 +205,24 @@ body { background-color: #ffa500; } +.warning-red { + color: red; + background-color: transparent; + margin-left: 0px; + display: block; + font-size: 10px; +} + +.warning-red > a { + color: red; + font-weight: bold; +} + +#negate-html-filter-list-warning { + text-decoration: underline; + cursor: pointer; +} + .hidden { display: none !important; } diff --git a/pages/options/options.html b/pages/options/options.html index 22be853f..83a8fa6d 100644 --- a/pages/options/options.html +++ b/pages/options/options.html @@ -162,6 +162,25 @@
+
+
+
Domains for HTML filter:
+ +
Enter domains for HTML filter. Separate multiple entries with semi-colons (;).
+
+ This function can break websites. Please note the information on the Wiki page. +
+
+ + +
+
If activated, the HTML filter for the domains in the list above is disabled instead of enabled.
+
+
+
diff --git a/pages/options/options.js b/pages/options/options.js index 44c389f6..215271c7 100644 --- a/pages/options/options.js +++ b/pages/options/options.js @@ -41,11 +41,14 @@ options._renderContents = function () { options._renderOptionsPanel = function () { - let whitelistedDomains, domainWhitelist, elements; + let whitelistedDomains, domainWhitelist, elements, htmlFilterDomains, domainHtmlFilter; whitelistedDomains = options._optionValues.whitelistedDomains; domainWhitelist = options._serializeWhitelistedDomains(whitelistedDomains); + htmlFilterDomains = options._optionValues.domainsManipulateDOM; + domainHtmlFilter = options._serializeWhitelistedDomains(htmlFilterDomains); + elements = options._optionElements; elements.showIconBadge.checked = options._optionValues.showIconBadge; @@ -55,6 +58,8 @@ options._renderOptionsPanel = function () { elements.hideReleaseNotes.checked = options._optionValues.hideReleaseNotes; elements.enableLogging.checked = options._optionValues.enableLogging; elements.whitelistedDomains.value = domainWhitelist; + elements.domainsManipulateDOM.value = domainHtmlFilter; + elements.negateHtmlFilterList.checked = options._optionValues.negateHtmlFilterList; options._registerOptionChangedEventListeners(elements); options._registerMiscellaneousEventListeners(); @@ -68,6 +73,7 @@ options._renderOptionsPanel = function () { } document.getElementById('last-mapping-update').textContent += ' ' + lastMappingUpdate; + document.getElementById('negate-html-filter-list-warning').addEventListener('click', options._onClickHTMLFilterWarning); }; options._renderBlockMissingNotice = function () { @@ -97,6 +103,8 @@ options._registerOptionChangedEventListeners = function (elements) { elements.enableLogging.addEventListener('change', options._onOptionChanged); elements.hideReleaseNotes.addEventListener('change', options._onOptionChanged); elements.whitelistedDomains.addEventListener('keyup', options._onOptionChanged); + elements.domainsManipulateDOM.addEventListener('keyup', options._onOptionChanged); + elements.negateHtmlFilterList.addEventListener('change', options._onOptionChanged); let type = elements.ruleSets; for(let i = 0; i < type.length; i++) { type[i].addEventListener('change', options._openRuleSet); @@ -146,7 +154,9 @@ options._getOptionElements = function () { [Setting.HIDE_RELEASE_NOTES]: options._getOptionElement(Setting.HIDE_RELEASE_NOTES), [Setting.LOGGING]: options._getOptionElement(Setting.LOGGING), ['ruleSets']: document.getElementsByName("rule-sets"), - ['copyRuleSet']: document.getElementById("button-copy-rule-set") + ['copyRuleSet']: document.getElementById("button-copy-rule-set"), + [Setting.NEGATE_HTML_FILTER_LIST]: options._getOptionElement(Setting.NEGATE_HTML_FILTER_LIST), + [Setting.DOMAINS_MANIPULATE_DOM]: options._getOptionElement(Setting.DOMAINS_MANIPULATE_DOM) }; return optionElements; @@ -169,6 +179,8 @@ options._configureLinkPrefetching = function (value) { options._serializeWhitelistedDomains = function (whitelistedDomains) { + if (whitelistedDomains === undefined) return; + let domainWhitelist, whitelistedDomainKeys; whitelistedDomainKeys = Object.keys(whitelistedDomains); @@ -236,7 +248,7 @@ options._onOptionChanged = function ({target}) { options._configureLinkPrefetching(optionValue); } - if (optionKey === Setting.WHITELISTED_DOMAINS) { + if (optionKey === Setting.WHITELISTED_DOMAINS || optionKey === Setting.DOMAINS_MANIPULATE_DOM) { optionValue = options._parseDomainWhitelist(optionValue); } @@ -276,6 +288,13 @@ options._copyRuleSet = function() { }); } +options._onClickHTMLFilterWarning = function() { + chrome.tabs.create({ + 'url': 'https://codeberg.org/nobody/LocalCDN/wiki/Blank-websites-or-weird-characters', + 'active': true + }); +} + /** * Initializations */ diff --git a/pages/popup/popup.js b/pages/popup/popup.js index 03e88688..0c11803e 100644 --- a/pages/popup/popup.js +++ b/pages/popup/popup.js @@ -21,6 +21,7 @@ let counterFrameworks = 0; let counterCDNs = 0; let oversized = false; +let negateHtmlFilterList; var popup = {}; /** @@ -42,6 +43,7 @@ popup._renderContents = function () { .then(popup._determineDomainWhitelistStatus) .then(popup._determineStatusManipulateDOM) .then(popup._determineResourceInjections) + .then(popup._determineNegateHtmlFilterOption) .then(popup._renderContextualContents); if(BrowserType.CHROMIUM) { @@ -114,7 +116,7 @@ popup._renderDomainWhitelistPanel = function () { protectionToggleElement.checked = true; protectionToggleElement.addEventListener('click', popup._disableProtection); - if (popup._domainManipulateDOM === true) { + if (( negateHtmlFilterList || popup._domainManipulateDOM ) && !( negateHtmlFilterList && popup._domainManipulateDOM )) { manipulateDOMToggleElement.checked = true; manipulateDOMToggleElement.addEventListener('click', popup._disableManipulateDOM); @@ -267,6 +269,18 @@ popup._determineAmountInjected = function () { }); }; +popup._determineNegateHtmlFilterOption = function () { + + return new Promise((resolve) => { + + chrome.storage.sync.get(Setting.NEGATE_HTML_FILTER_LIST, function (items) { + + negateHtmlFilterList = items.negateHtmlFilterList; + resolve(); + }); + }); +}; + popup._groupResourceInjections = function (injections) { let groupedInjections = {}; diff --git a/pages/updates/updates.html b/pages/updates/updates.html index a015c206..10a9c10c 100644 --- a/pages/updates/updates.html +++ b/pages/updates/updates.html @@ -29,6 +29,7 @@
  • Added: simplemde v1.11.2 (#36)
  • Added: NVD3 v1.8.6 (#36)
  • Added: clipboard.js v1.7.1 (#36)
  • +
  • Implemented: Option to enable HTML-Filter by default (#33)
  • Generate rule sets for uBlock or uMatrix