@opentermsarchive/engine 15.1.0 → 15.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentermsarchive/engine",
3
- "version": "15.1.0",
3
+ "version": "15.2.0",
4
4
  "description": "Tracks and makes visible changes to the terms of online services",
5
5
  "homepage": "https://opentermsarchive.org",
6
6
  "bugs": {
@@ -1,4 +1,35 @@
1
- export function removeQueryParams(webPageDOM, paramsToRemove = []) {
1
+ const DEFAULT_TRACKING_QUERY_PARAMS = Object.freeze([
2
+ 'utm_source', // Campaign parameters, see https://en.wikipedia.org/wiki/UTM_parameters
3
+ 'utm_medium',
4
+ 'utm_campaign',
5
+ 'utm_term',
6
+ 'utm_content',
7
+ 'fbclid', // Click and user identifiers, see https://github.com/privacytests/privacytests/blob/dda473a462e5c37f9f2c8b2367fbc5f834796be4/live/results.js#L31-L65
8
+ 'gclid',
9
+ 'msclkid',
10
+ 'mc_eid',
11
+ 'dclid',
12
+ 'oly_anon_id',
13
+ 'oly_enc_id',
14
+ '_openstat',
15
+ 'vero_conv',
16
+ 'vero_id',
17
+ 'wickedid',
18
+ 'yclid',
19
+ '__s',
20
+ 'rb_clickid',
21
+ 's_cid',
22
+ 'ml_subscriber',
23
+ 'ml_subscriber_hash',
24
+ '_hsenc',
25
+ '__hssc',
26
+ '__hstc',
27
+ '__hsfp',
28
+ 'hsCtaTracking',
29
+ 'mkt_tok',
30
+ ]);
31
+
32
+ export function removeQueryParams(webPageDOM, paramsToRemove = DEFAULT_TRACKING_QUERY_PARAMS) {
2
33
  const normalizedParams = Array.isArray(paramsToRemove) ? paramsToRemove : [paramsToRemove];
3
34
 
4
35
  if (!normalizedParams.length) {
@@ -51,6 +51,26 @@ describe('exposedFilters', () => {
51
51
  });
52
52
  });
53
53
 
54
+ describe('without parameters', () => {
55
+ let link;
56
+
57
+ before(() => {
58
+ link = webPageDOM.createElement('a');
59
+ link.setAttribute('href', 'https://example.com/page?utm_source=newsletter&utm_campaign=spring&fbclid=abc&gclid=def&mkt_tok=ghi&keep=value');
60
+ webPageDOM.body.appendChild(link);
61
+ });
62
+
63
+ after(() => {
64
+ link.remove();
65
+ });
66
+
67
+ it('removes well-known tracking parameters', () => {
68
+ removeQueryParams(webPageDOM);
69
+
70
+ expect(link.getAttribute('href')).to.equal('https://example.com/page?keep=value');
71
+ });
72
+ });
73
+
54
74
  describe('with string parameter', () => {
55
75
  let link;
56
76
 
@@ -106,7 +106,7 @@ function createWrappedFilter(baseFunction, filterName, filterParams) {
106
106
  return;
107
107
  }
108
108
 
109
- if (filterParams) {
109
+ if (filterParams || exposedFilters[filterName]) { // Built-in filters always receive their parameters before the context, even when none are declared
110
110
  const wrappedFilter = (webPageDOM, context) => baseFunction(webPageDOM, filterParams, context);
111
111
 
112
112
  Object.defineProperty(wrappedFilter, 'name', { value: filterName });
@@ -6,6 +6,7 @@ import sinon from 'sinon';
6
6
  import sinonChai from 'sinon-chai';
7
7
 
8
8
  import expectedServices from '../../../test/fixtures/services.js';
9
+ import createWebPageDOM from '../extract/dom.js';
9
10
  import * as exposedFilters from '../extract/exposedFilters.js';
10
11
 
11
12
  import Service from './service.js';
@@ -272,7 +273,18 @@ describe('Services', () => {
272
273
  const filterName = filterNames[0];
273
274
  const result = getServiceFilters({}, [filterName]);
274
275
 
275
- expect(result).to.deep.equal([exposedFilters[filterName]]);
276
+ expect(result).to.have.length(1);
277
+ expect(result[0]).to.be.a('function');
278
+ expect(result[0].name).to.equal(filterName);
279
+ });
280
+
281
+ it('calls exposedFilters with their default parameters when declared by string name', () => {
282
+ const webPageDOM = createWebPageDOM('<!DOCTYPE html><html><body><a href="https://example.com/page?fbclid=abc&keep=value"></a></body></html>', 'https://example.com');
283
+ const [removeQueryParams] = getServiceFilters({}, ['removeQueryParams']);
284
+
285
+ removeQueryParams(webPageDOM, { fetch: 'https://example.com', select: [], remove: [], filter: ['removeQueryParams'] });
286
+
287
+ expect(webPageDOM.querySelector('a').getAttribute('href')).to.equal('https://example.com/page?keep=value');
276
288
  });
277
289
 
278
290
  it('returns filters from serviceFilters by string name', () => {
@@ -371,7 +383,7 @@ describe('Services', () => {
371
383
  expect(sourceDocument.filters).to.be.an('array');
372
384
  expect(sourceDocument.filters).to.have.length(2);
373
385
  expect(sourceDocument.filters[0]).to.be.a('function');
374
- expect(sourceDocument.filters[0]).to.equal(exposedFilters[realFilterNames[0]]);
386
+ expect(sourceDocument.filters[0].name).to.equal(realFilterNames[0]);
375
387
  expect(sourceDocument.filters[1]).to.be.a('function');
376
388
  expect(sourceDocument.filters[1].name).to.equal('removePrintButton');
377
389
  });