<html>
<head>
<title>WebSocket Test</title>
<script language="JavaScript">

var ws = null;

function setup() {
  // Match the secure state of the current origin.
  var origin = location.origin;
  if (origin.indexOf('http://') == 0) {
    origin = origin.replace('http://', 'ws://');
  } else if (origin.indexOf('https://') == 0) {
    origin = origin.replace('https://', 'wss://');
  } else {
    origin = '';
  }

  if (origin.length > 0)
    document.getElementById('server').value = origin;
  document.getElementById('server').disabled = false;

  if (location.hostname != 'localhost')
    document.getElementById('warning').style.display = 'block';

  setConnected(false);
}

function setConnected(connected) {
  document.getElementById('connect').disabled = connected;
  document.getElementById('disconnect').disabled = !connected;
  document.getElementById('message').disabled = !connected;
  document.getElementById('response').disabled = !connected;
  document.getElementById('send').disabled = !connected;
}

function doConnect() {
  var url = document.getElementById('server').value;
  if (url.indexOf('ws://') < 0 && url.indexOf('wss://') < 0) {
    alert('Specify a valid WebSocket server URL.');
    return;
  }

  if (ws) {
    alert('WebSocket is already connected.');
    return;
  }

  ws = new WebSocket(url);
  ws.onopen = function() { setConnected(true); };
  ws.onmessage = function(event) {
    document.getElementById('response').value = event.data;
  };
  ws.onclose = function(event) {
    setConnected(false);
    ws = null;
  };
  ws.onerror = function(event) {
    if (ws.readyState == 3)
      alert('WebSocket connection failed.');
  }
}

function doDisconnect() {
  if (!ws) {
    alert('WebSocket is not currently connected.');
    return;
  }

  ws.close();
}

function doSend() {
  if (!ws) {
    alert('WebSocket is not currently connected.');
    return;
  }

  var value = document.getElementById('message').value;
  if (value.length > 0)
    ws.send(value);
}

</script>

</head>
<body bgcolor="white" onload="setup()">
<div id="warning" style="display:none;color:red;font-weight:bold;">
This page is most useful when loaded from localhost.
You should first create a server using the <a href="https://tests/server">HTTP/WebSocket Server test</a>.
</div>
<p>
This page tests a WebSocket connection.
The example implementation in server_test.cc will then echo the message contents in reverse.
</p>
<form>
Server URL: <input type="text" id="server" value="" disabled="true">
<br/><input type="button" id="connect" onclick="doConnect()" value="Connect" disabled="true">
<input type="button" id="disconnect" onclick="doDisconnect()" value="Disconnect" disabled="true">
<br/>Message: <input type="text" id="message" value="Test Message" disabled="true">
<input type="button" id="send" onclick="doSend()" value="Send" disabled="true">
<br/>Response: <input type="text" id="response" value="" disabled="true">
<br/><br/>
The example implementation in server_test.cc can also serve the HTTP-based <a href="other_tests">Other Tests</a>.
</form>
</body>
</html>
