From b2db8bb910d78d10cc8584bd8d59284789363ba2 Mon Sep 17 00:00:00 2001 From: Danny Shmueli Date: Sat, 21 Feb 2026 22:35:09 +0200 Subject: [PATCH] Fix tracker: hasOwnProperty guard, hash idiom, deprecated substr - Add hasOwnProperty checks to for..in loops in baseProps() to prevent picking up extended Object.prototype properties from third-party scripts - Replace non-standard `hash & hash` with idiomatic `hash |= 0` for 32-bit integer coercion in experiment bucketing - Replace deprecated substr(2, 9) with slice(2, 11) in ID generation Co-Authored-By: Claude Opus 4.6 --- src/tracker.js | 2 +- src/tracker.src.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tracker.js b/src/tracker.js index 824519c..e3c5104 100644 --- a/src/tracker.js +++ b/src/tracker.js @@ -1,2 +1,2 @@ // AUTO-GENERATED — edit tracker.src.js instead -export const TRACKER_JS = `(function(){"use strict";var i=document.currentScript,g=i&&i.src?new URL(i.src).origin+"/track":"/track",T=i&&i.dataset.project||"default",p=i&&i.dataset.token||null,x=i&&i.getAttribute("data-link-domains")||null,s=null;x&&(s=x.split(",").map(function(e){return e.trim().toLowerCase()}));function M(e){if(!s||e===location.hostname)return!1;for(var t=0;tD)&&(r="sess_"+Math.random().toString(36).substr(2,9)+e.toString(36),sessionStorage.setItem("aa_sid",r)),sessionStorage.setItem("aa_last_activity",String(e)),r}function E(){for(var e=new URLSearchParams(location.search),t={},r=["utm_source","utm_medium","utm_campaign","utm_content","utm_term"],a=0;a=768&&e<1024&&!/Mobi/i.test(d)?"tablet":/Mobi/i.test(d)||e<768?"mobile":"desktop"}c.device=B();var b=[],w=null,J=5e3;function L(e,t){navigator.sendBeacon&&navigator.sendBeacon(e,new Blob([t],{type:"text/plain"}))||fetch(e,{method:"POST",body:t,keepalive:!0,credentials:"omit"}).catch(function(){})}function _(){if(b.length){var e=b.splice(0);e.length===1?L(g,JSON.stringify(e[0])):L(g.replace("/track","/track/batch"),JSON.stringify({events:e}))}}function W(){w||(w=setTimeout(function(){w=null,_()},J))}document.addEventListener("visibilitychange",function(){document.visibilityState==="hidden"&&_()}),window.addEventListener("beforeunload",_);function q(e){var t={url:location.href,path:location.pathname,hostname:location.hostname,referrer:document.referrer,title:document.title,screen:screen.width+"x"+screen.height,language:navigator.language||"",browser:c.browser,browser_version:c.browser_version,os:c.os,device:c.device};for(var r in S)t[r]=S[r];if(e)for(var a in e)t[a]=e[a];return t}var y={},l=null,u={track:function(e,t){b.push({project:T,token:p,event:e,properties:q(t),user_id:f,session_id:R(),timestamp:Date.now()}),W()},identify:function(e){f=e,localStorage.setItem("aa_uid",e)},page:function(e){this.track("page_view",{page:e||document.title})},experiment:function(e,t){if(y[e]!==void 0)return y[e];var r=null;if(l){for(var a=0;aD)&&(r="sess_"+Math.random().toString(36).slice(2,11)+e.toString(36),sessionStorage.setItem("aa_sid",r)),sessionStorage.setItem("aa_last_activity",String(e)),r}function E(){for(var e=new URLSearchParams(location.search),t={},r=["utm_source","utm_medium","utm_campaign","utm_content","utm_term"],n=0;n=768&&e<1024&&!/Mobi/i.test(v)?"tablet":/Mobi/i.test(v)||e<768?"mobile":"desktop"}s.device=B();var w=[],_=null,J=5e3;function L(e,t){navigator.sendBeacon&&navigator.sendBeacon(e,new Blob([t],{type:"text/plain"}))||fetch(e,{method:"POST",body:t,keepalive:!0,credentials:"omit"}).catch(function(){})}function b(){if(w.length){var e=w.splice(0);e.length===1?L(p,JSON.stringify(e[0])):L(p.replace("/track","/track/batch"),JSON.stringify({events:e}))}}function W(){_||(_=setTimeout(function(){_=null,b()},J))}document.addEventListener("visibilitychange",function(){document.visibilityState==="hidden"&&b()}),window.addEventListener("beforeunload",b);function q(e){var t={url:location.href,path:location.pathname,hostname:location.hostname,referrer:document.referrer,title:document.title,screen:screen.width+"x"+screen.height,language:navigator.language||"",browser:s.browser,browser_version:s.browser_version,os:s.os,device:s.device};for(var r in d)d.hasOwnProperty(r)&&(t[r]=d[r]);if(e)for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var y={},c=null,l={track:function(e,t){w.push({project:T,token:S,event:e,properties:q(t),user_id:f,session_id:R(),timestamp:Date.now()}),W()},identify:function(e){f=e,localStorage.setItem("aa_uid",e)},page:function(e){this.track("page_view",{page:e||document.title})},experiment:function(e,t){if(y[e]!==void 0)return y[e];var r=null;if(c){for(var n=0;n SESSION_TIMEOUT)) { - sid = 'sess_' + Math.random().toString(36).substr(2, 9) + now.toString(36); + sid = 'sess_' + Math.random().toString(36).slice(2, 11) + now.toString(36); sessionStorage.setItem('aa_sid', sid); } sessionStorage.setItem('aa_last_activity', String(now)); @@ -177,9 +177,9 @@ device: dev.device }; // Merge UTM - for (var k in utm) p[k] = utm[k]; + for (var k in utm) { if (utm.hasOwnProperty(k)) p[k] = utm[k]; } // Merge extra - if (extra) for (var k2 in extra) p[k2] = extra[k2]; + if (extra) for (var k2 in extra) { if (extra.hasOwnProperty(k2)) p[k2] = extra[k2]; } return p; } @@ -232,7 +232,7 @@ var hash = 0; for (var j = 0; j < str.length; j++) { hash = ((hash << 5) - hash) + str.charCodeAt(j); - hash = hash & hash; + hash |= 0; } var bucket = Math.abs(hash) % 100;