forked from mirrors/gecko-dev
		
	Use the 'IsSecure' field from windowContexts where possible to determine WebSockets mixed content behaviour. Differential Revision: https://phabricator.services.mozilla.com/D153105
		
			
				
	
	
		
			106 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
	
		
			3.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE HTML>
 | 
						|
<html>
 | 
						|
<head>
 | 
						|
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"></meta>
 | 
						|
  <title>WebSocket test - big blob on content side</title>
 | 
						|
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
 | 
						|
  <script type="text/javascript" src="websocket_helpers.js"></script>
 | 
						|
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
 | 
						|
</head>
 | 
						|
<body>
 | 
						|
<script class="testbody" type="text/javascript">
 | 
						|
 | 
						|
// Test steps:
 | 
						|
// 1. Create a websocket and send 8 chunks of 1MB random data.
 | 
						|
// 2. Store the hash of each chunk (1MB of random data).
 | 
						|
// 3. Websocket server returns the same data back.
 | 
						|
// 4. Calculate the hash again and check the hash is the same as the stored one.
 | 
						|
 | 
						|
function genRandomPayload() {
 | 
						|
  const count = 128;
 | 
						|
  const chunkSize = 64 * 1024;
 | 
						|
  let buffer = new Uint8Array(chunkSize * count);
 | 
						|
  let offset = 0;
 | 
						|
  for (let i = 0; i < count; i++) {
 | 
						|
    let data = new Uint8Array(chunkSize);
 | 
						|
    crypto.getRandomValues(data);
 | 
						|
    buffer.set(data, offset);
 | 
						|
    offset += chunkSize;
 | 
						|
  }
 | 
						|
 | 
						|
  return buffer;
 | 
						|
}
 | 
						|
 | 
						|
function genRandomFile() {
 | 
						|
  return new File([genRandomPayload()], "payload.bin", {
 | 
						|
    type: 'application/octet-stream'
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
async function toHexString(buffer) {
 | 
						|
  let hashBuffer = await crypto.subtle.digest("SHA-256", buffer);
 | 
						|
  let hashBytes = new Uint8Array(hashBuffer);
 | 
						|
  let toHex = b => b.toString(16).padStart(2, "0");
 | 
						|
  return Array.from(hashBytes, toHex).join("");
 | 
						|
}
 | 
						|
 | 
						|
let message_count = 0;
 | 
						|
let sentHashArray = [];
 | 
						|
async function sendFile(file, ws) {
 | 
						|
  const oneMiB = 1 * 1024 * 1024;
 | 
						|
 | 
						|
  let offset = 0;
 | 
						|
  while (offset < file.size) {
 | 
						|
    let blob = file.slice(offset, offset + oneMiB);
 | 
						|
    let buffer = await blob.arrayBuffer();
 | 
						|
    let hash = await toHexString(buffer);
 | 
						|
    sentHashArray.push(hash);
 | 
						|
    ws.send(buffer);
 | 
						|
    offset += blob.size;
 | 
						|
    message_count++;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
var ws = CreateTestWS("wss://example.com/tests/dom/websocket/tests/file_websocket_bigBlob");
 | 
						|
is(ws.readyState, 0, "Initial readyState is 0");
 | 
						|
ws.binaryType = "blob";
 | 
						|
 | 
						|
ws.onopen = function() {
 | 
						|
  is(ws.readyState, 1, "Open readyState is 1");
 | 
						|
  let file = genRandomFile();
 | 
						|
  sendFile(file, ws);
 | 
						|
}
 | 
						|
 | 
						|
let receivedBlobs = [];
 | 
						|
ws.onmessage = function(e) {
 | 
						|
  ok(e.data instanceof Blob, "We should be receiving a Blob");
 | 
						|
  receivedBlobs.push(e.data);
 | 
						|
  message_count--;
 | 
						|
  if (message_count == 0) {
 | 
						|
    ws.close();
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
async function checkContent() {
 | 
						|
  is(receivedBlobs.length, sentHashArray.length, "length should be the same");
 | 
						|
  for (let index = 0; index < receivedBlobs.length; index++) {
 | 
						|
    let buffer = await receivedBlobs[index].arrayBuffer();
 | 
						|
    let hash = await toHexString(buffer);
 | 
						|
    is(hash, sentHashArray[index], "hash should be equal");
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
ws.onclose = function(e) {
 | 
						|
  is(ws.readyState, 3, "Close readyState is 3");
 | 
						|
  checkContent().then(() => {
 | 
						|
    SimpleTest.finish();
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
SimpleTest.requestFlakyTimeout("The web socket tests are really fragile, but avoiding timeouts might be hard, since it's testing stuff on the network. " +
 | 
						|
                               "Expect all sorts of flakiness in this test...");
 | 
						|
SimpleTest.waitForExplicitFinish();
 | 
						|
 | 
						|
</script>
 | 
						|
</body>
 | 
						|
</html>
 |