mirror of
https://github.com/SukkaW/Surge.git
synced 2025-12-12 01:00:34 +08:00
90 lines
2.4 KiB
JavaScript
90 lines
2.4 KiB
JavaScript
(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];
|
|
const ga = function (...args) {
|
|
const len = args.length;
|
|
if (len === 0) { return; }
|
|
let fn;
|
|
const a = args[len - 1];
|
|
if (typeof a === 'object' && typeof a.hitCallback === 'function') {
|
|
fn = a.hitCallback;
|
|
} else if (typeof a === 'function') {
|
|
fn = () => { a(ga.create()); };
|
|
} else {
|
|
const pos = args.indexOf('hitCallback');
|
|
if (pos !== -1 && typeof args[pos + 1] === 'function') {
|
|
fn = args[pos + 1];
|
|
}
|
|
}
|
|
if (typeof fn !== 'function') { return; }
|
|
try {
|
|
fn();
|
|
} catch {
|
|
}
|
|
};
|
|
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 (typeof dl === 'object') {
|
|
if (typeof dl.hide === 'object' && typeof dl.hide.end === 'function') {
|
|
dl.hide.end();
|
|
dl.hide.end = () => { };
|
|
}
|
|
if (typeof dl.push === 'function') {
|
|
const doCallback = function (item) {
|
|
if (typeof item === 'object' === false) { return; }
|
|
if (typeof item.eventCallback !== 'function') { return; }
|
|
// eslint-disable-next-line sukka/prefer-timer-id -- deliberate use of setTimeout
|
|
setTimeout(item.eventCallback, 1);
|
|
item.eventCallback = () => { };
|
|
};
|
|
dl.push = new Proxy(dl.push, {
|
|
apply(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 (typeof gaQueue === 'function' && Array.isArray(gaQueue.q)) {
|
|
const q = gaQueue.q.slice();
|
|
gaQueue.q.length = 0;
|
|
for (const entry of q) {
|
|
ga(...entry);
|
|
}
|
|
}
|
|
}());
|