govuk_publishing_components 39.2.4 → 39.2.5
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58b7f11016cf45ea3d59c0a1dbc3f8c059869a37a82925845e803d3a060074ec
|
4
|
+
data.tar.gz: 2115ba949c309a7482fb08748d2abfdca8b01f2adb01557d45083cf812d30073
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 313d31ab1ab2882e1d684357c40f95fcb73e8ac020f9e056aba9f8e46e25ab87cfb4df2414bfe19fef62717c7a028b00a5e2fc5616be12c0ef7356eb311c621d
|
7
|
+
data.tar.gz: c532deea8617bef61052a66fdc7501ebaed45a7040db52c5bd8150415385abc2e6c03972a6a9fee30622753aec2308b7440103cda8e923dd1d6d5be4838f43de
|
@@ -22,6 +22,48 @@
|
|
22
22
|
(function () {
|
23
23
|
'use strict';
|
24
24
|
|
25
|
+
var Flags = {
|
26
|
+
InitCalled: 1 << 0,
|
27
|
+
NavTimingNotSupported: 1 << 1,
|
28
|
+
UserTimingNotSupported: 1 << 2,
|
29
|
+
VisibilityStateNotVisible: 1 << 3,
|
30
|
+
BeaconSentFromUnloadHandler: 1 << 4,
|
31
|
+
BeaconSentAfterTimeout: 1 << 5,
|
32
|
+
PageLabelFromDocumentTitle: 1 << 6,
|
33
|
+
PageLabelFromLabelProp: 1 << 7,
|
34
|
+
PageLabelFromGlobalVariable: 1 << 8,
|
35
|
+
PageLabelFromUrlPattern: 1 << 9,
|
36
|
+
PageWasPrerendered: 1 << 10,
|
37
|
+
PageWasBfCacheRestored: 1 << 11,
|
38
|
+
BeaconBlockedByCsp: 1 << 12,
|
39
|
+
};
|
40
|
+
function addFlag(flags, flag) {
|
41
|
+
return flags | flag;
|
42
|
+
}
|
43
|
+
|
44
|
+
// Wrapper to support older browsers (<= IE8)
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
46
|
+
function addListener(type, callback, useCapture) {
|
47
|
+
if (useCapture === void 0) { useCapture = false; }
|
48
|
+
if (addEventListener) {
|
49
|
+
addEventListener(type, callback, useCapture);
|
50
|
+
}
|
51
|
+
else if (window.attachEvent && true) {
|
52
|
+
window.attachEvent("on" + type, callback);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
// Wrapper to support older browsers (<= IE8)
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
57
|
+
function removeListener(type, callback, useCapture) {
|
58
|
+
if (useCapture === void 0) { useCapture = false; }
|
59
|
+
if (removeEventListener) {
|
60
|
+
removeEventListener(type, callback, useCapture);
|
61
|
+
}
|
62
|
+
else if (window.detachEvent && true) {
|
63
|
+
window.detachEvent("on" + type, callback);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
|
25
67
|
function now() {
|
26
68
|
return Date.now ? Date.now() : +new Date();
|
27
69
|
}
|
@@ -74,6 +116,7 @@
|
|
74
116
|
PostBeaconMetricRejected: 87,
|
75
117
|
PostBeaconDisabled: 88,
|
76
118
|
PostBeaconSendFailed: 89,
|
119
|
+
PostBeaconCSPViolation: 90,
|
77
120
|
};
|
78
121
|
var Logger = /** @class */ (function () {
|
79
122
|
function Logger() {
|
@@ -240,7 +283,7 @@
|
|
240
283
|
return str;
|
241
284
|
}
|
242
285
|
|
243
|
-
var VERSION = "4.0.
|
286
|
+
var VERSION = "4.0.23";
|
244
287
|
/**
|
245
288
|
* Returns the version of the script as a float to be stored in legacy systems that do not support
|
246
289
|
* string versions.
|
@@ -256,6 +299,7 @@
|
|
256
299
|
xhr.open("POST", url, true);
|
257
300
|
xhr.setRequestHeader("content-type", "application/json");
|
258
301
|
xhr.send(String(data));
|
302
|
+
return true;
|
259
303
|
};
|
260
304
|
var sendBeacon = "sendBeacon" in navigator ? navigator.sendBeacon.bind(navigator) : sendBeaconFallback;
|
261
305
|
/**
|
@@ -279,7 +323,9 @@
|
|
279
323
|
var _this = this;
|
280
324
|
this.isRecording = true;
|
281
325
|
this.isSent = false;
|
326
|
+
this.sendRetries = 0;
|
282
327
|
this.maxMeasureTimeout = 0;
|
328
|
+
this.flags = 0;
|
283
329
|
this.onBeforeSendCbs = [];
|
284
330
|
this.startTime = opts.startTime || getZeroTime();
|
285
331
|
this.config = opts.config;
|
@@ -293,6 +339,33 @@
|
|
293
339
|
_this.stopRecording();
|
294
340
|
_this.send();
|
295
341
|
}, this.config.maxMeasureTime);
|
342
|
+
addListener("securitypolicyviolation", function (e) {
|
343
|
+
if (e.disposition !== "report" && e.blockedURI === _this.config.beaconUrlV2 && "URL" in self) {
|
344
|
+
// Some websites might have CSP rules that allow the GET beacon, but not the POST beacon.
|
345
|
+
// We can detect this here and attempt to send the beacon to a fallback endpoint.
|
346
|
+
//
|
347
|
+
// If the fallback endpoint has not been provided in the config, we will fall back to using
|
348
|
+
// the POST beacon pathname on the GET beacon origin.
|
349
|
+
if (!_this.config.beaconUrlFallback) {
|
350
|
+
var getOrigin = new URL(_this.config.beaconUrl).origin;
|
351
|
+
var postPathname = new URL(_this.config.beaconUrlV2).pathname;
|
352
|
+
_this.config.beaconUrlFallback = getOrigin + postPathname;
|
353
|
+
}
|
354
|
+
// Update the V2 beacon URL
|
355
|
+
_this.config.beaconUrlV2 = _this.config.beaconUrlFallback;
|
356
|
+
_this.logger.logEvent(LogEvent.PostBeaconCSPViolation, [_this.config.beaconUrlV2]);
|
357
|
+
_this.addFlag(Flags.BeaconBlockedByCsp);
|
358
|
+
// Not all browsers return false if sendBeacon fails. In this case, `this.isSent` will be
|
359
|
+
// true, even though the beacon wasn't sent. We need to reset this flag to ensure we can
|
360
|
+
// retry sending the beacon.
|
361
|
+
_this.isSent = false;
|
362
|
+
// Try to send the beacon again
|
363
|
+
if (_this.sendRetries < 1) {
|
364
|
+
_this.sendRetries++;
|
365
|
+
_this.send();
|
366
|
+
}
|
367
|
+
}
|
368
|
+
});
|
296
369
|
this.logger.logEvent(LogEvent.PostBeaconInitialised);
|
297
370
|
}
|
298
371
|
Beacon.prototype.isBeingSampled = function () {
|
@@ -310,6 +383,9 @@
|
|
310
383
|
}
|
311
384
|
this.metricData[metric] = data;
|
312
385
|
};
|
386
|
+
Beacon.prototype.addFlag = function (flag) {
|
387
|
+
this.flags = addFlag(this.flags, flag);
|
388
|
+
};
|
313
389
|
Beacon.prototype.hasMetricData = function () {
|
314
390
|
return Object.keys(this.metricData).length > 0;
|
315
391
|
};
|
@@ -347,6 +423,7 @@
|
|
347
423
|
var beaconUrl = this.beaconUrl();
|
348
424
|
var payload = Object.assign({
|
349
425
|
customerId: this.customerId,
|
426
|
+
flags: this.flags,
|
350
427
|
measureDuration: msSincePageInit(),
|
351
428
|
pageId: this.pageId,
|
352
429
|
scriptVersion: VERSION,
|
@@ -354,40 +431,21 @@
|
|
354
431
|
startTime: this.startTime,
|
355
432
|
}, this.metricData);
|
356
433
|
try {
|
357
|
-
sendBeacon(beaconUrl, JSON.stringify(payload))
|
358
|
-
|
359
|
-
|
434
|
+
if (sendBeacon(beaconUrl, JSON.stringify(payload))) {
|
435
|
+
this.isSent = true;
|
436
|
+
this.logger.logEvent(LogEvent.PostBeaconSent, [beaconUrl, payload]);
|
437
|
+
}
|
360
438
|
}
|
361
439
|
catch (e) {
|
362
|
-
|
440
|
+
// Intentionally empty; handled below
|
441
|
+
}
|
442
|
+
if (!this.isSent) {
|
443
|
+
this.logger.logEvent(LogEvent.PostBeaconSendFailed, [beaconUrl, payload]);
|
363
444
|
}
|
364
445
|
};
|
365
446
|
return Beacon;
|
366
447
|
}());
|
367
448
|
|
368
|
-
// Wrapper to support older browsers (<= IE8)
|
369
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
370
|
-
function addListener(type, callback, useCapture) {
|
371
|
-
if (useCapture === void 0) { useCapture = false; }
|
372
|
-
if (addEventListener) {
|
373
|
-
addEventListener(type, callback, useCapture);
|
374
|
-
}
|
375
|
-
else if (window.attachEvent && true) {
|
376
|
-
window.attachEvent("on" + type, callback);
|
377
|
-
}
|
378
|
-
}
|
379
|
-
// Wrapper to support older browsers (<= IE8)
|
380
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
381
|
-
function removeListener(type, callback, useCapture) {
|
382
|
-
if (useCapture === void 0) { useCapture = false; }
|
383
|
-
if (removeEventListener) {
|
384
|
-
removeEventListener(type, callback, useCapture);
|
385
|
-
}
|
386
|
-
else if (window.detachEvent && true) {
|
387
|
-
window.detachEvent("on" + type, callback);
|
388
|
-
}
|
389
|
-
}
|
390
|
-
|
391
449
|
function onPageLoad(callback) {
|
392
450
|
if (document.readyState === "complete") {
|
393
451
|
// The onload event has already fired
|
@@ -408,6 +466,7 @@
|
|
408
466
|
allowEmptyPostBeacon: getProperty(obj, "allowEmptyPostBeacon", false),
|
409
467
|
auto: autoMode,
|
410
468
|
beaconUrl: getProperty(obj, "beaconUrl", luxOrigin + "/lux/"),
|
469
|
+
beaconUrlFallback: getProperty(obj, "beaconUrlFallback"),
|
411
470
|
beaconUrlV2: getProperty(obj, "beaconUrlV2", "https://beacon.speedcurve.com/store"),
|
412
471
|
conversions: getProperty(obj, "conversions"),
|
413
472
|
cookieDomain: getProperty(obj, "cookieDomain"),
|
@@ -543,39 +602,38 @@
|
|
543
602
|
var MAX_SELECTOR_LENGTH = 100;
|
544
603
|
function getNodeSelector(node, selector) {
|
545
604
|
if (selector === void 0) { selector = ""; }
|
546
|
-
|
547
|
-
if (selector &&
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
return selectorWithParent;
|
575
|
-
}
|
605
|
+
try {
|
606
|
+
if (selector && (node.nodeType === 9 || selector.length > MAX_SELECTOR_LENGTH || !node.parentNode)) {
|
607
|
+
// Final selector.
|
608
|
+
return selector;
|
609
|
+
}
|
610
|
+
var el = node;
|
611
|
+
// Our first preference is to use the data-sctrack attribute from anywhere in the tree
|
612
|
+
var trackId = getClosestScTrackAttribute(el);
|
613
|
+
if (trackId) {
|
614
|
+
return trackId;
|
615
|
+
}
|
616
|
+
if (el.id) {
|
617
|
+
// Once we've found an element with ID we return the selector.
|
618
|
+
return "#" + el.id + (selector ? ">" + selector : "");
|
619
|
+
}
|
620
|
+
else if (el) {
|
621
|
+
// Otherwise attempt to get parent elements recursively
|
622
|
+
var name_1 = el.nodeType === 1 ? el.nodeName.toLowerCase() : el.nodeName.toUpperCase();
|
623
|
+
var classes = el.className ? "." + el.className.replace(/\s+/g, ".") : "";
|
624
|
+
// Remove classes until the selector is short enough
|
625
|
+
while ((name_1 + classes).length > MAX_SELECTOR_LENGTH) {
|
626
|
+
classes = classes.split(".").slice(0, -1).join(".");
|
627
|
+
}
|
628
|
+
var currentSelector = name_1 + classes + (selector ? ">" + selector : "");
|
629
|
+
if (el.parentNode) {
|
630
|
+
var selectorWithParent = getNodeSelector(el.parentNode, currentSelector);
|
631
|
+
if (selectorWithParent.length < MAX_SELECTOR_LENGTH) {
|
632
|
+
return selectorWithParent;
|
576
633
|
}
|
577
|
-
return currentSelector;
|
578
634
|
}
|
635
|
+
return currentSelector;
|
636
|
+
}
|
579
637
|
}
|
580
638
|
catch (error) {
|
581
639
|
// Do nothing.
|
@@ -583,24 +641,6 @@
|
|
583
641
|
return selector;
|
584
642
|
}
|
585
643
|
|
586
|
-
var Flags = {
|
587
|
-
InitCalled: 1 << 0,
|
588
|
-
NavTimingNotSupported: 1 << 1,
|
589
|
-
UserTimingNotSupported: 1 << 2,
|
590
|
-
VisibilityStateNotVisible: 1 << 3,
|
591
|
-
BeaconSentFromUnloadHandler: 1 << 4,
|
592
|
-
BeaconSentAfterTimeout: 1 << 5,
|
593
|
-
PageLabelFromDocumentTitle: 1 << 6,
|
594
|
-
PageLabelFromLabelProp: 1 << 7,
|
595
|
-
PageLabelFromGlobalVariable: 1 << 8,
|
596
|
-
PageLabelFromUrlPattern: 1 << 9,
|
597
|
-
PageWasPrerendered: 1 << 10,
|
598
|
-
PageWasBfCacheRestored: 1 << 11,
|
599
|
-
};
|
600
|
-
function addFlag(flags, flag) {
|
601
|
-
return flags | flag;
|
602
|
-
}
|
603
|
-
|
604
644
|
var sessionValue = 0;
|
605
645
|
var sessionEntries = [];
|
606
646
|
var sessionAttributions = [];
|
@@ -620,23 +660,23 @@
|
|
620
660
|
elementType: source.node.nodeName,
|
621
661
|
}); })
|
622
662
|
: [];
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
largestEntry = entry;
|
630
|
-
}
|
631
|
-
else {
|
632
|
-
sessionValue += entry.value;
|
633
|
-
sessionEntries.push(entry);
|
634
|
-
sessionAttributions = sessionAttributions.concat(sources);
|
635
|
-
if (!largestEntry || entry.value > largestEntry.value) {
|
663
|
+
if (sessionEntries.length &&
|
664
|
+
(entry.startTime - latestEntry.startTime >= 1000 ||
|
665
|
+
entry.startTime - firstEntry.startTime >= 5000)) {
|
666
|
+
sessionValue = entry.value;
|
667
|
+
sessionEntries = [entry];
|
668
|
+
sessionAttributions = sources;
|
636
669
|
largestEntry = entry;
|
637
|
-
|
670
|
+
}
|
671
|
+
else {
|
672
|
+
sessionValue += entry.value;
|
673
|
+
sessionEntries.push(entry);
|
674
|
+
sessionAttributions = sessionAttributions.concat(sources);
|
675
|
+
if (!largestEntry || entry.value > largestEntry.value) {
|
676
|
+
largestEntry = entry;
|
638
677
|
}
|
639
|
-
|
678
|
+
}
|
679
|
+
maximumSessionValue = max(maximumSessionValue, sessionValue);
|
640
680
|
}
|
641
681
|
}
|
642
682
|
function reset$1() {
|
@@ -1060,6 +1100,7 @@
|
|
1060
1100
|
if (!performance.timing) {
|
1061
1101
|
logger.logEvent(LogEvent.NavTimingNotSupported);
|
1062
1102
|
gFlags = addFlag(gFlags, Flags.NavTimingNotSupported);
|
1103
|
+
beacon.addFlag(Flags.NavTimingNotSupported);
|
1063
1104
|
}
|
1064
1105
|
logger.logEvent(LogEvent.NavigationStart, [timing.navigationStart]);
|
1065
1106
|
////////////////////// FID BEGIN
|
@@ -1165,6 +1206,7 @@
|
|
1165
1206
|
};
|
1166
1207
|
gaMarks.push(entry);
|
1167
1208
|
gFlags = addFlag(gFlags, Flags.UserTimingNotSupported);
|
1209
|
+
beacon.addFlag(Flags.UserTimingNotSupported);
|
1168
1210
|
return entry;
|
1169
1211
|
}
|
1170
1212
|
}
|
@@ -1267,6 +1309,7 @@
|
|
1267
1309
|
};
|
1268
1310
|
gaMeasures.push(entry);
|
1269
1311
|
gFlags = addFlag(gFlags, Flags.UserTimingNotSupported);
|
1312
|
+
beacon.addFlag(Flags.UserTimingNotSupported);
|
1270
1313
|
return entry;
|
1271
1314
|
}
|
1272
1315
|
}
|
@@ -1610,6 +1653,7 @@
|
|
1610
1653
|
if (clearFlags) {
|
1611
1654
|
gFlags = 0;
|
1612
1655
|
gFlags = addFlag(gFlags, Flags.InitCalled);
|
1656
|
+
beacon.addFlag(Flags.InitCalled);
|
1613
1657
|
}
|
1614
1658
|
// Reset the maximum measure timeout
|
1615
1659
|
createMaxMeasureTimeout();
|
@@ -1653,7 +1697,7 @@
|
|
1653
1697
|
"style" === e.as ||
|
1654
1698
|
(typeof e.onload === "function" && e.media === "all")) ;
|
1655
1699
|
else {
|
1656
|
-
|
1700
|
+
nBlocking++;
|
1657
1701
|
}
|
1658
1702
|
}
|
1659
1703
|
}
|
@@ -2024,6 +2068,7 @@
|
|
2024
2068
|
clearMaxMeasureTimeout();
|
2025
2069
|
gMaxMeasureTimeout = setTimeout(function () {
|
2026
2070
|
gFlags = addFlag(gFlags, Flags.BeaconSentAfterTimeout);
|
2071
|
+
beacon.addFlag(Flags.BeaconSentAfterTimeout);
|
2027
2072
|
_sendLux();
|
2028
2073
|
}, globalConfig.maxMeasureTime - msSincePageInit());
|
2029
2074
|
}
|
@@ -2094,9 +2139,11 @@
|
|
2094
2139
|
var sLuxjs = selfLoading();
|
2095
2140
|
if (!isVisible()) {
|
2096
2141
|
gFlags = addFlag(gFlags, Flags.VisibilityStateNotVisible);
|
2142
|
+
beacon.addFlag(Flags.VisibilityStateNotVisible);
|
2097
2143
|
}
|
2098
2144
|
if (wasPrerendered()) {
|
2099
2145
|
gFlags = addFlag(gFlags, Flags.PageWasPrerendered);
|
2146
|
+
beacon.addFlag(Flags.PageWasPrerendered);
|
2100
2147
|
}
|
2101
2148
|
if (globalConfig.serverTiming) {
|
2102
2149
|
var navEntry = getNavigationEntry();
|
@@ -2310,6 +2357,7 @@
|
|
2310
2357
|
function _addUnloadHandlers() {
|
2311
2358
|
var onunload = function () {
|
2312
2359
|
gFlags = addFlag(gFlags, Flags.BeaconSentFromUnloadHandler);
|
2360
|
+
beacon.addFlag(Flags.BeaconSentFromUnloadHandler);
|
2313
2361
|
logger.logEvent(LogEvent.UnloadHandlerTriggered);
|
2314
2362
|
_sendLux();
|
2315
2363
|
_sendIx();
|
@@ -2387,12 +2435,14 @@
|
|
2387
2435
|
function _getPageLabel() {
|
2388
2436
|
if (LUX.label) {
|
2389
2437
|
gFlags = addFlag(gFlags, Flags.PageLabelFromLabelProp);
|
2438
|
+
beacon.addFlag(Flags.PageLabelFromLabelProp);
|
2390
2439
|
return LUX.label;
|
2391
2440
|
}
|
2392
2441
|
if (typeof LUX.pagegroups !== "undefined") {
|
2393
2442
|
var label = getMatchesFromPatternMap(LUX.pagegroups, location.hostname, location.pathname, true);
|
2394
2443
|
if (label) {
|
2395
2444
|
gFlags = addFlag(gFlags, Flags.PageLabelFromUrlPattern);
|
2445
|
+
beacon.addFlag(Flags.PageLabelFromUrlPattern);
|
2396
2446
|
return label;
|
2397
2447
|
}
|
2398
2448
|
}
|
@@ -2402,6 +2452,7 @@
|
|
2402
2452
|
var label = evaluateJsPageLabel();
|
2403
2453
|
if (label) {
|
2404
2454
|
gFlags = addFlag(gFlags, Flags.PageLabelFromGlobalVariable);
|
2455
|
+
beacon.addFlag(Flags.PageLabelFromGlobalVariable);
|
2405
2456
|
return label;
|
2406
2457
|
}
|
2407
2458
|
}
|
@@ -2411,6 +2462,7 @@
|
|
2411
2462
|
}
|
2412
2463
|
// default to document.title
|
2413
2464
|
gFlags = addFlag(gFlags, Flags.PageLabelFromDocumentTitle);
|
2465
|
+
beacon.addFlag(Flags.PageLabelFromDocumentTitle);
|
2414
2466
|
return document.title;
|
2415
2467
|
}
|
2416
2468
|
function _getCookie(name) {
|
@@ -2495,6 +2547,7 @@
|
|
2495
2547
|
}
|
2496
2548
|
// Flag the current page as a bfcache restore
|
2497
2549
|
gFlags = addFlag(gFlags, Flags.PageWasBfCacheRestored);
|
2550
|
+
beacon.addFlag(Flags.PageWasBfCacheRestored);
|
2498
2551
|
}, 0);
|
2499
2552
|
}
|
2500
2553
|
});
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govuk_publishing_components
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 39.2.
|
4
|
+
version: 39.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GOV.UK Dev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
11
|
+
date: 2024-07-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: govuk_app_config
|