Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Unified Diff: third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-test.js

Issue 2739323003: DevTools protocol interception, blocking & modification of requests (Closed)
Patch Set: Add a comment Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-test.js
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..9bc5d02a69673f83d47c464e7a20c481e7013feb
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector-protocol/network/interception-test.js
@@ -0,0 +1,259 @@
+var initialize_InterceptionTest = function() {
+
+var interceptionRequestParams = {};
+var requestIdToFilename = {};
+var filenameToInterceptionId = {};
+var loggedMessages = {};
+var InterceptionIdToCanonicalInterceptionId = {};
+var idToCanoncalId = {};
+var nextId = 1;
+
+function getNextId()
+{
+ return "ID " + nextId++;
+}
+
+function canonicalId(id)
+{
+ if (!idToCanoncalId.hasOwnProperty(id))
+ idToCanoncalId[id] = getNextId();
+ return idToCanoncalId[id];
+}
+
+function log(id, message)
+{
+ testRunner.logToStderr("id " + id + " " + message);
+ if (!loggedMessages.hasOwnProperty(id))
+ loggedMessages[id] = [];
+ loggedMessages[id].push(message);
+}
+
+function completeTest(message)
+{
+ // The order in which network events occur is not fully deterministic so we
+ // sort based on the interception ID to try and make the test non-flaky.
+ for (var property in loggedMessages) {
+ if (loggedMessages.hasOwnProperty(property)) {
+ var messages = loggedMessages[property];
+ for (var i = 0; i < messages.length; i++) {
+ InspectorTest.log(messages[i]);
+ }
+ }
+ }
+
+ if (message)
+ InspectorTest.log(message);
+
+ InspectorTest.completeTest();
+}
+
+InspectorTest.startInterceptionTest = function(requestInterceptedDict,
+ numConsoleLogsToWaitFor) {
+ if (typeof numConsoleLogsToWaitFor === "undefined")
+ numConsoleLogsToWaitFor = 0;
+
+ InspectorTest.eventHandler["Network.requestIntercepted"] = onRequestIntercepted;
+ InspectorTest.eventHandler["Network.loadingFailed"] = onLoadingFailed;
+ InspectorTest.eventHandler["Network.requestWillBeSent"] = onRequestWillBeSent;
+ InspectorTest.eventHandler["Network.responseReceived"] = onResponseReceived;
+ InspectorTest.eventHandler["Runtime.consoleAPICalled"] = onConsoleAPICalled;
+ InspectorTest.eventHandler["Page.frameStoppedLoading"] = onStop;
+
+ var frameStoppedLoading = false;
+
+ function getInterceptionId(filename) {
+ if (!filenameToInterceptionId.hasOwnProperty(filename)) {
+ filenameToInterceptionId[filename] = getNextId()
+ }
+ return filenameToInterceptionId[filename];
+ }
+
+ function enableNetwork()
+ {
+ InspectorTest.log("Test started");
+ InspectorTest.sendCommand("Network.enable", {}, didEnableNetwork);
+ }
+
+ function didEnableNetwork(messageObject)
+ {
+ if (messageObject.error) {
+ completeTest("FAIL: Couldn't enable network agent" +
+ messageObject.error.message);
+ return;
+ }
+ InspectorTest.log("Network agent enabled");
+ InspectorTest.sendCommand(
+ "Network.enableRequestInterception", {"enabled": true},
+ didEnableRequestInterception);
+ }
+
+ function didEnableRequestInterception(messageObject)
+ {
+ if (messageObject.error) {
+ completeTest("FAIL: Couldn't enable fetch interception" +
+ messageObject.error.message);
+ return;
+ }
+ InspectorTest.log("Request interception enabled");
+ InspectorTest.sendCommand("Page.enable", {}, didEnablePage);
+ }
+
+ function didEnablePage(messageObject)
+ {
+ if (messageObject.error) {
+ completeTest("FAIL: Couldn't enable page agent" +
+ messageObject.error.message);
+ return;
+ }
+ InspectorTest.log("Page agent enabled");
+
+ InspectorTest.sendCommand("Runtime.enable", {}, didEnableRuntime);
+ }
+
+ function didEnableRuntime(messageObject)
+ {
+ if (messageObject.error) {
+ completeTest("FAIL: Couldn't enable runtime agent" +
+ messageObject.error.message);
+ return;
+ }
+ InspectorTest.log("Runtime agent enabled");
+
+ InspectorTest.sendCommand(
+ "Runtime.evaluate", { "expression": "appendIframe()"});
+ }
+
+ function onRequestIntercepted(event)
+ {
+ var filename = event.params.request.url.split('/').pop();
+ var id = canonicalId(event.params.InterceptionId);
+ filenameToInterceptionId[filename] = id;
+ if (!requestInterceptedDict.hasOwnProperty(filename)) {
+ completeTest("FAILED: unexpected request interception " +
+ JSON.stringify(event.params));
+ return;
+ }
+ if (event.params.hasOwnProperty("redirectUrl")) {
+ log(id, "Network.requestIntercepted " + id + " " +
+ event.params.redirectStatusCode + " redirect " +
+ interceptionRequestParams[id].url.split('/').pop() +
+ " -> " + event.params.redirectUrl.split('/').pop());
+ interceptionRequestParams[id].url = event.params.redirectUrl;
+ } else {
+ interceptionRequestParams[id] = event.params.request;
+ log(id, "Network.requestIntercepted " + id + " " +
+ event.params.request.method + " " + filename);
+ }
+ requestInterceptedDict[filename](event);
+ }
+
+ function onLoadingFailed(event)
+ {
+ var filename = requestIdToFilename[event.params.requestId];
+ var id = getInterceptionId(filename);
+ log(id, "Network.loadingFailed " + filename + " " +
+ event.params.errorText);
+ }
+
+ function onRequestWillBeSent(event)
+ {
+ var filename = event.params.request.url.split('/').pop();
+ requestIdToFilename[event.params.requestId] = filename;
+ }
+
+ function onResponseReceived(event)
+ {
+ var response = event.params.response;
+ var filename = response.url.split('/').pop();
+ var id = getInterceptionId(filename);
+ log(id, "Network.responseReceived " + filename + " " + response.status +
+ " " + response.mimeType);
+ }
+
+ function onStop()
+ {
+ frameStoppedLoading = true;
+ log(getNextId(), "Page.frameStoppedLoading");
+
+ maybeCompleteTest();
+ }
+
+ function onConsoleAPICalled(messageObject)
+ {
+ if (messageObject.params.type !== "log")
+ return;
+
+ numConsoleLogsToWaitFor--;
+ maybeCompleteTest();
+ }
+
+ // Wait until we've seen Page.frameStoppedLoading and the expected number of
+ // console logs.
+ function maybeCompleteTest() {
+ if (numConsoleLogsToWaitFor === 0 && frameStoppedLoading)
+ completeTest();
+ }
+
+ enableNetwork();
+}
+
+InspectorTest.allowRequest = function(event) {
+ var id = canonicalId(event.params.InterceptionId);
+ log(id, "allowRequest " + id);
+ InspectorTest.sendCommand("Network.continueInterceptedRequest", {
+ "interceptionId": event.params.InterceptionId
+ });
+}
+
+InspectorTest.modifyRequest = function(event, params) {
+ var id = canonicalId(event.params.InterceptionId);
+ var mods = [];
+ for (property in params) {
+ if (!params.hasOwnProperty(property))
+ continue;
+ if (property === "url") {
+ var newUrl = params["url"];
+ var filename = interceptionRequestParams[id].url;
+ mods.push("url " + filename.split('/').pop() + " -> " + newUrl);
+ var directoryPath =
+ filename.substring(0, filename.lastIndexOf('/') + 1);
+ params["url"] = directoryPath + newUrl;
+ } else {
+ mods.push(property + " " +
+ JSON.stringify(interceptionRequestParams[id][property]) +
+ " -> " + JSON.stringify(params[property]));
+ }
+ }
+
+ log(id, "modifyRequest " + id + ": " + mods.join("; "));
+ params["interceptionId"] = event.params.InterceptionId;
+ InspectorTest.sendCommand("Network.continueInterceptedRequest", params);
+}
+
+InspectorTest.blockRequest = function(event, errorReason) {
+ var id = canonicalId(event.params.InterceptionId);
+ log(id, "blockRequest " + id + " " + errorReason);
+ InspectorTest.sendCommand("Network.continueInterceptedRequest", {
+ "interceptionId": event.params.InterceptionId,
+ "errorReason": errorReason
+ });
+}
+
+InspectorTest.mockResponse = function(event, rawResponse) {
+ var id = canonicalId(event.params.InterceptionId);
+ log(id, "mockResponse " + id);
+ InspectorTest.sendCommand("Network.continueInterceptedRequest", {
+ "interceptionId": event.params.InterceptionId,
+ "rawResponse": btoa(rawResponse)
+ });
+}
+
+InspectorTest.disableRequestInterception = function(event) {
+ var id = canonicalId(event.params.InterceptionId);
+ log(id, "----- disableRequestInterception -----");
+ InspectorTest.sendCommand("Network.enableRequestInterception", {
+ "enabled": false,
+ });
+}
+
+}

Powered by Google App Engine
This is Rietveld 408576698