diff --git a/app/panel/components/Summary.jsx b/app/panel/components/Summary.jsx
index 794c68810..97983aaf5 100644
--- a/app/panel/components/Summary.jsx
+++ b/app/panel/components/Summary.jsx
@@ -428,6 +428,7 @@ class Summary extends React.Component {
_renderDonut() {
const {
categories,
+ antiTracking,
is_expert,
paused_blocking,
sitePolicy,
@@ -437,6 +438,7 @@ class Summary extends React.Component {
Object.assign({}, state.blocking, {
is_expanded: state.panel.is_expanded,
language: state.panel.language,
+ smartBlock: state.panel.smartBlock,
+ enable_anti_tracking: state.panel.enable_anti_tracking,
pageHost: state.summary.pageHost,
paused_blocking: state.summary.paused_blocking,
sitePolicy: state.summary.sitePolicy,
smartBlockActive: state.panel.enable_smart_block,
- smartBlock: state.panel.smartBlock,
});
/**
* Bind Blocking view component action creators using Redux's bindActionCreators
@@ -43,7 +44,14 @@ const mapStateToProps = state => Object.assign({}, state.blocking, {
* @return {function} to be used as an argument in redux connect call
*/
const mapDispatchToProps = dispatch => ({
- actions: bindActionCreators(Object.assign(blockingActions, { updateTrackerCounts, showNotification }), dispatch)
+ actions: bindActionCreators(
+ Object.assign(blockingActions, {
+ updateTrackerCounts,
+ showNotification,
+ toggleCliqzFeature
+ }),
+ dispatch
+ )
});
/**
* Connects Blocking component to the Redux store.
diff --git a/app/panel/reducers/__tests__/summary.js b/app/panel/reducers/__tests__/summary.js
index fe34442fa..412422c68 100644
--- a/app/panel/reducers/__tests__/summary.js
+++ b/app/panel/reducers/__tests__/summary.js
@@ -35,6 +35,11 @@ const initialState = Immutable({
blocked: 0,
},
tab_id: 0,
+ antiTracking: {
+ totalUnsafeCount: 0,
+ totalUnknownCount: 0,
+ unknownTrackerCount: 0,
+ },
});
describe('app/panel/reducers/summary.js', () => {
@@ -57,11 +62,10 @@ describe('app/panel/reducers/summary.js', () => {
changedData: true,
newData: true
},
- antitracking: {
- totalUnsafeCount: 3,
- unchangedData: false,
- changedData: true,
- newData: true
+ antiTracking: {
+ totalUnsafeCount: 5,
+ totalUnknownCount: 3,
+ unknownTrackerCount: 1
}
};
const action = { data, type: UPDATE_CLIQZ_MODULE_DATA };
@@ -73,14 +77,14 @@ describe('app/panel/reducers/summary.js', () => {
},
antiTracking: {
totalUnsafeCount: 1,
- unchangedData: false,
- changedData: false
+ totalUnknownCount: 0,
+ unknownTrackerCount: 0
}
});
const updatedState = Immutable.merge(initState, {
adBlock: data.adblock,
- antiTracking: data.antitracking
+ antiTracking: data.antiTracking
});
expect(summaryReducer(initState, action)).toEqual(updatedState);
diff --git a/app/panel/reducers/blocking.js b/app/panel/reducers/blocking.js
index c0fb0e59a..c47e5fcbd 100644
--- a/app/panel/reducers/blocking.js
+++ b/app/panel/reducers/blocking.js
@@ -17,10 +17,13 @@ import {
FILTER_TRACKERS,
UPDATE_BLOCK_ALL_TRACKERS,
UPDATE_CATEGORIES,
+ UPDATE_ANTI_TRACKING_HIDE,
UPDATE_CATEGORY_BLOCKED,
UPDATE_TRACKER_BLOCKED,
UPDATE_TRACKER_TRUST_RESTRICT,
- TOGGLE_EXPAND_ALL
+ UPDATE_ANTI_TRACKING_WHITELIST,
+ TOGGLE_EXPAND_ALL,
+ UPDATE_CLIQZ_MODULE_DATA
} from '../constants/constants';
import {
updateTrackerBlocked, updateCategoryBlocked, updateBlockAllTrackers, toggleExpandAll
@@ -37,6 +40,14 @@ const initialState = {
},
site_specific_unblocks: {},
site_specific_blocks: {},
+ antiTracking: {
+ totalUnsafeCount: 0, // The amount of data points scrubbed by Anti-Tracking
+ totalUnknownCount: 0, // The amount of data points scrubbed by Anti-Tracking for Trackers not in the Ghostery DB
+ unknownTrackerCount: 0, // The amount of trackers blocked by Anti-Tracking
+ unknownTrackers: [], // An array of objects associated with each unknown Tracker (includes both blocked and whitelisted trackers for this site)
+ whitelistedUrls: {}, // An object of whitelisted url domains pointing to an object with the associated tracker name and an array of whitelisted host domains
+ hide: false, // Whether or not to display the Anti-Tracking blocking category
+ }
};
/**
@@ -66,6 +77,9 @@ export default (state = initialState, action) => {
case UPDATE_CATEGORIES: {
return Object.assign({}, state, { categories: action.data });
}
+ case UPDATE_ANTI_TRACKING_HIDE: {
+ return Object.assign({}, state, { antiTracking: action.data });
+ }
case UPDATE_CATEGORY_BLOCKED: {
const updated = updateCategoryBlocked(state, action);
return Object.assign({}, state, updated);
@@ -82,6 +96,16 @@ export default (state = initialState, action) => {
const updated = _updateTrackerTrustRestrict(state, action);
return Object.assign({}, state, updated);
}
+ case UPDATE_ANTI_TRACKING_WHITELIST: {
+ const antiTracking = _updateAntiTrackingWhitelist(state, action);
+ return Object.assign({}, state, { antiTracking });
+ }
+ case UPDATE_CLIQZ_MODULE_DATA: {
+ const { hide } = state.antiTracking;
+ return Object.assign({}, state, {
+ antiTracking: Object.assign({}, action.data.antiTracking, { hide })
+ });
+ }
default: return state;
}
@@ -152,3 +176,65 @@ const _updateTrackerTrustRestrict = (state, action) => {
site_specific_blocks: updated_site_specific_blocks,
};
};
+
+/**
+ * Update site_specific_blocks/unblocks for anit-tracking whitelist
+ * @memberOf PanelReactReducers
+ * @private
+ * @param {Object} state current state
+ * @param {Object} action action which provides data
+ * @return {Object} updated categories and site-specific blocking counters
+ */
+const _updateAntiTrackingWhitelist = (state, action) => {
+ const updatedAntiTracking = JSON.parse(JSON.stringify(state.antiTracking));
+ const { whitelistedUrls } = updatedAntiTracking;
+ const { unknownTracker, pageHost } = action.data;
+
+ const addToWhitelist = () => {
+ unknownTracker.domains.forEach((domain) => {
+ if (whitelistedUrls.hasOwnProperty(domain)) {
+ whitelistedUrls[domain].name = unknownTracker.name;
+ whitelistedUrls[domain].hosts.push(pageHost);
+ } else {
+ whitelistedUrls[domain] = {
+ name: unknownTracker.name,
+ hosts: [pageHost],
+ };
+ }
+ });
+ };
+
+ const removeFromWhitelist = (domain) => {
+ if (!whitelistedUrls[domain]) { return; }
+
+ whitelistedUrls[domain].hosts = whitelistedUrls[domain].hosts.filter(hostUrl => (
+ hostUrl !== pageHost
+ ));
+
+ if (whitelistedUrls[domain].hosts.length === 0) {
+ delete whitelistedUrls[domain];
+ }
+ };
+
+ if (unknownTracker.whitelisted) {
+ unknownTracker.domains.forEach(removeFromWhitelist);
+
+ Object.keys(whitelistedUrls).forEach((domain) => {
+ if (whitelistedUrls[domain].name === unknownTracker.name) {
+ removeFromWhitelist(domain);
+ }
+ });
+ } else {
+ addToWhitelist();
+ }
+
+ updatedAntiTracking.unknownTrackers.forEach((tracker) => {
+ if (tracker.name === unknownTracker.name) {
+ tracker.whitelisted = !tracker.whitelisted;
+ }
+ });
+
+ sendMessage('setPanelData', { anti_tracking_whitelist: whitelistedUrls });
+
+ return updatedAntiTracking;
+};
diff --git a/app/panel/reducers/summary.js b/app/panel/reducers/summary.js
index e94a644dc..1aef810d4 100644
--- a/app/panel/reducers/summary.js
+++ b/app/panel/reducers/summary.js
@@ -36,6 +36,11 @@ const initialState = {
blocked: 0,
},
tab_id: 0,
+ antiTracking: {
+ totalUnsafeCount: 0, // The amount of data points scrubbed by Anti-Tracking
+ totalUnknownCount: 0, // The amount of data points scrubbed by Anti-Tracking for Trackers not in the Ghostery DB
+ unknownTrackerCount: 0, // The amount of trackers blocked by Anti-Tracking
+ }
};
/**
* Default export for summary view reducer.
@@ -51,7 +56,11 @@ export default (state = initialState, action) => {
return Object.assign({}, state, action.data);
}
case UPDATE_CLIQZ_MODULE_DATA: {
- return Object.assign({}, state, { adBlock: action.data.adblock, antiTracking: action.data.antitracking });
+ const { totalUnsafeCount, totalUnknownCount, unknownTrackerCount } = action.data.antiTracking;
+ return Object.assign({}, state, {
+ adBlock: action.data.adblock,
+ antiTracking: { totalUnsafeCount, totalUnknownCount, unknownTrackerCount },
+ });
}
case UPDATE_GHOSTERY_PAUSED: {
return Object.assign({}, state, { paused_blocking: action.data.ghosteryPaused, paused_blocking_timeout: action.data.time });
@@ -77,7 +86,7 @@ export default (state = initialState, action) => {
};
/**
- * Update blacklist / whitelist
+ * Update site blacklist / whitelist
* @memberOf PanelReactReducers
* @private
*
diff --git a/app/scss/partials/_blocking_category.scss b/app/scss/partials/_blocking_category.scss
index 637aa399f..9f0cb86cc 100644
--- a/app/scss/partials/_blocking_category.scss
+++ b/app/scss/partials/_blocking_category.scss
@@ -5,7 +5,7 @@
* https://www.ghostery.com/
*
* Copyright 2019 Ghostery, Inc. All rights reserved.
- *
+ *
* 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
@@ -56,6 +56,13 @@
top: 0;
z-index: 1;
height: 62px;
+
+ &.anti-tracking-header {
+ height: 80px;
+ border-top: 0;
+ padding-top: 0;
+ }
+
.caret-down {
@extend %pointer;
display: inline-block;
@@ -119,6 +126,10 @@
max-width: 125px;
overflow-y: hidden;
@extend %nowrap;
+
+ &.ghosty-blue {
+ color: #00AEF0;
+ }
}
}
.checkbox-container {
@@ -129,4 +140,28 @@
fill: $alabaster;
}
}
+ .Category__antiTrackingDivider {
+ background-color: #00AEF0;
+ width: 110%;
+ height: 18px;
+ margin-bottom: 9px;
+ }
+ .Category__antiTrackingDividerText {
+ margin: 0;
+ padding-top: 2px;
+ padding-left: 15px;
+ font-size: 10px;
+ color: white;
+ }
+ .Category__antiTrackingCaret {
+ position: relative;
+ bottom: 14px;
+ left: 8px;
+ }
+ .Category__antiTrackingButton {
+ display: inline-block;
+ position: relative;
+ left: 4px;
+ bottom: 4px
+ }
}
diff --git a/app/scss/partials/_blocking_header.scss b/app/scss/partials/_blocking_header.scss
index 1c8a43972..5962e457d 100644
--- a/app/scss/partials/_blocking_header.scss
+++ b/app/scss/partials/_blocking_header.scss
@@ -61,6 +61,8 @@
line-height: 19px;
&.disabled {
color: #acacac;
+ pointer-events: none;
+ visibility: hidden;
}
}
.caret-down {
diff --git a/app/scss/partials/_blocking_tracker.scss b/app/scss/partials/_blocking_tracker.scss
index 08668f579..33b5af48c 100644
--- a/app/scss/partials/_blocking_tracker.scss
+++ b/app/scss/partials/_blocking_tracker.scss
@@ -27,6 +27,9 @@
font-weight: 400;
color: #4a4a4a;
@extend %nowrap;
+ &.is-whitelisted {
+ color: #00AEF0;
+ }
}
.trk-cliqz-stats-outer-container {
// prevent jitter from breaking to new line
@@ -108,6 +111,10 @@
margin-right: 10px;
overflow-y: hidden;
@extend %nowrap;
+ &.unknown {
+ margin: 0 10px 0 0;
+ color: #4a4a4a;
+ }
}
}
svg.blocking-icons {
@@ -127,6 +134,57 @@
display: block;
}
}
+
+ .unknown-svg-container {
+ position: relative;
+ top: 3px;
+ width: 42px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+
+ &:not(.whitelisted) {
+ .anti-track-trust {
+ visibility: hidden;
+ cursor: pointer;
+ .border { stroke: #d8d8d8; }
+ .background { fill: #f7f7f7; }
+ .trust-circle { stroke: #9B9B9B; }
+ }
+
+ .anti-track-scrub {
+ pointer-events: none;
+ }
+ }
+
+ &.whitelisted {
+ flex-direction: row-reverse;
+
+ .anti-track-trust {
+ pointer-events: none;
+ }
+ .anti-track-scrub {
+ visibility: hidden;
+ pointer-events: auto;
+ cursor: pointer;
+ .border { stroke: #d8d8d8; }
+ .background { fill: #f7f7f7; }
+ .shield { stroke: #9B9B9B; }
+ }
+ }
+
+ &:hover {
+ .anti-track-trust {
+ visibility: visible;
+ }
+ }
+
+ &.whitelisted:hover {
+ .anti-track-scrub {
+ visibility: visible;
+ }
+ }
+ }
}
// SVG icons shared with _blocking_category
@@ -167,3 +225,7 @@ svg.blocking-icons {
stroke-linecap: square;
}
}
+
+.OtherDataPoint__svgGroup {
+ padding-top: 5px;
+}
diff --git a/app/scss/partials/_cliqz_feature.scss b/app/scss/partials/_cliqz_feature.scss
index 5379840d0..d88f0b5e2 100644
--- a/app/scss/partials/_cliqz_feature.scss
+++ b/app/scss/partials/_cliqz_feature.scss
@@ -73,6 +73,19 @@ $cliqz-feature--darker-gray: #a4a4a4;
.CliqzFeature__feature-name { display: none; }
}
+.CliqzFeature--tiny {
+ .CliqzFeature__status {
+ line-height: 17px;
+ font-size: 9px;
+ }
+ .CliqzFeature__icon {
+ height: 28px;
+ width: 28px;
+ background-size: 26px 26px;
+ }
+ .CliqzFeature__feature-name { display: none; }
+}
+
// Modifications to element styling based on state-related block-level modifiers
// The CliqzFeature block is always either active or inactive
// and always either clickable or not-clickable
diff --git a/app/scss/partials/_tooltip.scss b/app/scss/partials/_tooltip.scss
index dbb63dac8..9ae6d4711 100644
--- a/app/scss/partials/_tooltip.scss
+++ b/app/scss/partials/_tooltip.scss
@@ -201,3 +201,7 @@
margin-left: 0 !important;
}
}
+
+.Category__antiTrackingButton .tooltip-content.left {
+ top: -27px;
+}
diff --git a/src/background.js b/src/background.js
index 423a41ba0..6172b3b43 100644
--- a/src/background.js
+++ b/src/background.js
@@ -1277,9 +1277,11 @@ function initialiseWebRequestPipeline() {
* @return {boolean}
*/
function isWhitelisted(state) {
- const url = state.tabUrl;
+ const hostUrl = utils.processUrl(state.tabUrl).host;
+ const trackerUrl = utils.processUrl(state.url).host;
+
// state.ghosteryWhitelisted is sometimes undefined so force to bool
- return Boolean(globals.SESSION.paused_blocking || events.policy.getSitePolicy(url) === 2 || state.ghosteryWhitelisted);
+ return Boolean(globals.SESSION.paused_blocking || events.policy.getSitePolicy(hostUrl, trackerUrl) === 2 || state.ghosteryWhitelisted);
}
/**
diff --git a/src/classes/BrowserButton.js b/src/classes/BrowserButton.js
index ffdc820aa..8a419945d 100644
--- a/src/classes/BrowserButton.js
+++ b/src/classes/BrowserButton.js
@@ -17,7 +17,7 @@ import conf from './Conf';
import foundBugs from './FoundBugs';
import rewards from './Rewards';
import Policy from './Policy';
-import { getCliqzAntiTrackingCount, getCliqzAdBlockingCount } from '../utils/cliqzModulesData';
+import { getCliqzAntiTrackingData, getCliqzAdBlockingCount } from '../utils/cliqzModulesData';
import { getTab } from '../utils/utils';
import { log } from '../utils/common';
import globals from './Globals';
@@ -146,7 +146,7 @@ class BrowserButton {
const { appsCount, appsAlertCount } = this._getTrackerCount(tabId);
const adBlockingCount = getCliqzAdBlockingCount(tabId).totalCount;
- const antiTrackingCount = getCliqzAntiTrackingCount(tabId).totalUnsafeCount;
+ const antiTrackingCount = getCliqzAntiTrackingData(tabId).totalUnsafeCount;
alert = (appsAlertCount > 0);
trackerCount = (appsCount + antiTrackingCount + adBlockingCount).toString();
@@ -155,7 +155,7 @@ class BrowserButton {
if (trackerCount === '') {
this._setIcon(false, tabId, trackerCount, alert);
} else {
- this._setIcon(!globals.SESSION.paused_blocking && !this.policy.whitelisted(tab.url), tabId, trackerCount, alert);
+ this._setIcon(!globals.SESSION.paused_blocking && !this.policy.checkSiteWhitelist(tab.url), tabId, trackerCount, alert);
}
}
diff --git a/src/classes/ConfData.js b/src/classes/ConfData.js
index 54c86231d..ebce5ac25 100644
--- a/src/classes/ConfData.js
+++ b/src/classes/ConfData.js
@@ -150,6 +150,7 @@ class ConfData {
_initProperty('site_specific_blocks', {});
_initProperty('site_specific_unblocks', {});
_initProperty('site_whitelist', []);
+ _initProperty('anti_tracking_whitelist', {});
_initProperty('surrogates', {});
_initProperty('version_history', []);
_initProperty('account', null);
diff --git a/src/classes/PanelData.js b/src/classes/PanelData.js
index b84c929cb..123705a70 100644
--- a/src/classes/PanelData.js
+++ b/src/classes/PanelData.js
@@ -550,7 +550,11 @@ class PanelData {
_postCliqzModulesData() {
if (!this._panelPort || !this._activeTab) { return; }
- sendCliqzModuleCounts(this._activeTab.id, this.postMessageToSummary);
+ sendCliqzModuleCounts(
+ this._activeTab.id,
+ this._activeTab.pageHost,
+ this.postMessageToSummary,
+ );
}
/**
diff --git a/src/classes/Policy.js b/src/classes/Policy.js
index e982e93f7..bfc02f996 100644
--- a/src/classes/Policy.js
+++ b/src/classes/Policy.js
@@ -17,7 +17,6 @@
import c2pDb from './Click2PlayDb';
import conf from './Conf';
-import { processUrl } from '../utils/utils';
import globals from './Globals';
/**
@@ -46,32 +45,32 @@ class Policy {
* @param {string} url site url
* @return {boolean}
*/
- getSitePolicy(url) {
- if (this.blacklisted(url)) {
+ getSitePolicy(hostUrl, trackerUrl) {
+ if (this.blacklisted(hostUrl)) {
return globals.BLACKLISTED;
}
- if (this.whitelisted(url)) {
+ if (this.checkSiteWhitelist(hostUrl)
+ || this.checkAntiTrackingWhitelist(hostUrl, trackerUrl)) {
return globals.WHITELISTED;
}
return false;
}
/**
- * Check given url against whitelist
+ * Check given url against site whitelist
* @param {string} url site url
* @return {string|boolean} corresponding whitelist entry or false, if none
*/
- whitelisted(url) {
+ checkSiteWhitelist(url) {
if (url) {
- url = processUrl(url).hostname;
- url = url.replace(/^www\./, '');
+ const replacedUrl = url.replace(/^www\./, '');
const sites = conf.site_whitelist || [];
const num_sites = sites.length;
// TODO: speed up
for (let i = 0; i < num_sites; i++) {
// TODO match from the beginning of the string to avoid false matches (somewhere in the querystring for instance)
- if (url === sites[i]) {
+ if (replacedUrl === sites[i]) {
return sites[i];
}
}
@@ -80,6 +79,28 @@ class Policy {
return false;
}
+ /**
+ * Check given url against anti-tracking whitelist
+ * @param {string} url site url
+ * @return {string|boolean} corresponding whitelist entry or false, if none
+ */
+ checkAntiTrackingWhitelist(hostUrl, trackerUrl) {
+ let isWhitelisted = false;
+ const antiTrackingWhitelist = conf.anti_tracking_whitelist;
+
+ if (antiTrackingWhitelist[trackerUrl]) {
+ antiTrackingWhitelist[trackerUrl].hosts.some((host) => {
+ if (host === hostUrl) {
+ isWhitelisted = true;
+ return true;
+ }
+ return false;
+ });
+ }
+
+ return isWhitelisted;
+ }
+
/**
* Check given url against blacklist
* @param {string} url site url
@@ -87,15 +108,14 @@ class Policy {
*/
blacklisted(url) {
if (url) {
- url = processUrl(url).hostname;
- url = url.replace(/^www\./, '');
+ const replacedUrl = url.replace(/^www\./, '');
const sites = conf.site_blacklist || [];
const num_sites = sites.length;
// TODO: speed up
for (let i = 0; i < num_sites; i++) {
// TODO match from the beginning of the string to avoid false matches (somewhere in the querystring for instance)
- if (url === sites[i]) {
+ if (replacedUrl === sites[i]) {
return sites[i];
}
}
diff --git a/src/classes/PurpleBox.js b/src/classes/PurpleBox.js
index 5e8cfa659..8f3cf7bbb 100644
--- a/src/classes/PurpleBox.js
+++ b/src/classes/PurpleBox.js
@@ -48,7 +48,7 @@ class PurpleBox {
// Skip in the event of pause, trust, prefetching, newtab page, or Firefox about:pages
if (!conf.show_alert ||
globals.SESSION.paused_blocking ||
- (conf.hide_alert_trusted && !!this.policy.whitelisted(tab.url)) ||
+ (conf.hide_alert_trusted && !!this.policy.checkSiteWhitelist(tab.url)) ||
!tab || tab.purplebox || tab.path.includes('_/chrome/newtab') || tab.protocol === 'about' || globals.EXCLUDES.includes(tab.host)) {
return Promise.resolve(false);
}
diff --git a/src/utils/cliqzModulesData.js b/src/utils/cliqzModulesData.js
index b22974133..84b8f2282 100644
--- a/src/utils/cliqzModulesData.js
+++ b/src/utils/cliqzModulesData.js
@@ -26,25 +26,64 @@ const { adblocker, antitracking } = cliqz.modules;
* @param {int} tabId
* @return {object} totalUnsafeCount
*/
-export function getCliqzAntiTrackingCount(tabId) {
- let count = 0;
+export function getCliqzAntiTrackingData(tabId, tabHostUrl) {
+ let totalUnsafeCount = 0;
+ let totalUnknownCount = 0;
+ let unknownTrackerCount = 0;
if (!conf.enable_anti_tracking || !antitracking.background) {
return {
- totalUnsafeCount: count
+ totalUnsafeCount,
+ totalUnknownCount,
};
}
// Count up number of fingerprints and cookies found
const { bugs, others } = antitracking.background.actions.getGhosteryStats(tabId);
- const allStats = Object.assign({}, bugs, others);
- const values = Object.values(allStats);
+ const bugsValues = Object.values(bugs);
+ const othersValues = Object.values(others);
- for (const val of values) {
- count += val.cookies + val.fingerprints;
+ const unknownTrackers = [];
+
+ for (const bug of bugsValues) {
+ totalUnsafeCount += bug.cookies + bug.fingerprints;
+ }
+
+ for (const other of othersValues) {
+ let whitelisted = false;
+ const scrubbed = other.cookies || other.fingerprints;
+
+ other.domains.some((domain) => {
+ if (conf.anti_tracking_whitelist[domain]
+ && conf.anti_tracking_whitelist[domain].hosts.includes(tabHostUrl)) {
+ whitelisted = true;
+ return true;
+ }
+ return false;
+ });
+
+ if (scrubbed) {
+ totalUnsafeCount += other.cookies + other.fingerprints;
+ totalUnknownCount += other.cookies + other.fingerprints;
+ unknownTrackerCount += 1;
+ }
+
+ if (scrubbed || whitelisted) {
+ const {
+ name, domains, ads, cookies, fingerprints
+ } = other;
+
+ unknownTrackers.push({
+ name, domains, ads, cookies, fingerprints, whitelisted
+ });
+ }
}
return {
- totalUnsafeCount: count
+ totalUnsafeCount,
+ unknownTrackers,
+ unknownTrackerCount,
+ totalUnknownCount,
+ whitelistedUrls: conf.anti_tracking_whitelist,
};
}
@@ -92,10 +131,10 @@ export function getCliqzGhosteryBugs(tabId) {
* @param {int} tabId
* @param {Function} callback
*/
-export function sendCliqzModuleCounts(tabId, callback) {
+export function sendCliqzModuleCounts(tabId, tabHostUrl, callback) {
const modules = { adblock: {}, antitracking: {} };
modules.adblock = getCliqzAdBlockingCount(tabId);
- modules.antitracking = getCliqzAntiTrackingCount(tabId);
+ modules.antiTracking = getCliqzAntiTrackingData(tabId, tabHostUrl);
callback(modules);
}