(() => {
// src/uv.handler.js
var Ultraviolet = self.Ultraviolet;
var UVClient = self.UVClient;
var __uv$config = self.__uv$config;
var __uv$bareData = self.__uv$bareData;
var __uv$bareURL = self.__uv$bareURL;
var __uv$cookies = self.__uv$cookies;
if (typeof __uv$bareData !== "object" || typeof __uv$bareURL !== "string" || typeof __uv$cookies !== "string")
throw new TypeError("Unable to load global UV data");
if (!self.__uv)
__uvHook(self);
self.__uvHook = __uvHook;
function __uvHook(window) {
if ("__uv" in window && window.__uv instanceof Ultraviolet)
return false;
if (window.document && !!window.window) {
window.document.querySelectorAll("script[__uv-script]").forEach((node) => node.remove());
}
const worker = !window.window;
const master = "__uv";
const methodPrefix = "__uv$";
const __uv = new Ultraviolet(__uv$config);
const bareClient = new Ultraviolet.BareClient(__uv$bareURL, __uv$bareData);
const client = new UVClient(window, bareClient, worker);
const {
HTMLMediaElement,
HTMLScriptElement,
HTMLAudioElement,
HTMLVideoElement,
HTMLInputElement,
HTMLEmbedElement,
HTMLTrackElement,
HTMLAnchorElement,
HTMLIFrameElement,
HTMLAreaElement,
HTMLLinkElement,
HTMLBaseElement,
HTMLFormElement,
HTMLImageElement,
HTMLSourceElement
} = window;
client.nativeMethods.defineProperty(window, "__uv", {
value: __uv,
enumerable: false
});
__uv.meta.origin = location.origin;
__uv.location = client.location.emulate(
(href) => {
if (href === "about:srcdoc")
return new URL(href);
if (href.startsWith("blob:"))
href = href.slice("blob:".length);
return new URL(__uv.sourceUrl(href));
},
(href) => {
return __uv.rewriteUrl(href);
}
);
let cookieStr = __uv$cookies;
__uv.meta.url = __uv.location;
__uv.domain = __uv.meta.url.host;
__uv.blobUrls = new window.Map();
__uv.referrer = "";
__uv.cookies = [];
__uv.localStorageObj = {};
__uv.sessionStorageObj = {};
if (__uv.location.href === "about:srcdoc") {
__uv.meta = window.parent.__uv.meta;
}
if (window.EventTarget) {
__uv.addEventListener = window.EventTarget.prototype.addEventListener;
__uv.removeListener = window.EventTarget.prototype.removeListener;
__uv.dispatchEvent = window.EventTarget.prototype.dispatchEvent;
}
client.nativeMethods.defineProperty(
client.storage.storeProto,
"__uv$storageObj",
{
get() {
if (this === client.storage.sessionStorage)
return __uv.sessionStorageObj;
if (this === client.storage.localStorage)
return __uv.localStorageObj;
},
enumerable: false
}
);
if (window.localStorage) {
for (const key in window.localStorage) {
if (key.startsWith(methodPrefix + __uv.location.origin + "@")) {
__uv.localStorageObj[key.slice(
(methodPrefix + __uv.location.origin + "@").length
)] = window.localStorage.getItem(key);
}
}
__uv.lsWrap = client.storage.emulate(
client.storage.localStorage,
__uv.localStorageObj
);
}
if (window.sessionStorage) {
for (const key in window.sessionStorage) {
if (key.startsWith(methodPrefix + __uv.location.origin + "@")) {
__uv.sessionStorageObj[key.slice(
(methodPrefix + __uv.location.origin + "@").length
)] = window.sessionStorage.getItem(key);
}
}
__uv.ssWrap = client.storage.emulate(
client.storage.sessionStorage,
__uv.sessionStorageObj
);
}
let rawBase = window.document ? client.node.baseURI.get.call(window.document) : window.location.href;
let base = __uv.sourceUrl(rawBase);
client.nativeMethods.defineProperty(__uv.meta, "base", {
get() {
if (!window.document)
return __uv.meta.url.href;
if (client.node.baseURI.get.call(window.document) !== rawBase) {
rawBase = client.node.baseURI.get.call(window.document);
base = __uv.sourceUrl(rawBase);
}
return base;
}
});
__uv.methods = {
setSource: methodPrefix + "setSource",
source: methodPrefix + "source",
location: methodPrefix + "location",
function: methodPrefix + "function",
string: methodPrefix + "string",
eval: methodPrefix + "eval",
parent: methodPrefix + "parent",
top: methodPrefix + "top"
};
__uv.filterKeys = [
master,
__uv.methods.setSource,
__uv.methods.source,
__uv.methods.location,
__uv.methods.function,
__uv.methods.string,
__uv.methods.eval,
__uv.methods.parent,
__uv.methods.top,
methodPrefix + "protocol",
methodPrefix + "storageObj",
methodPrefix + "url",
methodPrefix + "modifiedStyle",
methodPrefix + "config",
methodPrefix + "dispatched",
"Ultraviolet",
"__uvHook"
];
client.on("wrap", (target, wrapped) => {
client.nativeMethods.defineProperty(
wrapped,
"name",
client.nativeMethods.getOwnPropertyDescriptor(target, "name")
);
client.nativeMethods.defineProperty(
wrapped,
"length",
client.nativeMethods.getOwnPropertyDescriptor(target, "length")
);
client.nativeMethods.defineProperty(wrapped, __uv.methods.string, {
enumerable: false,
value: client.nativeMethods.fnToString.call(target)
});
client.nativeMethods.defineProperty(wrapped, __uv.methods.function, {
enumerable: false,
value: target
});
});
client.fetch.on("request", (event) => {
event.data.input = __uv.rewriteUrl(event.data.input);
});
client.fetch.on("requestUrl", (event) => {
event.data.value = __uv.sourceUrl(event.data.value);
});
client.fetch.on("responseUrl", (event) => {
event.data.value = __uv.sourceUrl(event.data.value);
});
client.xhr.on("open", (event) => {
event.data.input = __uv.rewriteUrl(event.data.input);
});
client.xhr.on("responseUrl", (event) => {
event.data.value = __uv.sourceUrl(event.data.value);
});
client.workers.on("worker", (event) => {
event.data.url = __uv.rewriteUrl(event.data.url);
});
client.workers.on("addModule", (event) => {
event.data.url = __uv.rewriteUrl(event.data.url);
});
client.workers.on("importScripts", (event) => {
for (const i in event.data.scripts) {
event.data.scripts[i] = __uv.rewriteUrl(event.data.scripts[i]);
}
});
client.workers.on("postMessage", (event) => {
let to = event.data.origin;
event.data.origin = "*";
event.data.message = {
__data: event.data.message,
__origin: __uv.meta.url.origin,
__to: to
};
});
client.navigator.on("sendBeacon", (event) => {
event.data.url = __uv.rewriteUrl(event.data.url);
});
client.document.on("getCookie", (event) => {
event.data.value = cookieStr;
});
client.document.on("setCookie", (event) => {
__uv.cookie.db().then((db) => {
__uv.cookie.setCookies(event.data.value, db, __uv.meta);
__uv.cookie.getCookies(db).then((cookies) => {
cookieStr = __uv.cookie.serialize(cookies, __uv.meta, true);
});
});
const cookie = __uv.cookie.setCookie(event.data.value)[0];
if (!cookie.path)
cookie.path = "/";
if (!cookie.domain)
cookie.domain = __uv.meta.url.hostname;
if (__uv.cookie.validateCookie(cookie, __uv.meta, true)) {
if (cookieStr.length)
cookieStr += "; ";
cookieStr += `${cookie.name}=${cookie.value}`;
}
event.respondWith(event.data.value);
});
client.element.on("setInnerHTML", (event) => {
switch (event.that.tagName) {
case "SCRIPT":
event.data.value = __uv.js.rewrite(event.data.value);
break;
case "STYLE":
event.data.value = __uv.rewriteCSS(event.data.value);
break;
default:
event.data.value = __uv.rewriteHtml(event.data.value);
}
});
client.element.on("getInnerHTML", (event) => {
switch (event.that.tagName) {
case "SCRIPT":
event.data.value = __uv.js.source(event.data.value);
break;
default:
event.data.value = __uv.sourceHtml(event.data.value);
}
});
client.element.on("setOuterHTML", (event) => {
event.data.value = __uv.rewriteHtml(event.data.value, {
document: event.that.tagName === "HTML"
});
});
client.element.on("getOuterHTML", (event) => {
switch (event.that.tagName) {
case "HEAD":
event.data.value = __uv.sourceHtml(
event.data.value.replace(
/
(.*)<\/head>/s,
"$2"
)
).replace(
/(.*)<\/op-head>/s,
"$2"
);
break;
case "BODY":
event.data.value = __uv.sourceHtml(
event.data.value.replace(
/(.*)<\/body>/s,
"$2"
)
).replace(
/(.*)<\/op-body>/s,
"$2"
);
break;
default:
event.data.value = __uv.sourceHtml(event.data.value, {
document: event.that.tagName === "HTML"
});
break;
}
});
client.document.on("write", (event) => {
if (!event.data.html.length)
return false;
event.data.html = [__uv.rewriteHtml(event.data.html.join(""))];
});
client.document.on("writeln", (event) => {
if (!event.data.html.length)
return false;
event.data.html = [__uv.rewriteHtml(event.data.html.join(""))];
});
client.element.on("insertAdjacentHTML", (event) => {
event.data.html = __uv.rewriteHtml(event.data.html);
});
client.eventSource.on("construct", (event) => {
event.data.url = __uv.rewriteUrl(event.data.url);
});
client.eventSource.on("url", (event) => {
event.data.url = __uv.rewriteUrl(event.data.url);
});
client.idb.on("idbFactoryOpen", (event) => {
if (event.data.name === "__op")
return;
event.data.name = `${__uv.meta.url.origin}@${event.data.name}`;
});
client.idb.on("idbFactoryName", (event) => {
event.data.value = event.data.value.slice(
__uv.meta.url.origin.length + 1
/*the @*/
);
});
client.history.on("replaceState", (event) => {
if (event.data.url)
event.data.url = __uv.rewriteUrl(
event.data.url,
"__uv" in event.that ? event.that.__uv.meta : __uv.meta
);
});
client.history.on("pushState", (event) => {
if (event.data.url)
event.data.url = __uv.rewriteUrl(
event.data.url,
"__uv" in event.that ? event.that.__uv.meta : __uv.meta
);
});
client.element.on("getAttribute", (event) => {
if (client.element.hasAttribute.call(
event.that,
__uv.attributePrefix + "-attr-" + event.data.name
)) {
event.respondWith(
event.target.call(
event.that,
__uv.attributePrefix + "-attr-" + event.data.name
)
);
}
});
client.message.on("postMessage", (event) => {
let to = event.data.origin;
let call = __uv.call;
if (event.that) {
call = event.that.__uv$source.call;
}
event.data.origin = "*";
event.data.message = {
__data: event.data.message,
__origin: (event.that || event.target).__uv$source.location.origin,
__to: to
};
event.respondWith(
worker ? call(
event.target,
[event.data.message, event.data.transfer],
event.that
) : call(
event.target,
[
event.data.message,
event.data.origin,
event.data.transfer
],
event.that
)
);
});
client.message.on("data", (event) => {
const { value: data } = event.data;
if (typeof data === "object" && "__data" in data && "__origin" in data) {
event.respondWith(data.__data);
}
});
client.message.on("origin", (event) => {
const data = client.message.messageData.get.call(event.that);
if (typeof data === "object" && data.__data && data.__origin) {
event.respondWith(data.__origin);
}
});
client.overrideDescriptor(window, "origin", {
get: () => {
return __uv.location.origin;
}
});
client.node.on("baseURI", (event) => {
if (event.data.value.startsWith(window.location.origin))
event.data.value = __uv.sourceUrl(event.data.value);
});
client.element.on("setAttribute", (event) => {
if (event.that instanceof HTMLMediaElement && event.data.name === "src" && event.data.value.startsWith("blob:")) {
event.target.call(
event.that,
__uv.attributePrefix + "-attr-" + event.data.name,
event.data.value
);
event.data.value = __uv.blobUrls.get(event.data.value);
return;
}
if (__uv.attrs.isUrl(event.data.name)) {
event.target.call(
event.that,
__uv.attributePrefix + "-attr-" + event.data.name,
event.data.value
);
event.data.value = __uv.rewriteUrl(event.data.value);
}
if (__uv.attrs.isStyle(event.data.name)) {
event.target.call(
event.that,
__uv.attributePrefix + "-attr-" + event.data.name,
event.data.value
);
event.data.value = __uv.rewriteCSS(event.data.value, {
context: "declarationList"
});
}
if (__uv.attrs.isHtml(event.data.name)) {
event.target.call(
event.that,
__uv.attributePrefix + "-attr-" + event.data.name,
event.data.value
);
event.data.value = __uv.rewriteHtml(event.data.value, {
...__uv.meta,
document: true,
injectHead: __uv.createHtmlInject(
__uv.handlerScript,
__uv.bundleScript,
__uv.clientScript,
__uv.configScript,
__uv$bareURL,
__uv$bareData,
cookieStr,
window.location.href
)
});
}
if (__uv.attrs.isSrcset(event.data.name)) {
event.target.call(
event.that,
__uv.attributePrefix + "-attr-" + event.data.name,
event.data.value
);
event.data.value = __uv.html.wrapSrcset(
event.data.value.toString()
);
}
if (__uv.attrs.isForbidden(event.data.name)) {
event.data.name = __uv.attributePrefix + "-attr-" + event.data.name;
}
});
client.element.on("audio", (event) => {
event.data.url = __uv.rewriteUrl(event.data.url);
});
client.element.hookProperty(
[HTMLAnchorElement, HTMLAreaElement, HTMLLinkElement, HTMLBaseElement],
"href",
{
get: (target, that) => {
return __uv.sourceUrl(target.call(that));
},
set: (target, that, [val]) => {
client.element.setAttribute.call(
that,
__uv.attributePrefix + "-attr-href",
val
);
target.call(that, __uv.rewriteUrl(val));
}
}
);
client.element.hookProperty(
[
HTMLScriptElement,
HTMLAudioElement,
HTMLVideoElement,
HTMLMediaElement,
HTMLImageElement,
HTMLInputElement,
HTMLEmbedElement,
HTMLIFrameElement,
HTMLTrackElement,
HTMLSourceElement
],
"src",
{
get: (target, that) => {
return __uv.sourceUrl(target.call(that));
},
set: (target, that, [val]) => {
if (new String(val).toString().trim().startsWith("blob:") && that instanceof HTMLMediaElement) {
client.element.setAttribute.call(
that,
__uv.attributePrefix + "-attr-src",
val
);
return target.call(that, __uv.blobUrls.get(val) || val);
}
client.element.setAttribute.call(
that,
__uv.attributePrefix + "-attr-src",
val
);
target.call(that, __uv.rewriteUrl(val));
}
}
);
client.element.hookProperty([HTMLFormElement], "action", {
get: (target, that) => {
return __uv.sourceUrl(target.call(that));
},
set: (target, that, [val]) => {
client.element.setAttribute.call(
that,
__uv.attributePrefix + "-attr-action",
val
);
target.call(that, __uv.rewriteUrl(val));
}
});
client.element.hookProperty([HTMLImageElement], "srcset", {
get: (target, that) => {
return client.element.getAttribute.call(
that,
__uv.attributePrefix + "-attr-srcset"
) || target.call(that);
},
set: (target, that, [val]) => {
client.element.setAttribute.call(
that,
__uv.attributePrefix + "-attr-srcset",
val
);
target.call(that, __uv.html.wrapSrcset(val.toString()));
}
});
client.element.hookProperty(HTMLScriptElement, "integrity", {
get: (target, that) => {
return client.element.getAttribute.call(
that,
__uv.attributePrefix + "-attr-integrity"
);
},
set: (target, that, [val]) => {
client.element.setAttribute.call(
that,
__uv.attributePrefix + "-attr-integrity",
val
);
}
});
client.element.hookProperty(HTMLIFrameElement, "sandbox", {
get: (target, that) => {
return client.element.getAttribute.call(
that,
__uv.attributePrefix + "-attr-sandbox"
) || target.call(that);
},
set: (target, that, [val]) => {
client.element.setAttribute.call(
that,
__uv.attributePrefix + "-attr-sandbox",
val
);
}
});
const contentWindowGet = HTMLIFrameElement && Object.getOwnPropertyDescriptor(
HTMLIFrameElement.prototype,
"contentWindow"
).get;
function uvInject(that) {
const win = contentWindowGet.call(that);
if (!win.__uv)
try {
__uvHook(win);
} catch (e) {
console.error("catastrophic failure");
console.error(e);
}
}
client.element.hookProperty(HTMLIFrameElement, "contentWindow", {
get: (target, that) => {
uvInject(that);
return target.call(that);
}
});
client.element.hookProperty(HTMLIFrameElement, "contentDocument", {
get: (target, that) => {
uvInject(that);
return target.call(that);
}
});
client.element.hookProperty(HTMLIFrameElement, "srcdoc", {
get: (target, that) => {
return client.element.getAttribute.call(
that,
__uv.attributePrefix + "-attr-srcdoc"
) || target.call(that);
},
set: (target, that, [val]) => {
target.call(
that,
__uv.rewriteHtml(val, {
document: true,
injectHead: __uv.createHtmlInject(
__uv.handlerScript,
__uv.bundleScript,
__uv.clientScript,
__uv.configScript,
__uv$bareURL,
__uv$bareData,
cookieStr,
window.location.href
)
})
);
}
});
client.node.on("getTextContent", (event) => {
if (event.that.tagName === "SCRIPT") {
event.data.value = __uv.js.source(event.data.value);
}
});
client.node.on("setTextContent", (event) => {
if (event.that.tagName === "SCRIPT") {
event.data.value = __uv.js.rewrite(event.data.value);
}
});
if ("serviceWorker" in window.navigator) {
delete window.Navigator.prototype.serviceWorker;
}
client.document.on("getDomain", (event) => {
event.data.value = __uv.domain;
});
client.document.on("setDomain", (event) => {
if (!event.data.value.toString().endsWith(__uv.meta.url.hostname.split(".").slice(-2).join(".")))
return event.respondWith("");
event.respondWith(__uv.domain = event.data.value);
});
client.document.on("url", (event) => {
event.data.value = __uv.location.href;
});
client.document.on("documentURI", (event) => {
event.data.value = __uv.location.href;
});
client.document.on("referrer", (event) => {
event.data.value = __uv.referrer || __uv.sourceUrl(event.data.value);
});
client.document.on("parseFromString", (event) => {
if (event.data.type !== "text/html")
return false;
event.data.string = __uv.rewriteHtml(event.data.string, {
...__uv.meta,
document: true
});
});
client.attribute.on("getValue", (event) => {
if (client.element.hasAttribute.call(
event.that.ownerElement,
__uv.attributePrefix + "-attr-" + event.data.name
)) {
event.data.value = client.element.getAttribute.call(
event.that.ownerElement,
__uv.attributePrefix + "-attr-" + event.data.name
);
}
});
client.attribute.on("setValue", (event) => {
if (__uv.attrs.isUrl(event.data.name)) {
client.element.setAttribute.call(
event.that.ownerElement,
__uv.attributePrefix + "-attr-" + event.data.name,
event.data.value
);
event.data.value = __uv.rewriteUrl(event.data.value);
}
if (__uv.attrs.isStyle(event.data.name)) {
client.element.setAttribute.call(
event.that.ownerElement,
__uv.attributePrefix + "-attr-" + event.data.name,
event.data.value
);
event.data.value = __uv.rewriteCSS(event.data.value, {
context: "declarationList"
});
}
if (__uv.attrs.isHtml(event.data.name)) {
client.element.setAttribute.call(
event.that.ownerElement,
__uv.attributePrefix + "-attr-" + event.data.name,
event.data.value
);
event.data.value = __uv.rewriteHtml(event.data.value, {
...__uv.meta,
document: true,
injectHead: __uv.createHtmlInject(
__uv.handlerScript,
__uv.bundleScript,
__uv.clientScript,
__uv.configScript,
__uv$bareURL,
__uv$bareData,
cookieStr,
window.location.href
)
});
}
if (__uv.attrs.isSrcset(event.data.name)) {
client.element.setAttribute.call(
event.that.ownerElement,
__uv.attributePrefix + "-attr-" + event.data.name,
event.data.value
);
event.data.value = __uv.html.wrapSrcset(
event.data.value.toString()
);
}
});
client.url.on("createObjectURL", (event) => {
let url = event.target.call(event.that, event.data.object);
if (url.startsWith("blob:" + location.origin)) {
let newUrl = "blob:" + (__uv.meta.url.href !== "about:blank" ? __uv.meta.url.origin : window.parent.__uv.meta.url.origin) + url.slice("blob:".length + location.origin.length);
__uv.blobUrls.set(newUrl, url);
event.respondWith(newUrl);
} else {
event.respondWith(url);
}
});
client.url.on("revokeObjectURL", (event) => {
if (__uv.blobUrls.has(event.data.url)) {
const old = event.data.url;
event.data.url = __uv.blobUrls.get(event.data.url);
__uv.blobUrls.delete(old);
}
});
client.storage.on("get", (event) => {
event.data.name = methodPrefix + __uv.meta.url.origin + "@" + event.data.name;
});
client.storage.on("set", (event) => {
if (event.that.__uv$storageObj) {
event.that.__uv$storageObj[event.data.name] = event.data.value;
}
event.data.name = methodPrefix + __uv.meta.url.origin + "@" + event.data.name;
});
client.storage.on("delete", (event) => {
if (event.that.__uv$storageObj) {
delete event.that.__uv$storageObj[event.data.name];
}
event.data.name = methodPrefix + __uv.meta.url.origin + "@" + event.data.name;
});
client.storage.on("getItem", (event) => {
event.data.name = methodPrefix + __uv.meta.url.origin + "@" + event.data.name;
});
client.storage.on("setItem", (event) => {
if (event.that.__uv$storageObj) {
event.that.__uv$storageObj[event.data.name] = event.data.value;
}
event.data.name = methodPrefix + __uv.meta.url.origin + "@" + event.data.name;
});
client.storage.on("removeItem", (event) => {
if (event.that.__uv$storageObj) {
delete event.that.__uv$storageObj[event.data.name];
}
event.data.name = methodPrefix + __uv.meta.url.origin + "@" + event.data.name;
});
client.storage.on("clear", (event) => {
if (event.that.__uv$storageObj) {
for (const key of client.nativeMethods.keys.call(
null,
event.that.__uv$storageObj
)) {
delete event.that.__uv$storageObj[key];
client.storage.removeItem.call(
event.that,
methodPrefix + __uv.meta.url.origin + "@" + key
);
event.respondWith();
}
}
});
client.storage.on("length", (event) => {
if (event.that.__uv$storageObj) {
event.respondWith(
client.nativeMethods.keys.call(null, event.that.__uv$storageObj).length
);
}
});
client.storage.on("key", (event) => {
if (event.that.__uv$storageObj) {
event.respondWith(
client.nativeMethods.keys.call(
null,
event.that.__uv$storageObj
)[event.data.index] || null
);
}
});
client.websocket.on("websocket", async (event) => {
const requestHeaders = /* @__PURE__ */ Object.create(null);
requestHeaders["Origin"] = __uv.meta.url.origin;
requestHeaders["User-Agent"] = navigator.userAgent;
if (cookieStr !== "")
requestHeaders["Cookie"] = cookieStr.toString();
event.respondWith(
bareClient.createWebSocket(event.data.args[0], event.data.args[1], {
headers: requestHeaders,
readyStateHook: (socket, getReadyState) => {
socket.__uv$getReadyState = getReadyState;
},
sendErrorHook: (socket, getSendError) => {
socket.__uv$getSendError = getSendError;
},
urlHook: (socket, url) => {
socket.__uv$socketUrl = url;
},
protocolHook: (socket, getProtocol) => {
socket.__uv$getProtocol = getProtocol;
},
setCookiesCallback: (setCookies) => {
for (const cookie of setCookies)
window.document.cookie = cookie;
},
webSocketImpl: event.target
})
);
});
client.websocket.on("readyState", (event) => {
if ("__uv$getReadyState" in event.that)
event.data.value = event.that.__uv$getReadyState();
});
client.websocket.on("send", (event) => {
if ("__uv$getSendError" in event.that) {
const error = event.that.__uv$getSendError();
if (error)
throw error;
}
});
client.websocket.on("url", (event) => {
if ("__uv$socketUrl" in event.that)
event.data.value = event.that.__uv$socketUrl.toString();
});
client.websocket.on("protocol", (event) => {
if ("__uv$getProtocol" in event.that)
event.data.value = event.that.__uv$getProtocol();
});
client.function.on("function", (event) => {
event.data.script = __uv.rewriteJS(event.data.script);
});
client.function.on("toString", (event) => {
if (__uv.methods.string in event.that)
event.respondWith(event.that[__uv.methods.string]);
});
client.object.on("getOwnPropertyNames", (event) => {
event.data.names = event.data.names.filter(
(element) => !__uv.filterKeys.includes(element)
);
});
client.object.on("getOwnPropertyDescriptors", (event) => {
for (const forbidden of __uv.filterKeys) {
delete event.data.descriptors[forbidden];
}
});
client.style.on("setProperty", (event) => {
if (client.style.dashedUrlProps.includes(event.data.property)) {
event.data.value = __uv.rewriteCSS(event.data.value, {
context: "value",
...__uv.meta
});
}
});
client.style.on("getPropertyValue", (event) => {
if (client.style.dashedUrlProps.includes(event.data.property)) {
event.respondWith(
__uv.sourceCSS(
event.target.call(event.that, event.data.property),
{
context: "value",
...__uv.meta
}
)
);
}
});
if ("CSS2Properties" in window) {
for (const key of client.style.urlProps) {
client.overrideDescriptor(window.CSS2Properties.prototype, key, {
get: (target, that) => {
return __uv.sourceCSS(target.call(that), {
context: "value",
...__uv.meta
});
},
set: (target, that, val) => {
target.call(
that,
__uv.rewriteCSS(val, {
context: "value",
...__uv.meta
})
);
}
});
}
} else if ("HTMLElement" in window) {
client.overrideDescriptor(window.HTMLElement.prototype, "style", {
get: (target, that) => {
const value = target.call(that);
if (!value[methodPrefix + "modifiedStyle"]) {
for (const key of client.style.urlProps) {
client.nativeMethods.defineProperty(value, key, {
enumerable: true,
configurable: true,
get() {
const value2 = client.style.getPropertyValue.call(
this,
key
) || "";
return __uv.sourceCSS(value2, {
context: "value",
...__uv.meta
});
},
set(val) {
client.style.setProperty.call(
this,
client.style.propToDashed[key] || key,
__uv.rewriteCSS(val, {
context: "value",
...__uv.meta
})
);
}
});
client.nativeMethods.defineProperty(
value,
methodPrefix + "modifiedStyle",
{
enumerable: false,
value: true
}
);
}
}
return value;
}
});
}
client.style.on("setCssText", (event) => {
event.data.value = __uv.rewriteCSS(event.data.value, {
context: "declarationList",
...__uv.meta
});
});
client.style.on("getCssText", (event) => {
event.data.value = __uv.sourceCSS(event.data.value, {
context: "declarationList",
...__uv.meta
});
});
__uv.addEventListener.call(window, "hashchange", (event) => {
if (event.__uv$dispatched)
return false;
event.stopImmediatePropagation();
const hash = window.location.hash;
client.history.replaceState.call(window.history, "", "", event.oldURL);
__uv.location.hash = hash;
});
client.location.on("hashchange", (oldUrl, newUrl, ctx) => {
if (ctx.HashChangeEvent && client.history.replaceState) {
client.history.replaceState.call(
window.history,
"",
"",
__uv.rewriteUrl(newUrl)
);
const event = new ctx.HashChangeEvent("hashchange", {
newURL: newUrl,
oldURL: oldUrl
});
client.nativeMethods.defineProperty(
event,
methodPrefix + "dispatched",
{
value: true,
enumerable: false
}
);
__uv.dispatchEvent.call(window, event);
}
});
client.fetch.overrideRequest();
client.fetch.overrideUrl();
client.xhr.overrideOpen();
client.xhr.overrideResponseUrl();
client.element.overrideHtml();
client.element.overrideAttribute();
client.element.overrideInsertAdjacentHTML();
client.element.overrideAudio();
client.node.overrideBaseURI();
client.node.overrideTextContent();
client.attribute.overrideNameValue();
client.document.overrideDomain();
client.document.overrideURL();
client.document.overrideDocumentURI();
client.document.overrideWrite();
client.document.overrideReferrer();
client.document.overrideParseFromString();
client.storage.overrideMethods();
client.storage.overrideLength();
client.object.overrideGetPropertyNames();
client.object.overrideGetOwnPropertyDescriptors();
client.idb.overrideName();
client.idb.overrideOpen();
client.history.overridePushState();
client.history.overrideReplaceState();
client.eventSource.overrideConstruct();
client.eventSource.overrideUrl();
client.websocket.overrideWebSocket();
client.websocket.overrideProtocol();
client.websocket.overrideURL();
client.websocket.overrideReadyState();
client.websocket.overrideProtocol();
client.websocket.overrideSend();
client.url.overrideObjectURL();
client.document.overrideCookie();
client.message.overridePostMessage();
client.message.overrideMessageOrigin();
client.message.overrideMessageData();
client.workers.overrideWorker();
client.workers.overrideAddModule();
client.workers.overrideImportScripts();
client.workers.overridePostMessage();
client.style.overrideSetGetProperty();
client.style.overrideCssText();
client.navigator.overrideSendBeacon();
client.function.overrideFunction();
client.function.overrideToString();
client.location.overrideWorkerLocation((href) => {
return new URL(__uv.sourceUrl(href));
});
client.overrideDescriptor(window, "localStorage", {
get: (target, that) => {
return (that || window).__uv.lsWrap;
}
});
client.overrideDescriptor(window, "sessionStorage", {
get: (target, that) => {
return (that || window).__uv.ssWrap;
}
});
client.override(window, "open", (target, that, args) => {
if (!args.length)
return target.apply(that, args);
let [url] = args;
url = __uv.rewriteUrl(url);
return target.call(that, url);
});
__uv.$wrap = function(name) {
if (name === "location")
return __uv.methods.location;
if (name === "eval")
return __uv.methods.eval;
return name;
};
__uv.$get = function(that) {
if (that === window.location)
return __uv.location;
if (that === window.eval)
return __uv.eval;
if (that === window.parent) {
return window.__uv$parent;
}
if (that === window.top) {
return window.__uv$top;
}
return that;
};
__uv.eval = client.wrap(window, "eval", (target, that, args) => {
if (!args.length || typeof args[0] !== "string")
return target.apply(that, args);
let [script] = args;
script = __uv.rewriteJS(script);
return target.call(that, script);
});
__uv.call = function(target, args, that) {
return that ? target.apply(that, args) : target(...args);
};
__uv.call$ = function(obj, prop, args = []) {
return obj[prop].apply(obj, args);
};
client.nativeMethods.defineProperty(window.Object.prototype, master, {
get: () => {
return __uv;
},
enumerable: false
});
client.nativeMethods.defineProperty(
window.Object.prototype,
__uv.methods.setSource,
{
value: function(source) {
if (!client.nativeMethods.isExtensible(this))
return this;
client.nativeMethods.defineProperty(this, __uv.methods.source, {
value: source,
writable: true,
enumerable: false
});
return this;
},
enumerable: false
}
);
client.nativeMethods.defineProperty(
window.Object.prototype,
__uv.methods.source,
{
value: __uv,
writable: true,
enumerable: false
}
);
client.nativeMethods.defineProperty(
window.Object.prototype,
__uv.methods.location,
{
configurable: true,
get() {
return this === window.document || this === window ? __uv.location : this.location;
},
set(val) {
if (this === window.document || this === window) {
__uv.location.href = val;
} else {
this.location = val;
}
}
}
);
client.nativeMethods.defineProperty(
window.Object.prototype,
__uv.methods.parent,
{
configurable: true,
get() {
const val = this.parent;
if (this === window) {
try {
return "__uv" in val ? val : this;
} catch (e) {
return this;
}
}
return val;
},
set(val) {
this.parent = val;
}
}
);
client.nativeMethods.defineProperty(
window.Object.prototype,
__uv.methods.top,
{
configurable: true,
get() {
const val = this.top;
if (this === window) {
if (val === this.parent)
return this[__uv.methods.parent];
try {
if (!("__uv" in val)) {
let current = this;
while (current.parent !== val) {
current = current.parent;
}
return "__uv" in current ? current : this;
} else {
return val;
}
} catch (e) {
return this;
}
}
return val;
},
set(val) {
this.top = val;
}
}
);
client.nativeMethods.defineProperty(
window.Object.prototype,
__uv.methods.eval,
{
configurable: true,
get() {
return this === window ? __uv.eval : this.eval;
},
set(val) {
this.eval = val;
}
}
);
}
})();
//# sourceMappingURL=uv.handler.js.map