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);
};