diff options
author | Peter Zhang <peter@innocraft.com> | 2022-05-03 02:07:42 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-05-03 02:07:42 +0300 |
commit | b9043debf14b422f4b2045a55f2f37b65fa9bb31 (patch) | |
tree | ca2c5c76f1ffc60a3de6b733f93902c4bc827de3 /js | |
parent | a0a47dc27b0b67e8f69498fb1bb5592da5d52bf9 (diff) |
[JS]update beforeunload to visibilitychange (#19041)
* Update piwik.js
update beforeunload to visibilitychange
* Update piwik.js
update condition
* rebuilt piwik.js
* Update piwik.js
take timer outside of check
* rebuilt piwik.js
* Update piwik.js
update functions
* rebuilt piwik.js
* update visibility State
update visibility State
* rebuilt piwik.js
* add extra event
add extra event
* rebuilt piwik.js
* update tests, reset timer
update tests, reset timer
* Update js/piwik.js
Co-authored-by: Justin Velluppillai <justin@innocraft.com>
* update tests
update tests
* add visibilitychange to test
update tests
* update test to 530
update test to 530
* Update tests/javascript/index.php
Co-authored-by: Justin Velluppillai <justin@innocraft.com>
* disable unload if tab is switched
disable unload if tab is switched
* update events
update events
* update jsLint error
update jsLint error
Co-authored-by: peterhashair <peterhashair@users.noreply.github.com>
Co-authored-by: Justin Velluppillai <justin@innocraft.com>
Diffstat (limited to 'js')
-rw-r--r-- | js/piwik.js | 15 | ||||
-rw-r--r-- | js/piwik.min.js | 4 |
2 files changed, 14 insertions, 5 deletions
diff --git a/js/piwik.js b/js/piwik.js index 7b1ba0e56b..b10f2862ad 100644 --- a/js/piwik.js +++ b/js/piwik.js @@ -497,13 +497,12 @@ if (typeof window.Matomo !== 'object') { * Chrome V8 extension that terminates JS that exhibits * "slow unload", i.e., calling getTime() > 1000 times */ - function beforeUnloadHandler() { + function beforeUnloadHandler(event) { var now; isPageUnloading = true; executePluginMethod('unload'); - - now = new Date(); + now = new Date(); var aliasTime = now.getTimeAlias(); if ((expireDateTime - aliasTime) > 3000) { expireDateTime = aliasTime + 3000; @@ -7167,6 +7166,16 @@ if (typeof window.Matomo !== 'object') { // initialize the Matomo singleton addEventListener(windowAlias, 'beforeunload', beforeUnloadHandler, false); + addEventListener(windowAlias, 'visibilitychange', function () { + // if unloaded, return + if (isPageUnloading) { + return; + } + // if not visible + if (documentAlias.visibilityState === 'hidden') { + executePluginMethod('unload'); + } + }, false); addEventListener(windowAlias, 'online', function () { if (isDefined(navigatorAlias.serviceWorker)) { navigatorAlias.serviceWorker.ready.then(function(swRegistration) { diff --git a/js/piwik.min.js b/js/piwik.min.js index ec048226eb..82f5b1ed62 100644 --- a/js/piwik.min.js +++ b/js/piwik.min.js @@ -11,7 +11,7 @@ ;if(typeof _paq!=="object"){_paq=[]}if(typeof window.Matomo!=="object"){window.Matomo=window.Piwik=(function(){var r,b={},z={},J=document,g=navigator,ab=screen,W=window,h=W.performance||W.mozPerformance||W.msPerformance||W.webkitPerformance,t=W.encodeURIComponent,V=W.decodeURIComponent,k=unescape,L=[],H,u,al=[],y=0,af=0,X=0,m=false;function p(at){try{return V(at)}catch(au){return unescape(at)}}function M(au){var at=typeof au;return at!=="undefined"}function C(at){return typeof at==="function"}function Z(at){return typeof at==="object"}function x(at){return typeof at==="string"||at instanceof String}function ak(at){return typeof at==="number"||at instanceof Number }function ac(at){return M(at)&&(ak(at)||(x(at)&&at.length))}function D(au){if(!au){return true}var at;var av=true;for(at in au){if(Object.prototype.hasOwnProperty.call(au,at)){av=false}}return av}function ao(at){var au=typeof console;if(au!=="undefined"&&console&&console.error){console.error(at)}}function aj(){var ay,ax,aA,au,at;for(ay=0;ay<arguments.length;ay+=1){at=null;if(arguments[ay]&&arguments[ay].slice){at=arguments[ay].slice()}au=arguments[ay];aA=au.shift();var az,av;var aw=x(aA)&&aA.indexOf("::")>0;if(aw){az=aA.split("::");av=az[0];aA=az[1];if("object"===typeof u[av]&&"function"===typeof u[av][aA]){u[av][aA].apply(u[av],au)}else{if(at){al.push(at)}}}else{for(ax=0;ax<L.length;ax++){if(x(aA)){av=L[ax];var aB=aA.indexOf(".")>0;if(aB){az=aA.split(".");if(av&&"object"===typeof av[az[0]]){av=av[az[0]];aA=az[1]}else{if(at){al.push(at);break}}}if(av[aA]){av[aA].apply(av,au)}else{var aC="The method '"+aA+'\' was not found in "_paq" variable. Please have a look at the Matomo tracker documentation: https://developer.matomo.org/api-reference/tracking-javascript'; ao(aC);if(!aB){throw new TypeError(aC)}}if(aA==="addTracker"){break}if(aA==="setTrackerUrl"||aA==="setSiteId"){break}}else{aA.apply(L[ax],au)}}}}}function ar(aw,av,au,at){if(aw.addEventListener){aw.addEventListener(av,au,at);return true}if(aw.attachEvent){return aw.attachEvent("on"+av,au)}aw["on"+av]=au}function n(at){if(J.readyState==="complete"){at()}else{if(W.addEventListener){W.addEventListener("load",at,false)}else{if(W.attachEvent){W.attachEvent("onload",at)}}}}function q(aw){var at=false;if(J.attachEvent){at=J.readyState==="complete"}else{at=J.readyState!=="loading"}if(at){aw();return}var av;if(J.addEventListener){ar(J,"DOMContentLoaded",function au(){J.removeEventListener("DOMContentLoaded",au,false);if(!at){at=true;aw()}})}else{if(J.attachEvent){J.attachEvent("onreadystatechange",function au(){if(J.readyState==="complete"){J.detachEvent("onreadystatechange",au);if(!at){at=true;aw()}}});if(J.documentElement.doScroll&&W===W.top){(function au(){if(!at){try{J.documentElement.doScroll("left") -}catch(ax){setTimeout(au,0);return}at=true;aw()}}())}}}ar(W,"load",function(){if(!at){at=true;aw()}},false)}function ag(au,az,aA){if(!au){return""}var at="",aw,av,ax,ay;for(aw in b){if(Object.prototype.hasOwnProperty.call(b,aw)){ay=b[aw]&&"function"===typeof b[aw][au];if(ay){av=b[aw][au];ax=av(az||{},aA);if(ax){at+=ax}}}}return at}function am(){var at;m=true;ag("unload");at=new Date();var au=at.getTimeAlias();if((r-au)>3000){r=au+3000}if(r){do{at=new Date()}while(at.getTimeAlias()<r)}}function o(av,au){var at=J.createElement("script");at.type="text/javascript";at.src=av;if(at.readyState){at.onreadystatechange=function(){var aw=this.readyState;if(aw==="loaded"||aw==="complete"){at.onreadystatechange=null;au()}}}else{at.onload=au}J.getElementsByTagName("head")[0].appendChild(at)}function N(){var at="";try{at=W.top.document.referrer}catch(av){if(W.parent){try{at=W.parent.document.referrer}catch(au){at=""}}}if(at===""){at=J.referrer}return at}function s(at){var av=new RegExp("^([a-z]+):"),au=av.exec(at); +}catch(ax){setTimeout(au,0);return}at=true;aw()}}())}}}ar(W,"load",function(){if(!at){at=true;aw()}},false)}function ag(au,az,aA){if(!au){return""}var at="",aw,av,ax,ay;for(aw in b){if(Object.prototype.hasOwnProperty.call(b,aw)){ay=b[aw]&&"function"===typeof b[aw][au];if(ay){av=b[aw][au];ax=av(az||{},aA);if(ax){at+=ax}}}}return at}function am(au){var at;m=true;ag("unload");at=new Date();var av=at.getTimeAlias();if((r-av)>3000){r=av+3000}if(r){do{at=new Date()}while(at.getTimeAlias()<r)}}function o(av,au){var at=J.createElement("script");at.type="text/javascript";at.src=av;if(at.readyState){at.onreadystatechange=function(){var aw=this.readyState;if(aw==="loaded"||aw==="complete"){at.onreadystatechange=null;au()}}}else{at.onload=au}J.getElementsByTagName("head")[0].appendChild(at)}function N(){var at="";try{at=W.top.document.referrer}catch(av){if(W.parent){try{at=W.parent.document.referrer}catch(au){at=""}}}if(at===""){at=J.referrer}return at}function s(at){var av=new RegExp("^([a-z]+):"),au=av.exec(at); return au?au[1]:null}function d(at){var av=new RegExp("^(?:(?:https?|ftp):)/*(?:[^@]+@)?([^:/#]+)"),au=av.exec(at);return au?au[1]:at}function G(at){return(/^[0-9][0-9]*(\.[0-9]+)?$/).test(at)}function Q(av,aw){var at={},au;for(au in av){if(av.hasOwnProperty(au)&&aw(av[au])){at[au]=av[au]}}return at}function B(av){var at={},au;for(au in av){if(av.hasOwnProperty(au)){if(G(av[au])){at[au]=Math.round(av[au])}else{throw new Error('Parameter "'+au+'" provided value "'+av[au]+'" is not valid. Please provide a numeric value.')}}}return at}function l(au){var av="",at;for(at in au){if(au.hasOwnProperty(at)){av+="&"+t(at)+"="+t(au[at])}}return av}function an(au,at){au=String(au);return au.lastIndexOf(at,0)===0}function U(au,at){au=String(au);return au.indexOf(at,au.length-at.length)!==-1}function A(au,at){au=String(au);return au.indexOf(at)!==-1}function f(au,at){au=String(au);return au.substr(0,au.length-at)}function I(aw,av,ay){aw=String(aw);if(!ay){ay=""}var at=aw.indexOf("#");var az=aw.length; if(at===-1){at=az}var ax=aw.substr(0,at);var au=aw.substr(at,az-at);if(ax.indexOf("?")===-1){ax+="?"}else{if(!U(ax,"?")){ax+="&"}}return ax+t(av)+"="+t(ay)+au}function j(au,av){au=String(au);if(au.indexOf("?"+av+"=")===-1&&au.indexOf("&"+av+"=")===-1){return au}var aw=au.indexOf("?");if(aw===-1){return au}var at=au.substr(aw+1);var aA=au.substr(0,aw);if(at){var aB="";var aD=at.indexOf("#");if(aD!==-1){aB=at.substr(aD+1);at=at.substr(0,aD)}var ax;var az=at.split("&");var ay=az.length-1;for(ay;ay>=0;ay--){ax=az[ay].split("=")[0];if(ax===av){az.splice(ay,1)}}var aC=az.join("&");if(aC){aA=aA+"?"+aC}if(aB){aA+="#"+aB}}return aA}function e(av,au){var at="[\\?&#]"+au+"=([^&#]*)";var ax=new RegExp(at);var aw=ax.exec(av);return aw?p(aw[1]):""}function a(at){if(at&&String(at)===at){return at.replace(/^\s+|\s+$/g,"")}return at}function F(at){return unescape(t(at))}function aq(aI){var av=function(aO,aN){return(aO<<aN)|(aO>>>(32-aN))},aJ=function(aQ){var aO="",aP,aN;for(aP=7;aP>=0;aP--){aN=(aQ>>>(aP*4))&15; aO+=aN.toString(16)}return aO},ay,aL,aK,au=[],aC=1732584193,aA=4023233417,az=2562383102,ax=271733878,aw=3285377520,aH,aG,aF,aE,aD,aM,at,aB=[];aI=F(aI);at=aI.length;for(aL=0;aL<at-3;aL+=4){aK=aI.charCodeAt(aL)<<24|aI.charCodeAt(aL+1)<<16|aI.charCodeAt(aL+2)<<8|aI.charCodeAt(aL+3);aB.push(aK)}switch(at&3){case 0:aL=2147483648;break;case 1:aL=aI.charCodeAt(at-1)<<24|8388608;break;case 2:aL=aI.charCodeAt(at-2)<<24|aI.charCodeAt(at-1)<<16|32768;break;case 3:aL=aI.charCodeAt(at-3)<<24|aI.charCodeAt(at-2)<<16|aI.charCodeAt(at-1)<<8|128;break}aB.push(aL);while((aB.length&15)!==14){aB.push(0)}aB.push(at>>>29);aB.push((at<<3)&4294967295);for(ay=0;ay<aB.length;ay+=16){for(aL=0;aL<16;aL++){au[aL]=aB[ay+aL]}for(aL=16;aL<=79;aL++){au[aL]=av(au[aL-3]^au[aL-8]^au[aL-14]^au[aL-16],1)}aH=aC;aG=aA;aF=az;aE=ax;aD=aw;for(aL=0;aL<=19;aL++){aM=(av(aH,5)+((aG&aF)|(~aG&aE))+aD+au[aL]+1518500249)&4294967295;aD=aE;aE=aF;aF=av(aG,30);aG=aH;aH=aM}for(aL=20;aL<=39;aL++){aM=(av(aH,5)+(aG^aF^aE)+aD+au[aL]+1859775393)&4294967295; @@ -64,7 +64,7 @@ bK.push(dw)})};this.trackContentImpressionsWithinNode=function(dt){if(R(cc)||!dt if(ac(dv)){dv=String(dv)}if(!M(dv)||dv===null||dv===false||!dv.length){dv=""}else{if(dv instanceof Array){dv=W.JSON.stringify(dv)}}var dw="_pkc";cA[dw]=dv;if(M(du)&&du!==null&&du!==false&&String(du).length){dw="_pkp";cA[dw]=du}if(!ac(dx)&&!ac(dt)){return}if(ac(dx)){dw="_pks";cA[dw]=dx}if(!ac(dt)){dt=""}dw="_pkn";cA[dw]=dt};this.getEcommerceItems=function(){return JSON.parse(JSON.stringify(da))};this.addEcommerceItem=function(dx,dt,dv,du,dw){if(ac(dx)){da[dx]=[String(dx),dt,dv,du,dw]}};this.removeEcommerceItem=function(dt){if(ac(dt)){dt=String(dt);delete da[dt]}};this.clearEcommerceCart=function(){da={}};this.trackEcommerceOrder=function(dt,dx,dw,dv,du,dy){b4(dt,dx,dw,dv,du,dy)};this.trackEcommerceCartUpdate=function(dt){bz(dt)};this.trackRequest=function(du,dw,dv,dt){cm(function(){var dx=cy(du,dw,dt);bM(dx,bQ,dv)})};this.ping=function(){this.trackRequest("ping=1",null,null,"ping")};this.disableQueueRequest=function(){bK.enabled=false};this.setRequestQueueInterval=function(dt){if(dt<1000){throw new Error("Request queue interval needs to be at least 1000ms") }bK.interval=dt};this.queueRequest=function(dt){cm(function(){var du=cy(dt);bK.push(du)})};this.isConsentRequired=function(){return cI};this.getRememberedConsent=function(){var dt=aH(bj);if(aH(cU)){if(dt){b5(bj,bw,c7)}return null}if(!dt||dt===0){return null}return dt};this.hasRememberedConsent=function(){return !!this.getRememberedConsent()};this.requireConsent=function(){cI=true;bJ=this.hasRememberedConsent();if(!bJ){bs=true}y++;b["CoreConsent"+y]={unload:function(){if(!bJ){aJ()}}}};this.setConsentGiven=function(du){bJ=true;c6=true;b5(cU,bw,c7);var dv,dt;for(dv=0;dv<cT.length;dv++){dt=typeof cT[dv];if(dt==="string"){bM(cT[dv],bQ)}else{if(dt==="object"){dp(cT[dv],bQ)}}}cT=[];if(!M(du)||du){this.setCookieConsentGiven()}};this.rememberConsentGiven=function(dv){if(dv){dv=dv*60*60*1000}else{dv=30*365*24*60*60*1000}var dt=true;this.setConsentGiven(dt);var du=new Date().getTime();dn(bj,du,dv,bw,c7,bY,aN)};this.forgetConsentGiven=function(){var dt=30*365*24*60*60*1000;b5(bj,bw,c7);dn(cU,new Date().getTime(),dt,bw,c7,bY,aN); this.forgetCookieConsentGiven();this.requireConsent()};this.isUserOptedOut=function(){return !bJ};this.optUserOut=this.forgetConsentGiven;this.forgetUserOptOut=function(){this.setConsentGiven(false)};n(function(){setTimeout(function(){bL=true},0)});u.trigger("TrackerSetup",[this]);u.addPlugin("TrackerVisitorIdCookie"+aB,{unload:function(){if(!aA){aR()}}})}function K(){return{push:aj}}function c(ay,ax){var az={};var av,aw;for(av=0;av<ax.length;av++){var at=ax[av];az[at]=1;for(aw=0;aw<ay.length;aw++){if(ay[aw]&&ay[aw][0]){var au=ay[aw][0];if(at===au){aj(ay[aw]);delete ay[aw];if(az[au]>1&&au!=="addTracker"&&au!=="enableLinkTracking"){ao("The method "+au+' is registered more than once in "_paq" variable. Only the last call has an effect. Please have a look at the multiple Matomo trackers documentation: https://developer.matomo.org/guides/tracking-javascript-guide#multiple-piwik-trackers')}az[au]++}}}}return ay}var E=["addTracker","forgetCookieConsentGiven","requireCookieConsent","disableBrowserFeatureDetection","disableCookies","setTrackerUrl","setAPIUrl","enableCrossDomainLinking","setCrossDomainLinkingTimeout","setSessionCookieTimeout","setVisitorCookieTimeout","setCookieNamePrefix","setCookieSameSite","setSecureCookie","setCookiePath","setCookieDomain","setDomains","setUserId","setVisitorId","setSiteId","alwaysUseSendBeacon","disableAlwaysUseSendBeacon","enableLinkTracking","setCookieConsentGiven","requireConsent","setConsentGiven","disablePerformanceTracking","setPagePerformanceTiming","setExcludedQueryParams"]; -function ah(av,au){var at=new T(av,au);L.push(at);_paq=c(_paq,E);for(H=0;H<_paq.length;H++){if(_paq[H]){aj(_paq[H])}}_paq=new K();u.trigger("TrackerAdded",[at]);return at}ar(W,"beforeunload",am,false);ar(W,"online",function(){if(M(g.serviceWorker)){g.serviceWorker.ready.then(function(at){if(at&&at.sync){return at.sync.register("matomoSync")}},function(){})}},false);ar(W,"message",function(ay){if(!ay||!ay.origin){return}var aA,aw,au;var aB=d(ay.origin);var ax=u.getAsyncTrackers();for(aw=0;aw<ax.length;aw++){au=d(ax[aw].getMatomoUrl());if(au===aB){aA=ax[aw];break}}if(!aA){return}var av=null;try{av=JSON.parse(ay.data)}catch(az){return}if(!av){return}function at(aE){var aG=J.getElementsByTagName("iframe");for(aw=0;aw<aG.length;aw++){var aF=aG[aw];var aC=d(aF.src);if(aF.contentWindow&&M(aF.contentWindow.postMessage)&&aC===aB){var aD=JSON.stringify(aE);aF.contentWindow.postMessage(aD,"*")}}}if(M(av.maq_initial_value)){at({maq_opted_in:av.maq_initial_value&&aA.hasConsent(),maq_url:aA.getMatomoUrl(),maq_optout_by_default:aA.isConsentRequired()}) +function ah(av,au){var at=new T(av,au);L.push(at);_paq=c(_paq,E);for(H=0;H<_paq.length;H++){if(_paq[H]){aj(_paq[H])}}_paq=new K();u.trigger("TrackerAdded",[at]);return at}ar(W,"beforeunload",am,false);ar(W,"visibilitychange",function(){if(m){return}if(J.visibilityState==="hidden"){ag("unload")}},false);ar(W,"online",function(){if(M(g.serviceWorker)){g.serviceWorker.ready.then(function(at){if(at&&at.sync){return at.sync.register("matomoSync")}},function(){})}},false);ar(W,"message",function(ay){if(!ay||!ay.origin){return}var aA,aw,au;var aB=d(ay.origin);var ax=u.getAsyncTrackers();for(aw=0;aw<ax.length;aw++){au=d(ax[aw].getMatomoUrl());if(au===aB){aA=ax[aw];break}}if(!aA){return}var av=null;try{av=JSON.parse(ay.data)}catch(az){return}if(!av){return}function at(aE){var aG=J.getElementsByTagName("iframe");for(aw=0;aw<aG.length;aw++){var aF=aG[aw];var aC=d(aF.src);if(aF.contentWindow&&M(aF.contentWindow.postMessage)&&aC===aB){var aD=JSON.stringify(aE);aF.contentWindow.postMessage(aD,"*")}}}if(M(av.maq_initial_value)){at({maq_opted_in:av.maq_initial_value&&aA.hasConsent(),maq_url:aA.getMatomoUrl(),maq_optout_by_default:aA.isConsentRequired()}) }else{if(M(av.maq_opted_in)){ax=u.getAsyncTrackers();for(aw=0;aw<ax.length;aw++){aA=ax[aw];if(av.maq_opted_in){aA.rememberConsentGiven()}else{aA.forgetConsentGiven()}}at({maq_confirm_opted_in:aA.hasConsent(),maq_url:aA.getMatomoUrl(),maq_optout_by_default:aA.isConsentRequired()})}}},false);Date.prototype.getTimeAlias=Date.prototype.getTime;u={initialized:false,JSON:W.JSON,DOM:{addEventListener:function(aw,av,au,at){var ax=typeof at;if(ax==="undefined"){at=false}ar(aw,av,au,at)},onLoad:n,onReady:q,isNodeVisible:i,isOrWasNodeVisible:w.isNodeVisible},on:function(au,at){if(!z[au]){z[au]=[]}z[au].push(at)},off:function(av,au){if(!z[av]){return}var at=0;for(at;at<z[av].length;at++){if(z[av][at]===au){z[av].splice(at,1)}}},trigger:function(av,aw,au){if(!z[av]){return}var at=0;for(at;at<z[av].length;at++){z[av][at].apply(au||W,aw)}},addPlugin:function(at,au){b[at]=au},getTracker:function(au,at){if(!M(at)){at=this.getAsyncTracker().getSiteId()}if(!M(au)){au=this.getAsyncTracker().getTrackerUrl() }return new T(au,at)},getAsyncTrackers:function(){return L},addTracker:function(av,au){var at;if(!L.length){at=ah(av,au)}else{at=L[0].addTracker(av,au)}return at},getAsyncTracker:function(ax,aw){var av;if(L&&L.length&&L[0]){av=L[0]}else{return ah(ax,aw)}if(!aw&&!ax){return av}if((!M(aw)||null===aw)&&av){aw=av.getSiteId()}if((!M(ax)||null===ax)&&av){ax=av.getTrackerUrl()}var au,at=0;for(at;at<L.length;at++){au=L[at];if(au&&String(au.getSiteId())===String(aw)&&au.getTrackerUrl()===ax){return au}}},retryMissedPluginCalls:function(){var au=al;al=[];var at=0;for(at;at<au.length;at++){aj(au[at])}}};if(typeof define==="function"&&define.amd){define("piwik",[],function(){return u});define("matomo",[],function(){return u})}return u}())} /*!!! pluginTrackerHook */ |