diff --git a/.eslintrc b/.eslintrc index 82e605a..74a50f7 100644 --- a/.eslintrc +++ b/.eslintrc @@ -16,6 +16,7 @@ "helpers": true, "interceptor": true, "mappings": true, + "MessageResponse": true, "requestAnalyzer": true, "requestSanitizer": true, "Resource": true, diff --git a/core/constants.js b/core/constants.js index f4edd00..2681915 100644 --- a/core/constants.js +++ b/core/constants.js @@ -34,6 +34,11 @@ const Header = { 'REFERER': 'Referer' }; +const MessageResponse = { + 'ASYNCHRONOUS': true, + 'SYNCHRONOUS': false +}; + const Resource = { 'MAPPING_EXPRESSION': /\.map$/i, 'VERSION_EXPRESSION': /(?:\d{1,2}\.){1,3}\d{1,2}/, diff --git a/core/messenger.js b/core/messenger.js new file mode 100644 index 0000000..4db9f68 --- /dev/null +++ b/core/messenger.js @@ -0,0 +1,70 @@ +/** + * Messenger + * Belongs to Decentraleyes. + * + * @author Thomas Rientjes + * @since 2018-05-28 + * @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'; + +/** + * Messenger + */ + +var messenger = {}; + +/** + * Private Methods + */ + +messenger._handleMessageReceived = function (message, sender, sendResponse) { + + let topic, value; + + topic = message.topic; + value = message.value; + + if (topic === 'tab:fetch-injections') { + + sendResponse({'value': stateManager.tabs[value].injections}); + return MessageResponse.SYNCHRONOUS; + } + + if (topic === 'domain:fetch-is-whitelisted') { + + let whitelistRecord = requestAnalyzer.whitelistedDomains[value]; + sendResponse({'value': Boolean(whitelistRecord)}); + + return MessageResponse.SYNCHRONOUS; + } + + if (topic === 'whitelist:add-domain') { + + stateManager.addDomainToWhitelist(value).then(function () { + sendResponse({'value': true}); + }); + + return MessageResponse.ASYNCHRONOUS; + } + + if (topic === 'whitelist:remove-domain') { + + stateManager.removeDomainFromWhitelist(value).then(function () { + sendResponse({'value': true}); + }); + + return MessageResponse.ASYNCHRONOUS; + } +}; + +/** + * Event Handlers + */ + +chrome.runtime.onMessage.addListener(messenger._handleMessageReceived); diff --git a/core/state-manager.js b/core/state-manager.js index 8d4db71..ba7d472 100644 --- a/core/state-manager.js +++ b/core/state-manager.js @@ -74,7 +74,7 @@ stateManager.addDomainToWhitelist = function (domain) { }); }; -stateManager.deleteDomainFromWhitelist = function (domain) { +stateManager.removeDomainFromWhitelist = function (domain) { return new Promise((resolve) => { diff --git a/pages/background/background.html b/pages/background/background.html index 92ba3c4..0093dbe 100644 --- a/pages/background/background.html +++ b/pages/background/background.html @@ -22,6 +22,7 @@ + diff --git a/pages/popup/popup.js b/pages/popup/popup.js index ac7751b..7dc635e 100644 --- a/pages/popup/popup.js +++ b/pages/popup/popup.js @@ -30,11 +30,10 @@ popup._renderContents = function () { popup._renderNonContextualContents(); - if (popup._backgroundPage !== null) { - - popup._determineTargetTab() - .then(popup._renderContextualContents); - } + popup._determineTargetTab() + .then(popup._determineDomainWhitelistStatus) + .then(popup._determineResourceInjections) + .then(popup._renderContextualContents); }; popup._renderNonContextualContents = function () { @@ -55,24 +54,12 @@ popup._renderNonContextualContents = function () { popup._renderContextualContents = function () { - let injections, groupedInjections; - - popup._domain = helpers.extractDomainFromUrl(popup._targetTab.url); - - popup._requestAnalyzer = popup._backgroundPage.requestAnalyzer; - popup._stateManager = popup._backgroundPage.stateManager; - if (popup._domain !== null) { - - popup._domain = helpers.normalizeDomain(popup._domain); popup._renderDomainWhitelistPanel(); } - injections = popup._stateManager.tabs[popup._targetTab.id].injections; - groupedInjections = popup._groupResourceInjections(injections); - - if (Object.keys(groupedInjections).length > 0) { - popup._renderInjectionPanel(groupedInjections); + if (Object.keys(popup._resourceInjections).length > 0) { + popup._renderInjectionPanel(popup._resourceInjections); } }; @@ -87,7 +74,7 @@ popup._renderDomainWhitelistPanel = function () { protectionToggleElement.setAttribute('dir', popup._scriptDirection); domainIndicatorElement.innerText = popup._domain; - if (popup._requestAnalyzer.whitelistedDomains[popup._domain]) { + if (popup._domainIsWhitelisted === true) { let enableProtectionTitle = chrome.i18n.getMessage('enableProtectionTitle'); @@ -119,23 +106,59 @@ popup._renderInjectionPanel = function (groupedInjections) { popup._enableProtection = function () { - popup._stateManager.deleteDomainFromWhitelist(popup._domain) - .then(popup._onProtectionToggled); + let message = { + 'topic': 'whitelist:remove-domain', + 'value': popup._domain + }; + + chrome.runtime.sendMessage(message, function () { + popup._onProtectionToggled(); + }); }; popup._disableProtection = function () { - popup._stateManager.addDomainToWhitelist(popup._domain) - .then(popup._onProtectionToggled); + let message = { + 'topic': 'whitelist:add-domain', + 'value': popup._domain + }; + + chrome.runtime.sendMessage(message, function () { + popup._onProtectionToggled(); + }); }; -popup._determineBackgroundPage = function () { +popup._determineDomainWhitelistStatus = function () { return new Promise((resolve) => { - chrome.runtime.getBackgroundPage(function (backgroundPage) { + let message = { + 'topic': 'domain:fetch-is-whitelisted', + 'value': popup._domain + }; + + chrome.runtime.sendMessage(message, function (response) { + + popup._domainIsWhitelisted = response.value; + resolve(); + }); + }); +}; + +popup._determineResourceInjections = function () { + + return new Promise((resolve) => { + + let message = { + 'topic': 'tab:fetch-injections', + 'value': popup._targetTab.id + }; + + chrome.runtime.sendMessage(message, function (response) { + + let groupedInjections = popup._groupResourceInjections(response.value); + popup._resourceInjections = groupedInjections; - popup._backgroundPage = backgroundPage; resolve(); }); }); @@ -148,6 +171,12 @@ popup._determineTargetTab = function () { chrome.tabs.query({'active': true, 'currentWindow': true}, function (tabs) { popup._targetTab = tabs[0]; + popup._domain = helpers.extractDomainFromUrl(tabs[0].url); + + if (popup._domain !== null) { + popup._domain = helpers.normalizeDomain(popup._domain); + } + resolve(); }); }); @@ -292,8 +321,7 @@ popup._onDocumentLoaded = function () { popup._version = helpers.formatVersion(manifest.version); popup._scriptDirection = helpers.determineScriptDirection(language); - popup._determineBackgroundPage() - .then(popup._determineAmountInjected) + popup._determineAmountInjected() .then(popup._renderContents); };