blob: 2814206d94a94a8aa6933eab777243c45303641c [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../resources/inspector-test.js"></script>
<script>
function triggerNetworkLoad() {
let url = "resources/data.json?" + Math.random();
fetch(url, {credentials: "same-origin"}).then(() => {
TestPage.dispatchEventToFrontend("LoadComplete");
});
}
function triggerNetworkLoadWithBasicAuthentication(username, password) {
let xhr = new XMLHttpRequest();
xhr.open("GET", "resources/basic-auth.py?" + Math.random(), true, username, password);
xhr.onload = xhr.onerror = () => { TestPage.dispatchEventToFrontend("LoadComplete"); };
xhr.send();
}
function triggerNetworkLoadWithoutCookie() {
document.cookie = "InspectorTestCookie=;expires=Thu, 01 Jan 1970 00:00:01 GMT;";
triggerNetworkLoad();
}
function triggerNetworkLoadWithCookie() {
document.cookie = "InspectorTestCookie=1234";
triggerNetworkLoad();
}
function triggerNetworkLoadWithoutBasicAuthentication() {
triggerNetworkLoadWithBasicAuthentication(undefined, undefined);
}
function triggerNetworkLoadWithBasicAuthenticationFailure() {
triggerNetworkLoadWithBasicAuthentication("badUsername", "badPassword");
}
function triggerNetworkLoadWithBasicAuthenticationSuccess() {
triggerNetworkLoadWithBasicAuthentication("goodUsername", "goodPassword");
}
function test()
{
let suite = InspectorTest.createAsyncSuite("Resource.Metrics.RequestHeaders");
function addTestCase({name, description, expression, status, loadHandler}) {
suite.addTestCase({
name, description,
test(resolve, reject) {
InspectorTest.evaluateInPage(expression);
Promise.all([
WI.Frame.awaitEvent(WI.Frame.Event.ResourceWasAdded),
WI.Resource.awaitEvent(WI.Resource.Event.ResponseReceived),
WI.Resource.awaitEvent(WI.Resource.Event.LoadingDidFinish),
InspectorTest.awaitEvent("LoadComplete"),
]).then(([resourceWasAddedEvent, responseReceivedEvent, loadingDidFinish, loadCompleteEvent]) => {
let resource = resourceWasAddedEvent.data.resource;
InspectorTest.expectThat(resource instanceof WI.Resource, "Resource should be created.");
InspectorTest.expectEqual(resource, responseReceivedEvent.target, "Resource should receive a Response.");
return loadHandler(resource);
}).then(resolve, reject);
}
});
}
addTestCase({
name: "Resource.Metrics.RequestHeaders.WithoutCookie",
description: "Load a resource from the network without Cookies, we should not see any Cookie headers.",
expression: `triggerNetworkLoadWithoutCookie()`,
loadHandler(resource) {
InspectorTest.expectThat(!resource.requestHeaders.valueForCaseInsensitiveKey("Cookie"), "Request should not have a 'Cookie' header.");
}
});
addTestCase({
name: "Resource.Metrics.RequestHeaders.WithCookie",
description: "Load a resource from the network with Cookies, we should be able to see Cookie headers.",
expression: `triggerNetworkLoadWithCookie()`,
loadHandler(resource) {
InspectorTest.expectEqual(resource.requestHeaders.valueForCaseInsensitiveKey("Cookie"), "InspectorTestCookie=1234", "'Cookie' header value should be `InspectorTestCookie=1234`.");
}
});
addTestCase({
name: "Resource.Metrics.RequestHeaders.BasicAuth.None",
description: "Load a resource from the network without authentication, we should not be able to see Basic Authorization headers.",
expression: `triggerNetworkLoadWithoutBasicAuthentication()`,
loadHandler(resource) {
InspectorTest.expectEqual(resource.statusCode, 401, "Resource should have a 401 status code.");
InspectorTest.expectThat(resource.responseHeaders.valueForCaseInsensitiveKey("WWW-Authenticate"), "Response should have a 'WWW-Authenticate' response header for the failure.");
InspectorTest.expectThat(!resource.requestHeaders.valueForCaseInsensitiveKey("Authorization"), "Request should not have a 'Authorization' header.");
}
});
addTestCase({
name: "Resource.Metrics.RequestHeaders.BasicAuth.Failure",
description: "Load a resource from the network with authentication, we should be able to see Basic Authorization headers.",
expression: `triggerNetworkLoadWithBasicAuthenticationFailure()`,
loadHandler(resource) {
InspectorTest.expectEqual(resource.statusCode, 401, "Resource should have a 401 status code.");
InspectorTest.expectThat(resource.responseHeaders.valueForCaseInsensitiveKey("WWW-Authenticate"), "Response should have a 'WWW-Authenticate' response header for the failure.");
// FIXME: <https://webkit.org/b/170489> Web Inspector: Include NetworkLoadMetrics with failed loads
InspectorTest.expectEqual(resource.requestHeaders.valueForCaseInsensitiveKey("Authorization"), "Basic YmFkVXNlcm5hbWU6YmFkUGFzc3dvcmQ=", "'Authorization' header value should be for badUsername:badPassword.");
}
});
addTestCase({
name: "Resource.Metrics.RequestHeaders.BasicAuth.Success",
description: "Load a resource from the network with authentication, we should be able to see Basic Authorization headers.",
expression: `triggerNetworkLoadWithBasicAuthenticationSuccess()`,
loadHandler(resource) {
InspectorTest.expectEqual(resource.statusCode, 200, "Resource should have a 200 status code.");
InspectorTest.expectEqual(resource.requestHeaders.valueForCaseInsensitiveKey("Authorization"), "Basic Z29vZFVzZXJuYW1lOmdvb2RQYXNzd29yZA==", "'Authorization' header value should be for goodUsername:goodPassword.");
}
});
suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Test for Resource request headers which may not have been immediately available but eventually are (Cookie, Authorization).</p>
</body>
</html>