diff --git a/dist/latest/auto-events.js b/dist/latest/auto-events.js index c8ac687..ad6fe1f 100644 --- a/dist/latest/auto-events.js +++ b/dist/latest/auto-events.js @@ -1,4 +1,4 @@ -/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-30; 7048; v12) */ +/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-06-13; 7048; v12) */ function r(t,e){var a,n;t.hasAttribute("data-simple-event")||(a=!1,h.downloads&&/^https?:\/\//i.test(t.href)&&new RegExp("\\.("+(h.downloadsExtensions||[]).join("|")+")$","i").test(t.pathname)?a="download":h.outbound&&/^https?:\/\//i.test(t.href)&&t.hostname!==m.location.hostname?a="outbound":h.emails&&/^mailto:/i.test(t.href)&&(a="email"),a&&(e?(n="saAutomatedLink(this, '"+a+"');",t.hasAttribute("target")&&"_self"!==t.getAttribute("target")||(n+=" return false;"),t.setAttribute("onclick",n)):t.addEventListener("click",function(){g(t,a)})))}function e(){try{for(var t=document.getElementsByTagName("a"),e=0;e -1) { + // keep query from manual path + var parts = pathOverwrite.split("?"); + pathOverwrite = parts.shift(); + querySearch = "?" + parts.join("?"); + } // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -772,10 +779,13 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; + var delSrc = + isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - isPushState || userNavigated || !collectMetricByString("r"), // r = referrers + delSrc, // r = referrers sameSite, + querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, metadata, callback ); diff --git a/src/default.js b/src/default.js index 414bc66..ab63e46 100644 --- a/src/default.js +++ b/src/default.js @@ -232,9 +232,9 @@ overwriteOptions.strictUtm || attr(scriptElement, "strict-utm") == trueText; - var getQueryParams = function (ignoreSource) { + var getQueryParams = function (ignoreSource, overwriteSearch) { return ( - loc.search + (overwriteSearch || loc.search) .slice(1) .split("&") .filter(function (keyValue) { @@ -750,6 +750,7 @@ isPushState, deleteSourceInfo, sameSite, + query, metadata, callback ) { @@ -763,7 +764,7 @@ id: payload.page_id, type: pageviewText, referrer: !deleteSourceInfo || sameSite ? referrer : null, - query: getQueryParams(deleteSourceInfo), + query: query || getQueryParams(deleteSourceInfo), /** if metadata **/ metadata: stringify(metadata), @@ -788,6 +789,13 @@ ) { if (!callbackRaw && isFunction(metadata)) callbackRaw = metadata; var callback = isFunction(callbackRaw) ? callbackRaw : function () {}; + var querySearch; + if (isString(pathOverwrite) && pathOverwrite.indexOf("?") > -1) { + // keep query from manual path + var parts = pathOverwrite.split("?"); + pathOverwrite = parts.shift(); + querySearch = "?" + parts.join("?"); + } // Obfuscate personal data in URL by dropping the search and hash var path = getPath(pathOverwrite); @@ -876,10 +884,13 @@ var triggerSendPageView = function () { fetchedHighEntropyValues = trueVar; + var delSrc = + isPushState || userNavigated || !collectMetricByString("r"); sendPageView( isPushState, - isPushState || userNavigated || !collectMetricByString("r"), // r = referrers + delSrc, // r = referrers sameSite, + querySearch ? getQueryParams(delSrc, querySearch) : undefinedVar, metadata, callback ); diff --git a/test/unit/pageview-query.test.js b/test/unit/pageview-query.test.js new file mode 100644 index 0000000..0f4478d --- /dev/null +++ b/test/unit/pageview-query.test.js @@ -0,0 +1,22 @@ +const { expect } = require("chai"); +const { createDOM } = require("./helpers/dom"); + +describe("pageview query", function () { + it("sends query params from manual path", function (done) { + const dom = createDOM({ + settings: { autoCollect: false, allowParams: "foo" }, + }); + + dom.window.sa_pageview("/manual?foo=bar"); + + setTimeout(() => { + const req = dom.sent.find( + (r) => r.type === "image" && /path=%2Fmanual/.test(r.url) + ); + expect(req, "pageview request").to.exist; + const url = new URL(req.url); + expect(url.searchParams.get("query")).to.equal("foo=bar"); + done(); + }, 10); + }); +});