mirror of
https://github.com/ThePhaseless/Byparr.git
synced 2025-03-16 10:10:20 +08:00
446 lines
63 KiB
JavaScript
446 lines
63 KiB
JavaScript
![]() |
/*******************************************************************************
|
||
|
|
||
|
uBlock Origin Lite - a comprehensive, MV3-compliant content blocker
|
||
|
Copyright (C) 2014-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
|
||
|
|
||
|
*/
|
||
|
|
||
|
/* jshint esversion:11 */
|
||
|
/* global cloneInto */
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
// ruleset: default
|
||
|
|
||
|
/******************************************************************************/
|
||
|
|
||
|
// Important!
|
||
|
// Isolate from global scope
|
||
|
|
||
|
// Start of local scope
|
||
|
(() => {
|
||
|
|
||
|
/******************************************************************************/
|
||
|
|
||
|
// Start of code to inject
|
||
|
const uBOL_removeNodeText = function () {
|
||
|
|
||
|
const scriptletGlobals = {}; // jshint ignore: line
|
||
|
|
||
|
const argsList = [["script", "DisplayAcceptableAdIfAdblocked"], ["script", "/==undefined.*body/"], ["script", "\"Anzeige\""], ["script", "Promise"], ["script", "Reflect"], ["script", "document.write"], ["script", "self == top"], ["script", "/popunder|isAdBlock|admvn.src/i"], ["script", "deblocker"], ["script", "exdynsrv"], ["script", "/adb/i"], ["script", "adsbygoogle"], ["script", "FingerprintJS"], ["script", "/h=decodeURIComponent|popundersPerIP/"], ["script", "/adblock.php"], ["script", "/document\\.createElement|\\.banner-in/"], ["script", "/\\badblock\\b/"], ["script", "/block-adb|-0x|adblock/"], ["script", "myreadCookie"], ["script", "ExoLoader"], ["script", "/?key.*open/", "condition", "key"], ["script", "adblock"], ["script", "homad"], ["script", "Adblock"], ["script", "alert"], ["script", "/adblock|popunder/"], ["script", "document.createTextNode"], ["script", "style"], ["script", "shown_at"], ["script", "/fetch|adb/i"], ["script", "window.open"], ["script", ";break;case $."], ["script", "zaraz"], ["script", "adblockimg"], ["script", "showAd"], ["script", "imgSrc"], ["script", "document.createElement(\"script\")"], ["script", "googlesyndication"], ["script", "antiAdBlock"], ["script", "/fairAdblock|popMagic/"], ["script", "/pop1stp|detectAdBlock/"], ["script", "popundersPerIP"], ["script", "popunder"], ["script", "aclib.runPop"], ["script", "mega-enlace.com/ext.php?o="], ["script", "adserverDomain"], ["script", "Popup"], ["script", "catch"], ["script", "displayAdsV3"], ["script", ";}}};break;case $."], ["script", "adblocker"], ["script", "/interceptClickEvent|onbeforeunload|popMagic|location\\.replace/"], ["script", "/-Ads-close|preventDefault|ai-debug|b2a|split|reload/"], ["script", "ai_adb"], ["script", "/bypass.php"], ["script", "htmls"], ["script", "/\\/detected\\.html|Adblock/"], ["script", "toast"], ["script", "AdbModel"], ["script", "popup"], ["script", "antiAdBlockerHandler"], ["script", "/ad\\s?block|adsBlocked|document\\.write\\(unescape\\('|devtool/i"], ["script", "onerror"], ["script", "location.assign"], ["script", "location.href"], ["script", "/checkAdBlocker|AdblockRegixFinder/"], ["script", "adb_detected"], ["script", "/aclib|break;|zoneNativeSett/"], ["script", "/fetch|popupshow/"], ["script", "justDetectAdblock"], ["script", "openPopup"], ["style", "text-decoration"], ["script", "push"], ["script", "AdBlocker"], ["script", "clicky"], ["script", "charCodeAt"], ["script", "/h=decodeURIComponent|\"popundersPerIP\"/"], ["script", "popMagic"], ["script", "/popMagic|pop1stp/"], ["script", "/adblock|location\\.replace/"], ["script", "/downloadJSAtOnload|Object.prototype.toString.call/"], ["script", "numberPages"], ["script", "KCgpPT57bGV0IGU"], ["script", "error-report.com"], ["script", "adShield"], ["script", "AdblockRegixFinder"], ["script", "serve"], ["script", "/\\.pop\\(\\); \\}|AdSlot created|Created AdSlot|\\.length % 2; \\}/"], ["script", "/ConsoleBan|alert|AdBlocker/"], ["script", "runPop"], ["script", "mdpDeblocker"], ["script", "alert", "condition", "adblock"], ["script", "adb"], ["script", " fetch"], ["script", "innerHTML"], ["script", "/'.adsbygoogle'|text-danger|warning|Adblock|_0x/"], ["script", "popUnder"], ["#text", "/スポンサーリンク|Sponsored Link|广告/"], ["#text", "スポンサーリンク"], ["#text", "スポンサードリンク"], ["#text", "/\\[vkExUnit_ad area=(after|before)\\]/"], ["#text", "【広告】"], ["#text", "【PR】"], ["#text", "関連動画"], ["#text", "PR:"], ["script", "leave_recommend"], ["#text", "/Advertisement/"], ["script", "navigator.brave"], ["script", "zfgloaded"], ["script", "HTMLAllCollection"], ["script", "liedetector"], ["script", "popWin"], ["script", "end_click"], ["script", "ad blocker"], ["script", "closeAd"], ["script", "/modal|popupads/"], ["script", "/adconfig/i"], ["script", "AdblockDetector"], ["script", "is_antiblock_refresh"], ["script", "/userAgent|adb|htmls/"], ["script", "myModal"], ["script", "ad_block"], ["script", "app_checkext"], ["script", "clientHeight"], ["script", "/url_key|adHtml/"], ["script", "pop.targe
|
||
|
|
||
|
const hostnamesMap = new Map([["alpin.de", 0], ["boersennews.de", 0], ["chefkoch.de", 0], ["chip.de", 0], ["clever-tanken.de", 0], ["desired.de", 0], ["donnerwetter.de", 0], ["fanfiktion.de", 0], ["focus.de", 0], ["formel1.de", 0], ["frustfrei-lernen.de", 0], ["gewinnspiele.tv", 0], ["giga.de", 0], ["gut-erklaert.de", 0], ["kino.de", 0], ["messen.de", 0], ["nickles.de", 0], ["nordbayern.de", 0], ["spielfilm.de", 0], ["teltarif.de", 0], ["unsere-helden.com", 0], ["weltfussball.at", 0], ["watson.de", 0], ["moviepilot.de", [0, 3]], ["aupetitparieur.com", 1], ["allthingsvegas.com", 1], ["100percentfedup.com", 1], ["beforeitsnews.com", 1], ["concomber.com", 1], ["conservativebrief.com", 1], ["conservativefiringline.com", 1], ["dailylol.com", 1], ["funnyand.com", 1], ["letocard.fr", 1], ["mamieastuce.com", 1], ["meilleurpronostic.fr", 1], ["patriotnationpress.com", 1], ["toptenz.net", 1], ["vitamiiin.com", 1], ["writerscafe.org", 1], ["populist.press", 1], ["dailytruthreport.com", 1], ["livinggospeldaily.com", 1], ["first-names-meanings.com", 1], ["welovetrump.com", 1], ["thehayride.com", 1], ["thelibertydaily.com", 1], ["thepoke.co.uk", 1], ["thepolitistick.com", 1], ["theblacksphere.net", 1], ["shark-tank.com", 1], ["naturalblaze.com", 1], ["greatamericanrepublic.com", 1], ["dailysurge.com", 1], ["truthlion.com", 1], ["flagandcross.com", 1], ["westword.com", 1], ["republicbrief.com", 1], ["freedomfirstnetwork.com", 1], ["phoenixnewtimes.com", 1], ["designbump.com", 1], ["clashdaily.com", 1], ["madworldnews.com", 1], ["reviveusa.com", 1], ["sonsoflibertymedia.com", 1], ["thedesigninspiration.com", 1], ["videogamesblogger.com", 1], ["protrumpnews.com", 1], ["thepalmierireport.com", 1], ["kresy.pl", 1], ["thepatriotjournal.com", 1], ["gellerreport.com", 1], ["thegatewaypundit.com", 1], ["wltreport.com", 1], ["miaminewtimes.com", 1], ["politicalsignal.com", 1], ["rightwingnews.com", 1], ["bigleaguepolitics.com", 1], ["comicallyincorrect.com", 1], ["web.de", 2], ["yts.mx", 5], ["upornia.com", 7], ["pinsystem.co.uk", 8], ["elrellano.com", 8], ["tinyppt.com", 8], ["bharathwick.com", 8], ["descargaspcpro.net", 8], ["dx-tv.com", 8], ["rt3dmodels.com", 8], ["plc4me.com", 8], ["blisseyhusbands.com", 8], ["madaradex.org", 8], ["trigonevo.com", 8], ["franceprefecture.fr", 8], ["jazbaat.in", 8], ["aipebel.com", 8], ["veganab.co", 8], ["camdigest.com", 8], ["learnmany.in", 8], ["amanguides.com", [8, 58]], ["highkeyfinance.com", [8, 58]], ["appkamods.com", 8], ["techacode.com", 8], ["djqunjab.in", 8], ["downfile.site", 8], ["expertvn.com", 8], ["trangchu.news", 8], ["3dmodelshare.org", 8], ["nulleb.com", 8], ["asiaon.top", 8], ["coursesghar.com", 8], ["thecustomrom.com", 8], ["snlookup.com", 8], ["bingotingo.com", 8], ["ghior.com", 8], ["3dmili.com", 8], ["karanpc.com", 8], ["plc247.com", 8], ["hiraethtranslation.com", 8], ["apkdelisi.net", 8], ["javindo.eu.org", 8], ["chindohot.site", 8], ["freepasses.org", 8], ["tomarnarede.pt", 8], ["basketballbuzz.ca", 8], ["dribbblegraphics.com", 8], ["kemiox.com", 8], ["checkersmenu.us", 8], ["teksnologi.com", 8], ["dollareuro.live", 8], ["eporner.com", 10], ["javtiful.com", [10, 13]], ["germancarforum.com", 11], ["innateblogger.com", 11], ["cybercityhelp.in", 11], ["streamnoads.com", [12, 13, 49]], ["bowfile.com", 12], ["cloudvideo.tv", [12, 49]], ["coloredmanga.com", 12], ["embedstream.me", [12, 13, 49]], ["exeo.app", 12], ["hiphopa.net", [12, 13]], ["megaup.net", 12], ["tv247.us", [12, 13]], ["uploadhaven.com", 12], ["userscloud.com", [12, 49]], ["mdfx9dc8n.net", 13], ["mdzsmutpcvykb.net", 13], ["mixdrop21.net", 13], ["mixdropjmk.pw", 13], ["y2tube.pro", 13], ["123movies4u.site", 13], ["1337xporn.com", 13], ["141jav.com", 13], ["1bit.space", 13], ["1bitspace.com", 13], ["38dh2.top", 13], ["3dporndude.com", 13], ["4archive.org", 13], ["4horlover.com", 13], ["560pmovie.com", 13], ["60fps.xyz", 13], ["85tube.com", 13], ["85videos.com", 13], ["8xlinks.click", 13], ["a2zcrackworld.com", 13], ["aazzz.xyz", 13], ["acefile.co", 13], ["actusports.eu", 13], ["adclickersbot.com", 13], ["adricami.com"
|
||
|
|
||
|
const entitiesMap = new Map([["pahe", [4, 13]], ["soap2day", 4], ["hqq", 6], ["waaw", 6], ["mhdsports", 8], ["mhdsportstv", 8], ["mhdtvsports", 8], ["mhdtvworld", 8], ["mhdtvmax", 8], ["mhdstream", 8], ["reset-scans", 8], ["teluguflix", 8], ["poplinks", [8, 62]], ["pixhost", 9], ["viprow", [12, 13, 49]], ["bluemediadownload", 12], ["bluemediafile", 12], ["bluemedialink", 12], ["bluemediastorage", 12], ["bluemediaurls", 12], ["urlbluemedia", 12], ["cloudvideotv", [12, 49]], ["vidsrc", [12, 49]], ["123-movies", 13], ["123movieshd", 13], ["123movieshub", 13], ["123moviesme", 13], ["1337x", [13, 27]], ["1stream", 13], ["1tamilmv", 13], ["2ddl", 13], ["2umovies", 13], ["3hiidude", 13], ["4stream", 13], ["5movies", 13], ["7hitmovies", 13], ["9xmovie", 13], ["9xlinks", 13], ["aagmaal", [13, 49]], ["adblockeronstape", 13], ["adblockeronstreamtape", 13], ["adblockplustape", 13], ["adblockstreamtape", 13], ["adblockstrtape", 13], ["adblockstrtech", 13], ["adblocktape", 13], ["adcorto", 13], ["alexsports", 13], ["alexsportss", 13], ["alexsportz", 13], ["animepahe", 13], ["animesanka", 13], ["animixplay", 13], ["aniplay", 13], ["antiadtape", 13], ["asianclub", 13], ["ask4movie", 13], ["atomixhq", [13, 49]], ["atomohd", 13], ["beinmatch", [13, 20]], ["bhaai", 13], ["buffstreams", 13], ["canalesportivo", 13], ["clickndownload", 13], ["clicknupload", 13], ["daddylive", [13, 49]], ["daddylivehd", [13, 49]], ["ddrmovies", 13], ["desiremovies", 13], ["devlib", 13], ["divxtotal", 13], ["divxtotal1", 13], ["dlhd", 13], ["dvdplay", [13, 49]], ["elixx", 13], ["enjoy4k", 13], ["estrenosflix", 13], ["estrenosflux", 13], ["estrenosgo", 13], ["f1stream", 13], ["fbstream", 13], ["file4go", 13], ["filmymeet", 13], ["filmyzilla", [13, 49]], ["findav", 13], ["findporn", 13], ["flixmaza", 13], ["flizmovies", 13], ["freetvsports", 13], ["fullymaza", 13], ["g3g", 13], ["gotxx", 13], ["grantorrent", 13], ["hdmoviesfair", [13, 49]], ["hdmoviesflix", 13], ["hiidudemoviez", 13], ["imgsen", 13], ["imgsto", 13], ["incest", 13], ["incestflix", 13], ["itopmusic", 13], ["javmost", 13], ["keeplinks", 13], ["keepvid", 13], ["keralahd", 13], ["khatrimazaful", 13], ["khatrimazafull", 13], ["leechall", 13], ["linkshorts", 13], ["mangovideo", 13], ["masaporn", 13], ["miniurl", 13], ["mirrorace", 13], ["mixdroop", 13], ["mixdrop", [13, 45]], ["mkvcage", 13], ["mlbstream", 13], ["mlsbd", 13], ["mmsbee", 13], ["motogpstream", 13], ["movieplex", 13], ["movierulzlink", 13], ["movies123", 13], ["moviesflix", 13], ["moviesmeta", 13], ["moviessources", 13], ["moviesverse", 13], ["moviezwaphd", 13], ["mrunblock", 13], ["nbastream", 13], ["newmovierulz", 13], ["nflstream", 13], ["nhlstream", 13], ["noblocktape", 13], ["nocensor", 13], ["onlyfams", 13], ["ouo", 13], ["pctfenix", [13, 49]], ["pctnew", [13, 49]], ["peliculas24", 13], ["pelisplus", 13], ["piratebay", 13], ["plyjam", 13], ["plylive", 13], ["plyvdo", 13], ["pornhoarder", 13], ["prbay", 13], ["projectfreetv", 13], ["proxybit", 13], ["psarips", 13], ["racaty", 13], ["remaxhd", 13], ["rintor", 13], ["rnbxclusive", 13], ["rnbxclusive0", 13], ["rnbxclusive1", 13], ["rojadirecta", 13], ["rojadirectaenvivo", 13], ["rugbystreams", 13], ["sadisflix", 13], ["safetxt", 13], ["shadowrangers", 13], ["shahi4u", 13], ["shahid4u1", 13], ["shahid4uu", 13], ["shavetape", 13], ["shortearn", 13], ["shorten", 13], ["shorttey", 13], ["shortzzy", 13], ["skymovieshd", 13], ["socceronline", [13, 49]], ["softarchive", 13], ["sports-stream", 13], ["sshhaa", 13], ["stapadblockuser", 13], ["stape", 13], ["stapewithadblock", 13], ["starmusiq", 13], ["strcloud", 13], ["streamadblocker", [13, 49]], ["streamadblockplus", 13], ["streamcdn", 13], ["streamhub", 13], ["streamsport", 13], ["streamta", 13], ["streamtape", 13], ["streamtapeadblockuser", 13], ["strikeout", 13], ["strtape", 13], ["strtapeadblock", 13], ["strtapeadblocker", 13], ["strtapewithadblock", 13], ["strtpe", 13], ["swatchseries", 13], ["tabooflix", 13], ["tennisstreams", 13], ["themoviesflix", 13], ["thepiratebay", 13], ["thisav", 13], ["tmearn", 13], ["toonanime", 13], ["to
|
||
|
|
||
|
const exceptionsMap = new Map([]);
|
||
|
|
||
|
/******************************************************************************/
|
||
|
|
||
|
function removeNodeText(
|
||
|
nodeName,
|
||
|
condition,
|
||
|
...extraArgs
|
||
|
) {
|
||
|
replaceNodeTextFn(nodeName, '', '', 'condition', condition || '', ...extraArgs);
|
||
|
}
|
||
|
|
||
|
function replaceNodeTextFn(
|
||
|
nodeName = '',
|
||
|
pattern = '',
|
||
|
replacement = ''
|
||
|
) {
|
||
|
const safe = safeSelf();
|
||
|
const logPrefix = safe.makeLogPrefix('replace-node-text.fn', ...Array.from(arguments));
|
||
|
const reNodeName = safe.patternToRegex(nodeName, 'i', true);
|
||
|
const rePattern = safe.patternToRegex(pattern, 'gms');
|
||
|
const extraArgs = safe.getExtraArgs(Array.from(arguments), 3);
|
||
|
const reCondition = safe.patternToRegex(extraArgs.condition || '', 'ms');
|
||
|
const stop = (takeRecord = true) => {
|
||
|
if (takeRecord) {
|
||
|
handleMutations(observer.takeRecords());
|
||
|
}
|
||
|
observer.disconnect();
|
||
|
if (safe.logLevel > 1) {
|
||
|
safe.uboLog(logPrefix, 'Quitting');
|
||
|
}
|
||
|
};
|
||
|
let sedCount = extraArgs.sedCount || 0;
|
||
|
const handleNode = node => {
|
||
|
const before = node.textContent;
|
||
|
reCondition.lastIndex = 0;
|
||
|
if (safe.RegExp_test.call(reCondition, before) === false) { return true; }
|
||
|
rePattern.lastIndex = 0;
|
||
|
if (safe.RegExp_test.call(rePattern, before) === false) { return true; }
|
||
|
rePattern.lastIndex = 0;
|
||
|
const after = pattern !== ''
|
||
|
? before.replace(rePattern, replacement)
|
||
|
: replacement;
|
||
|
node.textContent = after;
|
||
|
if (safe.logLevel > 1) {
|
||
|
safe.uboLog(logPrefix, `Text before:\n${before.trim()}`);
|
||
|
}
|
||
|
safe.uboLog(logPrefix, `Text after:\n${after.trim()}`);
|
||
|
return sedCount === 0 || (sedCount -= 1) !== 0;
|
||
|
};
|
||
|
const handleMutations = mutations => {
|
||
|
for (const mutation of mutations) {
|
||
|
for (const node of mutation.addedNodes) {
|
||
|
if (reNodeName.test(node.nodeName) === false) { continue; }
|
||
|
if (handleNode(node)) { continue; }
|
||
|
stop(false); return;
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
const observer = new MutationObserver(handleMutations);
|
||
|
observer.observe(document, { childList: true, subtree: true });
|
||
|
if (document.documentElement) {
|
||
|
const treeWalker = document.createTreeWalker(
|
||
|
document.documentElement,
|
||
|
NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT
|
||
|
);
|
||
|
let count = 0;
|
||
|
for (; ;) {
|
||
|
const node = treeWalker.nextNode();
|
||
|
count += 1;
|
||
|
if (node === null) { break; }
|
||
|
if (reNodeName.test(node.nodeName) === false) { continue; }
|
||
|
if (node === document.currentScript) { continue; }
|
||
|
if (handleNode(node)) { continue; }
|
||
|
stop(); break;
|
||
|
}
|
||
|
safe.uboLog(logPrefix, `${count} nodes present before installing mutation observer`);
|
||
|
}
|
||
|
if (extraArgs.stay) { return; }
|
||
|
runAt(() => {
|
||
|
const quitAfter = extraArgs.quitAfter || 0;
|
||
|
if (quitAfter !== 0) {
|
||
|
setTimeout(() => { stop(); }, quitAfter);
|
||
|
} else {
|
||
|
stop();
|
||
|
}
|
||
|
}, 'interactive');
|
||
|
}
|
||
|
|
||
|
function runAt(fn, when) {
|
||
|
const intFromReadyState = state => {
|
||
|
const targets = {
|
||
|
'loading': 1,
|
||
|
'interactive': 2, 'end': 2, '2': 2,
|
||
|
'complete': 3, 'idle': 3, '3': 3,
|
||
|
};
|
||
|
const tokens = Array.isArray(state) ? state : [state];
|
||
|
for (const token of tokens) {
|
||
|
const prop = `${token}`;
|
||
|
if (targets.hasOwnProperty(prop) === false) { continue; }
|
||
|
return targets[prop];
|
||
|
}
|
||
|
return 0;
|
||
|
};
|
||
|
const runAt = intFromReadyState(when);
|
||
|
if (intFromReadyState(document.readyState) >= runAt) {
|
||
|
fn(); return;
|
||
|
}
|
||
|
const onStateChange = () => {
|
||
|
if (intFromReadyState(document.readyState) < runAt) { return; }
|
||
|
fn();
|
||
|
safe.removeEventListener.apply(document, args);
|
||
|
};
|
||
|
const safe = safeSelf();
|
||
|
const args = ['readystatechange', onStateChange, { capture: true }];
|
||
|
safe.addEventListener.apply(document, args);
|
||
|
}
|
||
|
|
||
|
function safeSelf() {
|
||
|
if (scriptletGlobals.safeSelf) {
|
||
|
return scriptletGlobals.safeSelf;
|
||
|
}
|
||
|
const self = globalThis;
|
||
|
const safe = {
|
||
|
'Array_from': Array.from,
|
||
|
'Error': self.Error,
|
||
|
'Function_toStringFn': self.Function.prototype.toString,
|
||
|
'Function_toString': thisArg => safe.Function_toStringFn.call(thisArg),
|
||
|
'Math_floor': Math.floor,
|
||
|
'Math_max': Math.max,
|
||
|
'Math_min': Math.min,
|
||
|
'Math_random': Math.random,
|
||
|
'Object': Object,
|
||
|
'Object_defineProperty': Object.defineProperty.bind(Object),
|
||
|
'Object_defineProperties': Object.defineProperties.bind(Object),
|
||
|
'Object_fromEntries': Object.fromEntries.bind(Object),
|
||
|
'Object_getOwnPropertyDescriptor': Object.getOwnPropertyDescriptor.bind(Object),
|
||
|
'RegExp': self.RegExp,
|
||
|
'RegExp_test': self.RegExp.prototype.test,
|
||
|
'RegExp_exec': self.RegExp.prototype.exec,
|
||
|
'Request_clone': self.Request.prototype.clone,
|
||
|
'XMLHttpRequest': self.XMLHttpRequest,
|
||
|
'addEventListener': self.EventTarget.prototype.addEventListener,
|
||
|
'removeEventListener': self.EventTarget.prototype.removeEventListener,
|
||
|
'fetch': self.fetch,
|
||
|
'JSON': self.JSON,
|
||
|
'JSON_parseFn': self.JSON.parse,
|
||
|
'JSON_stringifyFn': self.JSON.stringify,
|
||
|
'JSON_parse': (...args) => safe.JSON_parseFn.call(safe.JSON, ...args),
|
||
|
'JSON_stringify': (...args) => safe.JSON_stringifyFn.call(safe.JSON, ...args),
|
||
|
'log': console.log.bind(console),
|
||
|
// Properties
|
||
|
logLevel: 0,
|
||
|
// Methods
|
||
|
makeLogPrefix(...args) {
|
||
|
return this.sendToLogger && `[${args.join(' \u205D ')}]` || '';
|
||
|
},
|
||
|
uboLog(...args) {
|
||
|
if (this.sendToLogger === undefined) { return; }
|
||
|
if (args === undefined || args[0] === '') { return; }
|
||
|
return this.sendToLogger('info', ...args);
|
||
|
|
||
|
},
|
||
|
uboErr(...args) {
|
||
|
if (this.sendToLogger === undefined) { return; }
|
||
|
if (args === undefined || args[0] === '') { return; }
|
||
|
return this.sendToLogger('error', ...args);
|
||
|
},
|
||
|
escapeRegexChars(s) {
|
||
|
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||
|
},
|
||
|
initPattern(pattern, options = {}) {
|
||
|
if (pattern === '') {
|
||
|
return { matchAll: true };
|
||
|
}
|
||
|
const expect = (options.canNegate !== true || pattern.startsWith('!') === false);
|
||
|
if (expect === false) {
|
||
|
pattern = pattern.slice(1);
|
||
|
}
|
||
|
const match = /^\/(.+)\/([gimsu]*)$/.exec(pattern);
|
||
|
if (match !== null) {
|
||
|
return {
|
||
|
re: new this.RegExp(
|
||
|
match[1],
|
||
|
match[2] || options.flags
|
||
|
),
|
||
|
expect,
|
||
|
};
|
||
|
}
|
||
|
if (options.flags !== undefined) {
|
||
|
return {
|
||
|
re: new this.RegExp(this.escapeRegexChars(pattern),
|
||
|
options.flags
|
||
|
),
|
||
|
expect,
|
||
|
};
|
||
|
}
|
||
|
return { pattern, expect };
|
||
|
},
|
||
|
testPattern(details, haystack) {
|
||
|
if (details.matchAll) { return true; }
|
||
|
if (details.re) {
|
||
|
return this.RegExp_test.call(details.re, haystack) === details.expect;
|
||
|
}
|
||
|
return haystack.includes(details.pattern) === details.expect;
|
||
|
},
|
||
|
patternToRegex(pattern, flags = undefined, verbatim = false) {
|
||
|
if (pattern === '') { return /^/; }
|
||
|
const match = /^\/(.+)\/([gimsu]*)$/.exec(pattern);
|
||
|
if (match === null) {
|
||
|
const reStr = this.escapeRegexChars(pattern);
|
||
|
return new RegExp(verbatim ? `^${reStr}$` : reStr, flags);
|
||
|
}
|
||
|
try {
|
||
|
return new RegExp(match[1], match[2] || undefined);
|
||
|
}
|
||
|
catch (ex) {
|
||
|
}
|
||
|
return /^/;
|
||
|
},
|
||
|
getExtraArgs(args, offset = 0) {
|
||
|
const entries = args.slice(offset).reduce((out, v, i, a) => {
|
||
|
if ((i & 1) === 0) {
|
||
|
const rawValue = a[i + 1];
|
||
|
const value = /^\d+$/.test(rawValue)
|
||
|
? parseInt(rawValue, 10)
|
||
|
: rawValue;
|
||
|
out.push([a[i], value]);
|
||
|
}
|
||
|
return out;
|
||
|
}, []);
|
||
|
return this.Object_fromEntries(entries);
|
||
|
},
|
||
|
onIdle(fn, options) {
|
||
|
if (self.requestIdleCallback) {
|
||
|
return self.requestIdleCallback(fn, options);
|
||
|
}
|
||
|
return self.requestAnimationFrame(fn);
|
||
|
},
|
||
|
};
|
||
|
scriptletGlobals.safeSelf = safe;
|
||
|
if (scriptletGlobals.bcSecret === undefined) { return safe; }
|
||
|
// This is executed only when the logger is opened
|
||
|
const bc = new self.BroadcastChannel(scriptletGlobals.bcSecret);
|
||
|
let bcBuffer = [];
|
||
|
safe.logLevel = scriptletGlobals.logLevel || 1;
|
||
|
safe.sendToLogger = (type, ...args) => {
|
||
|
if (args.length === 0) { return; }
|
||
|
const text = `[${document.location.hostname || document.location.href}]${args.join(' ')}`;
|
||
|
if (bcBuffer === undefined) {
|
||
|
return bc.postMessage({ what: 'messageToLogger', type, text });
|
||
|
}
|
||
|
bcBuffer.push({ type, text });
|
||
|
};
|
||
|
bc.onmessage = ev => {
|
||
|
const msg = ev.data;
|
||
|
switch (msg) {
|
||
|
case 'iamready!':
|
||
|
if (bcBuffer === undefined) { break; }
|
||
|
bcBuffer.forEach(({ type, text }) =>
|
||
|
bc.postMessage({ what: 'messageToLogger', type, text })
|
||
|
);
|
||
|
bcBuffer = undefined;
|
||
|
break;
|
||
|
case 'setScriptletLogLevelToOne':
|
||
|
safe.logLevel = 1;
|
||
|
break;
|
||
|
case 'setScriptletLogLevelToTwo':
|
||
|
safe.logLevel = 2;
|
||
|
break;
|
||
|
}
|
||
|
};
|
||
|
bc.postMessage('areyouready?');
|
||
|
return safe;
|
||
|
}
|
||
|
|
||
|
/******************************************************************************/
|
||
|
|
||
|
const hnParts = [];
|
||
|
try { hnParts.push(...document.location.hostname.split('.')); }
|
||
|
catch (ex) { }
|
||
|
const hnpartslen = hnParts.length;
|
||
|
if (hnpartslen === 0) { return; }
|
||
|
|
||
|
const todoIndices = new Set();
|
||
|
const tonotdoIndices = [];
|
||
|
|
||
|
// Exceptions
|
||
|
if (exceptionsMap.size !== 0) {
|
||
|
for (let i = 0; i < hnpartslen; i++) {
|
||
|
const hn = hnParts.slice(i).join('.');
|
||
|
const excepted = exceptionsMap.get(hn);
|
||
|
if (excepted) { tonotdoIndices.push(...excepted); }
|
||
|
}
|
||
|
exceptionsMap.clear();
|
||
|
}
|
||
|
|
||
|
// Hostname-based
|
||
|
if (hostnamesMap.size !== 0) {
|
||
|
const collectArgIndices = hn => {
|
||
|
let argsIndices = hostnamesMap.get(hn);
|
||
|
if (argsIndices === undefined) { return; }
|
||
|
if (typeof argsIndices === 'number') { argsIndices = [argsIndices]; }
|
||
|
for (const argsIndex of argsIndices) {
|
||
|
if (tonotdoIndices.includes(argsIndex)) { continue; }
|
||
|
todoIndices.add(argsIndex);
|
||
|
}
|
||
|
};
|
||
|
for (let i = 0; i < hnpartslen; i++) {
|
||
|
const hn = hnParts.slice(i).join('.');
|
||
|
collectArgIndices(hn);
|
||
|
}
|
||
|
collectArgIndices('*');
|
||
|
hostnamesMap.clear();
|
||
|
}
|
||
|
|
||
|
// Entity-based
|
||
|
if (entitiesMap.size !== 0) {
|
||
|
const n = hnpartslen - 1;
|
||
|
for (let i = 0; i < n; i++) {
|
||
|
for (let j = n; j > i; j--) {
|
||
|
const en = hnParts.slice(i, j).join('.');
|
||
|
let argsIndices = entitiesMap.get(en);
|
||
|
if (argsIndices === undefined) { continue; }
|
||
|
if (typeof argsIndices === 'number') { argsIndices = [argsIndices]; }
|
||
|
for (const argsIndex of argsIndices) {
|
||
|
if (tonotdoIndices.includes(argsIndex)) { continue; }
|
||
|
todoIndices.add(argsIndex);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
entitiesMap.clear();
|
||
|
}
|
||
|
|
||
|
// Apply scriplets
|
||
|
for (const i of todoIndices) {
|
||
|
try { removeNodeText(...argsList[i]); }
|
||
|
catch (ex) { }
|
||
|
}
|
||
|
argsList.length = 0;
|
||
|
|
||
|
/******************************************************************************/
|
||
|
|
||
|
};
|
||
|
// End of code to inject
|
||
|
|
||
|
/******************************************************************************/
|
||
|
|
||
|
// Inject code
|
||
|
|
||
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=1736575
|
||
|
// 'MAIN' world not yet supported in Firefox, so we inject the code into
|
||
|
// 'MAIN' ourself when environment in Firefox.
|
||
|
|
||
|
const targetWorld = 'ISOLATED';
|
||
|
|
||
|
// Not Firefox
|
||
|
if (typeof wrappedJSObject !== 'object' || targetWorld === 'ISOLATED') {
|
||
|
return uBOL_removeNodeText();
|
||
|
}
|
||
|
|
||
|
// Firefox
|
||
|
{
|
||
|
const page = self.wrappedJSObject;
|
||
|
let script, url;
|
||
|
try {
|
||
|
page.uBOL_removeNodeText = cloneInto([
|
||
|
['(', uBOL_removeNodeText.toString(), ')();'],
|
||
|
{ type: 'text/javascript; charset=utf-8' },
|
||
|
], self);
|
||
|
const blob = new page.Blob(...page.uBOL_removeNodeText);
|
||
|
url = page.URL.createObjectURL(blob);
|
||
|
const doc = page.document;
|
||
|
script = doc.createElement('script');
|
||
|
script.async = false;
|
||
|
script.src = url;
|
||
|
(doc.head || doc.documentElement || doc).append(script);
|
||
|
} catch (ex) {
|
||
|
console.error(ex);
|
||
|
}
|
||
|
if (url) {
|
||
|
if (script) { script.remove(); }
|
||
|
page.URL.revokeObjectURL(url);
|
||
|
}
|
||
|
delete page.uBOL_removeNodeText;
|
||
|
}
|
||
|
|
||
|
/******************************************************************************/
|
||
|
|
||
|
// End of local scope
|
||
|
})();
|
||
|
|
||
|
/******************************************************************************/
|
||
|
|
||
|
void 0;
|