Skip to content

Instantly share code, notes, and snippets.

@smhmic
Last active October 21, 2020 22:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save smhmic/f849403eaddac3c1cd5cfb6bc4123d5e to your computer and use it in GitHub Desktop.
Save smhmic/f849403eaddac3c1cd5cfb6bc4123d5e to your computer and use it in GitHub Desktop.
Test GA CID persistence in iframe

Test

  1. (optional) Edit code to have custom domain
  2. Paste code into console on any page
  3. Select iframe in console, and paste same code.
  4. Click reload in iframe, and repeat step 3.

Fix

(function(){
var ENABLE_FIX = false,
prefix = 'SEER_SameSite_Test_',
kTrackingIndex = prefix+'TrackerIndex',
//trackerIndex = window[prefix+'TrackerIndex'] = window[prefix+'TrackerIndex'] || 1,
isInIframe = window !== window.top;
window[kTrackingIndex] = window[kTrackingIndex] || 0;
var setGaCookie = function( name, domain, clientId ){
var val = 'GA1.'+(domain.split(".").length)+'.'+clientId;
var expires = new Date();
expires.setFullYear(expires.getFullYear()+2);
document.cookie = name+'='+val+'; expires='+expires.toUTCString()+'; domain=.'+domain+'; path=/; SameSite=None; Secure';
}
var customTask = function(model){
try{
var ga = window[window['GoogleAnalyticsObject']],
tracker = ga.getByName(model.get('name')),
//origSendHitTask = model.get('sendHitTask'),
linkerParam = tracker.get('linkerParam'),
CID = model.get('clientId'),
cookieName, cookieDomain;
appendText( CID ? 'CID: '+CID : 'No client id!' );
if( CID ){}
if( isInIframe ){
if( window.name == CID ){
appendText( 'CID persisted in iframe' );
document.body.style.backgroundColor = 'green';
cookieName = model.get('cookieName') || '_ga';
cookieDomain = model.get('cookieDomain');
if( cookieDomain=='auto' )
cookieDomain = (function(){
var i,h,
tmp_cookie=cookieName+'_tld_check_tmp=cookie',
hostname = document.location.hostname.split('.');
for(i=hostname.length-1; i>=0; i--) {
h = hostname.slice(i).join('.');
document.cookie = tmp_cookie + ';domain=.' + h + ';';
if(document.cookie.indexOf(tmp_cookie)>-1){
// We were able to store a cookie! This must be it
document.cookie = tmp_cookie.split('=')[0] + '=;domain=.' + h + ';expires=Thu, 01 Jan 1970 00:00:01 GMT;';
return h;
}
}
})();
ENABLE_FIX && setGaCookie( cookieName, cookieDomain, CID );
}else{
appendText( 'CID NOT persisted' );
document.body.style.backgroundColor = 'red';
}
appendText( '<a href="/reload-test/?noredirect">Reload</a>' );
}else{
addIframe( 'https://searchchurch.com/?noredirect&'+linkerParam, CID );
}
}catch(ex){console.error('customTask',ex)}
};
var getCookie = function(name) {
var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
}
var appendText = function( text, style ){
window.console && console.debug && console.debug('['+prefix+window[kTrackingIndex]+']',text);
var el = document.body;
var newEl = document.createElement('p');
newEl.style="color:inherit;margin:5px;padding:0;"+ style;//( style?, style:'');
//newEl.appendChild(document.createTextNode( text ));
newEl.innerHTML = text;
el.appendChild(newEl);
}
var showCid = function( prefix ){
appendText( (prefix?prefix+': ':'')+'_ga: '+getCookie('_ga') );
}
var addIframe = function( url, CID ){
appendText( 'Iframe URL: <a href="'+url+'" target="_blank_'+url+'" style="color:inherit">'+url+'</a>', 'color:red;' );
var iframe = document.createElement('iframe');
iframe.id = url;
iframe.src = url;
iframe.name = CID;
document.body.appendChild(iframe);
//appendText( 'Iframe created.' );
}
var HEREDOC = function( fn ){
return fn.toString().match( /\/\*[\n\l]?([\s\S]*?)\*\//m )[1];
};
var injectCss = function( css, removeLineComments ){
var el = document.createElement('style');
el.innerHTML = css.replace(/[\s\n]\/\/\s?(.*)$/mg, removeLineComments ? '' : '/* $1 */' );
document.head.appendChild( el );
}
var gaAllTrackers = function(){
var ga = window[window['GoogleAnalyticsObject']];
var args = [].slice.apply(arguments);
var cmd = args[0];
for( var i=0; i<window[kTrackingIndex]; i++ ){
args[0] = prefix+i+'.'+cmd;
ga.apply( ga, args );
}
}
window[prefix] || (function(){
window[prefix] = 1;
document.body.innerHTML = '';
injectCss( HEREDOC( function(){/*
html {
margin: 0 !important;
}
html body {
margin: 0 !important;
padding: 0 !important;
font-size:14px !important;
line-height:1 !important;
color: black !important;
background: white;
font-family: monospace;
}
iframe{
position:static;height:150px;margin:0 5px 5px; width: 80%;
border:1px solid red;
}
*/}));
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
appendText('Current URL: '+window.location.href);
//showCid('Init');
//ga(function(){ showCid('ga()'); });
})();
(function(){
window["_gaUserPrefs"] = { ioo : function(){} }; // Disable GA opt-out
ga('create', 'UA-11111-1', {
name: prefix+(window[kTrackingIndex]++),
allowLinker:true,
//sendHitTask: customTask,
});
gaAllTrackers('set','customTask',customTask);
gaAllTrackers('send','pageview');
})();
})();
var gaCustomTask = function(model){
// Set SameSite-compliant GA cookie inside secure iframes.
// Based on analytics.js cookie format as of January 2020.
// Details: https://seer.is/2Op2N66
if( window !== window.top && location.protocol == 'https:' ){
(function(domain){
if( 'auto' == ( domain = model.get('cookieDomain') ) )
domain = (function getTLD(){
var cookieName = '_seer_gtm_fw_detect_tld', globalNamespacePageloadCache = cookieName;
return window[globalNamespacePageloadCache] || ( window[globalNamespacePageloadCache] = (function(){
var i, domain, parts = location.hostname.split('.'), cKeyValPair, c;
for( i=parts.length-1; i>=0; i-- ){
domain = parts.slice(i).join('.');
cKeyValPair = cookieName+'_'+domain+'=1';
document.cookie = c = cKeyValPair+';domain=.'+domain+';path=/; SameSite=None; Secure';
if( document.cookie.indexOf(cKeyValPair)>-1 ){
document.cookie = c+'; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
return domain;
}
}
return location.hostname;
})());
})();
document.cookie = model.get('cookieName')
+'=GA1.'+(domain.split(".").length)+'.'+model.get('clientId')
+'; expires='+(new Date( +new Date() + model.get('cookieExpires')*1e3 )).toUTCString()
+'; domain=.'+domain+'; path=/; SameSite=None; Secure';
})();
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment