123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /*******************************************************************************
- uBlock Origin - a browser extension to block requests.
- Copyright (C) 2019-present Raymond Hill
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see {http://www.gnu.org/licenses/}.
- Home: https://github.com/gorhill/uBlock
- */
- (function() {
- 'use strict';
- // https://developers.google.com/analytics/devguides/collection/analyticsjs/
- const noopfn = function() {
- };
- //
- const Tracker = function() {
- };
- const p = Tracker.prototype;
- p.get = noopfn;
- p.set = noopfn;
- p.send = noopfn;
- //
- const w = window;
- const gaName = w.GoogleAnalyticsObject || 'ga';
- const gaQueue = w[gaName];
- // https://github.com/uBlockOrigin/uAssets/pull/4115
- const ga = function() {
- 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 if ( a instanceof Function ) {
- fn = ( ) => { a(ga.create()); };
- } 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 {
- fn();
- } catch (ex) {
- }
- };
- ga.create = function() {
- return new Tracker();
- };
- ga.getByName = function() {
- return new Tracker();
- };
- ga.getAll = function() {
- return [new Tracker()];
- };
- ga.remove = noopfn;
- // https://github.com/uBlockOrigin/uAssets/issues/2107
- ga.loaded = true;
- w[gaName] = ga;
- // https://github.com/gorhill/uBlock/issues/3075
- const dl = w.dataLayer;
- if ( dl instanceof Object ) {
- if ( dl.hide instanceof Object && typeof dl.hide.end === 'function' ) {
- dl.hide.end();
- dl.hide.end = ()=>{};
- }
- if ( typeof dl.push === 'function' ) {
- const doCallback = function(item) {
- if ( item instanceof Object === false ) { return; }
- if ( typeof item.eventCallback !== 'function' ) { return; }
- setTimeout(item.eventCallback, 1);
- item.eventCallback = ()=>{};
- };
- dl.push = new Proxy(dl.push, {
- apply: function(target, thisArg, args) {
- doCallback(args[0]);
- return Reflect.apply(target, thisArg, args);
- }
- });
- if ( Array.isArray(dl) ) {
- const q = dl.slice();
- for ( const item of q ) {
- doCallback(item);
- }
- }
- }
- }
- // empty ga queue
- if ( gaQueue instanceof Function && Array.isArray(gaQueue.q) ) {
- const q = gaQueue.q.slice();
- gaQueue.q.length = 0;
- for ( const entry of q ) {
- ga(...entry);
- }
- }
- })();
|