From 8a1a8b103f56e4fcef1264e02dfd718a29bda006 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 1 Dec 2019 10:40:05 -0500 Subject: [PATCH] Improve neutered Google Analytics replacement scriptlet Related issue: - https://github.com/uBlockOrigin/uAssets/issues/5132 The change in this commit make it so that it's no longer required to have an exception filter for `google-analytics.com/analytics.js` for the page to render properly. --- .../google-analytics_analytics.js | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/web_accessible_resources/google-analytics_analytics.js b/src/web_accessible_resources/google-analytics_analytics.js index c802aadcc..5d6a087c8 100644 --- a/src/web_accessible_resources/google-analytics_analytics.js +++ b/src/web_accessible_resources/google-analytics_analytics.js @@ -37,17 +37,24 @@ // const w = window; const gaName = w.GoogleAnalyticsObject || 'ga'; + const gaQueue = w[gaName]; const ga = function() { - var len = arguments.length; - if ( len === 0 ) { - return; - } - var f = arguments[len-1]; - if ( typeof f !== 'object' || f === null || typeof f.hitCallback !== 'function' ) { - return; + const len = arguments.length; + if ( len === 0 ) { return; } + const args = Array.from(arguments); + let fn; + let a = args[len-1]; + if ( a instanceof Object && a.hitCallback instanceof Function ) { + fn = a.hitCallback; + } else { + const pos = args.indexOf('hitCallback'); + if ( pos !== -1 && args[pos+1] instanceof Function ) { + fn = args[pos+1]; + } } + if ( fn instanceof Function === false ) { return; } try { - f.hitCallback(); + fn(); } catch (ex) { } }; @@ -67,4 +74,10 @@ if ( dl instanceof Object && dl.hide instanceof Object && typeof dl.hide.end === 'function' ) { dl.hide.end(); } + // empty ga queue + if ( gaQueue instanceof Function && Array.isArray(gaQueue.q) ) { + for ( const entry of gaQueue.q ) { + ga(...entry); + } + } })();