|
1 | | -/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-23; d79b; v9) */ |
| 1 | +/* Simple Analytics - Privacy friendly analytics (docs.simpleanalytics.com/script; 2022-07-25; 72db; v9) */ |
2 | 2 | /* eslint-env browser */ |
3 | 3 |
|
4 | 4 | (function ( |
|
36 | 36 | var doc = window.document; |
37 | 37 | var userAgent = nav.userAgent; |
38 | 38 | var notSending = "Not sending request "; |
| 39 | + var notSendingWhen = notSending + "when "; |
39 | 40 | var fetchedHighEntropyValues = falseVar; |
40 | 41 | var encodeURIComponentFunc = encodeURIComponent; |
41 | 42 | var decodeURIComponentFunc = decodeURIComponent; |
|
82 | 83 | return typeof string == "string"; |
83 | 84 | }; |
84 | 85 |
|
| 86 | + var filterRegex = function (item) { |
| 87 | + return item.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); |
| 88 | + }; |
| 89 | + |
85 | 90 | var attr = function (scriptElement, attribute) { |
86 | 91 | return scriptElement && scriptElement.getAttribute("data-" + attribute); |
87 | 92 | }; |
|
196 | 201 | .filter(function (keyValue) { |
197 | 202 | var ignore = ignoreSource || !collectMetricByString("ut"); |
198 | 203 |
|
199 | | - var paramsRegexList = allowParams.join("|"); |
| 204 | + var paramsRegexList = allowParams.map(filterRegex).join("|"); |
200 | 205 | var regex = ignore |
201 | 206 | ? "^(" + paramsRegexList + ")=" |
202 | 207 | : "^((utm_)" + |
|
229 | 234 | try { |
230 | 235 | if ( |
231 | 236 | ignorePage === path || |
232 | | - new RegExp(ignorePage.replace(/\*/gi, "(.*)"), "gi").test(path) |
| 237 | + new RegExp( |
| 238 | + "^" + filterRegex(ignorePage).replace(/\\\*/gi, "(.*)") + "$", |
| 239 | + "i" |
| 240 | + ).test(path) |
233 | 241 | ) |
234 | 242 | return trueVar; |
235 | 243 | } catch (error) { |
|
256 | 264 |
|
257 | 265 | // Send data via image |
258 | 266 | var sendData = function (data, callback, onlyThisData) { |
259 | | - return braveCallback(function (isBrave) { |
260 | | - data = onlyThisData ? data : assign(payload, page, data); |
| 267 | + data = onlyThisData ? data : assign(payload, page, data); |
261 | 268 |
|
262 | | - if (isBrave && !onlyThisData) data.brave = trueVar; |
| 269 | + if (nav.brave && !onlyThisData) data.brave = trueVar; |
263 | 270 |
|
264 | 271 |
|
265 | | - var image = new Image(); |
266 | | - if (callback) { |
267 | | - image.onerror = callback; |
268 | | - image.onload = callback; |
269 | | - } |
270 | | - image.src = |
271 | | - fullApiUrl + |
272 | | - "/simple.gif?" + |
273 | | - Object.keys(data) |
274 | | - .filter(function (key) { |
275 | | - return data[key] != undefinedVar; |
276 | | - }) |
277 | | - .map(function (key) { |
278 | | - return ( |
279 | | - encodeURIComponentFunc(key) + |
280 | | - "=" + |
281 | | - encodeURIComponentFunc(data[key]) |
282 | | - ); |
283 | | - }) |
284 | | - .join("&") + |
285 | | - "&time=" + |
286 | | - Date.now(); |
287 | | - }); |
| 272 | + var image = new Image(); |
| 273 | + if (callback) { |
| 274 | + image.onerror = callback; |
| 275 | + image.onload = callback; |
| 276 | + } |
| 277 | + image.src = |
| 278 | + fullApiUrl + |
| 279 | + "/simple.gif?" + |
| 280 | + Object.keys(data) |
| 281 | + .filter(function (key) { |
| 282 | + return data[key] != undefinedVar; |
| 283 | + }) |
| 284 | + .map(function (key) { |
| 285 | + return ( |
| 286 | + encodeURIComponentFunc(key) + |
| 287 | + "=" + |
| 288 | + encodeURIComponentFunc(data[key]) |
| 289 | + ); |
| 290 | + }) |
| 291 | + .join("&") + |
| 292 | + "&time=" + |
| 293 | + Date.now(); |
288 | 294 | }; |
289 | 295 |
|
290 | 296 | ///////////////////// |
|
319 | 325 | // INITIALIZE VALUES |
320 | 326 | // |
321 | 327 |
|
322 | | - var duration = "duration"; |
323 | 328 | var start = now(); |
324 | 329 |
|
325 | 330 | var scrolled = 0; |
|
356 | 361 | namespace + "_" + eventText; |
357 | 362 |
|
358 | 363 | // Customers can ignore certain pages |
359 | | - var ignorePages = convertCommaSeparatedToArray( |
360 | | - overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") |
361 | | - ); |
| 364 | + var ignorePages = |
| 365 | + ["/path*lala"] || |
| 366 | + convertCommaSeparatedToArray( |
| 367 | + overwriteOptions.ignorePages || attr(scriptElement, "ignore-pages") |
| 368 | + ); |
362 | 369 |
|
363 | 370 | // Customers can allow params |
364 | 371 | var allowParams = convertCommaSeparatedToArray( |
|
380 | 387 | overwriteOptions.metadataCollector || |
381 | 388 | attr(scriptElement, "metadata-collector"); |
382 | 389 |
|
383 | | - var braveCallback = function (callback) { |
384 | | - if (!nav.brave) callback(falseVar); |
385 | | - else |
386 | | - nav.brave |
387 | | - .isBrave() |
388 | | - .then(function () { |
389 | | - callback(trueVar); |
390 | | - }) |
391 | | - .catch(function () { |
392 | | - callback(falseVar); |
393 | | - }); |
394 | | - }; |
395 | | - |
396 | 390 | // This code could error on (incomplete) implementations, that's why we use try...catch |
397 | 391 | var timezone; |
398 | 392 | try { |
|
422 | 416 | var collectDataOnLeave = |
423 | 417 | collectMetricByString("t") || collectMetricByString("scro"); |
424 | 418 |
|
425 | | - var payload = { |
| 419 | + var basePayload = { |
426 | 420 | version: version, |
| 421 | + hostname: definedHostname, |
| 422 | + }; |
| 423 | + |
| 424 | + if (bot) basePayload.bot = trueVar; |
| 425 | + |
| 426 | + var payload = assign(basePayload, { |
427 | 427 | // us = useragent |
428 | 428 | ua: collectMetricByString("us") ? userAgent : undefinedVar, |
| 429 | + |
429 | 430 | https: loc.protocol == https, |
430 | 431 | timezone: timezone, |
431 | | - hostname: definedHostname, |
432 | 432 | page_id: collectDataOnLeave ? uuid() : undefinedVar, |
| 433 | + |
433 | 434 | // se = sessions |
434 | 435 | session_id: collectMetricByString("se") ? uuid() : undefinedVar, |
435 | | - }; |
436 | | - if (bot) payload.bot = trueVar; |
| 436 | + }); |
437 | 437 |
|
438 | 438 | payload.sri = falseVar; |
439 | 439 |
|
|
460 | 460 | // Don't track when Do Not Track is set to true |
461 | 461 | if (!collectDnt && doNotTrack in nav && nav[doNotTrack] == "1") |
462 | 462 | return warn( |
463 | | - notSending + |
464 | | - "when " + |
465 | | - doNotTrack + |
466 | | - " is enabled. See " + |
467 | | - docsUrl + |
468 | | - "/dnt" |
| 463 | + notSendingWhen + doNotTrack + " is enabled. See " + docsUrl + "/dnt" |
469 | 464 | ); |
470 | 465 |
|
471 | 466 | // Warn when sending from localhost and not having a hostname set |
|
506 | 501 | var sendOnLeave = function (id, push) { |
507 | 502 | if (!collectDataOnLeave) return; |
508 | 503 |
|
509 | | - var append = { |
| 504 | + var append = assign(basePayload, { |
510 | 505 | type: "append", |
511 | | - hostname: definedHostname, |
512 | 506 | original_id: push ? id : payload.page_id, |
513 | | - }; |
| 507 | + }); |
514 | 508 |
|
515 | 509 | // t = timeonpage |
516 | 510 | if (collectMetricByString("t")) { |
517 | | - append[duration] = Math.round((now() - start - msHidden) / thousand); |
| 511 | + append.duration = Math.round((now() - start - msHidden) / thousand); |
518 | 512 | } |
519 | 513 | msHidden = 0; |
520 | 514 | start = now(); |
|
603 | 597 |
|
604 | 598 | // Ignore pages specified in data-ignore-pages |
605 | 599 | if (shouldIgnore(path)) { |
606 | | - warn(notSending + ", ignored " + path); |
| 600 | + warn(notSendingWhen + "ignoring " + path); |
607 | 601 | return; |
608 | 602 | } |
609 | 603 |
|
|
675 | 669 | var navigationText = "navigation"; |
676 | 670 |
|
677 | 671 | // Check if back, forward or reload buttons are being used in modern browsers |
678 | | - var userNavigated = |
679 | | - perf && |
680 | | - perf.getEntriesByType && |
681 | | - perf.getEntriesByType(navigationText)[0] && |
682 | | - perf.getEntriesByType(navigationText)[0].type |
683 | | - ? ["reload", "back_forward"].indexOf( |
684 | | - perf.getEntriesByType(navigationText)[0].type |
685 | | - ) > -1 |
686 | | - : // Check if back, forward or reload buttons are being use in older browsers |
687 | | - // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD |
688 | | - perf && |
689 | | - perf[navigationText] && |
690 | | - [1, 2].indexOf(perf[navigationText].type) > -1; |
| 672 | + var performaceEntryType; |
| 673 | + try { |
| 674 | + performaceEntryType = perf.getEntriesByType(navigationText)[0].type; |
| 675 | + } catch (error) { |
| 676 | + // Do nothing |
| 677 | + } |
| 678 | + |
| 679 | + var userNavigated = performaceEntryType |
| 680 | + ? ["reload", "back_forward"].indexOf(performaceEntryType) > -1 |
| 681 | + : // Check if back, forward or reload buttons are being use in older browsers |
| 682 | + // 1: TYPE_RELOAD, 2: TYPE_BACK_FORWARD |
| 683 | + perf && |
| 684 | + perf[navigationText] && |
| 685 | + [1, 2].indexOf(perf[navigationText].type) > -1; |
691 | 686 |
|
692 | 687 | // Check if referrer is the same as current real hostname (not the defined hostname!) |
693 | 688 | var currentReferrerHostname = doc.referrer.split(slash)[2]; |
|
0 commit comments