1// Automatically sets referrer cookie setting basing on url hash, url query parameter or HTTP referrer header 2 3(function () { 4 function getSeoReferrer() { 5 if (!document.referrer) { 6 return null; 7 } 8 9 var patterns = [ 10 { 'name': 'Google', 'url': 'google' }, 11 { 'name': 'Bing', 'url': 'bing' }, 12 { 'name': 'Yahoo', 'url': 'yahoo' }, 13 { 'name': 'Yandex', 'url': 'yandex' }, 14 { 'name': 'Baidu', 'url': 'baidu' }, 15 { 'name': 'DuckDuckGo', 'url': 'duckduckgo' } 16 ]; 17 18 var maxReferrerLength = 550; 19 20 for (var i = 0; i < patterns.length; i++) { 21 var search = patterns[i]; 22 23 if (document.referrer.search(search.url) !== -1) { 24 var host = search.name; 25 26 var res = document.referrer.match(/^(http[s]?\:?\/?\/?)?(www.)?([^:\/\s]+)/); 27 if (res) { 28 host = res[3]; 29 } 30 31 var seoReferrer = 'SEO-' + search.name + '-' + host.replace('-', '%2D'); 32 if (seoReferrer.length > maxReferrerLength) { 33 seoReferrer = seoReferrer.substring(0, maxReferrerLength - 3) + '...'; 34 } 35 36 return seoReferrer; 37 } 38 } 39 40 return null; 41 } 42 43 // Attempt to avoid setting a referrer for Chrome prefetching pages 44 if (typeof document.visibilityState != 'undefined' && document.visibilityState === 'prerender') { 45 return; 46 } 47 48 // Get the existing referrer cookie value, if any. 49 var cookiedReferrer = getCookie("referrer"); 50 51 if (!cookiedReferrer) { 52 var defaultReferrer = window.defaultReferrer || getSeoReferrer(); 53 54 if (defaultReferrer !== "NONE") { 55 var paramsString = window.location.search, regex = /[?&]([^=#]+)=([^&#]*)/g, params = {}, m; 56 while (m = regex.exec(paramsString)) { 57 params[m[1]] = m[2]; 58 } 59 60 var referrer = params['referrer'] || params['ref'] || params['r']; 61 62 if (!referrer) { 63 // Get the text after the hash in the URL, if any. 64 var fragment = window.location.hash && window.location.hash.substring(1); 65 // We used to use "hashbang" URLs to allow direct linking to pages, Don't set these old links as referrers 66 // e.g. /gold_market.do#!/orderboard 67 if (fragment && fragment.substring(0, 2) !== "!/") { 68 referrer = fragment; 69 } 70 } 71 72 referrer = referrer || defaultReferrer; 73 referrer = referrer && referrer.toUpperCase(); 74 75 // Post to the referrer controller to set the cookie 76 // If there is a token and HMAC they will take precedence - the referrer is contained in the token. 77 // Otherwise if there is #REFERRER that will be set (if whitelisted) 78 79 var setCookieUrl = "/set_referrer.do?" + $.param({ 80 token: params["token"], 81 hmac: params["hmac"], 82 referrer: referrer 83 }); 84 $.ajax({ 85 type: 'POST', 86 url: setCookieUrl, 87 error: function(jqXHR) { 88 if (jqXHR.status === 403 && location.pathname.indexOf("/help/blocked_referral.html") !== 0) { 89 // Blocked referral 90 location.href = "/help/blocked_referral.html"; 91 } 92 } 93 }) 94 } 95 } 96 97}());
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.