Skip to content

Commit b5fc937

Browse files
committed
use data feed for trackers blocked
1 parent afcdb5f commit b5fc937

File tree

7 files changed

+62
-20
lines changed

7 files changed

+62
-20
lines changed

special-pages/pages/new-tab/app/activity/ActivityProvider.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,12 @@ export function ActivityProvider(props) {
8989
* @property {Record<string, TrackingStatus>} trackingStatus
9090
* @property {Record<string, boolean>} favorites
9191
* @property {string[]} urls
92-
*/
93-
94-
/**
95-
* @typedef {{ activity: DomainActivity[], urls: string[] }} Incoming
92+
* @property {number} totalTrackers
9693
*/
9794

9895
/**
9996
* @param {NormalizedActivity} prev
100-
* @param {Incoming} incoming
97+
* @param {import("./batched-activity.service.js").Incoming} incoming
10198
* @return {NormalizedActivity}
10299
*/
103100
function normalizeItems(prev, incoming) {
@@ -108,6 +105,7 @@ function normalizeItems(prev, incoming) {
108105
history: {},
109106
trackingStatus: {},
110107
urls: [],
108+
totalTrackers: incoming.totalTrackers,
111109
};
112110

113111
if (shallowDiffers(prev.urls, incoming.urls)) {
@@ -248,8 +246,9 @@ export function SignalStateProvider({ children }) {
248246
trackingStatus: {},
249247
favorites: {},
250248
urls: [],
249+
totalTrackers: 0,
251250
},
252-
{ activity: state.data.activity, urls: state.data.urls },
251+
{ activity: state.data.activity, urls: state.data.urls, totalTrackers: state.data.totalTrackers },
253252
),
254253
);
255254

@@ -282,7 +281,11 @@ export function SignalStateProvider({ children }) {
282281
const src = /** @type {BatchedActivityService} */ (service);
283282
const unsub = src.onData((evt) => {
284283
batch(() => {
285-
activity.value = normalizeItems(activity.value, { activity: evt.data.activity, urls: evt.data.urls });
284+
activity.value = normalizeItems(activity.value, {
285+
activity: evt.data.activity,
286+
urls: evt.data.urls,
287+
totalTrackers: evt.data.totalTrackers,
288+
});
286289
const visible = keys.value;
287290
const all = activity.value.urls;
288291
const nextVisibleRange = all.slice(0, Math.max(service.INITIAL, Math.max(service.INITIAL, visible.length)));

special-pages/pages/new-tab/app/activity/batched-activity.service.js

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import { Service } from '../service.js';
1010

1111
/**
12-
* @typedef {{ activity: DomainActivity[], urls: string[] }} Incoming
12+
* @typedef {{ activity: DomainActivity[], urls: string[], totalTrackers: number }} Incoming
1313
*/
1414

1515
export class BatchedActivityService {
@@ -33,28 +33,41 @@ export class BatchedActivityService {
3333
const data = await this.ntp.messaging.request('activity_getDataForUrls', {
3434
urls: params.urls,
3535
});
36-
return { activity: data.activity, urls: this.dataService.data.urls };
36+
return {
37+
activity: data.activity,
38+
totalTrackers: this.dataService.data.totalTrackers,
39+
urls: this.dataService.data.urls,
40+
};
3741
} else {
3842
const urlsResponse = await this.ntp.messaging.request('activity_getUrls');
3943
const data = await this.ntp.messaging.request('activity_getDataForUrls', {
4044
urls: urlsResponse.urls.slice(0, this.INITIAL),
4145
});
42-
return { activity: data.activity, urls: urlsResponse.urls };
46+
return { activity: data.activity, urls: urlsResponse.urls, totalTrackers: urlsResponse.totalTrackersBlocked };
4347
}
4448
} else {
4549
const data = await this.ntp.messaging.request('activity_getData');
46-
return { activity: data.activity, urls: data.activity.map((x) => x.url) };
50+
return {
51+
activity: data.activity,
52+
urls: data.activity.map((x) => x.url),
53+
totalTrackers: data.activity.reduce((acc, item) => acc + item.trackingStatus.totalCount, 0),
54+
};
4755
}
4856
},
4957
subscribe: (cb) => {
5058
const sub1 = ntp.messaging.subscribe('activity_onDataUpdate', (params) => {
51-
cb({ activity: params.activity, urls: params.activity.map((x) => x.url) });
59+
cb({
60+
activity: params.activity,
61+
urls: params.activity.map((x) => x.url),
62+
totalTrackers: params.activity.reduce((acc, item) => acc + item.trackingStatus.totalCount, 0),
63+
});
5264
});
5365
const sub2 = ntp.messaging.subscribe('activity_onDataPatch', (params) => {
66+
const totalTrackers = params.totalTrackersBlocked;
5467
if ('patch' in params && params.patch !== null) {
55-
cb({ activity: [/** @type {DomainActivity} */ (params.patch)], urls: params.urls });
68+
cb({ activity: [/** @type {DomainActivity} */ (params.patch)], urls: params.urls, totalTrackers });
5669
} else {
57-
cb({ activity: [], urls: params.urls });
70+
cb({ activity: [], urls: params.urls, totalTrackers });
5871
}
5972
});
6073
return () => {
@@ -67,7 +80,11 @@ export class BatchedActivityService {
6780
return next;
6881
}
6982
if (this.batched) {
70-
return { activity: old.activity.concat(next.activity), urls: next.urls };
83+
return {
84+
activity: old.activity.concat(next.activity),
85+
urls: next.urls,
86+
totalTrackers: next.totalTrackers,
87+
};
7188
}
7289
return next;
7390
});

special-pages/pages/new-tab/app/activity/components/Activity.examples.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { h } from 'preact';
22
import { ActivityMockProvider } from '../mocks/ActivityMockProvider.js';
33
import { ActivityConsumer } from './Activity.js';
4-
import { activityMocks } from '../mocks/activity.mocks.js';
54

65
/** @type {Record<string, {factory: () => import("preact").ComponentChild}>} */
76

special-pages/pages/new-tab/app/activity/components/Activity.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,11 @@ function ActivityConfigured({ expansion, toggle }) {
4141
const expanded = expansion === 'expanded';
4242
const { activity } = useContext(SignalStateContext);
4343
const { didClick } = useContext(ActivityApiContext);
44+
4445
const count = useComputed(() => {
45-
return Object.values(activity.value.trackingStatus).reduce((acc, item) => {
46-
return acc + item.totalCount;
47-
}, 0);
46+
return activity.value.totalTrackers;
4847
});
48+
4949
const itemCount = useComputed(() => {
5050
return Object.keys(activity.value.items).length;
5151
});

special-pages/pages/new-tab/app/activity/integration-tests/activity.spec.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ test.describe('activity widget', () => {
139139
await ntp.mocks.waitForCallCount({ method: 'activity_getData', count: 2 });
140140
});
141141
test.describe('batched API', () => {
142+
test('batched API reads tracker count total from urls api', async ({ page }, workerInfo) => {
143+
const ntp = NewtabPage.create(page, workerInfo);
144+
const widget = new ActivityPage(page, ntp).withEntries(6);
145+
const batching = new BatchingPage(page, ntp, widget);
146+
await ntp.reducedMotion();
147+
await ntp.openPage({
148+
additional: { feed: 'activity', 'activity.api': 'batched', platform: 'windows', activity: widget.entries },
149+
});
150+
await batching.displaysTrackerCount();
151+
});
142152
test('control: un-batched fetches all', async ({ page }, workerInfo) => {
143153
const ntp = NewtabPage.create(page, workerInfo);
144154
const ap = new ActivityPage(page, ntp);

special-pages/pages/new-tab/app/activity/integration-tests/batching.page.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,15 @@ export class BatchingPage {
186186
- link "4 EVm3Kbs9Qh"
187187
`);
188188
}
189+
190+
async displaysTrackerCount() {
191+
if (this.ap.entries !== 6) throw new Error('this scenario expects 6 initial items');
192+
193+
const { totalTrackersBlocked } = toPatch(generateSampleData(this.ap.entries));
194+
195+
// ensure the total is shown, even though some item will not have been fetched
196+
await expect(this.ap.context().getByRole('heading')).toContainText(`${totalTrackersBlocked} tracking attempts blocked`);
197+
}
189198
}
190199

191200
/**

special-pages/pages/new-tab/app/activity/mocks/ActivityMockProvider.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,11 @@ import { reducer } from '../../service.hooks.js';
2525
*
2626
*/
2727
export function ActivityMockProvider({
28-
data = { activity: activityMocks.few.activity, urls: activityMocks.few.activity.map((x) => x.url) },
28+
data = {
29+
activity: activityMocks.few.activity,
30+
urls: activityMocks.few.activity.map((x) => x.url),
31+
totalTrackers: activityMocks.few.activity.reduce((acc, item) => acc + item.trackingStatus.totalCount, 0),
32+
},
2933
config = { expansion: 'expanded', animation: { kind: 'auto-animate' } },
3034
children,
3135
}) {

0 commit comments

Comments
 (0)