1/** 2 * Dadalytics â apre la connessione che segnala la pagina vista. 3 * 4 * Era stampato dentro `wp_footer` di ogni pagina: uno `<script>` inline con 5 * dentro il codice di tracciamento e l'indirizzo del server, diverso a ogni 6 * URL e quindi non riutilizzabile da nessuna cache. Ora è un file solo e i 7 * valori arrivano da `wp_localize_script`. 8 * 9 * ## Due cose che rompevano altro 10 * 11 * `dadaCheckIdle()` assegnava `window.onload`, `window.onmousemove`, 12 * `window.onmousedown`, `window.ontouchstart`, `window.ontouchmove`, 13 * `window.onclick` e `window.onkeydown`. Quelle proprietà tengono **un solo** 14 * gestore: qualunque cosa il tema o un altro plugin ci avesse messo prima 15 * veniva buttata via, in silenzio. Qui si usa `addEventListener`, che si 16 * aggiunge invece di sostituire. 17 * 18 * E la connessione, una volta chiusa per inattività , non veniva più riaperta: 19 * chi tornava sulla scheda dopo dieci secondi smetteva di essere contato per 20 * il resto della visita. Ora torna su alla prima attività . 21 */ 22( function () { 23 'use strict'; 24 25 var cfg = window.dadasuiteDadalytics; 26 27 if ( ! cfg || ! cfg.server || ! cfg.trackCode ) { 28 return; 29 } 30 31 var IDLE_MS = 10000; 32 var socket = null; 33 var idleTimer = null; 34 35 /** 36 * Codifica il minimo indispensabile: solo i caratteri che dentro il valore 37 * di un parametro cambiano il significato dell'indirizzo. 38 * 39 * Non si usa `encodeURIComponent` di proposito. Quella funzione codifica 40 * anche le barre, e trasformerebbe `/articolo/` in `%2Farticolo%2F`: un 41 * server che non decodifica come ci aspettiamo comincerebbe a registrare 42 * percorsi di forma diversa da tutti quelli raccolti finora. Qui invece un 43 * percorso normale esce identico a come lo mandava la 1.x, e cambia solo 44 * quando contiene qualcosa che prima rompeva davvero i parametri. 45 * 46 * L'ordine conta: il segno di percentuale va per primo, altrimenti 47 * andrebbe a codificare gli `%` introdotti dalle sostituzioni dopo. 48 */ 49 function param( value ) { 50 return String( value ) 51 .replace( /%/g, '%25' ) 52 .replace( /&/g, '%26' ) 53 .replace( /#/g, '%23' ) 54 .replace( / /g, '%20' ); 55 } 56 57 function address() { 58 var params = [ 59 'tc=' + param( cfg.trackCode ), 60 'r=' + param( document.referrer || '' ), 61 'c=' + param( cfg.path || location.pathname ), 62 // Arriva già codificato da PHP, come nella 1.x: non si tocca. 63 't=' + ( cfg.titleEncoded || '' ) 64 ]; 65 66 return cfg.server + '/?' + params.join( '&' ); 67 } 68 69 function open() { 70 if ( socket && ( socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING ) ) { 71 return; 72 } 73 74 try { 75 socket = new WebSocket( address() ); 76 } catch ( e ) { 77 // Indirizzo non valido: si smette, senza far cadere il resto della 78 // pagina come faceva l'eccezione non catturata di prima. 79 socket = null; 80 81 return; 82 } 83 84 socket.addEventListener( 'close', function () { 85 socket = null; 86 } ); 87 88 socket.addEventListener( 'error', function () { 89 socket = null; 90 } ); 91 } 92 93 function close() { 94 if ( socket && socket.readyState === WebSocket.OPEN ) { 95 socket.close(); 96 } 97 } 98 99 function onActivity() { 100 open(); 101 102 window.clearTimeout( idleTimer ); 103 idleTimer = window.setTimeout( close, IDLE_MS ); 104 } 105 106 [ 'load', 'mousemove', 'mousedown', 'touchstart', 'touchmove', 'click', 'keydown', 'scroll' ] 107 .forEach( function ( event ) { 108 window.addEventListener( event, onActivity, { passive: true } ); 109 } ); 110 111 // La scheda in secondo piano non è una visita: si chiude subito invece di 112 // aspettare i dieci secondi di inattività . 113 document.addEventListener( 'visibilitychange', function () { 114 if ( document.hidden ) { 115 window.clearTimeout( idleTimer ); 116 close(); 117 } else { 118 onActivity(); 119 } 120 } ); 121 122 onActivity(); 123}() );
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.