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

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: Add a comment Created 3 years, 6 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 filenameToInterceptionId = {};
6 var loggedMessages = {};
7 var InterceptionIdToCanonicalInterceptionId = {};
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(requestInterceptedDict,
51 numConsoleLogsToWaitFor) {
52 if (typeof numConsoleLogsToWaitFor === "undefined")
53 numConsoleLogsToWaitFor = 0;
54
55 InspectorTest.eventHandler["Network.requestIntercepted"] = onRequestIntercep ted;
56 InspectorTest.eventHandler["Network.loadingFailed"] = onLoadingFailed;
57 InspectorTest.eventHandler["Network.requestWillBeSent"] = onRequestWillBeSen t;
58 InspectorTest.eventHandler["Network.responseReceived"] = onResponseReceived;
59 InspectorTest.eventHandler["Runtime.consoleAPICalled"] = onConsoleAPICalled;
60 InspectorTest.eventHandler["Page.frameStoppedLoading"] = onStop;
61
62 var frameStoppedLoading = false;
63
64 function getInterceptionId(filename) {
65 if (!filenameToInterceptionId.hasOwnProperty(filename)) {
66 filenameToInterceptionId[filename] = getNextId()
67 }
68 return filenameToInterceptionId[filename];
69 }
70
71 function enableNetwork()
72 {
73 InspectorTest.log("Test started");
74 InspectorTest.sendCommand("Network.enable", {}, didEnableNetwork);
75 }
76
77 function didEnableNetwork(messageObject)
78 {
79 if (messageObject.error) {
80 completeTest("FAIL: Couldn't enable network agent" +
81 messageObject.error.message);
82 return;
83 }
84 InspectorTest.log("Network agent enabled");
85 InspectorTest.sendCommand(
86 "Network.enableRequestInterception", {"enabled": true},
87 didEnableRequestInterception);
88 }
89
90 function didEnableRequestInterception(messageObject)
91 {
92 if (messageObject.error) {
93 completeTest("FAIL: Couldn't enable fetch interception" +
94 messageObject.error.message);
95 return;
96 }
97 InspectorTest.log("Request interception enabled");
98 InspectorTest.sendCommand("Page.enable", {}, didEnablePage);
99 }
100
101 function didEnablePage(messageObject)
102 {
103 if (messageObject.error) {
104 completeTest("FAIL: Couldn't enable page agent" +
105 messageObject.error.message);
106 return;
107 }
108 InspectorTest.log("Page agent enabled");
109
110 InspectorTest.sendCommand("Runtime.enable", {}, didEnableRuntime);
111 }
112
113 function didEnableRuntime(messageObject)
114 {
115 if (messageObject.error) {
116 completeTest("FAIL: Couldn't enable runtime agent" +
117 messageObject.error.message);
118 return;
119 }
120 InspectorTest.log("Runtime agent enabled");
121
122 InspectorTest.sendCommand(
123 "Runtime.evaluate", { "expression": "appendIframe()"});
124 }
125
126 function onRequestIntercepted(event)
127 {
128 var filename = event.params.request.url.split('/').pop();
129 var id = canonicalId(event.params.InterceptionId);
130 filenameToInterceptionId[filename] = id;
131 if (!requestInterceptedDict.hasOwnProperty(filename)) {
132 completeTest("FAILED: unexpected request interception " +
133 JSON.stringify(event.params));
134 return;
135 }
136 if (event.params.hasOwnProperty("redirectUrl")) {
137 log(id, "Network.requestIntercepted " + id + " " +
138 event.params.redirectStatusCode + " redirect " +
139 interceptionRequestParams[id].url.split('/').pop() +
140 " -> " + event.params.redirectUrl.split('/').pop());
141 interceptionRequestParams[id].url = event.params.redirectUrl;
142 } else {
143 interceptionRequestParams[id] = event.params.request;
144 log(id, "Network.requestIntercepted " + id + " " +
145 event.params.request.method + " " + filename);
146 }
147 requestInterceptedDict[filename](event);
148 }
149
150 function onLoadingFailed(event)
151 {
152 var filename = requestIdToFilename[event.params.requestId];
153 var id = getInterceptionId(filename);
154 log(id, "Network.loadingFailed " + filename + " " +
155 event.params.errorText);
156 }
157
158 function onRequestWillBeSent(event)
159 {
160 var filename = event.params.request.url.split('/').pop();
161 requestIdToFilename[event.params.requestId] = filename;
162 }
163
164 function onResponseReceived(event)
165 {
166 var response = event.params.response;
167 var filename = response.url.split('/').pop();
168 var id = getInterceptionId(filename);
169 log(id, "Network.responseReceived " + filename + " " + response.status +
170 " " + response.mimeType);
171 }
172
173 function onStop()
174 {
175 frameStoppedLoading = true;
176 log(getNextId(), "Page.frameStoppedLoading");
177
178 maybeCompleteTest();
179 }
180
181 function onConsoleAPICalled(messageObject)
182 {
183 if (messageObject.params.type !== "log")
184 return;
185
186 numConsoleLogsToWaitFor--;
187 maybeCompleteTest();
188 }
189
190 // Wait until we've seen Page.frameStoppedLoading and the expected number of
191 // console logs.
192 function maybeCompleteTest() {
193 if (numConsoleLogsToWaitFor === 0 && frameStoppedLoading)
194 completeTest();
195 }
196
197 enableNetwork();
198 }
199
200 InspectorTest.allowRequest = function(event) {
201 var id = canonicalId(event.params.InterceptionId);
202 log(id, "allowRequest " + id);
203 InspectorTest.sendCommand("Network.continueInterceptedRequest", {
204 "interceptionId": event.params.InterceptionId
205 });
206 }
207
208 InspectorTest.modifyRequest = function(event, params) {
209 var id = canonicalId(event.params.InterceptionId);
210 var mods = [];
211 for (property in params) {
212 if (!params.hasOwnProperty(property))
213 continue;
214 if (property === "url") {
215 var newUrl = params["url"];
216 var filename = interceptionRequestParams[id].url;
217 mods.push("url " + filename.split('/').pop() + " -> " + newUrl);
218 var directoryPath =
219 filename.substring(0, filename.lastIndexOf('/') + 1);
220 params["url"] = directoryPath + newUrl;
221 } else {
222 mods.push(property + " " +
223 JSON.stringify(interceptionRequestParams[id][property]) +
224 " -> " + JSON.stringify(params[property]));
225 }
226 }
227
228 log(id, "modifyRequest " + id + ": " + mods.join("; "));
229 params["interceptionId"] = event.params.InterceptionId;
230 InspectorTest.sendCommand("Network.continueInterceptedRequest", params);
231 }
232
233 InspectorTest.blockRequest = function(event, errorReason) {
234 var id = canonicalId(event.params.InterceptionId);
235 log(id, "blockRequest " + id + " " + errorReason);
236 InspectorTest.sendCommand("Network.continueInterceptedRequest", {
237 "interceptionId": event.params.InterceptionId,
238 "errorReason": errorReason
239 });
240 }
241
242 InspectorTest.mockResponse = function(event, rawResponse) {
243 var id = canonicalId(event.params.InterceptionId);
244 log(id, "mockResponse " + id);
245 InspectorTest.sendCommand("Network.continueInterceptedRequest", {
246 "interceptionId": event.params.InterceptionId,
247 "rawResponse": btoa(rawResponse)
248 });
249 }
250
251 InspectorTest.disableRequestInterception = function(event) {
252 var id = canonicalId(event.params.InterceptionId);
253 log(id, "----- disableRequestInterception -----");
254 InspectorTest.sendCommand("Network.enableRequestInterception", {
255 "enabled": false,
256 });
257 }
258
259 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698