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. async function createFenced(){
  29. const URLs = [{url:'fence.php'}];
  30. await window.sharedStorage.worklet.addModule("worklet.js");
  31. const resolveToConfig = window.FencedFrameConfig !== void 0;
  32. let opaqueURL = await window.sharedStorage.selectURL("ts", URLs, {resolveToConfig, keepAlive:true});
  33. if (resolveToConfig && opaqueURL instanceof FencedFrameConfig) document.body.appendChild(Object.assign(document.createElement('fencedframe'), {mode: 'opaque-ads', config: opaqueURL, width:1000, height:800, id:'fenced'}));
  34. }
  35.  
  36. if (window === top)
  37. {
  38. }
  39. else
  40. {
  41. eScreen.style.width = "95%";
  42. ifd.style.width = "3%";
  43. }
  44.  
  45.  
  46. function createError()
  47. {
  48. try
  49. {
  50. nothing()
  51. //null[0]();
  52. }
  53. catch(error)
  54. {
  55. log(error.stack.toString());
  56. }
  57. }
  58. //setTimeout(createError, 1000);
  59. function logMe()
  60. {
  61. let logData = ` isActive: ${navigator.userActivation.isActive}
  62. hasBeenActive: ${navigator.userActivation.hasBeenActive}
  63. location: ${location.href}
  64. `;
  65. log(logData.replace(/\n/g,'<br />'));
  66. }
  67. let timer;
  68.  
  69. const cmd = {
  70. get start() {
  71. timer = setInterval(logMe, 1000);
  72. return 1;
  73. },
  74. set start(arg) {
  75.  
  76. },
  77. get stop() {
  78. clearInterval(timer);
  79. return 1;
  80. },
  81.  
  82. };
  83.  
  84.  
  85. (function (){
  86. /*
  87. var eScreen = document.createElement("div");
  88. eScreen.style.width = "46%";
  89. eScreen.style.margin = "0px";
  90. eScreen.style.padding = "0px";
  91. eScreen.style.fontSize = "14px";
  92. eScreen.style.fontFamily = "Monospace, Arial, sans-serif, Helvetica";
  93. eScreen.style.float = "left";
  94. */
  95. //let iFrame = document.createElement("iframe");
  96.  
  97.  
  98. ///////////////////////// Code TextArea
  99. var eCode = document.createElement("textarea");
  100. /*
  101. eCode.onchange = function(e)
  102. {
  103. window.x = e;
  104. alert(e.isTrusted);
  105. }
  106. */
  107. eCode.name = "taCode";
  108. eCode.style.width = "100%";
  109. eCode.rows = "20";
  110. eCode.style.backgroundColor = "#000000";
  111. eCode.style.color = "#30ee30";
  112. eCode.style.fontSize = "16px";
  113. eCode.style.padding = "5px";
  114. eCode.autofocus = true;
  115. eCode.autocorrect = "off";
  116. eCode.autocapitalize = "off";
  117. eCode.spellcheck = false;
  118. eCode.ondblclick = function(e)
  119. {
  120. var ret = eval(this.value);
  121. log(ret);
  122. }
  123. eCode.onkeydown = function(e)
  124. {
  125. if (typeof e == "undefined") e = event;
  126. if ((e.keyCode == 13 || e.keyCode == 10) && (e.metaKey || e.ctrlKey || e.shiftKey) ||
  127. (e.key == "@" || e.key == "#")
  128. )
  129. {
  130. if (e.preventDefault) e.preventDefault();
  131.  
  132. try
  133. {
  134. var ret = eval(this.value);
  135. }
  136. catch(e)
  137. {
  138. log("Error: " + e);
  139. return;
  140. }
  141.  
  142. if (e.metaKey || e.ctrlKey || e.key == "@" || e.key == "#") // Log either eval or enum
  143. {
  144. if (e.shiftKey && !(e.key == "@" || e.key == "#")) log(prettyEnumObject(ret));
  145. else if (e.altKey || e.key == "#") log(remoteSave(prettyEnumObject(ret, true)));
  146. else log(ret);
  147. }
  148. }
  149. }
  150.  
  151. ///////////////////////// Code Log-Status
  152. var eLog = document.createElement("div");
  153. eLog.style.width = "100%";
  154. eLog.style.height = "300pt";
  155. eLog.style.margin = "0px";
  156. eLog.style.padding = "0px";
  157. eLog.style.wordWrap = "break-word";
  158. eLog.style.overflow = "scroll";
  159. eLog.style.padding = "5px";
  160. eLog.style.backgroundColor = "#000000";
  161. eLog.style.color = "#ffffff";
  162. eLog.style.border = "1px solid #eeeeee";
  163. eLog.innerHTML  = "Fast Hack'em";
  164.  
  165. eScreen.appendChild(eCode);
  166. eScreen.appendChild(eLog);
  167. //document.body.appendChild(eScreen);
  168.  
  169. window.log = function log(msg)
  170. {
  171. return eLog.innerHTML = msg;
  172. }
  173. function rot(s, i)
  174. {
  175. return void 0 === i && (i = 13), s.replace(/[A-Za-z]/g, function(c)
  176. {
  177. return String.fromCharCode(c.charCodeAt(0) + (c.toUpperCase() <= "M" ? i : -i));
  178. });
  179. }
  180. //console.log = window.log;
  181.  
  182. function enumMembers(obj) // Returns an array of Strings of the members of the object
  183. {
  184. //Object.getOwnPropertyDescriptors(window)
  185. var instanceValues = Object.getOwnPropertyNames(obj);
  186. if (Object.getPrototypeOf(obj) != null)
  187. {
  188. instanceValues = instanceValues.concat(enumMembers(Object.getPrototypeOf(obj)));
  189. }
  190. return instanceValues;
  191. }
  192. function prettyEnumObject(obj, bPlainText)
  193. {
  194. var arrMembersList = enumMembers(obj);
  195. if (bPlainText)
  196. {
  197. var prettyList = obj.toString() + "\n";
  198. for (var i in arrMembersList)
  199. {
  200. var strMemberName = arrMembersList[i];
  201. var refMember = obj[strMemberName];
  202. prettyList += strMemberName + " = " + refMember + "\n";
  203. }
  204.  
  205. }
  206. else
  207. {
  208. var prettyList = "<strong>" + obj.toString() + "</strong><br />";
  209. for (var i in arrMembersList)
  210. {
  211. var strMemberName = arrMembersList[i];
  212. var refMember = obj[strMemberName];
  213. var memberType = typeof refMember;
  214. var prettyMemberValue = "";
  215. var prettyMemberName = '<span style="color:#aaaaaa">' + strMemberName + '</span>';
  216. if (memberType == "object") prettyMemberName = '<span style="color:#aaaaaa;cursor:pointer" onclick="alert(this.innerText)">' + strMemberName + '</span>';
  217. var memberValueColor = {
  218. "string"  : "#dddddd",
  219. "number"  : "#ff8080",
  220. "object"  : "#80ff80",
  221. "boolean" : "#8080ff",
  222. "function": "#a0a0cc"
  223. }
  224. //if (memberType == "object") prettyMemberValue = '<span onclick="alert(\''+refMember+'\')" style="cursor:pointer;color:' + memberValueColor[memberType] + '">' + refMember + '</span>';
  225. prettyMemberValue = '<span style="color:' + memberValueColor[memberType] + '">' + refMember + '</span>';
  226. prettyList += prettyMemberName + " = " + prettyMemberValue + "<br />";
  227. }
  228. }
  229. return prettyList;
  230. }
  231.  
  232. // Detects if Chrome Extension Resource exists and is accessible
  233. // Vivaldi Sample: ext("chrome-extension://jffbochibkahlbbmanpmndnhmeliecah/config.json")
  234. function ext(ext)
  235. {
  236.    var request = new XMLHttpRequest();
  237.    request.open("GET", ext, false);
  238.    try {
  239.       request.send(null);
  240.    } catch(_) {
  241.        return false;
  242.    }
  243.  
  244.    if (request.status === 200) {
  245.        return true;
  246.    }
  247. }
  248. //ext("chrome-extension://jffbochibkahlbbmanpmndnhmeliecah/config.json")
  249.  
  250. function fav(url)
  251. {
  252.    var link = document.querySelector("link[rel~='icon']");
  253.    if (!link)
  254.    {
  255.        var link = document.createElement('link');
  256.        link.rel = 'icon';
  257.        document.getElementsByTagName('head')[0].appendChild(link);
  258.    }
  259.    link.href = url;
  260. }
  261. //fav("https://www.google.com/favicon.ico");
  262.  
  263.  
  264. var isolatedIFrame = window;
  265.  
  266. function workerCodeWrappedAsFunction()
  267. {
  268.    function probeExtensionInsideWorker(extensionURL)
  269.    {
  270.        var isExtensionInstalled = false;
  271.        var syncXHR = new XMLHttpRequest();
  272.        syncXHR.open("GET", extensionURL, false);
  273.        try
  274.        {
  275.            syncXHR.send(null);
  276.            if (syncXHR.status === 200) {isExtensionInstalled = true;}
  277.        }
  278.        catch(e){}
  279.        return isExtensionInstalled;
  280.    }
  281.    self.onmessage = function(messageEvent)
  282.    {
  283.        // messageEvent.data is the extensionURL to probe
  284.        var isInstalled = probeExtensionInsideWorker(messageEvent.data);
  285.        if (isInstalled) self.postMessage(messageEvent.data);
  286.    }
  287.  
  288.    
  289. }
  290.  
  291. // Converts the contexts (text) of workerCodeWrappedAsFunction to a real Blob
  292. // so we can easily use it as the code inside the Worker.
  293. var strFn = workerCodeWrappedAsFunction.toString();
  294. var strWorkerCode = strFn.slice(strFn.indexOf("{") + 1, strFn.lastIndexOf("}"));
  295. var workerBlob = new Blob([strWorkerCode], {type: 'application/javascript'});
  296. var workerUrl = isolatedIFrame.URL.createObjectURL(workerBlob);
  297.  
  298.  
  299.  
  300. var workerToProbeExtensions = false, arrayWithCallbacks = null, timeoutToKillWorker = 0;
  301. function initWorker()
  302. {
  303.    if (!workerToProbeExtensions)
  304.    {
  305.        arrayWithCallbacks = [];
  306.        workerToProbeExtensions = new isolatedIFrame.Worker(workerUrl);
  307.        workerToProbeExtensions.addEventListener("message", function (messageEvent)
  308.        {
  309.            arrayWithCallbacks[messageEvent.data]();
  310.        });
  311.    }
  312.    
  313.    clearTimeout(timeoutToKillWorker);
  314.    timeoutToKillWorker = setTimeout(function()
  315.    {   // Destroy Worker and clean callbacks Array
  316.        workerToProbeExtensions.terminate();
  317.        workerToProbeExtensions = false;
  318.        arrayWithCallbacks = null;
  319.    }, 3000);
  320.  
  321. }
  322. function probeExtensionNoisy(url, callback)
  323. {
  324.    initWorker();
  325.    arrayWithCallbacks[url] = callback;
  326.    workerToProbeExtensions.postMessage(url);
  327.  
  328. }
  329.  
  330. //probeExtensionNoisy("chrome-extension://jffbochibkahlbbmanpmndnhmeliecah/config.json", function(){alert("yes")});
  331.  
  332.  
  333. window.logep = function(obj)
  334. {
  335. const pretty = prettyEnumObject(obj, true);
  336. remoteSave(pretty);
  337. //log(pretty);
  338. return pretty;
  339. }
  340. window.remoteSave = function(str)
  341. {
  342. /*
  343. //let str = "your_data_here"; // Your data string
  344.  
  345. // Ensure the string is within the max size limit
  346. //str = str.substring(0, MAX_SIZE);
  347. const data = `data=${encodeURIComponent(str)}`;
  348. fetch("remote_save.php", {
  349. method: "POST",
  350. headers: {
  351. "Content-Type": "application/x-www-form-urlencoded"
  352. },
  353. body: data
  354. })
  355. .then(response => response.text())
  356. .then(result => {
  357. console.log("Success:", result);
  358. })
  359. .catch(error => {
  360. console.error("Error:", error);
  361. });
  362. */
  363. var xhttp = new XMLHttpRequest();
  364. xhttp.open("POST", "remote_save.php", true);
  365. xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  366. //MAX_SIZE = 3200;
  367. //str = str.substring(0, MAX_SIZE);
  368. xhttp.send("data=" + escape(str));
  369. return str;
  370.  
  371. }
  372. function autoLog()
  373. {
  374. log(remoteSave(prettyEnumObject(ret, true)));
  375. }
  376. if (location.hash.substring(1,4) == "log")
  377. {
  378. var strObject = location.hash.substring(5);
  379. var obj = eval(strObject);
  380. log(remoteSave(prettyEnumObject(obj, true)));
  381. }
  382. else if (location.hash.substring(1,4) == "cmd")
  383. {
  384. let command = location.hash.substring(5);
  385. cmd[command];
  386. }
  387. /*
  388. window.loge = function(__tempObject)
  389. {
  390. var strEnum  = forIn(__tempObject);
  391. var __tempObject_Enum = strEnum.replace(/</g, "&lt;").replace(/>/g, "&gt;");
  392. __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>");
  393. __tempObject_Enum = __tempObject_Enum.replace(/CUSTOM_ERROR/g, "<font color=\"red\">CUSTOM_ERROR</font>");
  394. __tempObject_Enum = __tempObject_Enum.replace(/(null)|(undefined)/gi, "<font color=\"#999999\">$1$2</font>");
  395.  
  396. log(__tempObject_Enum);
  397. document.getElementById("notepad").value = strEnum;
  398. }
  399. window.logep = function(__tempObject)
  400. {
  401. loge(__tempObject);
  402. post();
  403. }
  404.  
  405.  
  406. window.addEventListener('error', function (e)
  407. {
  408. console.log(e);
  409. log(e.message);// + "<br />" + url + "<br />" + lineNo + "<br />" + columnNo + "<br />" + error);
  410. })
  411. */
  412.  
  413. })();
  414.  
  415. /*
  416. var str = "";
  417. function showPaintTimings() {
  418. let performance = window.performance;
  419. let performanceEntries = performance.getEntriesByType('paint');
  420. performanceEntries.forEach( (performanceEntry, i, entries) => {
  421. str += ("The time to " + performanceEntry.name + " was " + performanceEntry.startTime + " milliseconds.\n");
  422. console.log(str);
  423. });
  424.  }
  425.  
  426. setTimeout("showPaintTimings()",1000);
  427. setTimeout(function(){
  428. z = new Image();
  429. z.src = "https://www.cracking.com.ar/fh/remote_save.php?data=" + escape(str);
  430. }, 3000)
  431. */
  432. /* Inline worker code
  433. function getWorkerCode()
  434. {
  435.    function workerCode()
  436.    {
  437.        self.onmessage = function(event)
  438.        {
  439. console.log(navigator)
  440.            self.postMessage(navigator.toString());
  441.        }
  442.    }
  443.    var strFn = workerCode.toString();
  444.    return strFn.slice(strFn.indexOf("{") + 1, strFn.lastIndexOf("}"));
  445. }
  446.  
  447.  
  448. var workerCode = getWorkerCode();//"self.onmessage=function(e){postMessage('Worker: '+e.data);}";
  449.  
  450. var blob;
  451. try {
  452.    blob = new Blob([workerCode], {type: 'application/javascript'});
  453. } catch (e) { // Backwards-compatibility
  454.    window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
  455.    blob = new BlobBuilder();
  456.    blob.append(workerCode);
  457.    blob = blob.getBlob();
  458. }
  459. var worker = new Worker(URL.createObjectURL(blob));
  460.  
  461. // Test, used in all examples:
  462. worker.onmessage = function(e)
  463. {
  464.    alert('Worker Response:\n' + e.data);
  465. };
  466. worker.postMessage('Test');
  467. */
  468.  
  469.  
  470. function w(htmlCode)
  471. {
  472. document.getElementById("scratch").innerHTML = htmlCode;
  473. return "Code written in scratch";
  474. }
  475. function eventEnum(obj, callback)
  476. {
  477.    if (!callback) var callback = function(e){alert(e.type)};
  478.    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;
  479. }
  480.  
  481. function fnOnMessage(e)
  482. {
  483. alert( "document.URL: " + document.URL + "\n" +
  484. "e.data: " + e.data + "\n" +
  485. "typeof e.data: " + typeof e.data + "\n" +
  486. "callee.caller has: " + arguments.callee.caller + "\n"
  487. );
  488. }
  489. //window.addEventListener("message", fnOnMessage, false);
  490.  
  491. ////////////////////////////////////////////////////////////////////////////////////////////
  492. /*
  493. var scratchDiv = document.createElement("div");
  494. scratchDiv.setAttribute("style","position:absolute:top:-100px;width:1px;height:1px;visibility:hidden");
  495. document.body.appendChild(scratchDiv);
  496. */
  497. var scratchDiv = document.getElementById("scratch");
  498. const ERROR = -1, NOT_INITIALIZED = 0,  INITIALIZING = 1, READY = 2;
  499. var state = NOT_INITIALIZED;
  500. var queueExtensions = new Array();
  501. function initProbeExtension()
  502. {
  503. if (state === NOT_INITIALIZED)
  504. {
  505. state = INITIALIZING;
  506. //console.log("INITIALIZING");
  507. var obj = document.createElement("object");
  508. obj.setAttribute("style","width:1px;height:1px;visibility:hidden");
  509. obj.type = "text/plain";
  510. var toInvalidLoad = setTimeout(function()
  511. {
  512. state = READY; // probeExtension works well. We can safely assume that it will work as expected.
  513. probeExtension(); // Start testing extensions
  514. }, 400);
  515. obj.onload = function()
  516. {
  517. state = ERROR; // probeExtension throws FPs. Can't be used during this session.
  518. clearTimeout(toInvalidLoad);
  519. alert("FP on extension load")
  520. }
  521. obj.data = "chrome-extension://agnangantblacabcerducharleorepsu/dshawo.json";
  522. scratchDiv.appendChild(obj);
  523. }
  524. }
  525. function probeExtension(url, callback)
  526. {
  527. if (arguments.length > 0) {queueExtensions.push([url, callback]);}
  528. if (state === READY) // Create the object
  529. {
  530. while (queueExtensions.length > 0)
  531. {
  532. var obj = document.createElement("object");
  533. obj.setAttribute("style","width:1px;height:1px;visibility:hidden");
  534. obj.type = "text/plain";
  535. var extFromQueue = queueExtensions.shift();
  536. obj.onload = extFromQueue[1]; // callback
  537. obj.data =   extFromQueue[0]; // extension url
  538. scratchDiv.appendChild(obj);
  539. }
  540. // Destroy objects
  541. state = INITIALIZING;
  542. setTimeout(function(){
  543. scratchDiv.innerHTML = "";
  544. state = READY;
  545. if (queueExtensions.length > 0) {probeExtension();}
  546. }, 1500);
  547. }
  548. else if (state === NOT_INITIALIZED)
  549. {
  550. initProbeExtension();
  551. }
  552. }
  553. ////////////////////////////////////////////////////////////////////////////////////////////
  554. ////////////////////////////////////////////////////////////////////////////////////////////
  555. probeExtension("chrome-extension://dehdhmbfpjfihgpekceokjdeeheinkfo/intercept.js", function(){alert("Epic")});
  556. function classExists(className) {
  557.    var styleSheets = document.styleSheets;
  558.    for (var i = 0; i < styleSheets.length; i++) {
  559.      var rules = styleSheets[i].cssRules || styleSheets[i].rules;
  560.      for (var j = 0; j < rules.length; j++) {
  561.        if (rules[j].selectorText === '.' + className) {
  562.          return true;
  563.        }
  564.      }
  565.    }
  566.    return false;
  567.  }
  568. /*
  569. function isWebView()
  570. {
  571. var wb = window.document?.documentElement?.clientHeight === window.document?.documentElement?.scrollHeight;
  572. return wb;
  573. }
  574. */
  575. function isWebView()
  576. {
  577.    // Writes a string with a telephone number format.
  578.    // Real Safari Mobile converts it to a tel: link
  579.    if ("safari" in window) return false;
  580. const iFrameWebView = document.createElement('iframe');
  581.    iFrameWebView.style.dislay = "none";
  582.    iFrameWebView.style.width = iFrameWebView.style.height = '0px';
  583.    document.body.appendChild(iFrameWebView);
  584.    iFrameWebView.contentDocument.write("123-123-123");
  585.    iFrameWebView.contentDocument.close();
  586.    const isWebView = iFrameWebView.contentDocument.links.length === 0;
  587.    iFrameWebView.remove();
  588.    return isWebView;
  589. }
  590.  
  591. ////////////////////////////////////////////////
  592. // Custom Protocol Detection
  593. function protocolExists(protocol) {
  594.    let w = null;
  595.    try {
  596.        w = new Worker(protocol);
  597.    }
  598.    catch(e) {
  599.        try {
  600.            if (w && w.terminate) w.terminate();
  601.            return e.toString().indexOf("valid URL") !== -1;
  602.        }
  603.        catch (f) {
  604.            return false;
  605.        }
  606.    }
  607. }
  608. /*
  609. if (protocolExists("brave://")) alert("Brave");
  610. if (protocolExists("edge://")) alert("Edge");
  611. if (protocolExists("puffin://")) alert("Puffin");
  612. if (protocolExists("app://")) alert("Electron");
  613. */
  614. /*
  615.  
  616. html {height: 100vh;}
  617. body {height: 100%;position: fixed;}
  618.  
  619. */
  620. /*
  621.  function resourceLoader(url)
  622. {
  623. var obj = document.createElement("object");
  624. obj.setAttribute("style","width:1px;height:1px;visibility:hidden");
  625. obj.type = "text/plain";
  626. obj.onload = function(){alert("Loaded")}
  627. obj.data = url;
  628. document.body.appendChild(obj);
  629. }
  630. resourceLoader("chrome-extension://does_not_exist");
  631.  */
  632.  
  633. </script>
  634. <!--
  635.  
  636. <iframe name="ifr" id="_ifr" width="800" height="600"></iframe>
  637. //console.log("Epic: " + ifr.document.documentElement.dataset.cbscriptallow);
  638. //https://www.cracking.com.ar/fh/do.php?do=headers
  639.  
  640. -->
  641.  
  642.  
  643.  
  644. </script>
  645. </body>
  646. </html>
  647.  
Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda