diff --git a/CHANGELOG.md b/CHANGELOG.md index f98a25bb3..a6c241a31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ### GHOSTERY 8.4.1 (UNRELEASED) -+ Add new Data Points tracker category in detail view with anti-tracking whitelist (#417) ++ Add new Unknown tracker category in detail view with anti-tracking whitelist (#417, #433) + Fixes broken `target=_blank` links in Opera (#426) + Fixes error `Uncaught TypeError: c.querySelectorAll` (#406) + Show ad-blocking icons in detail view tracker list (#411) diff --git a/CODEOWNERS b/CODEOWNERS index fb3fb8d25..63a84492d 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -13,16 +13,16 @@ /src/classes/PolicySmartBlock.js @jsignanini /src/classes/Conf.js @zarembsky /src/classes/ConfData.js @zarembsky -/src/classes/PanelData.js @zarembsky +/src/classes/PanelData.js @wlycdgr # Background /src/background.js @zarembsky # The Ghostery Hub -/app/hub/ @IAmThePan +/app/hub/ @Eden12345 # Shared Components -/app/shared-components @IAmThePan +/app/shared-components @wlycdgr # Build Tools .eslintrc.js @christophertino @@ -30,4 +30,4 @@ babel.config.js @christophertino webpack.config.js @christophertino # Unit Tests -/test/ @IAmThePan +/test/ @Eden12345 diff --git a/app/images/panel/anti_tracking_unknown.svg b/app/images/panel/anti_tracking_unknown.svg deleted file mode 100644 index 936cfeb8c..000000000 --- a/app/images/panel/anti_tracking_unknown.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/app/images/panel/unknown.svg b/app/images/panel/unknown.svg new file mode 100644 index 000000000..0b5dc198c --- /dev/null +++ b/app/images/panel/unknown.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/app/panel/actions/BlockingActions.js b/app/panel/actions/BlockingActions.js index 5e4c273f9..3964acaac 100644 --- a/app/panel/actions/BlockingActions.js +++ b/app/panel/actions/BlockingActions.js @@ -15,11 +15,11 @@ import { UPDATE_BLOCKING_DATA, UPDATE_BLOCK_ALL_TRACKERS, UPDATE_CATEGORIES, - UPDATE_ANTI_TRACKING_HIDE, + UPDATE_UNKNOWN_CATEGORY_HIDE, UPDATE_CATEGORY_BLOCKED, UPDATE_TRACKER_BLOCKED, UPDATE_TRACKER_TRUST_RESTRICT, - UPDATE_ANTI_TRACKING_WHITELIST, + UPDATE_CLIQZ_MODULE_WHITELIST, TOGGLE_EXPAND_ALL } from '../constants/constants'; @@ -64,9 +64,9 @@ export function updateCategories(data) { * @param {Object} data * @return {Object} */ -export function updateAntiTrackingHide(data) { +export function updateUnknownCategoryHide(data) { return { - type: UPDATE_ANTI_TRACKING_HIDE, + type: UPDATE_UNKNOWN_CATEGORY_HIDE, data, }; } @@ -119,16 +119,16 @@ export function updateTrackerTrustRestrict(data) { } /** - * Called from Tracker.handleAntiTrackingWhitelist() + * Called from Tracker.handleCliqzTrackerWhitelist() * @param {Object} data * @return {Object} dispatch */ -export function updateAntiTrackingWhitelist(unknownTracker) { +export function updateCliqzModuleWhitelist(unknownTracker) { return function(dispatch, getState) { // use redux-thunk to get pageHost from summary const { pageHost } = getState().summary; dispatch({ - type: UPDATE_ANTI_TRACKING_WHITELIST, + type: UPDATE_CLIQZ_MODULE_WHITELIST, data: { unknownTracker, pageHost }, }); }; diff --git a/app/panel/components/Blocking.jsx b/app/panel/components/Blocking.jsx index a26c4c2fe..45ea17733 100644 --- a/app/panel/components/Blocking.jsx +++ b/app/panel/components/Blocking.jsx @@ -93,7 +93,7 @@ class Blocking extends React.Component { */ setShow(filterName) { const updated_categories = JSON.parse(JSON.stringify(this.props.categories)); // deep clone - const updatedAntiTracking = JSON.parse(JSON.stringify(this.props.antiTracking)); // deep clone + const updatedUnknownCategory = JSON.parse(JSON.stringify(this.props.unknownCategory)); // deep clone updated_categories.forEach((category) => { let count = 0; @@ -112,9 +112,9 @@ class Blocking extends React.Component { category.num_shown = (show) ? count : 0; }); - updatedAntiTracking.hide = !(filterName === 'all' || filterName === 'unknown'); + updatedUnknownCategory.hide = !(filterName === 'all' || filterName === 'unknown'); this.props.actions.updateCategories(updated_categories); - this.props.actions.updateAntiTrackingHide(updatedAntiTracking); + this.props.actions.updateUnknownCategoryHide(updatedUnknownCategory); } /** @@ -284,7 +284,7 @@ class Blocking extends React.Component { const { actions, categories, - antiTracking, + unknownCategory, enable_anti_tracking, expand_all_trackers, is_expanded, @@ -329,7 +329,7 @@ class Blocking extends React.Component { language={language} smartBlockActive={smartBlockActive} smartBlock={smartBlock} - antiTracking={antiTracking} + unknownCategory={unknownCategory} enable_anti_tracking={enable_anti_tracking} /> )} diff --git a/app/panel/components/Blocking/Categories.jsx b/app/panel/components/Blocking/Categories.jsx index fdfa3bbef..a51b58882 100644 --- a/app/panel/components/Blocking/Categories.jsx +++ b/app/panel/components/Blocking/Categories.jsx @@ -32,7 +32,7 @@ class Categories extends React.Component { const { categories, expandAll, - antiTracking, + unknownCategory, enable_anti_tracking, sitePolicy, } = this.props; @@ -43,22 +43,23 @@ class Categories extends React.Component { let whitelistedTotal = 0; const unknownCategoryMapping = isUnknown ? ( { - id: 'anti_tracking_unknown', + id: 'unknown', name: t('unknown'), description: t('unknown_description'), - img_name: 'anti_tracking_unknown', - num_total: antiTracking.unknownTrackers.length, - num_blocked: antiTracking.unknownTrackerCount, - num_shown: antiTracking.hide ? 0 : antiTracking.unknownTrackers.length, - trackers: antiTracking.unknownTrackers.map((unknownTracker) => { + img_name: 'unknown', + num_total: unknownCategory.unknownTrackers.length, + num_blocked: unknownCategory.unknownTrackerCount, + num_shown: unknownCategory.hide ? 0 : unknownCategory.unknownTrackers.length, + trackers: unknownCategory.unknownTrackers.map((unknownTracker) => { if (unknownTracker.whitelisted) { whitelistedTotal++; } return { name: unknownTracker.name, domains: unknownTracker.domains, whitelisted: unknownTracker.whitelisted, + type: unknownTracker.type, siteRestricted: sitePolicy === 1, blocked: false, - catId: 'anti_tracking_unknown', + catId: 'unknown', description: '', id: unknownTracker.name + unknownTracker.domains[0], shouldShow: true, @@ -94,13 +95,13 @@ class Categories extends React.Component { }; const categoryList = categories.map((category, index) => renderCategory(category, index)); - const unknownCategory = antiTracking && antiTracking.unknownTrackers.length + const renderUnknownCategory = unknownCategory && unknownCategory.unknownTrackers.length ? renderCategory(null, categoryList.length, true) : null; return (
{categoryList} - {unknownCategory} + {renderUnknownCategory}
); } diff --git a/app/panel/components/Blocking/Category.jsx b/app/panel/components/Blocking/Category.jsx index cd4abc709..587b84567 100644 --- a/app/panel/components/Blocking/Category.jsx +++ b/app/panel/components/Blocking/Category.jsx @@ -13,8 +13,6 @@ import React from 'react'; import Trackers from './Trackers'; -import { CliqzFeature } from '../BuildingBlocks'; -import Globals from '../../../../src/classes/Globals'; /** * @class Implement Category component, which represents a @@ -165,8 +163,6 @@ class Category extends React.Component { category, paused_blocking, sitePolicy, - enable_anti_tracking, - actions, isUnknown, } = this.props; @@ -185,26 +181,11 @@ class Category extends React.Component { trackersBlockedCount = category.num_blocked || 0; } - const clickCliqzFeature = (options) => { - const { feature, status, text } = options; - this.props.actions.showNotification({ - updated: feature, - reload: true, - text, - }); - actions.toggleCliqzFeature(feature, status); - }; - const cliqzInactive = paused_blocking || sitePolicy || Globals.IS_CLIQZ; - return (
{isUnknown && ( -
-

- {t('enhanced_anti_tracking')} -

-
+
)}
@@ -272,20 +253,6 @@ class Category extends React.Component {
)} - {isUnknown && ( -
- -
- )}
diff --git a/app/panel/components/Blocking/Tracker.jsx b/app/panel/components/Blocking/Tracker.jsx index 9997bea7e..2f51e50a9 100644 --- a/app/panel/components/Blocking/Tracker.jsx +++ b/app/panel/components/Blocking/Tracker.jsx @@ -42,7 +42,7 @@ class Tracker extends React.Component { this.clickTrackerStatus = this.clickTrackerStatus.bind(this); this.clickTrackerTrust = this.clickTrackerTrust.bind(this); this.clickTrackerRestrict = this.clickTrackerRestrict.bind(this); - this.handleAntiTrackingWhitelist = this.handleAntiTrackingWhitelist.bind(this); + this.handleCliqzTrackerWhitelist = this.handleCliqzTrackerWhitelist.bind(this); } /** @@ -217,10 +217,10 @@ class Tracker extends React.Component { * Trigger actions which persist the new setting and notify user * that the page should be reloaded. */ - handleAntiTrackingWhitelist() { + handleCliqzTrackerWhitelist() { const { tracker } = this.props; - this.props.actions.updateAntiTrackingWhitelist(tracker); + this.props.actions.updateCliqzModuleWhitelist(tracker); this.props.actions.showNotification({ updated: `${tracker.name}-whitelisting-status-changed`, reload: true, @@ -335,16 +335,18 @@ class Tracker extends React.Component { {!tracker.whitelisted && this._renderCliqzStatsContainer()}
- {!isUnknown ? renderKnownTrackerButtons( + {!isUnknown && renderKnownTrackerButtons( this.props.tracker.ss_allowed, this.props.tracker.ss_blocked, this.clickTrackerTrust, this.clickTrackerRestrict, this.clickTrackerStatus, - ) : renderUnknownTrackerButtons( - this.handleAntiTrackingWhitelist, + )} + {isUnknown && tracker.type === 'antiTracking' && renderUnknownTrackerButtons( + this.handleCliqzTrackerWhitelist, tracker.whitelisted, tracker.siteRestricted, + tracker.type, )}
diff --git a/app/panel/components/Blocking/trackerButtonRenderHelpers.jsx b/app/panel/components/Blocking/trackerButtonRenderHelpers.jsx index e3829b881..2027507b6 100644 --- a/app/panel/components/Blocking/trackerButtonRenderHelpers.jsx +++ b/app/panel/components/Blocking/trackerButtonRenderHelpers.jsx @@ -54,7 +54,7 @@ export const renderKnownTrackerButtons = ( ); export const renderUnknownTrackerButtons = ( - handleAntiTrackingWhitelist, whitelisted, siteRestricted + handleCliqzTrackerWhitelist, whitelisted, siteRestricted, type ) => { const svgContainerClasses = ClassNames('unknown-svg-container', { whitelisted: whitelisted && !siteRestricted, @@ -65,7 +65,7 @@ export const renderUnknownTrackerButtons = (
{/* USE INLINE SVG FOR TRUST CIRCLE TO CHANGE COLORS WITH CSS */} - + @@ -78,15 +78,24 @@ export const renderUnknownTrackerButtons = ( {/* USE INLINE SVG FOR ANTI-TRACKING SHIELD TO CHANGE COLORS WITH CSS */} - + - - - - - + {type === 'antiTracking' ? ( + + + + + + ) : ( + + + + + + + )} diff --git a/app/panel/components/BuildingBlocks/DonutGraph.jsx b/app/panel/components/BuildingBlocks/DonutGraph.jsx index f22a79e84..a156b29b2 100644 --- a/app/panel/components/BuildingBlocks/DonutGraph.jsx +++ b/app/panel/components/BuildingBlocks/DonutGraph.jsx @@ -76,6 +76,7 @@ class DonutGraph extends React.Component { componentDidMount() { const { categories, + adBlock, antiTracking, renderRedscale, renderGreyscale, @@ -90,7 +91,7 @@ class DonutGraph extends React.Component { .value(d => d.value); this.prepareDonutContainer(isSmall); - this.bakeDonut(categories, antiTracking, { + this.bakeDonut(categories, antiTracking, adBlock, { renderRedscale, renderGreyscale }); @@ -102,6 +103,7 @@ class DonutGraph extends React.Component { componentWillReceiveProps(nextProps) { const { categories, + adBlock, antiTracking, renderRedscale, renderGreyscale, @@ -128,9 +130,10 @@ class DonutGraph extends React.Component { return; } - if (!antiTracking.unknownTrackerCount && !nextProps.antiTracking.unknownTrackerCount) { return; } - const unknownDataPoints = antiTracking.unknownTrackerCount; - const nextUnknownDataPoints = nextProps.antiTracking.unknownTrackerCount; + if (!antiTracking.unknownTrackerCount && !nextProps.antiTracking.unknownTrackerCount + && !adBlock.unknownTrackerCount && !nextProps.adBlock.unknownTrackerCount) { return; } + const unknownDataPoints = antiTracking.unknownTrackerCount + adBlock.unknownTrackerCount; + const nextUnknownDataPoints = nextProps.antiTracking.unknownTrackerCount + nextProps.adBlock.unknownTrackerCount; if (unknownDataPoints !== nextUnknownDataPoints) { this.nextPropsDonut(nextProps); } @@ -154,7 +157,7 @@ class DonutGraph extends React.Component { * Helper function that updates donut with nextProps values */ nextPropsDonut(nextProps) { - this.bakeDonut(nextProps.categories, nextProps.antiTracking, { + this.bakeDonut(nextProps.categories, nextProps.antiTracking, nextProps.adBlock, { renderRedscale: nextProps.renderRedscale, renderGreyscale: nextProps.renderGreyscale, isSmall: nextProps.isSmall, @@ -193,7 +196,7 @@ class DonutGraph extends React.Component { */ bakeDonut = throttle(this._bakeDonut.bind(this), 600, { leading: true, trailing: true }) // eslint-disable-line react/sort-comp - _bakeDonut(categories, antiTracking, options) { + _bakeDonut(categories, antiTracking, adBlock, options) { const { renderRedscale, renderGreyscale, @@ -221,11 +224,11 @@ class DonutGraph extends React.Component { graphData.sort((a, b) => a.value < b.value); } - if (antiTracking.unknownTrackerCount) { + if (antiTracking.unknownTrackerCount || adBlock.unknownTrackerCount) { graphData.push({ id: 'unknown', name: 'Unknown', - value: antiTracking.unknownTrackerCount, + value: antiTracking.unknownTrackerCount + adBlock.unknownTrackerCount, }); } @@ -338,6 +341,7 @@ class DonutGraph extends React.Component { const { isSmall, categories, + adBlock, antiTracking, totalCount, } = this.props; @@ -359,7 +363,7 @@ class DonutGraph extends React.Component { {cat.name} ))} - {!!antiTracking.unknownTrackerCount && ( + {!!antiTracking.unknownTrackerCount && !!adBlock.unknownTrackerCount && ( { @@ -57,33 +62,32 @@ describe('app/panel/reducers/summary.js', () => { test('reducer correctly handles UPDATE_CLIQZ_MODULE_DATA', () => { const data = { - adblock: { - unchangedData: false, - changedData: true, - newData: true + adBlock: { + totalCount: 3, + trackerCount: 2, }, antiTracking: { totalUnsafeCount: 5, totalUnknownCount: 3, - unknownTrackerCount: 1 + trackerCount: 1 } }; const action = { data, type: UPDATE_CLIQZ_MODULE_DATA }; const initState = Immutable({ tab_id: 0, adBlock: { - unchangedData: false, - changedData: false + totalCount: 1, + trackerCount: 1, }, antiTracking: { totalUnsafeCount: 1, totalUnknownCount: 0, - unknownTrackerCount: 0 + trackerCount: 0 } }); const updatedState = Immutable.merge(initState, { - adBlock: data.adblock, + adBlock: data.adBlock, antiTracking: data.antiTracking }); diff --git a/app/panel/reducers/blocking.js b/app/panel/reducers/blocking.js index 7acca9d03..87bc75141 100644 --- a/app/panel/reducers/blocking.js +++ b/app/panel/reducers/blocking.js @@ -17,13 +17,14 @@ import { FILTER_TRACKERS, UPDATE_BLOCK_ALL_TRACKERS, UPDATE_CATEGORIES, - UPDATE_ANTI_TRACKING_HIDE, + UPDATE_UNKNOWN_CATEGORY_HIDE, UPDATE_CATEGORY_BLOCKED, UPDATE_TRACKER_BLOCKED, UPDATE_TRACKER_TRUST_RESTRICT, - UPDATE_ANTI_TRACKING_WHITELIST, + UPDATE_CLIQZ_MODULE_WHITELIST, TOGGLE_EXPAND_ALL, - UPDATE_CLIQZ_MODULE_DATA + UPDATE_CLIQZ_MODULE_DATA, + UPDATE_SUMMARY_DATA } from '../constants/constants'; import { updateTrackerBlocked, updateCategoryBlocked, updateBlockAllTrackers, toggleExpandAll @@ -40,13 +41,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 + unknownCategory: { + totalUnsafeCount: 0, // The amount of data points scrubbed by Anti-Tracking and Ad Block + totalUnknownCount: 0, // The amount of data points scrubbed by Anti-Tracking and Ad Block for Trackers not in the Ghostery DB + trackerCount: 0, // The amount of trackers scrubbed by Anti-Tracking and Ad Block (which are each associated with 1 or more data points) + unknownTrackerCount: 0, // The amount of unknown trackers scrubbed by Anti-Tracking and Ad Block 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 + hide: false, // Whether or not to display the Unknown category } }; @@ -77,8 +79,8 @@ 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_UNKNOWN_CATEGORY_HIDE: { + return Object.assign({}, state, { unknownCategory: action.data }); } case UPDATE_CATEGORY_BLOCKED: { const updated = updateCategoryBlocked(state, action); @@ -96,15 +98,35 @@ 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_WHITELIST: { + const unknownCategory = _updateCliqzModuleWhitelist(state, action); + return Object.assign({}, state, { unknownCategory }); } - case UPDATE_CLIQZ_MODULE_DATA: { - const { hide } = state.antiTracking; - return Object.assign({}, state, { - antiTracking: Object.assign({}, action.data.antiTracking, { hide }) - }); + case UPDATE_CLIQZ_MODULE_DATA: + case UPDATE_SUMMARY_DATA: { + if (action.data.antiTracking) { + const { antiTracking, adBlock } = action.data; + let adBlockUnknownTrackers = adBlock.unknownTrackers; + antiTracking.unknownTrackers.forEach((tracker) => { + if (tracker.whitelisted) { + adBlockUnknownTrackers = adBlockUnknownTrackers.filter(adBlockTracker => ( + adBlockTracker.name !== tracker.name + )); + } + }); + + const unknownCategory = { + totalUnsafeCount: antiTracking.totalUnsafeCount + adBlock.totalUnsafeCount, + totalUnknownCount: antiTracking.totalUnknownCount + adBlock.totalUnknownCount, + trackerCount: antiTracking.trackerCount + adBlock.trackerCount, + unknownTrackerCount: antiTracking.unknownTrackerCount + adBlock.unknownTrackerCount, + unknownTrackers: Array.from(new Set(antiTracking.unknownTrackers.concat(adBlockUnknownTrackers))), + whitelistedUrls: Object.assign({}, antiTracking.whitelistedUrls, adBlock.whitelistedUrls), + hide: state.unknownCategory.hide, + }; + return Object.assign({}, state, { unknownCategory }); + } + return state; } default: return state; @@ -186,9 +208,9 @@ const _updateTrackerTrustRestrict = (state, action) => { * @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 _updateCliqzModuleWhitelist = (state, action) => { + const updatedUnknownCategory = JSON.parse(JSON.stringify(state.unknownCategory)); + const { whitelistedUrls } = updatedUnknownCategory; const { unknownTracker, pageHost } = action.data; const addToWhitelist = () => { @@ -229,13 +251,13 @@ const _updateAntiTrackingWhitelist = (state, action) => { addToWhitelist(); } - updatedAntiTracking.unknownTrackers.forEach((tracker) => { + updatedUnknownCategory.unknownTrackers.forEach((tracker) => { if (tracker.name === unknownTracker.name) { tracker.whitelisted = !tracker.whitelisted; } }); - sendMessage('setPanelData', { anti_tracking_whitelist: whitelistedUrls }); + sendMessage('setPanelData', { cliqz_module_whitelist: whitelistedUrls }); - return updatedAntiTracking; + return updatedUnknownCategory; }; diff --git a/app/panel/reducers/summary.js b/app/panel/reducers/summary.js index 759b3c543..1e80aea2c 100644 --- a/app/panel/reducers/summary.js +++ b/app/panel/reducers/summary.js @@ -39,7 +39,12 @@ const initialState = { 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 + trackerCount: 0, // The amount of trackers scrubbed by Anti-Tracking (which are each associated with 1 or more data points) + unknownTrackerCount: 0, // The amount of unknown trackers scrubbed by Anti-Tracking + }, + adBlock: { + totalCount: 0, // The amount of ads blocked by Ad Blocking + trackerCount: 0, // The amount of trackers blocked by Ad Blocking (which are each associated with 1 or more ads) } }; /** @@ -52,15 +57,9 @@ const initialState = { */ export default (state = initialState, action) => { switch (action.type) { - case UPDATE_SUMMARY_DATA: { - return Object.assign({}, state, action.data); - } + case UPDATE_SUMMARY_DATA: case UPDATE_CLIQZ_MODULE_DATA: { - const { totalUnsafeCount, totalUnknownCount, unknownTrackerCount } = action.data.antiTracking; - return Object.assign({}, state, { - adBlock: action.data.adblock, - antiTracking: { totalUnsafeCount, totalUnknownCount, unknownTrackerCount }, - }); + return Object.assign({}, state, action.data); } case UPDATE_GHOSTERY_PAUSED: { return Object.assign({}, state, { paused_blocking: action.data.ghosteryPaused, paused_blocking_timeout: action.data.time }); diff --git a/app/scss/partials/_blocking_category.scss b/app/scss/partials/_blocking_category.scss index 9f0cb86cc..75fdf1930 100644 --- a/app/scss/partials/_blocking_category.scss +++ b/app/scss/partials/_blocking_category.scss @@ -58,7 +58,7 @@ height: 62px; &.anti-tracking-header { - height: 80px; + height: 66px; border-top: 0; padding-top: 0; } @@ -141,27 +141,14 @@ } } .Category__antiTrackingDivider { - background-color: #00AEF0; width: 110%; - height: 18px; + height: 4px; + border-top: 1px solid #00AEF0; + border-bottom: 1px solid #00AEF0; 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 + left: -20px; } } diff --git a/app/scss/partials/_blocking_tracker.scss b/app/scss/partials/_blocking_tracker.scss index 1c0e35053..a238516aa 100644 --- a/app/scss/partials/_blocking_tracker.scss +++ b/app/scss/partials/_blocking_tracker.scss @@ -144,7 +144,7 @@ justify-content: space-between; &:not(.whitelisted) { - .anti-track-trust { + .cliqz-tracker-trust { visibility: hidden; cursor: pointer; .border { stroke: #d8d8d8; } @@ -152,7 +152,7 @@ .trust-circle { stroke: #9B9B9B; } } - .anti-track-scrub { + .cliqz-tracker-scrub { pointer-events: none; } } @@ -160,10 +160,10 @@ &.whitelisted { flex-direction: row-reverse; - .anti-track-trust { + .cliqz-tracker-trust { pointer-events: none; } - .anti-track-scrub { + .cliqz-tracker-scrub { visibility: hidden; pointer-events: auto; cursor: pointer; @@ -174,13 +174,13 @@ } &:hover { - .anti-track-trust { + .cliqz-tracker-trust { visibility: visible; } } &.whitelisted:hover { - .anti-track-scrub { + .cliqz-tracker-scrub { visibility: visible; } } diff --git a/src/background.js b/src/background.js index 4c6d49802..34541f334 100644 --- a/src/background.js +++ b/src/background.js @@ -842,13 +842,9 @@ function onMessageHandler(request, sender, callback) { return false; } if (name === 'getCliqzModuleData') { // panel-android only - if (message && message.tabId) { - sendCliqzModuleCounts(message.tabId, callback); - } else { - utils.getActiveTab((tab) => { - sendCliqzModuleCounts(tab.id, callback); - }); - } + utils.getActiveTab((tab) => { + sendCliqzModuleCounts(tab.id, tab.pageHost, callback); + }); return true; } if (name === 'getTrackerDescription') { diff --git a/src/classes/BrowserButton.js b/src/classes/BrowserButton.js index 8a419945d..34731cc31 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 { getCliqzAntiTrackingData, getCliqzAdBlockingCount } from '../utils/cliqzModulesData'; +import { getCliqzData } from '../utils/cliqzModulesData'; import { getTab } from '../utils/utils'; import { log } from '../utils/common'; import globals from './Globals'; @@ -131,6 +131,7 @@ class BrowserButton { */ _getIconCount(tab) { const tabId = tab.id; + const tabHostUrl = tab.pageHost; let trackerCount = ''; let alert = false; @@ -145,8 +146,8 @@ class BrowserButton { } const { appsCount, appsAlertCount } = this._getTrackerCount(tabId); - const adBlockingCount = getCliqzAdBlockingCount(tabId).totalCount; - const antiTrackingCount = getCliqzAntiTrackingData(tabId).totalUnsafeCount; + const adBlockingCount = getCliqzData(tabId, tabHostUrl).trackerCount; + const antiTrackingCount = getCliqzData(tabId, tabHostUrl, true).trackerCount; alert = (appsAlertCount > 0); trackerCount = (appsCount + antiTrackingCount + adBlockingCount).toString(); diff --git a/src/classes/ConfData.js b/src/classes/ConfData.js index 14315cac5..c4e262ae7 100644 --- a/src/classes/ConfData.js +++ b/src/classes/ConfData.js @@ -151,7 +151,7 @@ class ConfData { _initProperty('site_specific_blocks', {}); _initProperty('site_specific_unblocks', {}); _initProperty('site_whitelist', []); - _initProperty('anti_tracking_whitelist', {}); + _initProperty('cliqz_module_whitelist', {}); _initProperty('surrogates', {}); _initProperty('version_history', []); _initProperty('account', null); diff --git a/src/classes/Policy.js b/src/classes/Policy.js index 833b1a55c..547784d42 100644 --- a/src/classes/Policy.js +++ b/src/classes/Policy.js @@ -50,8 +50,7 @@ class Policy { if (this.blacklisted(hostUrl)) { return globals.BLACKLISTED; } - if (this.checkSiteWhitelist(hostUrl) - || this.checkAntiTrackingWhitelist(hostUrl, trackerUrl)) { + if (this.checkSiteWhitelist(hostUrl) || this.checkCliqzModuleWhitelist(hostUrl, trackerUrl)) { return globals.WHITELISTED; } return false; @@ -86,14 +85,14 @@ class Policy { * @param {string} url site url * @return {string|boolean} corresponding whitelist entry or false, if none */ - checkAntiTrackingWhitelist(hostUrl, trackerUrl) { + checkCliqzModuleWhitelist(hostUrl, trackerUrl) { let isWhitelisted = false; const processedHostUrl = processUrl(hostUrl).host; const processedTrackerUrl = processUrl(trackerUrl).host; - const antiTrackingWhitelist = conf.anti_tracking_whitelist; + const cliqzModuleWhitelist = conf.cliqz_module_whitelist; - if (antiTrackingWhitelist[processedTrackerUrl]) { - antiTrackingWhitelist[processedTrackerUrl].hosts.some((host) => { + if (cliqzModuleWhitelist[processedTrackerUrl]) { + cliqzModuleWhitelist[processedTrackerUrl].hosts.some((host) => { if (host === processedHostUrl) { isWhitelisted = true; return true; diff --git a/src/utils/cliqzModulesData.js b/src/utils/cliqzModulesData.js index b97b95a8e..73f045088 100644 --- a/src/utils/cliqzModulesData.js +++ b/src/utils/cliqzModulesData.js @@ -26,16 +26,21 @@ const { adblocker, antitracking } = cliqz.modules; * @param {int} tabId * @return {object} totalUnsafeCount */ -export function getCliqzAntiTrackingData(tabId, tabHostUrl) { +export function getCliqzData(tabId, tabHostUrl, antiTracking) { let totalUnsafeCount = 0; let totalUnknownCount = 0; + let trackerCount = 0; let unknownTrackerCount = 0; const unknownTrackers = []; - const whitelistedUrls = conf.anti_tracking_whitelist; - if (!conf.enable_anti_tracking || !antitracking.background) { + const whitelistedUrls = conf.cliqz_module_whitelist; + const cliqzModule = antiTracking ? antitracking : adblocker; + const cliqzModuleEnabled = antiTracking ? conf.enable_anti_tracking : conf.enable_ad_block; + + if (!cliqzModuleEnabled || !cliqzModule.background) { return { totalUnsafeCount, totalUnknownCount, + trackerCount, unknownTrackerCount, unknownTrackers, whitelistedUrls, @@ -43,40 +48,50 @@ export function getCliqzAntiTrackingData(tabId, tabHostUrl) { } // Count up number of fingerprints and cookies found - const { bugs, others } = antitracking.background.actions.getGhosteryStats(tabId); + const { bugs, others } = cliqzModule.background.actions.getGhosteryStats(tabId); const bugsValues = Object.values(bugs); const othersValues = Object.values(others); + const getDataPoints = (tracker) => { + if (antiTracking) { return tracker.cookies + tracker.fingerprints; } + return tracker.ads; + }; for (const bug of bugsValues) { - totalUnsafeCount += bug.cookies + bug.fingerprints; + const dataPoints = getDataPoints(bug); + if (dataPoints) { + totalUnsafeCount += dataPoints; + trackerCount++; + } } for (const other of othersValues) { let whitelisted = false; - const scrubbed = other.cookies || other.fingerprints; + const dataPoints = getDataPoints(other); other.domains.some((domain) => { - if (conf.anti_tracking_whitelist[domain] - && conf.anti_tracking_whitelist[domain].hosts.includes(tabHostUrl)) { + if (whitelistedUrls[domain] + && whitelistedUrls[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 (dataPoints) { + totalUnsafeCount += dataPoints; + totalUnknownCount += dataPoints; + trackerCount++; + unknownTrackerCount++; } - if (scrubbed || whitelisted) { + if (dataPoints || whitelisted) { + const type = antiTracking ? 'antiTracking' : 'adBlock'; const { name, domains, ads, cookies, fingerprints } = other; unknownTrackers.push({ - name, domains, ads, cookies, fingerprints, whitelisted + name, domains, ads, cookies, fingerprints, whitelisted, type }); } } @@ -84,31 +99,13 @@ export function getCliqzAntiTrackingData(tabId, tabHostUrl) { return { totalUnsafeCount, totalUnknownCount, + trackerCount, unknownTrackerCount, unknownTrackers, whitelistedUrls, }; } -/** - * Get the totalCount of ads found by the Ad Blocker on this tabId - * @memberOf BackgroundUtils - * @param {int} tabId - * @return {object} - */ -export function getCliqzAdBlockingCount(tabId) { - if (!conf.enable_ad_block || !adblocker.background) { - return { - totalCount: 0 - }; - } - - const adBlockInfo = adblocker.background.actions.getAdBlockInfoForTab(tabId); - return { - totalCount: adBlockInfo.totalCount || 0, - }; -} - /** * Get list of matched bug_ids from Anti-Tracking and Ad-Blocking for this * tab, along with list of 'other' trackers found that do not match known bug_ids. @@ -135,9 +132,9 @@ export function getCliqzGhosteryBugs(tabId) { * @param {Function} callback */ export function sendCliqzModuleCounts(tabId, tabHostUrl, callback) { - const modules = { adblock: {}, antitracking: {} }; + const modules = { adBlock: {}, antiTracking: {} }; - modules.adblock = getCliqzAdBlockingCount(tabId); - modules.antiTracking = getCliqzAntiTrackingData(tabId, tabHostUrl); + modules.adBlock = getCliqzData(tabId, tabHostUrl); + modules.antiTracking = getCliqzData(tabId, tabHostUrl, true); callback(modules); }