blob: 5918beead03ab2fd5a1278aa547c57cba912331f [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="../../resources/inspector-test.js"></script>
<script src="../../../cookies/resources/cookie-utilities.js"></script>
<script>
function test()
{
function HARJSONFilter(key, value) {
// Filter out the creator.version / browser.version but leave a top level version.
if ((key === "creator" || key === "browser") && value.version) {
value.version = "<filtered>";
return value;
}
// Cache may or may not have been used so remove optional fields which may or may not be set.
if (key === "connection")
return undefined;
if (key === "serverIPAddress")
return undefined;
if (key === "_transferSize")
return undefined;
if (key === "_fetchType")
return undefined;
// If cached the protocol might not be available.
if (key === "httpVersion")
return "<filtered>";
// Headers include dynamic data.
if (key === "headers")
return "<filtered>";
// Dates would change between test runs.
if (key.endsWith("DateTime"))
return "<filtered>";
// If any files are modified, we'd need to update the test without this filter.
if (key == "size")
return "<filtered>";
// Size data may or may not be available, but could change based on headers.
if (key.endsWith("Size"))
return "<filtered>";
// Reduce the file contents.
if (key === "text") {
InspectorTest.assert(value.length > 0, "The file should have contents.");
return "<filtered>";
}
// Sort cookies by name to make cookie order deterministic between test runs. We assume
// that cookies have names that consist of only ASCII characters.
if (key === "cookies") {
value.sort((a, b) => { return a.name === b.name ? 0 : (a.name < b.name ? -1 : 1); });
return value;
}
// Since cache may or may not be used, timing data may be variable.
// NOTE: SSL should always be -1 for this test case.
if (key === "time")
return "<filtered>";
if (key === "timings") {
value.blocked = "<filtered>";
value.dns = "<filtered>";
value.connect = "<filtered>";
value.send = "<filtered>";
value.wait = "<filtered>";
value.receive = "<filtered>";
}
// PageTimings can be variable.
if (key === "onContentLoad" || key === "onLoad")
return "<filtered>";
return value;
}
let suite = InspectorTest.createAsyncSuite("HAR.Page");
suite.addTestCase({
name: "HAR.Basic.Page",
description: "Should be able to generate a HAR with all of this test page's resources.",
async test() {
InspectorTest.reloadPage({ignoreCache: true});
await InspectorTest.awaitEvent("LoadComplete");
InspectorTest.evaluateInPage("setup()");
await InspectorTest.awaitEvent("SetupComplete");
let resources = [WI.networkManager.mainFrame.mainResource, ...WI.networkManager.mainFrame.resourceCollection];
let har = await WI.HARBuilder.buildArchive(resources);
InspectorTest.json(har, HARJSONFilter);
InspectorTest.evaluateInPage("cleanup()");
await InspectorTest.awaitEvent("CleanComplete");
}
});
suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>HAR Page Test.</p>
<script>
async function setup()
{
await resetCookies();
await setCookie("simple", "simple");
await setCookie("path", "path", {"path": "/A/B/C"}); // This cookie will not be sent in subsequent requests from this page.
// Secure cookies will only be sent in subsequent requests from this page if the page was served over HTTPS.
await setCookie("secure", "secure", {"secure": null});
await setCookie("secure-and-http-only", "secure-and-http-only", {"secure": null, "HttpOnly": null});
await setCookie("with-expiration", "with-expiration", {"Expires": new Date("01/04/5000").toGMTString()});
await setCookie("http-only", "http-only", {"HttpOnly": null});
await setCookie("same-site-strict", "same-site-strict", {"SameSite": "Strict", "path": "/"});
await setCookie("same-site-ignored-because-no-value", "same-site-ignored-because-no-value", {"SameSite": null, "path": "/"});
await setCookie("same-site-ignored-because-unknown-value", "same-site-ignored-because-unknown-value", {"SameSite": "invalid", "path": "/"});
await setCookie("same-site-lax", "same-site-lax", {"SameSite": "Lax", "path": "/"});
TestPage.dispatchEventToFrontend("SetupComplete");
}
async function cleanup()
{
await resetCookies();
TestPage.dispatchEventToFrontend("CleanComplete");
}
window.addEventListener("load", () => {
TestPage.dispatchEventToFrontend("LoadComplete");
});
</script>
</body>
</html>