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

Side by Side 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: Fix 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 unified diff | Download patch
OLDNEW
(Empty)
1 var initialize_InterceptionTest = function() {
2
3 var interceptionRequestParams = {};
4 var requestIdToFilename = {};
5 var filenameToInterceptId = {};
6 var loggedMessages = {};
7 var interceptIdToCanonicalInterceptionId = {};
8 var idToCanoncalId = {};
9 var nextId = 1;
10
11 function getNextId()
12 {
13 return "ID " + nextId++;
14 }
15
16 function canonicalId(id)
17 {
18 if (!idToCanoncalId.hasOwnProperty(id))
19 idToCanoncalId[id] = getNextId();
20 return idToCanoncalId[id];
21 }
22
23 function log(id, message)
24 {
25 testRunner.logToStderr("id " + id + " " + message);
26 if (!loggedMessages.hasOwnProperty(id))
27 loggedMessages[id] = [];
28 loggedMessages[id].push(message);
29 }
30
31 function completeTest(message)
32 {
33 // The order in which network events occur is not fully deterministic so we
34 // sort based on the interception ID to try and make the test non-flaky.
35 for (var property in loggedMessages) {
36 if (loggedMessages.hasOwnProperty(property)) {
37 var messages = loggedMessages[property];
38 for (var i = 0; i < messages.length; i++) {
39 InspectorTest.log(messages[i]);
40 }
41 }
42 }
43
44 if (message)
45 InspectorTest.log(message);
46
47 InspectorTest.completeTest();
48 }
49
50 InspectorTest.startInterceptionTest = function(interceptedRequestDict,
51 interceptedRedirectDict,
52 numConsoleLogsToWaitFor) {
53 if (typeof numConsoleLogsToWaitFor === "undefined")
54 numConsoleLogsToWaitFor = 0;
55
56 InspectorTest.eventHandler["Network.interceptedRequest"] = onInterceptedRequ est;
57 InspectorTest.eventHandler["Network.interceptedRedirect"] = onInterceptedRed irect;
58 InspectorTest.eventHandler["Network.loadingFailed"] = onLoadingFailed;
59 InspectorTest.eventHandler["Network.requestWillBeSent"] = onRequestWillBeSen t;
60 InspectorTest.eventHandler["Network.responseReceived"] = onResponseReceived;
61 InspectorTest.eventHandler["Runtime.consoleAPICalled"] = onConsoleAPICalled;
62 InspectorTest.eventHandler["Page.frameStoppedLoading"] = onStop;
63
64 var frameStoppedLoading = false;
65
66 function enableNetwork()
67 {
68 InspectorTest.log("Test started");
69 InspectorTest.sendCommand("Network.enable", {}, didEnableNetwork);
70 }
71
72 function didEnableNetwork(messageObject)
73 {
74 if (messageObject.error) {
75 completeTest("FAIL: Couldn't enable network agent" +
76 messageObject.error.message);
77 return;
78 }
79 InspectorTest.log("Network agent enabled");
80 InspectorTest.sendCommand(
81 "Network.enableFetchInterception", {"enabled": true},
82 didEnableFetchInterception);
83 }
84
85 function didEnableFetchInterception(messageObject)
86 {
87 if (messageObject.error) {
88 completeTest("FAIL: Couldn't enable fetch interception" +
89 messageObject.error.message);
90 return;
91 }
92 InspectorTest.log("Fetch interception enabled");
93 InspectorTest.sendCommand("Page.enable", {}, didEnablePage);
94 }
95
96 function didEnablePage(messageObject)
97 {
98 if (messageObject.error) {
99 completeTest("FAIL: Couldn't enable page agent" +
100 messageObject.error.message);
101 return;
102 }
103 InspectorTest.log("Page agent enabled");
104
105 InspectorTest.sendCommand("Runtime.enable", {}, didEnableRuntime);
106 }
107
108 function didEnableRuntime(messageObject)
109 {
110 if (messageObject.error) {
111 completeTest("FAIL: Couldn't enable runtime agent" +
112 messageObject.error.message);
113 return;
114 }
115 InspectorTest.log("Runtime agent enabled");
116
117 InspectorTest.sendCommand(
118 "Runtime.evaluate", { "expression": "appendIframe()"});
119 }
120
121 function onInterceptedRequest(event)
122 {
123 var filename = event.params.request.url.split('/').pop();
124 var id = canonicalId(event.params.interceptId);
125 filenameToInterceptId[filename] = id;
126 interceptionRequestParams[id] = event.params.request;
127 if (interceptedRequestDict.hasOwnProperty(filename)) {
128 log(id, "Network.interceptedRequest " + id + " " +
129 event.params.request.method + " " + filename);
130 interceptedRequestDict[filename](event);
131 } else {
132 completeTest("FAILED: unexpected request interception " +
133 JSON.stringify(event.params));
134 }
135 }
136
137 function onInterceptedRedirect(event)
138 {
139 var redirectFilename = event.params.redirectUrl.split('/').pop();
140 var id = canonicalId(event.params.interceptId);
141 if (interceptedRedirectDict.hasOwnProperty(redirectFilename)) {
142 log(id, "Network.interceptedRedirect " + id + " " +
143 event.params.responseStatusCode + " " +
144 interceptionRequestParams[id].url.split('/').pop() +
145 " -> " + redirectFilename);
146 interceptedRedirectDict[redirectFilename](event);
147 } else {
148 completeTest("FAILED: unexpected redirect interception " +
149 JSON.stringify(event.params));
150 }
151 interceptionRequestParams[id].url = event.params.redirectUrl;
152 }
153
154 function onLoadingFailed(event)
155 {
156 var filename = requestIdToFilename[event.params.requestId];
157 var id = filenameToInterceptId[filename];
158 log(id, "Network.loadingFailed " + filename + " " +
159 event.params.errorText);
160 }
161
162 function onRequestWillBeSent(event)
163 {
164 var filename = event.params.request.url.split('/').pop();
165 requestIdToFilename[event.params.requestId] = filename;
166 }
167
168 function onResponseReceived(event)
169 {
170 var response = event.params.response;
171 var filename = response.url.split('/').pop();
172 var id = filenameToInterceptId[filename];
173 log(id, "Network.responseReceived " + filename + " " + response.status +
174 " " + response.mimeType);
175 }
176
177 function onStop()
178 {
179 frameStoppedLoading = true;
180 log(getNextId(), "Page.frameStoppedLoading");
181
182 maybeCompleteTest();
183 }
184
185 function onConsoleAPICalled(messageObject)
186 {
187 if (messageObject.params.type !== "log")
188 return;
189
190 numConsoleLogsToWaitFor--;
191 maybeCompleteTest();
192 }
193
194 // Wait until we've seen Page.frameStoppedLoading and the expected number of
195 // console logs.
196 function maybeCompleteTest() {
197 if (numConsoleLogsToWaitFor === 0 && frameStoppedLoading)
198 completeTest();
199 }
200
201 enableNetwork();
202 }
203
204 InspectorTest.allowRequest = function(event) {
205 var id = canonicalId(event.params.interceptId);
206 log(id, "Network.allowRequest " + id);
207 InspectorTest.sendCommand(
208 "Network.allowRequest", { "interceptId": event.params.interceptId });
209 }
210
211 InspectorTest.modifyRequest = function(event, params) {
212 var id = canonicalId(event.params.interceptId);
213 var mods = [];
214 for (property in params) {
215 if (!params.hasOwnProperty(property))
216 continue;
217 if (property === "url") {
218 var newUrl = params["url"];
219 var filename = interceptionRequestParams[id].url;
220 mods.push("url " + filename.split('/').pop() + " -> " + newUrl);
221 var directoryPath =
222 filename.substring(0, filename.lastIndexOf('/') + 1);
223 params["url"] = directoryPath + newUrl;
224 } else {
225 mods.push(property + " " +
226 JSON.stringify(interceptionRequestParams[id][property]) +
227 " -> " + JSON.stringify(params[property]));
228 }
229 }
230
231 log(id, "Network.modifyRequest " + id + ": " + mods.join("; "));
232 params["interceptId"] = event.params.interceptId;
233 InspectorTest.sendCommand("Network.modifyRequest", params);
234 }
235
236 InspectorTest.blockRequest = function(event, errorReason) {
237 var id = canonicalId(event.params.interceptId);
238 log(id, "Network.blockRequest " + id + " " + errorReason);
239 InspectorTest.sendCommand("Network.blockRequest", {
240 "interceptId": event.params.interceptId, "errorReason": errorReason});
241 }
242
243 InspectorTest.mockResponse = function(event, rawResponse) {
244 var id = canonicalId(event.params.interceptId);
245 log(id, "Network.mockResponse " + id);
246 InspectorTest.sendCommand("Network.mockResponse", {
247 "interceptId": event.params.interceptId,
248 "rawResponse": rawResponse});
249 }
250
251 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698