mirror of
https://github.com/zen-browser/www.git
synced 2025-07-09 01:35:33 +02:00
172 lines
4.1 KiB
JavaScript
172 lines
4.1 KiB
JavaScript
!(function () {
|
|
"use strict";
|
|
((t) => {
|
|
const {
|
|
screen: { width: e, height: a },
|
|
navigator: { language: r },
|
|
location: n,
|
|
localStorage: i,
|
|
document: c,
|
|
history: o,
|
|
} = t,
|
|
{ hostname: s, href: u } = n,
|
|
{ currentScript: l, referrer: d } = c;
|
|
if (!l) return;
|
|
const f = "data-",
|
|
m = l.getAttribute.bind(l),
|
|
h = m(f + "website-id"),
|
|
p = m(f + "host-url"),
|
|
g = m(f + "tag"),
|
|
y = "false" !== m(f + "auto-track"),
|
|
b = "true" === m(f + "exclude-search"),
|
|
v = m(f + "domains") || "",
|
|
S = v.split(",").map((t) => t.trim()),
|
|
w = `${(p || "" || l.src.split("/").slice(0, -1).join("/")).replace(/\/$/, "")}/api/send`,
|
|
N = `${e}x${a}`,
|
|
T = /data-umami-event-([\w-_]+)/,
|
|
A = f + "umami-event",
|
|
x = 300,
|
|
O = (t) => {
|
|
if (t) {
|
|
try {
|
|
const e = decodeURI(t);
|
|
if (e !== t) return e;
|
|
} catch (e) {
|
|
return t;
|
|
}
|
|
return encodeURI(t);
|
|
}
|
|
},
|
|
U = (t) => {
|
|
try {
|
|
const { pathname: e, search: a } = new URL(t);
|
|
t = e + a;
|
|
} catch (t) {}
|
|
return b ? t.split("?")[0] : t;
|
|
},
|
|
j = () => ({
|
|
website: h,
|
|
hostname: s,
|
|
screen: N,
|
|
language: r,
|
|
title: O(q),
|
|
url: O(D),
|
|
referrer: O(_),
|
|
tag: g || void 0,
|
|
}),
|
|
k = (t, e, a) => {
|
|
a && ((_ = D), (D = U(a.toString())), D !== _ && setTimeout(I, x));
|
|
},
|
|
E = () =>
|
|
!h || (i && i.getItem("umami.disabled")) || (v && !S.includes(s)),
|
|
L = async (t, e = "event") => {
|
|
if (E()) return;
|
|
const a = { "Content-Type": "application/json" };
|
|
void 0 !== R && (a["x-umami-cache"] = R);
|
|
try {
|
|
const r = await fetch(w, {
|
|
method: "POST",
|
|
body: JSON.stringify({ type: e, payload: t }),
|
|
headers: a,
|
|
}),
|
|
n = await r.text();
|
|
return (R = n);
|
|
} catch (t) {}
|
|
},
|
|
$ = () => {
|
|
B ||
|
|
(I(),
|
|
(() => {
|
|
const t = (t, e, a) => {
|
|
const r = t[e];
|
|
return (...e) => (a.apply(null, e), r.apply(t, e));
|
|
};
|
|
(o.pushState = t(o, "pushState", k)),
|
|
(o.replaceState = t(o, "replaceState", k));
|
|
})(),
|
|
(() => {
|
|
const t = new MutationObserver(([t]) => {
|
|
q = t && t.target ? t.target.text : void 0;
|
|
}),
|
|
e = c.querySelector("head > title");
|
|
e &&
|
|
t.observe(e, { subtree: !0, characterData: !0, childList: !0 });
|
|
})(),
|
|
c.addEventListener(
|
|
"click",
|
|
async (t) => {
|
|
const e = (t) => ["BUTTON", "A"].includes(t),
|
|
a = async (t) => {
|
|
const e = t.getAttribute.bind(t),
|
|
a = e(A);
|
|
if (a) {
|
|
const r = {};
|
|
return (
|
|
t.getAttributeNames().forEach((t) => {
|
|
const a = t.match(T);
|
|
a && (r[a[1]] = e(t));
|
|
}),
|
|
I(a, r)
|
|
);
|
|
}
|
|
},
|
|
r = t.target,
|
|
i = e(r.tagName)
|
|
? r
|
|
: ((t, a) => {
|
|
let r = t;
|
|
for (let t = 0; t < a; t++) {
|
|
if (e(r.tagName)) return r;
|
|
if (((r = r.parentElement), !r)) return null;
|
|
}
|
|
})(r, 10);
|
|
if (!i) return a(r);
|
|
{
|
|
const { href: e, target: r } = i,
|
|
c = i.getAttribute(A);
|
|
if (c)
|
|
if ("A" === i.tagName) {
|
|
const o =
|
|
"_blank" === r ||
|
|
t.ctrlKey ||
|
|
t.shiftKey ||
|
|
t.metaKey ||
|
|
(t.button && 1 === t.button);
|
|
if (c && e)
|
|
return (
|
|
o || t.preventDefault(),
|
|
a(i).then(() => {
|
|
o || (n.href = e);
|
|
})
|
|
);
|
|
} else if ("BUTTON" === i.tagName) return a(i);
|
|
}
|
|
},
|
|
!0,
|
|
),
|
|
(B = !0));
|
|
},
|
|
I = (t, e) =>
|
|
L(
|
|
"string" == typeof t
|
|
? { ...j(), name: t, data: "object" == typeof e ? e : void 0 }
|
|
: "object" == typeof t
|
|
? t
|
|
: "function" == typeof t
|
|
? t(j())
|
|
: j(),
|
|
),
|
|
K = (t) => L({ ...j(), data: t }, "identify");
|
|
t.umami || (t.umami = { track: I, identify: K });
|
|
let R,
|
|
B,
|
|
D = U(u),
|
|
_ = d !== s ? d : "",
|
|
q = c.title;
|
|
y &&
|
|
!E() &&
|
|
("complete" === c.readyState
|
|
? $()
|
|
: c.addEventListener("readystatechange", $, !0));
|
|
})(window);
|
|
})();
|