basicvtt-server.sjs (3108B)
1 // This file is a simple "server" for test_webvtt_resistfingerprinting.html 2 3 // You can request a VTT file by setting the `request` parameter to `vtt` and 4 // providing an `id` parameter. Id parameter is used to track how many times 5 // a specific test has requested the file. Please don't use the same id for 6 // multiple tests. 7 8 // You can also request the number of times a specific test has requested the 9 // file by setting the `request` parameter to `count` and providing an `id` 10 // parameter. 11 12 const vtt = `WEBVTT 13 REGION 14 id:testOne lines:2 width:30% 15 REGION 16 id:testTwo lines:4 width:20% 17 18 1 19 00:00.500 --> 00:00.700 region:testOne 20 This 21 22 2 23 00:01.200 --> 00:02.400 region:testTwo 24 Is 25 26 2.5 27 00:02.000 --> 00:03.500 region:testOne 28 (Over here?!) 29 30 3 31 00:02.710 --> 00:02.910 32 A 33 34 4 35 00:03.217 --> 00:03.989 36 Test 37 38 5 39 00:03.217 --> 00:03.989 40 And more! 41 `; 42 43 // stolen from server-stream-download.sjs# and they stole it from file_blocked_script.sjs 44 function setGlobalState(data, key) { 45 const x = { 46 data, 47 QueryInterface(_iid) { 48 return this; 49 }, 50 }; 51 x.wrappedJSObject = x; 52 setObjectState(key, x); 53 } 54 55 function getGlobalState(key) { 56 let data; 57 getObjectState(key, function (x) { 58 data = x && x.wrappedJSObject.data; 59 }); 60 return data; 61 } 62 63 const requestCounter = (() => { 64 const keyPrefix = "vtt-request-counter-"; 65 66 return { 67 recordRequest(id) { 68 const key = keyPrefix + id; 69 const count = getGlobalState(key) || 0; 70 setGlobalState(count + 1, key); 71 }, 72 getRequestCount(id) { 73 const key = keyPrefix + id; 74 return getGlobalState(key) || 0; 75 }, 76 }; 77 })(); 78 79 // We need this for test-verify jobs. It runs the test 80 // multiple times and we need to know how many times 81 // the test has been run because global state is not 82 // reset between runs. 83 const iterationCounter = (() => { 84 const keyPrefix = "vtt-request-iteration-counter-"; 85 86 return { 87 recordIteration() { 88 const count = getGlobalState(keyPrefix) || 0; 89 setGlobalState(count + 1, keyPrefix); 90 }, 91 getIterationCount() { 92 return getGlobalState(keyPrefix) || 0; 93 }, 94 }; 95 })(); 96 97 function handleRequest(aRequest, aResponse) { 98 aResponse.setHeader("Access-Control-Allow-Origin", "*", false); 99 100 const params = aRequest.queryString 101 .split("&") 102 .map(command => command.split("=")) 103 .reduce((acc, [key, value]) => { 104 acc[key] = value; 105 return acc; 106 }, {}); 107 108 if (params.request === "vtt") { 109 requestCounter.recordRequest(params.id); 110 aResponse.setStatusLine(aRequest.httpVersion, 200); 111 aResponse.setHeader("Content-Type", "text/vtt", false); 112 aResponse.write(vtt); 113 } else if (params.request === "count") { 114 aResponse.setStatusLine(aRequest.httpVersion, 200); 115 aResponse.write(requestCounter.getRequestCount(params.id)); 116 } else if (params.request === "newIteration") { 117 iterationCounter.recordIteration(); 118 aResponse.setStatusLine(aRequest.httpVersion, 200); 119 aResponse.write(iterationCounter.getIterationCount()); 120 } else { 121 aResponse.setStatusLine(aRequest.httpVersion, 400); 122 aResponse.write(aRequest.queryString); 123 } 124 }