blob: 7a9b9ac3dfced4fb48669c3cb2446e9ed9646a96 [file] [log] [blame]
<!DOCTYPE html>
<script src="/js-test-resources/testharness.js"></script>
<script src="/js-test-resources/testharnessreport.js"></script>
<script>
'use strict';
// These tests test WebSocket handshake throttling, which is a feature of
// Blink's implementation, not part of the web platform. The special throttle
// content::TestWebSocketHandshakeThrottle is used when content_shell is run
// with the --run-web-tests option. It detects the
// content-shell-websocket-delay-ms query parameter in the URL and applies a
// delay of the specified number of milliseconds.
//
// These tests will not function correctly without the --run-web-tests
// option. To debug them interactively you can follow the instructions for a
// "legacy test" in
// https://chromium.googlesource.com/chromium/src/+/master/docs/testing/web_tests.md#Debugging-DevTools-Tests.
async_test(t => {
const startTime = Date.now();
const ws = new WebSocket(
'ws://localhost:8880/echo?content-shell-websocket-delay-ms=250');
ws.onopen = t.step_func(() => {
const endTime = Date.now();
assert_greater_than_equal(endTime - startTime, 250,
'elapsed time should be greater than 250ms');
ws.close();
});
ws.onclose = t.step_func(e => {
assert_true(e.wasClean, 'close handshake should complete successfully');
t.done();
});
}, 'throttle should delay connection success');
async_test(t => {
const startTime = Date.now();
// The test doesn't have to wait for this delay, so it is extra-long to reduce
// flakiness on slow bots.
const ws = new WebSocket(
'ws://localhost:8880/handshake-error?content-shell-websocket-delay-ms=2000');
ws.onopen = t.unreached_func('onopen should not be called');
ws.onclose = t.step_func(e => {
const endTime = Date.now();
assert_false(e.wasClean, 'WebSocket should not be cleanly closed');
assert_less_than(endTime - startTime, 2000,
'elapsed time should be less than 2000ms');
t.done();
});
}, 'throttle should not delay connection failure');
// Regression test for crbug.com/786776.
async_test(t => {
// The "echo-request-headers" handler sends a message immediately on connect,
// then closes.
const ws = new WebSocket(
'ws://localhost:8880/echo-request-headers?content-shell-websocket-delay-ms=250');
let onOpenCalled = false;
let onMessageCalled = false;
ws.onopen = () => {
onOpenCalled = true;
};
ws.onmessage = t.step_func(() => {
assert_true(onOpenCalled, 'onopen should happen before onmessage');
onMessageCalled = true;
});
ws.onclose = t.step_func(e => {
assert_true(e.wasClean, 'close handshake should complete successfully');
assert_true(onMessageCalled, 'onmessage should be called');
t.done();
});
}, 'throttle should not prevent onmessage events');
</script>