cookie.sjs (4312B)
1 function handleRequest(aRequest, aResponse) { 2 let parts = aRequest.queryString.split("&"); 3 if (parts.includes("window")) { 4 aResponse.setStatusLine(aRequest.httpVersion, 200); 5 aResponse.setHeader("Content-Type", "text/html"); 6 aResponse.setHeader("Clear-Site-Data", '"cache", "cookies", "storage"'); 7 aResponse.write("<body><h1>Welcome</h1></body>"); 8 return; 9 } 10 11 if (parts.includes("fetch")) { 12 setState( 13 "data", 14 JSON.stringify({ type: "fetch", hasCookie: aRequest.hasHeader("Cookie") }) 15 ); 16 aResponse.write("Hello world!"); 17 return; 18 } 19 20 if (parts.includes("xhr")) { 21 setState( 22 "data", 23 JSON.stringify({ type: "xhr", hasCookie: aRequest.hasHeader("Cookie") }) 24 ); 25 aResponse.write("Hello world!"); 26 return; 27 } 28 29 if (parts.includes("image")) { 30 setState( 31 "data", 32 JSON.stringify({ type: "image", hasCookie: aRequest.hasHeader("Cookie") }) 33 ); 34 35 // A 1x1 PNG image. 36 // Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain) 37 const IMAGE = atob( 38 "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" + 39 "ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=" 40 ); 41 42 aResponse.setHeader("Content-Type", "image/png", false); 43 aResponse.write(IMAGE); 44 return; 45 } 46 47 if (parts.includes("script")) { 48 setState( 49 "data", 50 JSON.stringify({ 51 type: "script", 52 hasCookie: aRequest.hasHeader("Cookie"), 53 }) 54 ); 55 56 aResponse.setHeader("Content-Type", "text/javascript", false); 57 aResponse.write("window.scriptLoaded();"); 58 return; 59 } 60 61 if (parts.includes("worker")) { 62 setState( 63 "data", 64 JSON.stringify({ 65 type: "worker", 66 hasCookie: aRequest.hasHeader("Cookie"), 67 }) 68 ); 69 70 function w() { 71 onmessage = e => { 72 if (e.data == "subworker") { 73 importScripts("cookie.sjs?subworker&" + Math.random()); 74 postMessage(42); 75 return; 76 } 77 78 if (e.data == "fetch") { 79 fetch("cookie.sjs?fetch&" + Math.random()) 80 .then(r => r.text()) 81 .then(_ => postMessage(42)); 82 return; 83 } 84 85 if (e.data == "xhr") { 86 let xhr = new XMLHttpRequest(); 87 xhr.open("GET", "cookie.sjs?xhr&" + Math.random()); 88 xhr.send(); 89 xhr.onload = _ => postMessage(42); 90 } 91 }; 92 postMessage(42); 93 } 94 95 aResponse.setHeader("Content-Type", "text/javascript", false); 96 aResponse.write(w.toString() + "; w();"); 97 return; 98 } 99 100 if (parts.includes("subworker")) { 101 setState( 102 "data", 103 JSON.stringify({ 104 type: "subworker", 105 hasCookie: aRequest.hasHeader("Cookie"), 106 }) 107 ); 108 aResponse.setHeader("Content-Type", "text/javascript", false); 109 aResponse.write("42"); 110 return; 111 } 112 113 if (parts.includes("sharedworker")) { 114 setState( 115 "data", 116 JSON.stringify({ 117 type: "sharedworker", 118 hasCookie: aRequest.hasHeader("Cookie"), 119 }) 120 ); 121 122 // This function is exported as a string. 123 /* eslint-disable no-undef */ 124 function w() { 125 onconnect = e => { 126 e.ports[0].onmessage = evt => { 127 if (evt.data == "subworker") { 128 importScripts("cookie.sjs?subworker&" + Math.random()); 129 e.ports[0].postMessage(42); 130 return; 131 } 132 133 if (evt.data == "fetch") { 134 fetch("cookie.sjs?fetch&" + Math.random()) 135 .then(r => r.text()) 136 .then(_ => e.ports[0].postMessage(42)); 137 return; 138 } 139 140 if (evt.data == "xhr") { 141 let xhr = new XMLHttpRequest(); 142 xhr.open("GET", "cookie.sjs?xhr&" + Math.random()); 143 xhr.send(); 144 xhr.onload = _ => e.ports[0].postMessage(42); 145 } 146 }; 147 e.ports[0].postMessage(42); 148 }; 149 } 150 /* eslint-enable no-undef */ 151 152 aResponse.setHeader("Content-Type", "text/javascript", false); 153 aResponse.write(w.toString() + "; w();"); 154 return; 155 } 156 157 if (parts.includes("last")) { 158 let data = getState("data"); 159 setState("data", ""); 160 aResponse.write(data); 161 return; 162 } 163 164 aResponse.setStatusLine(aRequest.httpVersion, 400); 165 aResponse.write("Invalid request"); 166 }