Skip to content

Commit 2d165c9

Browse files
committed
Reuse query param filter for manual pageviews
1 parent 76b0426 commit 2d165c9

File tree

4 files changed

+55
-12
lines changed

4 files changed

+55
-12
lines changed

dist/latest/auto-events.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/latest/latest.dev.js

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-30; 8325; v12) */
1+
/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; a5d8; v12) */
22
/* eslint-env browser */
33

44
(function (
@@ -216,9 +216,9 @@
216216
overwriteOptions.strictUtm ||
217217
attr(scriptElement, "strict-utm") == trueText;
218218

219-
var getQueryParams = function (ignoreSource) {
219+
var getQueryParams = function (ignoreSource, overwriteSearch) {
220220
return (
221-
loc.search
221+
(overwriteSearch || loc.search)
222222
.slice(1)
223223
.split("&")
224224
.filter(function (keyValue) {
@@ -560,8 +560,7 @@
560560
sendData(append, undefinedVar, trueVar);
561561
} else {
562562
try {
563-
nav.sendBeacon
564-
.bind(nav)(fullApiUrl + "/append", stringify(append));
563+
nav.sendBeacon.bind(nav)(fullApiUrl + "/append", stringify(append));
565564
} catch (e) {
566565
// Fallback for browsers throwing "Illegal invocation" when the URL is invalid
567566
sendData(append, undefinedVar, trueVar);
@@ -662,6 +661,7 @@
662661
isPushState,
663662
deleteSourceInfo,
664663
sameSite,
664+
query,
665665
metadata,
666666
callback
667667
) {
@@ -675,7 +675,7 @@
675675
id: payload.page_id,
676676
type: pageviewText,
677677
referrer: !deleteSourceInfo || sameSite ? referrer : null,
678-
query: getQueryParams(deleteSourceInfo),
678+
query: query || getQueryParams(deleteSourceInfo),
679679

680680
metadata: stringify(metadata),
681681
},
@@ -698,6 +698,13 @@
698698
) {
699699
if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;
700700
var callback = isFunction(callbackRaw) ? callbackRaw : function () {};
701+
var querySearch;
702+
if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) {
703+
// keep query from manual path
704+
var parts = pathOverwrite.split("?");
705+
pathOverwrite = parts.shift();
706+
querySearch = "?" + parts.join("?");
707+
}
701708
// Obfuscate personal data in URL by dropping the search and hash
702709
var path = getPath(pathOverwrite);
703710

@@ -772,10 +779,13 @@
772779

773780
var triggerSendPageView = function () {
774781
fetchedHighEntropyValues = trueVar;
782+
var delSrc =
783+
isPushState || userNavigated || !collectMetricByString("r");
775784
sendPageView(
776785
isPushState,
777-
isPushState || userNavigated || !collectMetricByString("r"), // r = referrers
786+
delSrc, // r = referrers
778787
sameSite,
788+
querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,
779789
metadata,
780790
callback
781791
);

src/default.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,9 @@
232232
overwriteOptions.strictUtm ||
233233
attr(scriptElement, "strict-utm") == trueText;
234234

235-
var getQueryParams = function (ignoreSource) {
235+
var getQueryParams = function (ignoreSource, overwriteSearch) {
236236
return (
237-
loc.search
237+
(overwriteSearch || loc.search)
238238
.slice(1)
239239
.split("&")
240240
.filter(function (keyValue) {
@@ -750,6 +750,7 @@
750750
isPushState,
751751
deleteSourceInfo,
752752
sameSite,
753+
query,
753754
metadata,
754755
callback
755756
) {
@@ -763,7 +764,7 @@
763764
id: payload.page_id,
764765
type: pageviewText,
765766
referrer: !deleteSourceInfo || sameSite ? referrer : null,
766-
query: getQueryParams(deleteSourceInfo),
767+
query: query || getQueryParams(deleteSourceInfo),
767768

768769
/** if metadata **/
769770
metadata: stringify(metadata),
@@ -788,6 +789,13 @@
788789
) {
789790
if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata;
790791
var callback = isFunction(callbackRaw) ? callbackRaw : function () {};
792+
var querySearch;
793+
if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) {
794+
// keep query from manual path
795+
var parts = pathOverwrite.split("?");
796+
pathOverwrite = parts.shift();
797+
querySearch = "?" + parts.join("?");
798+
}
791799
// Obfuscate personal data in URL by dropping the search and hash
792800
var path = getPath(pathOverwrite);
793801

@@ -876,10 +884,13 @@
876884

877885
var triggerSendPageView = function () {
878886
fetchedHighEntropyValues = trueVar;
887+
var delSrc =
888+
isPushState || userNavigated || !collectMetricByString("r");
879889
sendPageView(
880890
isPushState,
881-
isPushState || userNavigated || !collectMetricByString("r"), // r = referrers
891+
delSrc, // r = referrers
882892
sameSite,
893+
querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar,
883894
metadata,
884895
callback
885896
);

test/unit/pageview-query.test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const { expect } = require("chai");
2+
const { createDOM } = require("./helpers/dom");
3+
4+
describe("pageview query", function () {
5+
it("sends query params from manual path", function (done) {
6+
const dom = createDOM({
7+
settings: { autoCollect: false, allowParams: "foo" },
8+
});
9+
10+
dom.window.sa_pageview("/manual?foo=bar");
11+
12+
setTimeout(() => {
13+
const req = dom.sent.find(
14+
(r) => r.type === "image" && /path=%2Fmanual/.test(r.url)
15+
);
16+
expect(req, "pageview request").to.exist;
17+
const url = new URL(req.url);
18+
expect(url.searchParams.get("query")).to.equal("foo=bar");
19+
done();
20+
}, 10);
21+
});
22+
});

0 commit comments

Comments
 (0)