@adobe/helix-rum-enhancer 2.36.5 → 2.37.1
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/CHANGELOG.md +21 -0
- package/eslint.config.js +34 -0
- package/modules/fflags.js +1 -0
- package/modules/index.js +43 -25
- package/package.json +14 -12
- package/plugins/a11y.js +231 -0
- package/plugins/onetrust.js +12 -18
- package/plugins/trustarc.js +38 -0
- package/plugins/usercentrics.js +35 -0
- package/src/index.js +49 -35
- package/src/index.md5 +1 -1
- package/src/index.sri +1 -1
- package/src/plugins/a11y.js +181 -0
- package/src/plugins/a11y.map.js +182 -0
- package/src/plugins/a11y.md5 +1 -0
- package/src/plugins/cwv.js +3 -1
- package/src/plugins/cwv.map.js +4 -2
- package/src/plugins/cwv.md5 +1 -1
- package/src/plugins/form.map.js +1 -1
- package/src/plugins/martech.map.js +1 -1
- package/src/plugins/onetrust.js +15 -30
- package/src/plugins/onetrust.map.js +16 -31
- package/src/plugins/onetrust.md5 +1 -1
- package/src/plugins/trustarc.js +37 -0
- package/src/plugins/trustarc.map.js +38 -0
- package/src/plugins/trustarc.md5 +1 -0
- package/src/plugins/usercentrics.js +39 -0
- package/src/plugins/usercentrics.map.js +40 -0
- package/src/plugins/usercentrics.md5 +1 -0
- package/src/plugins/video.map.js +1 -1
- package/src/plugins/webcomponent.map.js +1 -1
- package/src/plugins/webcomponent.md5 +1 -1
- package/.eslintrc.cjs +0 -32
package/src/index.js
CHANGED
|
@@ -21,7 +21,8 @@
|
|
|
21
21
|
redirect: [620, 1139],
|
|
22
22
|
example: [543, 770, 1136],
|
|
23
23
|
language: [543, 959, 1139, 620],
|
|
24
|
-
allresources: [1139]
|
|
24
|
+
allresources: [1139],
|
|
25
|
+
a11y: [557, 781, 897, 955, 959]
|
|
25
26
|
};
|
|
26
27
|
|
|
27
28
|
const KNOWN_PROPERTIES = ['weight', 'id', 'referer', 'checkpoint', 't', 'source', 'target', 'cwv', 'CLS', 'FID', 'LCP', 'INP', 'TTFB'];
|
|
@@ -127,8 +128,22 @@
|
|
|
127
128
|
const [blocksMO, mediaMO] = [blocksMCB, mediaMCB].map(createMO);
|
|
128
129
|
const hasCookieKey = key => document.cookie.split(';').some(c => c.trim().startsWith(`${key}=`));
|
|
129
130
|
const pluginBasePath = new URL(document.currentScript.src).href.replace(/index(\.map)?\.js/, 'plugins');
|
|
131
|
+
const CONSENT_PROVIDERS = [{
|
|
132
|
+
name: 'onetrust',
|
|
133
|
+
detect: () => hasCookieKey('OptanonAlertBoxClosed') || document.querySelector('#onetrust-banner-sdk, #onetrust-pc-sdk')
|
|
134
|
+
}, {
|
|
135
|
+
name: 'trustarc',
|
|
136
|
+
detect: () => ['notice_gdpr_prefs', 'notice_preferences'].some(hasCookieKey) || document.querySelector('#truste-consent-track, #consent_blackbar')
|
|
137
|
+
}, {
|
|
138
|
+
name: 'usercentrics',
|
|
139
|
+
detect: () => window.localStorage.getItem('uc_gcm') || document.querySelector('#usercentrics-root')
|
|
140
|
+
}];
|
|
141
|
+
const getConsentProvider = () => CONSENT_PROVIDERS.find(({
|
|
142
|
+
detect
|
|
143
|
+
}) => detect());
|
|
130
144
|
const PLUGINS = {
|
|
131
145
|
cwv: `${pluginBasePath}/cwv.js`,
|
|
146
|
+
a11y: `${pluginBasePath}/a11y.js`,
|
|
132
147
|
form: {
|
|
133
148
|
url: `${pluginBasePath}/form.js`,
|
|
134
149
|
when: () => document.querySelector('form'),
|
|
@@ -150,9 +165,8 @@
|
|
|
150
165
|
urlParameters
|
|
151
166
|
}) => urlParameters.size > 0
|
|
152
167
|
},
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
when: () => hasCookieKey('OptanonAlertBoxClosed') || document.querySelector('#onetrust-consent-sdk'),
|
|
168
|
+
consent: {
|
|
169
|
+
when: () => getConsentProvider(),
|
|
156
170
|
isBlockDependent: true,
|
|
157
171
|
mutationObserverParams: {
|
|
158
172
|
target: document.body,
|
|
@@ -204,11 +218,13 @@
|
|
|
204
218
|
}
|
|
205
219
|
return null;
|
|
206
220
|
}
|
|
221
|
+
if (key === 'consent') {
|
|
222
|
+
plugin.url = `${pluginBasePath}/${getConsentProvider().name}.js`;
|
|
223
|
+
}
|
|
207
224
|
if (!pluginCache.has(key)) {
|
|
208
225
|
pluginCache.set(key, import(`${plugin.url || plugin}`));
|
|
209
226
|
}
|
|
210
|
-
|
|
211
|
-
return pluginLoadPromise.then(p => p.default && p.default(params) || typeof p === 'function' && p(params)).catch(() => {});
|
|
227
|
+
return pluginCache.get(key).then(p => p.default && p.default(params) || typeof p === 'function' && p(params)).catch(() => {});
|
|
212
228
|
}
|
|
213
229
|
function loadPlugins(filter = () => true, params = PLUGIN_PARAMETERS) {
|
|
214
230
|
Object.entries(PLUGINS).filter(([, plugin]) => filter(plugin)).map(([key]) => loadPlugin(key, params));
|
|
@@ -237,31 +253,28 @@
|
|
|
237
253
|
} = window.hlx.rum;
|
|
238
254
|
if (isSelected && maxEvents) {
|
|
239
255
|
maxEvents -= 1;
|
|
240
|
-
const
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
console.debug(`ping:${checkpoint}`, pdata);
|
|
263
|
-
};
|
|
264
|
-
sendPing(data);
|
|
256
|
+
const body = JSON.stringify({
|
|
257
|
+
weight,
|
|
258
|
+
id,
|
|
259
|
+
referer: urlSanitizers[window.hlx.RUM_MASK_URL || 'path'](),
|
|
260
|
+
checkpoint,
|
|
261
|
+
t,
|
|
262
|
+
...data
|
|
263
|
+
}, KNOWN_PROPERTIES);
|
|
264
|
+
const urlParams = window.RUM_PARAMS ? `?${new URLSearchParams(window.RUM_PARAMS).toString()}` : '';
|
|
265
|
+
const {
|
|
266
|
+
href: url,
|
|
267
|
+
origin
|
|
268
|
+
} = new URL(`.rum/${weight}${urlParams}`, sampleRUM.collectBaseURL);
|
|
269
|
+
if (window.location.origin === origin) {
|
|
270
|
+
const headers = {
|
|
271
|
+
type: 'application/json'
|
|
272
|
+
};
|
|
273
|
+
navigator.sendBeacon(url, new Blob([body], headers));
|
|
274
|
+
} else {
|
|
275
|
+
navigator.sendBeacon(url, body);
|
|
276
|
+
}
|
|
277
|
+
console.debug(`ping:${checkpoint}`, data);
|
|
265
278
|
}
|
|
266
279
|
}
|
|
267
280
|
function processQueue() {
|
|
@@ -316,13 +329,14 @@
|
|
|
316
329
|
function addLoadResourceTracking() {
|
|
317
330
|
const observer = new PerformanceObserver(list => {
|
|
318
331
|
try {
|
|
319
|
-
|
|
332
|
+
const entries = list.getEntries();
|
|
333
|
+
entries.filter(e => !e.responseStatus || e.responseStatus < 400).filter(e => window.location.hostname === new URL(e.name).hostname || fflags.has('allresources')).filter(e => new URL(e.name).pathname.match('.*(\\.plain\\.html$|\\.json|graphql|api)')).forEach(e => {
|
|
320
334
|
sampleRUM('loadresource', {
|
|
321
335
|
source: e.name,
|
|
322
336
|
target: Math.round(e.duration)
|
|
323
337
|
});
|
|
324
338
|
});
|
|
325
|
-
|
|
339
|
+
entries.filter(e => e.responseStatus >= 400).filter(e => !new URL(e.name).pathname.match('.*(/\\.rum/1[0-9]{0,3})')).forEach(e => {
|
|
326
340
|
sampleRUM('missingresource', {
|
|
327
341
|
source: e.name,
|
|
328
342
|
target: e.responseStatus
|
|
@@ -419,7 +433,7 @@
|
|
|
419
433
|
});
|
|
420
434
|
});
|
|
421
435
|
}
|
|
422
|
-
function
|
|
436
|
+
function init() {
|
|
423
437
|
try {
|
|
424
438
|
if (sampleRUM) {
|
|
425
439
|
addTrackingFromConfig();
|
|
@@ -428,6 +442,6 @@
|
|
|
428
442
|
}
|
|
429
443
|
} catch (error) {}
|
|
430
444
|
}
|
|
431
|
-
|
|
445
|
+
init();
|
|
432
446
|
|
|
433
447
|
})();
|
package/src/index.md5
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
17c00804cede176f8349b25d79899efa
|
package/src/index.sri
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
sha384-
|
|
1
|
+
sha384-E0tOoXUN4IvzjkIb4WwyWGlRnGAbrcrV5O3QbmmASq+cYh7qAE752ezPyoc/ID5O
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2024 Adobe. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
const MEDIA_QUERY_PREFERENCES = ['(prefers-reduced-motion: reduce)', '(prefers-contrast: high)', '(prefers-contrast: more)', '(forced-colors: active)', '(prefers-reduced-transparency: reduce)'];
|
|
13
|
+
const KEYBOARD_RELEVANT_KEYS = ['Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter', ' ', 'Escape'];
|
|
14
|
+
const HIGH_ZOOM_LEVEL = 200;
|
|
15
|
+
const MEDIUM_ZOOM_LEVEL = 125;
|
|
16
|
+
const BEHAVIORAL_MIN_EVENTS = 10;
|
|
17
|
+
const FOCUSTRAP_MAX_HISTORY = 25;
|
|
18
|
+
const FOCUS_TRAP_MIN_HISTORY = 4;
|
|
19
|
+
const FOCUS_TRAP_PING_PONG_DURATION = 3000;
|
|
20
|
+
const FOCUS_TRAP_MIN_REPEATS = 3;
|
|
21
|
+
function getZoom() {
|
|
22
|
+
if (window.visualViewport && window.visualViewport.width > 0) {
|
|
23
|
+
return Math.round(window.innerWidth / window.visualViewport.width * 100);
|
|
24
|
+
}
|
|
25
|
+
return 100;
|
|
26
|
+
}
|
|
27
|
+
function addAccessibilityAudienceTracking({
|
|
28
|
+
sampleRUM,
|
|
29
|
+
sourceSelector
|
|
30
|
+
}) {
|
|
31
|
+
const focusHistory = [];
|
|
32
|
+
let score = 0;
|
|
33
|
+
let reported = false;
|
|
34
|
+
let focusTrapDetected = false;
|
|
35
|
+
let keyboardCount = 0;
|
|
36
|
+
let totalCount = 0;
|
|
37
|
+
let lastFocusTime = 0;
|
|
38
|
+
let hadMeaningfulFocus = false;
|
|
39
|
+
const reportAudience = () => {
|
|
40
|
+
if (reported) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
reported = true;
|
|
44
|
+
const audience = score >= 1 ? 'on' : 'off';
|
|
45
|
+
sampleRUM('a11y', {
|
|
46
|
+
source: audience,
|
|
47
|
+
target: 'on:off'
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const reportFocusTrap = (trapType, elements) => {
|
|
51
|
+
if (focusTrapDetected) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
focusTrapDetected = true;
|
|
55
|
+
const elementDescriptions = elements.slice(0, 3).map(sourceSelector);
|
|
56
|
+
sampleRUM('error', {
|
|
57
|
+
source: `focus-trap:${trapType}`,
|
|
58
|
+
target: elementDescriptions.join(', ')
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const detectRepeatingSequence = (elements, seqLength) => {
|
|
62
|
+
const totalLength = seqLength * FOCUS_TRAP_MIN_REPEATS;
|
|
63
|
+
if (elements.length < totalLength) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
const recent = elements.slice(-totalLength);
|
|
67
|
+
const baseSequence = recent.slice(0, seqLength);
|
|
68
|
+
for (let i = 1; i < FOCUS_TRAP_MIN_REPEATS; i += 1) {
|
|
69
|
+
const nextSequence = recent.slice(i * seqLength, (i + 1) * seqLength);
|
|
70
|
+
if (nextSequence.length !== seqLength || !nextSequence.every((el, j) => el === baseSequence[j])) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
reportFocusTrap('sequence', baseSequence);
|
|
75
|
+
return true;
|
|
76
|
+
};
|
|
77
|
+
const detectFocusTrap = () => {
|
|
78
|
+
if (focusHistory.length < FOCUS_TRAP_MIN_HISTORY || focusTrapDetected) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const elements = focusHistory.map(h => h.element);
|
|
82
|
+
const timestamps = focusHistory.map(h => h.timestamp);
|
|
83
|
+
if (elements.slice(-3).every(el => el === elements[elements.length - 1])) {
|
|
84
|
+
reportFocusTrap('single', [elements[elements.length - 1]]);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const recent4 = elements.slice(-4);
|
|
88
|
+
const unique = [...new Set(recent4)];
|
|
89
|
+
const timeDiff = timestamps[timestamps.length - 1] - timestamps[timestamps.length - 4];
|
|
90
|
+
if (unique.length === 2 && timeDiff < FOCUS_TRAP_PING_PONG_DURATION) {
|
|
91
|
+
reportFocusTrap('ping-pong', unique);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const minSeqLength = 2 * FOCUS_TRAP_MIN_HISTORY + 1;
|
|
95
|
+
if (focusHistory.length >= minSeqLength) {
|
|
96
|
+
for (let seqLength = 2; seqLength <= 4; seqLength += 1) {
|
|
97
|
+
if (detectRepeatingSequence(elements, seqLength)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const trackFocusForTrap = event => {
|
|
104
|
+
setTimeout(() => {
|
|
105
|
+
const {
|
|
106
|
+
activeElement
|
|
107
|
+
} = document;
|
|
108
|
+
if (!activeElement || activeElement === document.body) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
focusHistory.push({
|
|
112
|
+
element: activeElement,
|
|
113
|
+
timestamp: performance.now(),
|
|
114
|
+
shiftKey: event.shiftKey
|
|
115
|
+
});
|
|
116
|
+
if (focusHistory.length > FOCUSTRAP_MAX_HISTORY) {
|
|
117
|
+
focusHistory.shift();
|
|
118
|
+
}
|
|
119
|
+
detectFocusTrap();
|
|
120
|
+
}, 0);
|
|
121
|
+
};
|
|
122
|
+
const checkBehavioralScore = () => {
|
|
123
|
+
if (totalCount >= BEHAVIORAL_MIN_EVENTS && !reported) {
|
|
124
|
+
if (keyboardCount / totalCount > 0.7) {
|
|
125
|
+
score += 2;
|
|
126
|
+
}
|
|
127
|
+
reportAudience();
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
score += MEDIA_QUERY_PREFERENCES.filter(q => window.matchMedia(q).matches).length;
|
|
131
|
+
const zoom = getZoom();
|
|
132
|
+
if (zoom >= HIGH_ZOOM_LEVEL) {
|
|
133
|
+
score += 3;
|
|
134
|
+
} else if (zoom >= MEDIUM_ZOOM_LEVEL) {
|
|
135
|
+
score += 2;
|
|
136
|
+
}
|
|
137
|
+
if (navigator.maxTouchPoints === 0 && window.matchMedia('(pointer: coarse)').matches) {
|
|
138
|
+
score += 2;
|
|
139
|
+
}
|
|
140
|
+
document.addEventListener('keydown', event => {
|
|
141
|
+
if (KEYBOARD_RELEVANT_KEYS.includes(event.key)) {
|
|
142
|
+
keyboardCount += 1;
|
|
143
|
+
totalCount += 1;
|
|
144
|
+
if (event.key === 'Tab') {
|
|
145
|
+
trackFocusForTrap(event);
|
|
146
|
+
}
|
|
147
|
+
checkBehavioralScore();
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
document.addEventListener('click', () => {
|
|
151
|
+
totalCount += 1;
|
|
152
|
+
checkBehavioralScore();
|
|
153
|
+
});
|
|
154
|
+
document.addEventListener('focusin', event => {
|
|
155
|
+
if (event.target !== document.body) {
|
|
156
|
+
lastFocusTime = performance.now();
|
|
157
|
+
hadMeaningfulFocus = true;
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
const focusLossObserver = new MutationObserver(mutations => {
|
|
161
|
+
if (hadMeaningfulFocus && document.activeElement === document.body && performance.now() - lastFocusTime > 100) {
|
|
162
|
+
const mutation = mutations.find(m => m.type === 'childList' && (m.addedNodes.length > 0 || m.removedNodes.length > 0));
|
|
163
|
+
sampleRUM('error', {
|
|
164
|
+
source: 'focus-loss',
|
|
165
|
+
target: sourceSelector(mutation?.target)
|
|
166
|
+
});
|
|
167
|
+
hadMeaningfulFocus = false;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
focusLossObserver.observe(document, {
|
|
171
|
+
childList: true,
|
|
172
|
+
subtree: true
|
|
173
|
+
});
|
|
174
|
+
if (score >= 1) {
|
|
175
|
+
reportAudience();
|
|
176
|
+
} else {
|
|
177
|
+
setTimeout(() => reportAudience(), window.hlx.A11Y_REPORT_DELAY || 10_000);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { addAccessibilityAudienceTracking as default };
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2024 Adobe. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
const MEDIA_QUERY_PREFERENCES = ['(prefers-reduced-motion: reduce)', '(prefers-contrast: high)', '(prefers-contrast: more)', '(forced-colors: active)', '(prefers-reduced-transparency: reduce)'];
|
|
13
|
+
const KEYBOARD_RELEVANT_KEYS = ['Tab', 'ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Enter', ' ', 'Escape'];
|
|
14
|
+
const HIGH_ZOOM_LEVEL = 200;
|
|
15
|
+
const MEDIUM_ZOOM_LEVEL = 125;
|
|
16
|
+
const BEHAVIORAL_MIN_EVENTS = 10;
|
|
17
|
+
const FOCUSTRAP_MAX_HISTORY = 25;
|
|
18
|
+
const FOCUS_TRAP_MIN_HISTORY = 4;
|
|
19
|
+
const FOCUS_TRAP_PING_PONG_DURATION = 3000;
|
|
20
|
+
const FOCUS_TRAP_MIN_REPEATS = 3;
|
|
21
|
+
function getZoom() {
|
|
22
|
+
if (window.visualViewport && window.visualViewport.width > 0) {
|
|
23
|
+
return Math.round(window.innerWidth / window.visualViewport.width * 100);
|
|
24
|
+
}
|
|
25
|
+
return 100;
|
|
26
|
+
}
|
|
27
|
+
function addAccessibilityAudienceTracking({
|
|
28
|
+
sampleRUM,
|
|
29
|
+
sourceSelector
|
|
30
|
+
}) {
|
|
31
|
+
const focusHistory = [];
|
|
32
|
+
let score = 0;
|
|
33
|
+
let reported = false;
|
|
34
|
+
let focusTrapDetected = false;
|
|
35
|
+
let keyboardCount = 0;
|
|
36
|
+
let totalCount = 0;
|
|
37
|
+
let lastFocusTime = 0;
|
|
38
|
+
let hadMeaningfulFocus = false;
|
|
39
|
+
const reportAudience = () => {
|
|
40
|
+
if (reported) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
reported = true;
|
|
44
|
+
const audience = score >= 1 ? 'on' : 'off';
|
|
45
|
+
sampleRUM('a11y', {
|
|
46
|
+
source: audience,
|
|
47
|
+
target: 'on:off'
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const reportFocusTrap = (trapType, elements) => {
|
|
51
|
+
if (focusTrapDetected) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
focusTrapDetected = true;
|
|
55
|
+
const elementDescriptions = elements.slice(0, 3).map(sourceSelector);
|
|
56
|
+
sampleRUM('error', {
|
|
57
|
+
source: `focus-trap:${trapType}`,
|
|
58
|
+
target: elementDescriptions.join(', ')
|
|
59
|
+
});
|
|
60
|
+
};
|
|
61
|
+
const detectRepeatingSequence = (elements, seqLength) => {
|
|
62
|
+
const totalLength = seqLength * FOCUS_TRAP_MIN_REPEATS;
|
|
63
|
+
if (elements.length < totalLength) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
const recent = elements.slice(-totalLength);
|
|
67
|
+
const baseSequence = recent.slice(0, seqLength);
|
|
68
|
+
for (let i = 1; i < FOCUS_TRAP_MIN_REPEATS; i += 1) {
|
|
69
|
+
const nextSequence = recent.slice(i * seqLength, (i + 1) * seqLength);
|
|
70
|
+
if (nextSequence.length !== seqLength || !nextSequence.every((el, j) => el === baseSequence[j])) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
reportFocusTrap('sequence', baseSequence);
|
|
75
|
+
return true;
|
|
76
|
+
};
|
|
77
|
+
const detectFocusTrap = () => {
|
|
78
|
+
if (focusHistory.length < FOCUS_TRAP_MIN_HISTORY || focusTrapDetected) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const elements = focusHistory.map(h => h.element);
|
|
82
|
+
const timestamps = focusHistory.map(h => h.timestamp);
|
|
83
|
+
if (elements.slice(-3).every(el => el === elements[elements.length - 1])) {
|
|
84
|
+
reportFocusTrap('single', [elements[elements.length - 1]]);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const recent4 = elements.slice(-4);
|
|
88
|
+
const unique = [...new Set(recent4)];
|
|
89
|
+
const timeDiff = timestamps[timestamps.length - 1] - timestamps[timestamps.length - 4];
|
|
90
|
+
if (unique.length === 2 && timeDiff < FOCUS_TRAP_PING_PONG_DURATION) {
|
|
91
|
+
reportFocusTrap('ping-pong', unique);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const minSeqLength = 2 * FOCUS_TRAP_MIN_HISTORY + 1;
|
|
95
|
+
if (focusHistory.length >= minSeqLength) {
|
|
96
|
+
for (let seqLength = 2; seqLength <= 4; seqLength += 1) {
|
|
97
|
+
if (detectRepeatingSequence(elements, seqLength)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const trackFocusForTrap = event => {
|
|
104
|
+
setTimeout(() => {
|
|
105
|
+
const {
|
|
106
|
+
activeElement
|
|
107
|
+
} = document;
|
|
108
|
+
if (!activeElement || activeElement === document.body) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
focusHistory.push({
|
|
112
|
+
element: activeElement,
|
|
113
|
+
timestamp: performance.now(),
|
|
114
|
+
shiftKey: event.shiftKey
|
|
115
|
+
});
|
|
116
|
+
if (focusHistory.length > FOCUSTRAP_MAX_HISTORY) {
|
|
117
|
+
focusHistory.shift();
|
|
118
|
+
}
|
|
119
|
+
detectFocusTrap();
|
|
120
|
+
}, 0);
|
|
121
|
+
};
|
|
122
|
+
const checkBehavioralScore = () => {
|
|
123
|
+
if (totalCount >= BEHAVIORAL_MIN_EVENTS && !reported) {
|
|
124
|
+
if (keyboardCount / totalCount > 0.7) {
|
|
125
|
+
score += 2;
|
|
126
|
+
}
|
|
127
|
+
reportAudience();
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
score += MEDIA_QUERY_PREFERENCES.filter(q => window.matchMedia(q).matches).length;
|
|
131
|
+
const zoom = getZoom();
|
|
132
|
+
if (zoom >= HIGH_ZOOM_LEVEL) {
|
|
133
|
+
score += 3;
|
|
134
|
+
} else if (zoom >= MEDIUM_ZOOM_LEVEL) {
|
|
135
|
+
score += 2;
|
|
136
|
+
}
|
|
137
|
+
if (navigator.maxTouchPoints === 0 && window.matchMedia('(pointer: coarse)').matches) {
|
|
138
|
+
score += 2;
|
|
139
|
+
}
|
|
140
|
+
document.addEventListener('keydown', event => {
|
|
141
|
+
if (KEYBOARD_RELEVANT_KEYS.includes(event.key)) {
|
|
142
|
+
keyboardCount += 1;
|
|
143
|
+
totalCount += 1;
|
|
144
|
+
if (event.key === 'Tab') {
|
|
145
|
+
trackFocusForTrap(event);
|
|
146
|
+
}
|
|
147
|
+
checkBehavioralScore();
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
document.addEventListener('click', () => {
|
|
151
|
+
totalCount += 1;
|
|
152
|
+
checkBehavioralScore();
|
|
153
|
+
});
|
|
154
|
+
document.addEventListener('focusin', event => {
|
|
155
|
+
if (event.target !== document.body) {
|
|
156
|
+
lastFocusTime = performance.now();
|
|
157
|
+
hadMeaningfulFocus = true;
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
const focusLossObserver = new MutationObserver(mutations => {
|
|
161
|
+
if (hadMeaningfulFocus && document.activeElement === document.body && performance.now() - lastFocusTime > 100) {
|
|
162
|
+
const mutation = mutations.find(m => m.type === 'childList' && (m.addedNodes.length > 0 || m.removedNodes.length > 0));
|
|
163
|
+
sampleRUM('error', {
|
|
164
|
+
source: 'focus-loss',
|
|
165
|
+
target: sourceSelector(mutation?.target)
|
|
166
|
+
});
|
|
167
|
+
hadMeaningfulFocus = false;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
focusLossObserver.observe(document, {
|
|
171
|
+
childList: true,
|
|
172
|
+
subtree: true
|
|
173
|
+
});
|
|
174
|
+
if (score >= 1) {
|
|
175
|
+
reportAudience();
|
|
176
|
+
} else {
|
|
177
|
+
setTimeout(() => reportAudience(), window.hlx.A11Y_REPORT_DELAY || 10_000);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
export { addAccessibilityAudienceTracking as default };
|
|
182
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYTExeS5tYXAuanMiLCJzb3VyY2VzIjpbIi4uLy4uL3BsdWdpbnMvYTExeS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IDIwMjQgQWRvYmUuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weVxuICogb2YgdGhlIExpY2Vuc2UgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlclxuICogdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TXG4gKiBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2VcbiAqIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuY29uc3QgTUVESUFfUVVFUllfUFJFRkVSRU5DRVMgPSBbXG4gICcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScsXG4gICcocHJlZmVycy1jb250cmFzdDogaGlnaCknLFxuICAnKHByZWZlcnMtY29udHJhc3Q6IG1vcmUpJyxcbiAgJyhmb3JjZWQtY29sb3JzOiBhY3RpdmUpJyxcbiAgJyhwcmVmZXJzLXJlZHVjZWQtdHJhbnNwYXJlbmN5OiByZWR1Y2UpJyxcbl07XG5cbmNvbnN0IEtFWUJPQVJEX1JFTEVWQU5UX0tFWVMgPSBbXG4gICdUYWInLCAnQXJyb3dVcCcsICdBcnJvd0Rvd24nLCAnQXJyb3dMZWZ0JywgJ0Fycm93UmlnaHQnLCAnRW50ZXInLCAnICcsICdFc2NhcGUnLFxuXTtcblxuY29uc3QgSElHSF9aT09NX0xFVkVMID0gMjAwO1xuY29uc3QgTUVESVVNX1pPT01fTEVWRUwgPSAxMjU7XG5cbmNvbnN0IEJFSEFWSU9SQUxfTUlOX0VWRU5UUyA9IDEwO1xuXG5jb25zdCBGT0NVU1RSQVBfTUFYX0hJU1RPUlkgPSAyNTtcbmNvbnN0IEZPQ1VTX1RSQVBfTUlOX0hJU1RPUlkgPSA0O1xuY29uc3QgRk9DVVNfVFJBUF9QSU5HX1BPTkdfRFVSQVRJT04gPSAzMDAwO1xuY29uc3QgRk9DVVNfVFJBUF9NSU5fUkVQRUFUUyA9IDM7XG5cbi8qKlxuICogRGV0ZWN0cyBhcHByb3hpbWF0ZSB6b29tIGxldmVsIHVzaW5nIHRoZSBWaXN1YWwgVmlld3BvcnQgQVBJLlxuICogVGhpcyBpcyBhIHB1cmUgdXRpbGl0eSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIHtOdW1iZXJ9IEVzdGltYXRlZCB6b29tIHBlcmNlbnRhZ2UuXG4gKi9cbmZ1bmN0aW9uIGdldFpvb20oKSB7XG4gIGlmICh3aW5kb3cudmlzdWFsVmlld3BvcnQgJiYgd2luZG93LnZpc3VhbFZpZXdwb3J0LndpZHRoID4gMCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKCh3aW5kb3cuaW5uZXJXaWR0aCAvIHdpbmRvdy52aXN1YWxWaWV3cG9ydC53aWR0aCkgKiAxMDApO1xuICB9XG4gIC8qIGM4IGlnbm9yZSBuZXh0IDEgKi9cbiAgcmV0dXJuIDEwMDtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIGFjY2Vzc2liaWxpdHkgYXVkaWVuY2UgZGV0ZWN0aW9uIHBsdWdpbiBmb3IgaGVsaXgtcnVtLWVuaGFuY2VyLlxuICogQHBhcmFtIHtPYmplY3R9IHBhcmFtcyBQbHVnaW4gcGFyYW1ldGVycyBmcm9tIGVuaGFuY2VyLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcGFyYW1zLnNhbXBsZVJVTSBSVU0gdHJhY2tpbmcgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBwYXJhbXMuc291cmNlU2VsZWN0b3IgRnVuY3Rpb24gdG8gZ2VuZXJhdGUgYSBzZWxlY3RvciBmb3IgYW4gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWRkQWNjZXNzaWJpbGl0eUF1ZGllbmNlVHJhY2tpbmcoeyBzYW1wbGVSVU0sIHNvdXJjZVNlbGVjdG9yIH0pIHtcbiAgY29uc3QgZm9jdXNIaXN0b3J5ID0gW107XG4gIGxldCBzY29yZSA9IDA7XG4gIGxldCByZXBvcnRlZCA9IGZhbHNlO1xuICBsZXQgZm9jdXNUcmFwRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgbGV0IGtleWJvYXJkQ291bnQgPSAwO1xuICBsZXQgdG90YWxDb3VudCA9IDA7XG4gIGxldCBsYXN0Rm9jdXNUaW1lID0gMDtcbiAgbGV0IGhhZE1lYW5pbmdmdWxGb2N1cyA9IGZhbHNlO1xuXG4gIGNvbnN0IHJlcG9ydEF1ZGllbmNlID0gKCkgPT4ge1xuICAgIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbiAgICBpZiAocmVwb3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmVwb3J0ZWQgPSB0cnVlO1xuICAgIGNvbnN0IGF1ZGllbmNlID0gc2NvcmUgPj0gMSA/ICdvbicgOiAnb2ZmJztcbiAgICBzYW1wbGVSVU0oJ2ExMXknLCB7IHNvdXJjZTogYXVkaWVuY2UsIHRhcmdldDogJ29uOm9mZicgfSk7XG4gIH07XG5cbiAgY29uc3QgcmVwb3J0Rm9jdXNUcmFwID0gKHRyYXBUeXBlLCBlbGVtZW50cykgPT4ge1xuICAgIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbiAgICBpZiAoZm9jdXNUcmFwRGV0ZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9jdXNUcmFwRGV0ZWN0ZWQgPSB0cnVlO1xuICAgIGNvbnN0IGVsZW1lbnREZXNjcmlwdGlvbnMgPSBlbGVtZW50cy5zbGljZSgwLCAzKS5tYXAoc291cmNlU2VsZWN0b3IpO1xuICAgIHNhbXBsZVJVTSgnZXJyb3InLCB7XG4gICAgICBzb3VyY2U6IGBmb2N1cy10cmFwOiR7dHJhcFR5cGV9YCxcbiAgICAgIHRhcmdldDogZWxlbWVudERlc2NyaXB0aW9ucy5qb2luKCcsICcpLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGRldGVjdFJlcGVhdGluZ1NlcXVlbmNlID0gKGVsZW1lbnRzLCBzZXFMZW5ndGgpID0+IHtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IHNlcUxlbmd0aCAqIEZPQ1VTX1RSQVBfTUlOX1JFUEVBVFM7XG4gICAgLyogYzggaWdub3JlIG5leHQgMyAqL1xuICAgIGlmIChlbGVtZW50cy5sZW5ndGggPCB0b3RhbExlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZWNlbnQgPSBlbGVtZW50cy5zbGljZSgtdG90YWxMZW5ndGgpO1xuICAgIGNvbnN0IGJhc2VTZXF1ZW5jZSA9IHJlY2VudC5zbGljZSgwLCBzZXFMZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgRk9DVVNfVFJBUF9NSU5fUkVQRUFUUzsgaSArPSAxKSB7XG4gICAgICBjb25zdCBuZXh0U2VxdWVuY2UgPSByZWNlbnQuc2xpY2UoaSAqIHNlcUxlbmd0aCwgKGkgKyAxKSAqIHNlcUxlbmd0aCk7XG4gICAgICBpZiAobmV4dFNlcXVlbmNlLmxlbmd0aCAhPT0gc2VxTGVuZ3RoXG4gICAgICAgIHx8ICFuZXh0U2VxdWVuY2UuZXZlcnkoKGVsLCBqKSA9PiBlbCA9PT0gYmFzZVNlcXVlbmNlW2pdKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJlcG9ydEZvY3VzVHJhcCgnc2VxdWVuY2UnLCBiYXNlU2VxdWVuY2UpO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IGRldGVjdEZvY3VzVHJhcCA9ICgpID0+IHtcbiAgICBpZiAoZm9jdXNIaXN0b3J5Lmxlbmd0aCA8IEZPQ1VTX1RSQVBfTUlOX0hJU1RPUlkgfHwgZm9jdXNUcmFwRGV0ZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudHMgPSBmb2N1c0hpc3RvcnkubWFwKChoKSA9PiBoLmVsZW1lbnQpO1xuICAgIGNvbnN0IHRpbWVzdGFtcHMgPSBmb2N1c0hpc3RvcnkubWFwKChoKSA9PiBoLnRpbWVzdGFtcCk7XG5cbiAgICBpZiAoZWxlbWVudHMuc2xpY2UoLTMpLmV2ZXJ5KChlbCkgPT4gZWwgPT09IGVsZW1lbnRzW2VsZW1lbnRzLmxlbmd0aCAtIDFdKSkge1xuICAgICAgcmVwb3J0Rm9jdXNUcmFwKCdzaW5nbGUnLCBbZWxlbWVudHNbZWxlbWVudHMubGVuZ3RoIC0gMV1dKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCByZWNlbnQ0ID0gZWxlbWVudHMuc2xpY2UoLTQpO1xuICAgIGNvbnN0IHVuaXF1ZSA9IFsuLi5uZXcgU2V0KHJlY2VudDQpXTtcbiAgICBjb25zdCB0aW1lRGlmZiA9IHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSAxXSAtIHRpbWVzdGFtcHNbdGltZXN0YW1wcy5sZW5ndGggLSA0XTtcbiAgICBpZiAodW5pcXVlLmxlbmd0aCA9PT0gMiAmJiB0aW1lRGlmZiA8IEZPQ1VTX1RSQVBfUElOR19QT05HX0RVUkFUSU9OKSB7XG4gICAgICByZXBvcnRGb2N1c1RyYXAoJ3BpbmctcG9uZycsIHVuaXF1ZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWluU2VxTGVuZ3RoID0gMiAqIEZPQ1VTX1RSQVBfTUlOX0hJU1RPUlkgKyAxO1xuICAgIGlmIChmb2N1c0hpc3RvcnkubGVuZ3RoID49IG1pblNlcUxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgc2VxTGVuZ3RoID0gMjsgc2VxTGVuZ3RoIDw9IDQ7IHNlcUxlbmd0aCArPSAxKSB7XG4gICAgICAgIGlmIChkZXRlY3RSZXBlYXRpbmdTZXF1ZW5jZShlbGVtZW50cywgc2VxTGVuZ3RoKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCB0cmFja0ZvY3VzRm9yVHJhcCA9IChldmVudCkgPT4ge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgeyBhY3RpdmVFbGVtZW50IH0gPSBkb2N1bWVudDtcbiAgICAgIC8qIGM4IGlnbm9yZSBuZXh0IDMgKi9cbiAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCBhY3RpdmVFbGVtZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGZvY3VzSGlzdG9yeS5wdXNoKHtcbiAgICAgICAgZWxlbWVudDogYWN0aXZlRWxlbWVudCxcbiAgICAgICAgdGltZXN0YW1wOiBwZXJmb3JtYW5jZS5ub3coKSxcbiAgICAgICAgc2hpZnRLZXk6IGV2ZW50LnNoaWZ0S2V5LFxuICAgICAgfSk7XG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCAzICovXG4gICAgICBpZiAoZm9jdXNIaXN0b3J5Lmxlbmd0aCA+IEZPQ1VTVFJBUF9NQVhfSElTVE9SWSkge1xuICAgICAgICBmb2N1c0hpc3Rvcnkuc2hpZnQoKTtcbiAgICAgIH1cbiAgICAgIGRldGVjdEZvY3VzVHJhcCgpO1xuICAgIH0sIDApO1xuICB9O1xuXG4gIGNvbnN0IGNoZWNrQmVoYXZpb3JhbFNjb3JlID0gKCkgPT4ge1xuICAgIGlmICh0b3RhbENvdW50ID49IEJFSEFWSU9SQUxfTUlOX0VWRU5UUyAmJiAhcmVwb3J0ZWQpIHtcbiAgICAgIGlmIChrZXlib2FyZENvdW50IC8gdG90YWxDb3VudCA+IDAuNykge1xuICAgICAgICBzY29yZSArPSAyO1xuICAgICAgfVxuICAgICAgcmVwb3J0QXVkaWVuY2UoKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gLS0tIFN0YXRpYyBTY29yaW5nIC0tLVxuICBzY29yZSArPSBNRURJQV9RVUVSWV9QUkVGRVJFTkNFUy5maWx0ZXIoKHEpID0+IHdpbmRvdy5tYXRjaE1lZGlhKHEpLm1hdGNoZXMpLmxlbmd0aDtcblxuICBjb25zdCB6b29tID0gZ2V0Wm9vbSgpO1xuICBpZiAoem9vbSA+PSBISUdIX1pPT01fTEVWRUwpIHtcbiAgICBzY29yZSArPSAzO1xuICB9IGVsc2UgaWYgKHpvb20gPj0gTUVESVVNX1pPT01fTEVWRUwpIHtcbiAgICBzY29yZSArPSAyO1xuICB9XG5cbiAgaWYgKG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA9PT0gMCAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHBvaW50ZXI6IGNvYXJzZSknKS5tYXRjaGVzKSB7XG4gICAgc2NvcmUgKz0gMjtcbiAgfVxuXG4gIC8vIC0tLSBFdmVudCBMaXN0ZW5lcnMgJiBPYnNlcnZlcnMgLS0tXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZXZlbnQpID0+IHtcbiAgICBpZiAoS0VZQk9BUkRfUkVMRVZBTlRfS0VZUy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XG4gICAgICBrZXlib2FyZENvdW50ICs9IDE7XG4gICAgICB0b3RhbENvdW50ICs9IDE7XG4gICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICB0cmFja0ZvY3VzRm9yVHJhcChldmVudCk7XG4gICAgICB9XG4gICAgICBjaGVja0JlaGF2aW9yYWxTY29yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgdG90YWxDb3VudCArPSAxO1xuICAgIGNoZWNrQmVoYXZpb3JhbFNjb3JlKCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCAoZXZlbnQpID0+IHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICBsYXN0Rm9jdXNUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICBoYWRNZWFuaW5nZnVsRm9jdXMgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZm9jdXNMb3NzT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgaWYgKGhhZE1lYW5pbmdmdWxGb2N1c1xuICAgICAgICAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBkb2N1bWVudC5ib2R5XG4gICAgICAgICYmIChwZXJmb3JtYW5jZS5ub3coKSAtIGxhc3RGb2N1c1RpbWUgPiAxMDApKSB7XG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCA5ICovXG4gICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9ucy5maW5kKChtKSA9PiAoXG4gICAgICAgIG0udHlwZSA9PT0gJ2NoaWxkTGlzdCcgJiYgKG0uYWRkZWROb2Rlcy5sZW5ndGggPiAwIHx8IG0ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApXG4gICAgICApKTtcbiAgICAgIHNhbXBsZVJVTSgnZXJyb3InLCB7XG4gICAgICAgIHNvdXJjZTogJ2ZvY3VzLWxvc3MnLFxuICAgICAgICB0YXJnZXQ6IHNvdXJjZVNlbGVjdG9yKG11dGF0aW9uPy50YXJnZXQpLFxuICAgICAgfSk7XG4gICAgICBoYWRNZWFuaW5nZnVsRm9jdXMgPSBmYWxzZTsgLy8gUHJldmVudCBzcGFtXG4gICAgfVxuICB9KTtcblxuICBmb2N1c0xvc3NPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTtcblxuICAvLyAtLS0gRmluYWwgUmVwb3J0aW5nIC0tLVxuICBpZiAoc2NvcmUgPj0gMSkge1xuICAgIHJlcG9ydEF1ZGllbmNlKCk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGltZW91dChcbiAgICAgICgpID0+IHJlcG9ydEF1ZGllbmNlKCksXG4gICAgICAvKiBjOCBpZ25vcmUgbmV4dCAxICovXG4gICAgICB3aW5kb3cuaGx4LkExMVlfUkVQT1JUX0RFTEFZIHx8IDEwXzAwMCxcbiAgICApO1xuICB9XG59XG4iXSwibmFtZXMiOlsiTUVESUFfUVVFUllfUFJFRkVSRU5DRVMiLCJLRVlCT0FSRF9SRUxFVkFOVF9LRVlTIiwiSElHSF9aT09NX0xFVkVMIiwiTUVESVVNX1pPT01fTEVWRUwiLCJCRUhBVklPUkFMX01JTl9FVkVOVFMiLCJGT0NVU1RSQVBfTUFYX0hJU1RPUlkiLCJGT0NVU19UUkFQX01JTl9ISVNUT1JZIiwiRk9DVVNfVFJBUF9QSU5HX1BPTkdfRFVSQVRJT04iLCJGT0NVU19UUkFQX01JTl9SRVBFQVRTIiwiZ2V0Wm9vbSIsIndpbmRvdyIsInZpc3VhbFZpZXdwb3J0Iiwid2lkdGgiLCJNYXRoIiwicm91bmQiLCJpbm5lcldpZHRoIiwiYWRkQWNjZXNzaWJpbGl0eUF1ZGllbmNlVHJhY2tpbmciLCJzYW1wbGVSVU0iLCJzb3VyY2VTZWxlY3RvciIsImZvY3VzSGlzdG9yeSIsInNjb3JlIiwicmVwb3J0ZWQiLCJmb2N1c1RyYXBEZXRlY3RlZCIsImtleWJvYXJkQ291bnQiLCJ0b3RhbENvdW50IiwibGFzdEZvY3VzVGltZSIsImhhZE1lYW5pbmdmdWxGb2N1cyIsInJlcG9ydEF1ZGllbmNlIiwiYXVkaWVuY2UiLCJzb3VyY2UiLCJ0YXJnZXQiLCJyZXBvcnRGb2N1c1RyYXAiLCJ0cmFwVHlwZSIsImVsZW1lbnRzIiwiZWxlbWVudERlc2NyaXB0aW9ucyIsInNsaWNlIiwibWFwIiwiam9pbiIsImRldGVjdFJlcGVhdGluZ1NlcXVlbmNlIiwic2VxTGVuZ3RoIiwidG90YWxMZW5ndGgiLCJsZW5ndGgiLCJyZWNlbnQiLCJiYXNlU2VxdWVuY2UiLCJpIiwibmV4dFNlcXVlbmNlIiwiZXZlcnkiLCJlbCIsImoiLCJkZXRlY3RGb2N1c1RyYXAiLCJoIiwiZWxlbWVudCIsInRpbWVzdGFtcHMiLCJ0aW1lc3RhbXAiLCJyZWNlbnQ0IiwidW5pcXVlIiwiU2V0IiwidGltZURpZmYiLCJtaW5TZXFMZW5ndGgiLCJ0cmFja0ZvY3VzRm9yVHJhcCIsImV2ZW50Iiwic2V0VGltZW91dCIsImFjdGl2ZUVsZW1lbnQiLCJkb2N1bWVudCIsImJvZHkiLCJwdXNoIiwicGVyZm9ybWFuY2UiLCJub3ciLCJzaGlmdEtleSIsInNoaWZ0IiwiY2hlY2tCZWhhdmlvcmFsU2NvcmUiLCJmaWx0ZXIiLCJxIiwibWF0Y2hNZWRpYSIsIm1hdGNoZXMiLCJ6b29tIiwibmF2aWdhdG9yIiwibWF4VG91Y2hQb2ludHMiLCJhZGRFdmVudExpc3RlbmVyIiwiaW5jbHVkZXMiLCJrZXkiLCJmb2N1c0xvc3NPYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnMiLCJtdXRhdGlvbiIsImZpbmQiLCJtIiwidHlwZSIsImFkZGVkTm9kZXMiLCJyZW1vdmVkTm9kZXMiLCJvYnNlcnZlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsImhseCIsIkExMVlfUkVQT1JUX0RFTEFZIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQVlBLE1BQU1BLHVCQUF1QixHQUFHLENBQzlCLGtDQUFrQyxFQUNsQywwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLHlCQUF5QixFQUN6Qix3Q0FBd0MsQ0FDekM7QUFFRCxNQUFNQyxzQkFBc0IsR0FBRyxDQUM3QixLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUNqRjtBQUVELE1BQU1DLGVBQWUsR0FBRyxHQUFHO0FBQzNCLE1BQU1DLGlCQUFpQixHQUFHLEdBQUc7QUFFN0IsTUFBTUMscUJBQXFCLEdBQUcsRUFBRTtBQUVoQyxNQUFNQyxxQkFBcUIsR0FBRyxFQUFFO0FBQ2hDLE1BQU1DLHNCQUFzQixHQUFHLENBQUM7QUFDaEMsTUFBTUMsNkJBQTZCLEdBQUcsSUFBSTtBQUMxQyxNQUFNQyxzQkFBc0IsR0FBRyxDQUFDO0FBT2hDLFNB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
7377a0534dc9e004550bba8a99e54c80
|
package/src/plugins/cwv.js
CHANGED
|
@@ -179,8 +179,10 @@
|
|
|
179
179
|
}
|
|
180
180
|
const B = e => {
|
|
181
181
|
const t = globalThis.requestIdleCallback || setTimeout;
|
|
182
|
-
"hidden" === document.visibilityState ? e() : (
|
|
182
|
+
"hidden" === document.visibilityState ? e() : (e = u(e), document.addEventListener("visibilitychange", e, {
|
|
183
183
|
once: true
|
|
184
|
+
}), t(() => {
|
|
185
|
+
e(), document.removeEventListener("visibilitychange", e);
|
|
184
186
|
}));
|
|
185
187
|
},
|
|
186
188
|
N = [200, 500];
|