It looks like this is a web page, not a feed. I looked for a feed associated with this page, but couldn't find one. Please enter the address of your feed to validate.

Source: http://cracking.com.ar

  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <!-- Does not work
  5. <meta http-equiv="Supports-Loading-Mode" content="fenced-frame">
  6. -->
  7. <title>Fast Hack'em v.0.0.3</title>
  8. </head>
  9. <body>
  10. <div id="eScreen" style="float:left;width:96%;margin:0px;padding:0px;font-size:14px;font-family: Monospace, Arial, sans-serif, Helvetica;"></div>
  11. <div id="scratch">id:scratch Write here using w("<b>Hello</b>")</div>
  12. <iframe name="ifn" id="ifd" style="width:96%;height:800px;margin:0px;padding:0px;"></iframe>
  13. <script>
  14. //document.write('<script async src="tracker.js?project_key=92d0c4de-8609-4d63-ba27-3df02ccfcde9&rnd='+Math.random()+'"><\/script>');
  15. //Object.getOwnPropertyDescriptor = Object.defineProperty = Object.create = Object.entries =
  16. /*
  17. window.eval = function(e){alert(e);console.log(e)}
  18. g = Object.getOwnPropertyDescriptors;
  19. Object.getOwnPropertyDescriptors = function(o)
  20. {
  21. console.log(o);
  22. alert("g:" + o);
  23. return g(o);
  24. }
  25. */
  26. //const navigationTimings = performance.getEntriesByType("navigation")[0].transferSize;
  27. //document.write("PERF:" + (navigationTimings.transferSize));
  28. /*
  29. async function createFenced(){
  30. const URLs = [{url:'fence.php'}];
  31. await window.sharedStorage.worklet.addModule("worklet.js");
  32. const resolveToConfig = window.FencedFrameConfig !== void 0;
  33. let opaqueURL = await window.sharedStorage.selectURL("ts", URLs, {resolveToConfig, keepAlive:true});
  34. if (resolveToConfig && opaqueURL instanceof FencedFrameConfig) document.body.appendChild(Object.assign(document.createElement('fencedframe'), {mode: 'opaque-ads', config: opaqueURL, width:1000, height:800, id:'fenced'}));
  35. }
  36. */
  37. if (window === top)
  38. {
  39. }
  40. else
  41. {
  42. eScreen.style.width = "95%";
  43. ifd.style.width = "3%";
  44. }
  45.  
  46.  
  47. function createError()
  48. {
  49. try
  50. {
  51. nothing()
  52. //null[0]();
  53. }
  54. catch(error)
  55. {
  56. log(error.stack.toString());
  57. }
  58. }
  59. //setTimeout(createError, 1000);
  60. function logMe()
  61. {
  62. var logData = ` isActive: ${navigator.userActivation.isActive}
  63. hasBeenActive: ${navigator.userActivation.hasBeenActive}
  64. location: ${location.href}
  65. `;
  66. log(logData.replace(/\n/g,'<br />'));
  67. }
  68. var timer;
  69.  
  70. const cmd = {
  71. get start() {
  72. timer = setInterval(logMe, 1000);
  73. return 1;
  74. },
  75. set start(arg) {
  76.  
  77. },
  78. get stop() {
  79. clearInterval(timer);
  80. return 1;
  81. },
  82.  
  83. };
  84.  
  85.  
  86. (function (){
  87. /*
  88. var eScreen = document.createElement("div");
  89. eScreen.style.width = "46%";
  90. eScreen.style.margin = "0px";
  91. eScreen.style.padding = "0px";
  92. eScreen.style.fontSize = "14px";
  93. eScreen.style.fontFamily = "Monospace, Arial, sans-serif, Helvetica";
  94. eScreen.style.float = "left";
  95. */
  96. //let iFrame = document.createElement("iframe");
  97.  
  98.  
  99. ///////////////////////// Code TextArea
  100. var eCode = document.createElement("textarea");
  101. /*
  102. eCode.onchange = function(e)
  103. {
  104. window.x = e;
  105. alert(e.isTrusted);
  106. }
  107. */
  108. eCode.name = "taCode";
  109. eCode.style.width = "100%";
  110. eCode.rows = "20";
  111. eCode.style.backgroundColor = "#000000";
  112. eCode.style.color = "#30ee30";
  113. eCode.style.fontSize = "16px";
  114. eCode.style.padding = "5px";
  115. eCode.autofocus = true;
  116. eCode.autocorrect = "off";
  117. eCode.autocapitalize = "off";
  118. eCode.spellcheck = false;
  119. eCode.ondblclick = function(e)
  120. {
  121. var ret = eval(this.value);
  122. log(ret);
  123. }
  124. eCode.onkeydown = function(e)
  125. {
  126. if (typeof e == "undefined") e = event;
  127. if ((e.keyCode == 13 || e.keyCode == 10) && (e.metaKey || e.ctrlKey || e.shiftKey) ||
  128. (e.key == "@" || e.key == "#")
  129. )
  130. {
  131. if (e.preventDefault) e.preventDefault();
  132.  
  133. try
  134. {
  135. var ret = eval(this.value);
  136. }
  137. catch(e)
  138. {
  139. log("Error: " + e);
  140. return;
  141. }
  142.  
  143. if (e.metaKey || e.ctrlKey || e.key == "@" || e.key == "#") // Log either eval or enum
  144. {
  145. if (e.shiftKey && !(e.key == "@" || e.key == "#")) log(prettyEnumObject(ret));
  146. else if (e.altKey || e.key == "#") log(remoteSave(prettyEnumObject(ret, true)));
  147. else log(ret);
  148. }
  149. }
  150. }
  151.  
  152. ///////////////////////// Code Log-Status
  153. var eLog = document.createElement("div");
  154. eLog.style.width = "100%";
  155. eLog.style.height = "300pt";
  156. eLog.style.margin = "0px";
  157. eLog.style.padding = "0px";
  158. eLog.style.wordWrap = "break-word";
  159. eLog.style.overflow = "scroll";
  160. eLog.style.padding = "5px";
  161. eLog.style.backgroundColor = "#000000";
  162. eLog.style.color = "#ffffff";
  163. eLog.style.border = "1px solid #eeeeee";
  164. eLog.innerHTML  = "Fast Hack'em";
  165.  
  166. eScreen.appendChild(eCode);
  167. eScreen.appendChild(eLog);
  168. //document.body.appendChild(eScreen);
  169.  
  170. window.log = function log(msg, append = false) {
  171.    if (append) {
  172.        return eLog.innerHTML += '<br />' + msg;
  173.    } else {
  174.        return eLog.innerHTML = msg;
  175.    }
  176. };
  177.  
  178. function rot(s, i)
  179. {
  180. return void 0 === i && (i = 13), s.replace(/[A-Za-z]/g, function(c)
  181. {
  182. return String.fromCharCode(c.charCodeAt(0) + (c.toUpperCase() <= "M" ? i : -i));
  183. });
  184. }
  185. //console.log = window.log;
  186.  
  187. function enumMembers(obj) // Returns an array of Strings of the members of the object
  188. {
  189. //Object.getOwnPropertyDescriptors(window)
  190. var instanceValues = Object.getOwnPropertyNames(obj);
  191. if (Object.getPrototypeOf(obj) != null)
  192. {
  193. instanceValues = instanceValues.concat(enumMembers(Object.getPrototypeOf(obj)));
  194. }
  195. return instanceValues;
  196. }
  197. function prettyEnumObject(obj, bPlainText)
  198. {
  199. var arrMembersList = enumMembers(obj);
  200. if (bPlainText)
  201. {
  202. var prettyList = obj.toString() + "\n";
  203. for (var i in arrMembersList)
  204. {
  205. var strMemberName = arrMembersList[i];
  206. var refMember = obj[strMemberName];
  207. prettyList += strMemberName + " = " + refMember + "\n";
  208. }
  209.  
  210. }
  211. else
  212. {
  213. var prettyList = "<strong>" + obj.toString() + "</strong><br />";
  214. for (var i in arrMembersList)
  215. {
  216. var strMemberName = arrMembersList[i];
  217. var refMember = obj[strMemberName];
  218. var memberType = typeof refMember;
  219. var prettyMemberValue = "";
  220. var prettyMemberName = '<span style="color:#aaaaaa">' + strMemberName + '</span>';
  221. if (memberType == "object") prettyMemberName = '<span style="color:#aaaaaa;cursor:pointer" onclick="alert(this.innerText)">' + strMemberName + '</span>';
  222. var memberValueColor = {
  223. "string"  : "#dddddd",
  224. "number"  : "#ff8080",
  225. "object"  : "#80ff80",
  226. "boolean" : "#8080ff",
  227. "function": "#a0a0cc"
  228. }
  229. //if (memberType == "object") prettyMemberValue = '<span onclick="alert(\''+refMember+'\')" style="cursor:pointer;color:' + memberValueColor[memberType] + '">' + refMember + '</span>';
  230. prettyMemberValue = '<span style="color:' + memberValueColor[memberType] + '">' + refMember + '</span>';
  231. prettyList += prettyMemberName + " = " + prettyMemberValue + "<br />";
  232. }
  233. }
  234. return prettyList;
  235. }
  236.  
  237. // Detects if Chrome Extension Resource exists and is accessible
  238. // Vivaldi Sample: ext("chrome-extension://jffbochibkahlbbmanpmndnhmeliecah/config.json")
  239. function ext(ext)
  240. {
  241.    var request = new XMLHttpRequest();
  242.    request.open("GET", ext, false);
  243.    try {
  244.       request.send(null);
  245.    } catch(_) {
  246.        return false;
  247.    }
  248.  
  249.    if (request.status === 200) {
  250.        return true;
  251.    }
  252. }
  253. //ext("chrome-extension://jffbochibkahlbbmanpmndnhmeliecah/config.json")
  254.  
  255. function fav(url)
  256. {
  257.    var link = document.querySelector("link[rel~='icon']");
  258.    if (!link)
  259.    {
  260.        var link = document.createElement('link');
  261.        link.rel = 'icon';
  262.        document.getElementsByTagName('head')[0].appendChild(link);
  263.    }
  264.    link.href = url;
  265. }
  266. //fav("https://www.google.com/favicon.ico");
  267.  
  268.  
  269. var isolatedIFrame = window;
  270.  
  271. function workerCodeWrappedAsFunction()
  272. {
  273.    function probeExtensionInsideWorker(extensionURL)
  274.    {
  275.        var isExtensionInstalled = false;
  276.        var syncXHR = new XMLHttpRequest();
  277.        syncXHR.open("GET", extensionURL, false);
  278.        try
  279.        {
  280.            syncXHR.send(null);
  281.            if (syncXHR.status === 200) {isExtensionInstalled = true;}
  282.        }
  283.        catch(e){}
  284.        return isExtensionInstalled;
  285.    }
  286.    self.onmessage = function(messageEvent)
  287.    {
  288.        // messageEvent.data is the extensionURL to probe
  289.        var isInstalled = probeExtensionInsideWorker(messageEvent.data);
  290.        if (isInstalled) self.postMessage(messageEvent.data);
  291.    }
  292.  
  293.    
  294. }
  295.  
  296. // Converts the contexts (text) of workerCodeWrappedAsFunction to a real Blob
  297. // so we can easily use it as the code inside the Worker.
  298. var strFn = workerCodeWrappedAsFunction.toString();
  299. var strWorkerCode = strFn.slice(strFn.indexOf("{") + 1, strFn.lastIndexOf("}"));
  300. var workerBlob = new Blob([strWorkerCode], {type: 'application/javascript'});
  301. var workerUrl = isolatedIFrame.URL.createObjectURL(workerBlob);
  302.  
  303.  
  304.  
  305. var workerToProbeExtensions = false, arrayWithCallbacks = null, timeoutToKillWorker = 0;
  306. function initWorker()
  307. {
  308.    if (!workerToProbeExtensions)
  309.    {
  310.        arrayWithCallbacks = [];
  311.        workerToProbeExtensions = new isolatedIFrame.Worker(workerUrl);
  312.        workerToProbeExtensions.addEventListener("message", function (messageEvent)
  313.        {
  314.            arrayWithCallbacks[messageEvent.data]();
  315.        });
  316.    }
  317.    
  318.    clearTimeout(timeoutToKillWorker);
  319.    timeoutToKillWorker = setTimeout(function()
  320.    {   // Destroy Worker and clean callbacks Array
  321.        workerToProbeExtensions.terminate();
  322.        workerToProbeExtensions = false;
  323.        arrayWithCallbacks = null;
  324.    }, 3000);
  325.  
  326. }
  327. function probeExtensionNoisy(url, callback)
  328. {
  329.    initWorker();
  330.    arrayWithCallbacks[url] = callback;
  331.    workerToProbeExtensions.postMessage(url);
  332.  
  333. }
  334.  
  335. //probeExtensionNoisy("chrome-extension://jffbochibkahlbbmanpmndnhmeliecah/config.json", function(){alert("yes")});
  336.  
  337.  
  338. window.logep = function(obj)
  339. {
  340. const pretty = prettyEnumObject(obj, true);
  341. remoteSave(pretty);
  342. //log(pretty);
  343. return pretty;
  344. }
  345. window.remoteSave = function(str)
  346. {
  347. /*
  348. //let str = "your_data_here"; // Your data string
  349.  
  350. // Ensure the string is within the max size limit
  351. //str = str.substring(0, MAX_SIZE);
  352. const data = `data=${encodeURIComponent(str)}`;
  353. fetch("remote_save.php", {
  354. method: "POST",
  355. headers: {
  356. "Content-Type": "application/x-www-form-urlencoded"
  357. },
  358. body: data
  359. })
  360. .then(response => response.text())
  361. .then(result => {
  362. console.log("Success:", result);
  363. })
  364. .catch(error => {
  365. console.error("Error:", error);
  366. });
  367. */
  368. var xhttp = new XMLHttpRequest();
  369. xhttp.open("POST", "remote_save.php", true);
  370. xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  371. //MAX_SIZE = 3200;
  372. //str = str.substring(0, MAX_SIZE);
  373. xhttp.send("data=" + escape(str));
  374. return str;
  375.  
  376. }
  377. function autoLog()
  378. {
  379. log(remoteSave(prettyEnumObject(ret, true)));
  380. }
  381. if (location.hash.substring(1,4) == "log")
  382. {
  383. var strObject = location.hash.substring(5);
  384. var obj = eval(strObject);
  385. log(remoteSave(prettyEnumObject(obj, true)));
  386. }
  387. else if (location.hash.substring(1,4) == "cmd")
  388. {
  389. var command = location.hash.substring(5);
  390. cmd[command];
  391. }
  392. /*
  393. window.loge = function(__tempObject)
  394. {
  395. var strEnum  = forIn(__tempObject);
  396. var __tempObject_Enum = strEnum.replace(/</g, "&lt;").replace(/>/g, "&gt;");
  397. __tempObject_Enum = __tempObject_Enum.replace(/\n/gi, "<br />").replace(/NO_ACCESS/g, "<font color=\"red\">NO_ACCESS</font>").replace(/(\[[^\]]*\])/g, "<font color=\"yellow\">$1</font>");
  398. __tempObject_Enum = __tempObject_Enum.replace(/CUSTOM_ERROR/g, "<font color=\"red\">CUSTOM_ERROR</font>");
  399. __tempObject_Enum = __tempObject_Enum.replace(/(null)|(undefined)/gi, "<font color=\"#999999\">$1$2</font>");
  400.  
  401. log(__tempObject_Enum);
  402. document.getElementById("notepad").value = strEnum;
  403. }
  404. window.logep = function(__tempObject)
  405. {
  406. loge(__tempObject);
  407. post();
  408. }
  409.  
  410.  
  411. window.addEventListener('error', function (e)
  412. {
  413. console.log(e);
  414. log(e.message);// + "<br />" + url + "<br />" + lineNo + "<br />" + columnNo + "<br />" + error);
  415. })
  416. */
  417.  
  418. })();
  419.  
  420. /*
  421. var str = "";
  422. function showPaintTimings() {
  423. let performance = window.performance;
  424. let performanceEntries = performance.getEntriesByType('paint');
  425. performanceEntries.forEach( (performanceEntry, i, entries) => {
  426. str += ("The time to " + performanceEntry.name + " was " + performanceEntry.startTime + " milliseconds.\n");
  427. console.log(str);
  428. });
  429.  }
  430.  
  431. setTimeout("showPaintTimings()",1000);
  432. setTimeout(function(){
  433. z = new Image();
  434. z.src = "https://www.cracking.com.ar/fh/remote_save.php?data=" + escape(str);
  435. }, 3000)
  436. */
  437. /* Inline worker code
  438. function getWorkerCode()
  439. {
  440.    function workerCode()
  441.    {
  442.        self.onmessage = function(event)
  443.        {
  444. console.log(navigator)
  445.            self.postMessage(navigator.toString());
  446.        }
  447.    }
  448.    var strFn = workerCode.toString();
  449.    return strFn.slice(strFn.indexOf("{") + 1, strFn.lastIndexOf("}"));
  450. }
  451.  
  452.  
  453. var workerCode = getWorkerCode();//"self.onmessage=function(e){postMessage('Worker: '+e.data);}";
  454.  
  455. var blob;
  456. try {
  457.    blob = new Blob([workerCode], {type: 'application/javascript'});
  458. } catch (e) { // Backwards-compatibility
  459.    window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
  460.    blob = new BlobBuilder();
  461.    blob.append(workerCode);
  462.    blob = blob.getBlob();
  463. }
  464. var worker = new Worker(URL.createObjectURL(blob));
  465.  
  466. // Test, used in all examples:
  467. worker.onmessage = function(e)
  468. {
  469.    alert('Worker Response:\n' + e.data);
  470. };
  471. worker.postMessage('Test');
  472. */
  473.  
  474.  
  475. function w(htmlCode)
  476. {
  477. document.getElementById("scratch").innerHTML = htmlCode;
  478. return "Code written in scratch";
  479. }
  480. function eventEnum(obj, callback)
  481. {
  482.    if (!callback) var callback = function(e){alert(e.type)};
  483.    obj.onabort=obj.onanimationend=obj.onanimationiteration=obj.onanimationstart=obj.onauxclick=obj.onbeforecopy=obj.onbeforecut=obj.onbeforepaste=obj.onbeforexrselect=obj.onblur=obj.oncancel=obj.oncanplay=obj.oncanplaythrough=obj.onchange=obj.onclick=obj.onclose=obj.oncontextmenu=obj.oncopy=obj.oncuechange=obj.oncut=obj.ondblclick=obj.ondrag=obj.ondragend=obj.ondragenter=obj.ondragleave=obj.ondragover=obj.ondragstart=obj.ondrop=obj.ondurationchange=obj.onemptied=obj.onended=obj.onerror=obj.onfocus=obj.onformdata=obj.onfullscreenchange=obj.onfullscreenerror=obj.ongotpointercapture=obj.oninput=obj.oninvalid=obj.onkeydown=obj.onkeypress=obj.onkeyup=obj.onload=obj.onloadeddata=obj.onloadedmetadata=obj.onloadstart=obj.onlostpointercapture=obj.onmousedown=obj.onmouseenter=obj.onmouseleave=obj.onmousemove=obj.onmouseout=obj.onmouseover=obj.onmouseup=obj.onmousewheel=obj.onpaste=obj.onpause=obj.onplay=obj.onplaying=obj.onpointercancel=obj.onpointerdown=obj.onpointerenter=obj.onpointerleave=obj.onpointermove=obj.onpointerout=obj.onpointerover=obj.onpointerrawupdate=obj.onpointerup=obj.onprogress=obj.onratechange=obj.onreadystatechange=obj.onreset=obj.onresize=obj.onscroll=obj.onsearch=obj.onseeked=obj.onseeking=obj.onselect=obj.onselectionchange=obj.onselectstart=obj.onstalled=obj.onsubmit=obj.onsuspend=obj.ontimeupdate=obj.ontoggle=obj.ontransitioncancel=obj.ontransitionend=obj.ontransitionrun=obj.ontransitionstart=obj.onvolumechange=obj.onwaiting=obj.onwebkitanimationend=obj.onwebkitanimationiteration=obj.onwebkitanimationstart=obj.onwebkitfullscreenchange=obj.onwebkitfullscreenerror=obj.onwebkittransitionend=obj.onwheel=callback;
  484. }
  485.  
  486. function fnOnMessage(e)
  487. {
  488. alert( "document.URL: " + document.URL + "\n" +
  489. "e.data: " + e.data + "\n" +
  490. "typeof e.data: " + typeof e.data + "\n" +
  491. "callee.caller has: " + arguments.callee.caller + "\n"
  492. );
  493. }
  494. //window.addEventListener("message", fnOnMessage, false);
  495.  
  496. ////////////////////////////////////////////////////////////////////////////////////////////
  497. /*
  498. var scratchDiv = document.createElement("div");
  499. scratchDiv.setAttribute("style","position:absolute:top:-100px;width:1px;height:1px;visibility:hidden");
  500. document.body.appendChild(scratchDiv);
  501. */
  502. var scratchDiv = document.getElementById("scratch");
  503. const ERROR = -1, NOT_INITIALIZED = 0,  INITIALIZING = 1, READY = 2;
  504. var state = NOT_INITIALIZED;
  505. var queueExtensions = new Array();
  506. function initProbeExtension()
  507. {
  508. if (state === NOT_INITIALIZED)
  509. {
  510. state = INITIALIZING;
  511. //console.log("INITIALIZING");
  512. var obj = document.createElement("object");
  513. obj.setAttribute("style","width:1px;height:1px;visibility:hidden");
  514. obj.type = "text/plain";
  515. var toInvalidLoad = setTimeout(function()
  516. {
  517. state = READY; // probeExtension works well. We can safely assume that it will work as expected.
  518. probeExtension(); // Start testing extensions
  519. }, 400);
  520. obj.onload = function()
  521. {
  522. state = ERROR; // probeExtension throws FPs. Can't be used during this session.
  523. clearTimeout(toInvalidLoad);
  524. alert("FP on extension load")
  525. }
  526. obj.data = "chrome-extension://agnangantblacabcerducharleorepsu/dshawo.json";
  527. scratchDiv.appendChild(obj);
  528. }
  529. }
  530. function probeExtension(url, callback)
  531. {
  532. if (arguments.length > 0) {queueExtensions.push([url, callback]);}
  533. if (state === READY) // Create the object
  534. {
  535. while (queueExtensions.length > 0)
  536. {
  537. var obj = document.createElement("object");
  538. obj.setAttribute("style","width:1px;height:1px;visibility:hidden");
  539. obj.type = "text/plain";
  540. var extFromQueue = queueExtensions.shift();
  541. obj.onload = extFromQueue[1]; // callback
  542. obj.data =   extFromQueue[0]; // extension url
  543. scratchDiv.appendChild(obj);
  544. }
  545. // Destroy objects
  546. state = INITIALIZING;
  547. setTimeout(function(){
  548. scratchDiv.innerHTML = "";
  549. state = READY;
  550. if (queueExtensions.length > 0) {probeExtension();}
  551. }, 1500);
  552. }
  553. else if (state === NOT_INITIALIZED)
  554. {
  555. initProbeExtension();
  556. }
  557. }
  558. ////////////////////////////////////////////////////////////////////////////////////////////
  559. ////////////////////////////////////////////////////////////////////////////////////////////
  560. probeExtension("chrome-extension://dehdhmbfpjfihgpekceokjdeeheinkfo/intercept.js", function(){alert("Epic")});
  561. function classExists(className) {
  562.    var styleSheets = document.styleSheets;
  563.    for (var i = 0; i < styleSheets.length; i++) {
  564.      var rules = styleSheets[i].cssRules || styleSheets[i].rules;
  565.      for (var j = 0; j < rules.length; j++) {
  566.        if (rules[j].selectorText === '.' + className) {
  567.          return true;
  568.        }
  569.      }
  570.    }
  571.    return false;
  572.  }
  573. /*
  574. function isWebView()
  575. {
  576. var wb = window.document?.documentElement?.clientHeight === window.document?.documentElement?.scrollHeight;
  577. return wb;
  578. }
  579. */
  580. function isWebView()
  581. {
  582.    // Writes a string with a telephone number format.
  583.    // Real Safari Mobile converts it to a tel: link
  584.    if ("safari" in window) return false;
  585. const iFrameWebView = document.createElement('iframe');
  586.    iFrameWebView.style.dislay = "none";
  587.    iFrameWebView.style.width = iFrameWebView.style.height = '0px';
  588.    document.body.appendChild(iFrameWebView);
  589.    iFrameWebView.contentDocument.write("123-123-123");
  590.    iFrameWebView.contentDocument.close();
  591.    const isWebView = iFrameWebView.contentDocument.links.length === 0;
  592.    iFrameWebView.remove();
  593.    return isWebView;
  594. }
  595.  
  596. ////////////////////////////////////////////////
  597. // Custom Protocol Detection
  598. function protocolExists(protocol) {
  599.    var w = null;
  600.    try {
  601.        w = new Worker(protocol);
  602.    }
  603.    catch(e) {
  604.        try {
  605.            if (w && w.terminate) w.terminate();
  606.            return e.toString().indexOf("valid URL") !== -1;
  607.        }
  608.        catch (f) {
  609.            return false;
  610.        }
  611.    }
  612. }
  613. /*
  614. if (protocolExists("brave://")) alert("Brave");
  615. if (protocolExists("edge://")) alert("Edge");
  616. if (protocolExists("puffin://")) alert("Puffin");
  617. if (protocolExists("app://")) alert("Electron");
  618. */
  619. /*
  620.  
  621. html {height: 100vh;}
  622. body {height: 100%;position: fixed;}
  623.  
  624. */
  625. /*
  626.  function resourceLoader(url)
  627. {
  628. var obj = document.createElement("object");
  629. obj.setAttribute("style","width:1px;height:1px;visibility:hidden");
  630. obj.type = "text/plain";
  631. obj.onload = function(){alert("Loaded")}
  632. obj.data = url;
  633. document.body.appendChild(obj);
  634. }
  635. resourceLoader("chrome-extension://does_not_exist");
  636.  */
  637.  
  638. function enabledCDP() {
  639.  var cnt = 0, fs = '%c', tr = new EvalError();
  640.  Object.defineProperty(tr, "name", {get() {cnt++; return '';}});
  641.  console.context().log(fs, tr);
  642.  return cnt > 1;
  643. }
  644.  
  645. if (enabledCDP()) log("CDP Detected", true);
  646.  
  647. const match = navigator.userAgent.match(/Chrome\/(\d+)\./);
  648. const version = match ? match[1] : null;
  649. log("Browser Version: " + version, true);
  650.  
  651.  
  652. /* Good for modern browsers
  653. async function uaOverride(){
  654. let uaData = await navigator.userAgentData.getHighEntropyValues([
  655. "architecture",
  656. "bitness",
  657. "model",
  658. "platformVersion",
  659. "uaFullVersion"
  660. ]);
  661. const uaOverride = uaData.architecture === '' && uaData.model === '' && uaData.bitness === '' &&
  662. uaData.platformVersion === '' && uaData.uaFullVersion === '';
  663. if(uaOverride) log("UA Override", true);
  664. console.log(uaData);
  665. }
  666. uaOverride();
  667. */
  668. // Does not throw errors on IE
  669. function uaDataHighEntropy(callback) {
  670.    if (!navigator.userAgentData || typeof navigator.userAgentData.getHighEntropyValues !== 'function') {
  671.        callback(false);
  672.        return;
  673.    }
  674.    try {
  675.        navigator.userAgentData.getHighEntropyValues([
  676.            "architecture",
  677.            "bitness",
  678.            "model",
  679.            "platformVersion",
  680.            "uaFullVersion"
  681.        ])
  682.        .then(function(ua) {
  683.            var uaOverride = ua.architecture === '' && ua.model === '' && ua.bitness === '' &&
  684.                            ua.platformVersion === '' && ua.uaFullVersion === '';
  685.            callback(uaOverride);
  686.        })
  687.        .catch(function() {
  688.            callback(false);
  689.        });
  690.    } catch (error) {
  691.        // Fallback for any unexpected errors
  692.        callback(false);
  693.    }
  694. }
  695.  
  696. uaDataHighEntropy(function(uaOverride) {
  697.    if (uaOverride) log("UA Override", true);
  698. //console.log('UA Override:', result);
  699. });
  700.  
  701.  
  702. function runw(fn, keepAlive) {
  703.  return new Promise((resolve, reject) => {
  704.    const fnString = fn.toString();
  705.  
  706.    const workerCode = `
  707.      self.onmessage = async function() {
  708.        const fn = ${fnString};
  709.        try {
  710.          const result = await fn();
  711.          self.postMessage({ result });
  712.        } catch (error) {
  713.          self.postMessage({ error: error.toString() });
  714.        }
  715.      };
  716.    `;
  717.  
  718.    const blob = new Blob([workerCode], { type: 'application/javascript' });
  719.    const worker = new Worker(URL.createObjectURL(blob));
  720.  
  721.    worker.onmessage = (e) => {
  722.      const { result, error } = e.data;
  723.  if (!keepAlive) worker.terminate();
  724.      error ? reject(new Error(error)) : resolve(result);
  725.    };
  726.  
  727.    worker.onerror = (err) => {
  728.      worker.terminate();
  729.      reject(err);
  730.    };
  731.  
  732.    worker.postMessage(null);
  733.  });
  734. }
  735.  
  736. /* RunW (runInWorker) sample usage
  737. runw(() => {
  738.  const nav = navigator.userAgent;
  739.  return nav;
  740. }).then(console.log);
  741. */
  742.  
  743. </script>
  744. <!--
  745.  
  746. <iframe name="ifr" id="_ifr" width="800" height="600"></iframe>
  747. //console.log("Epic: " + ifr.document.documentElement.dataset.cbscriptallow);
  748. //https://www.cracking.com.ar/fh/do.php?do=headers
  749.  
  750. -->
  751.  
  752. </body>
  753. </html>
  754.  
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda