1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 var pass = chrome.test.callbackPass;
7 // Constants as functions, not to be called until after runTests.
8 function getURLEchoUserAgent() {
9 return getServerURL('echoheader?User-Agent');
12 function getURLSetCookie() {
13 return getServerURL('set-cookie?Foo=Bar');
16 function getURLNonUTF8SetCookie() {
17 return getServerURL('set-header?Set-Cookie%3A%20Foo%3D%FE%D1');
20 function getURLHttpSimpleLoad() {
21 return getServerURL('extensions/api_test/webrequest/simpleLoad/a.html');
23 function getURLHttpXHRData() {
24 return getServerURL('extensions/api_test/webrequest/xhr/data.json');
27 function toCharCodes(str) {
29 for (var i = 0; i < str.length; ++i) {
30 result[i] = str.charCodeAt(i);
36 // Navigates to a page with subresources, with a blocking handler that
37 // cancels the page request. The page will not load, and we should not
38 // see the subresources.
39 function complexLoadCancelled() {
42 { label: "onBeforeRequest",
43 event: "onBeforeRequest",
46 url: getURL("complexLoad/b.html"),
47 frameUrl: getURL("complexLoad/b.html")
49 retval: {cancel: true}
51 // Cancelling is considered an error.
52 { label: "onErrorOccurred",
53 event: "onErrorOccurred",
55 url: getURL("complexLoad/b.html"),
57 error: "net::ERR_BLOCKED_BY_CLIENT"
58 // Request to chrome-extension:// url has no IP.
63 ["onBeforeRequest", "onErrorOccurred"]
65 {urls: ["<all_urls>"]}, // filter
67 navigateAndWait(getURL("complexLoad/b.html"));
70 // Navigates to a page with subresources, with a blocking handler that
71 // cancels the page request. The page will not load, and we should not
72 // see the subresources.
73 function simpleLoadCancelledOnReceiveHeaders() {
76 { label: "onBeforeRequest",
77 event: "onBeforeRequest",
81 url: getURLHttpSimpleLoad(),
82 frameUrl: getURLHttpSimpleLoad()
84 retval: {cancel: false}
86 { label: "onBeforeSendHeaders",
87 event: "onBeforeSendHeaders",
89 url: getURLHttpSimpleLoad(),
90 // Note: no requestHeaders because we don't ask for them.
93 { label: "onSendHeaders",
94 event: "onSendHeaders",
96 url: getURLHttpSimpleLoad()
99 { label: "onHeadersReceived",
100 event: "onHeadersReceived",
102 url: getURLHttpSimpleLoad(),
103 statusLine: "HTTP/1.1 200 OK",
105 retval: {cancel: true}
107 // Cancelling is considered an error.
108 { label: "onErrorOccurred",
109 event: "onErrorOccurred",
111 url: getURLHttpSimpleLoad(),
113 error: "net::ERR_BLOCKED_BY_CLIENT"
114 // Request to chrome-extension:// url has no IP.
119 ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
120 "onHeadersReceived", "onErrorOccurred"]
122 {urls: ["<all_urls>"]}, // filter
124 navigateAndWait(getURLHttpSimpleLoad());
127 // Navigates to a page and provides invalid header information. The request
128 // should continue as if the headers were not changed.
129 function simpleLoadIgnoreOnBeforeSendHeadersInvalidHeaders() {
132 { label: "onBeforeRequest",
133 event: "onBeforeRequest",
137 url: getURLHttpSimpleLoad(),
138 frameUrl: getURLHttpSimpleLoad()
141 { label: "onBeforeSendHeaders",
142 event: "onBeforeSendHeaders",
144 url: getURLHttpSimpleLoad(),
145 requestHeadersValid: true
147 retval: {requestHeaders: [{name: "User-Agent"}]}
149 // The headers were invalid, so they should not be modified.
150 // TODO(robwu): Test whether an error is logged to the console.
151 { label: "onSendHeaders",
152 event: "onSendHeaders",
154 url: getURLHttpSimpleLoad(),
155 requestHeadersValid: true
158 { label: "onHeadersReceived",
159 event: "onHeadersReceived",
161 url: getURLHttpSimpleLoad(),
162 statusLine: "HTTP/1.1 200 OK",
165 { label: "onResponseStarted",
166 event: "onResponseStarted",
168 url: getURLHttpSimpleLoad(),
172 statusLine: "HTTP/1.1 200 OK",
175 { label: "onCompleted",
176 event: "onCompleted",
178 url: getURLHttpSimpleLoad(),
182 statusLine: "HTTP/1.1 200 OK",
187 ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
188 "onHeadersReceived", "onResponseStarted", "onCompleted"]
190 {urls: ["<all_urls>"]}, // filter
191 ["blocking", "requestHeaders"]);
192 navigateAndWait(getURLHttpSimpleLoad());
195 // Navigates to a page and provides invalid header information. The request
196 // should continue as if the headers were not changed.
197 function simpleLoadIgnoreOnBeforeSendHeadersInvalidResponse() {
198 // Exception handling seems to break this test, so disable it.
199 // See http://crbug.com/370897. TODO(robwu): Fix me.
200 chrome.test.setExceptionHandler(function(){});
203 { label: "onBeforeRequest",
204 event: "onBeforeRequest",
208 url: getURLHttpSimpleLoad(),
209 frameUrl: getURLHttpSimpleLoad()
212 { label: "onBeforeSendHeaders",
213 event: "onBeforeSendHeaders",
215 url: getURLHttpSimpleLoad(),
216 requestHeadersValid: true
220 // TODO(robwu): Test whether an error is logged to the console.
221 { label: "onSendHeaders",
222 event: "onSendHeaders",
224 url: getURLHttpSimpleLoad(),
225 requestHeadersValid: true
228 { label: "onHeadersReceived",
229 event: "onHeadersReceived",
231 url: getURLHttpSimpleLoad(),
232 statusLine: "HTTP/1.1 200 OK",
235 { label: "onResponseStarted",
236 event: "onResponseStarted",
238 url: getURLHttpSimpleLoad(),
242 statusLine: "HTTP/1.1 200 OK",
245 { label: "onCompleted",
246 event: "onCompleted",
248 url: getURLHttpSimpleLoad(),
252 statusLine: "HTTP/1.1 200 OK",
257 ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
258 "onHeadersReceived", "onResponseStarted", "onCompleted"]
260 {urls: ["<all_urls>"]}, // filter
261 ["blocking", "requestHeaders"]);
262 navigateAndWait(getURLHttpSimpleLoad());
265 // Navigates to a page with a blocking handler that redirects to a different
267 function complexLoadRedirected() {
270 { label: "onBeforeRequest-1",
271 event: "onBeforeRequest",
273 url: getURL("complexLoad/a.html"),
274 frameUrl: getURL("complexLoad/a.html")
276 retval: {redirectUrl: getURL("simpleLoad/a.html")}
278 { label: "onBeforeRedirect",
279 event: "onBeforeRedirect",
281 url: getURL("complexLoad/a.html"),
282 redirectUrl: getURL("simpleLoad/a.html"),
284 statusLine: "HTTP/1.1 307 Internal Redirect",
288 { label: "onBeforeRequest-2",
289 event: "onBeforeRequest",
291 url: getURL("simpleLoad/a.html"),
292 frameUrl: getURL("simpleLoad/a.html"),
295 { label: "onResponseStarted",
296 event: "onResponseStarted",
298 url: getURL("simpleLoad/a.html"),
301 statusLine: "HTTP/1.1 200 OK",
302 // Request to chrome-extension:// url has no IP.
305 { label: "onCompleted",
306 event: "onCompleted",
308 url: getURL("simpleLoad/a.html"),
311 statusLine: "HTTP/1.1 200 OK",
312 // Request to chrome-extension:// url has no IP.
317 ["onBeforeRequest-1", "onBeforeRedirect", "onBeforeRequest-2",
318 "onResponseStarted", "onCompleted"],
320 {urls: ["<all_urls>"]}, // filter
322 navigateAndWait(getURL("complexLoad/a.html"));
325 // Loads a testserver page that echoes the User-Agent header that was
326 // sent to fetch it. We modify the outgoing User-Agent in
327 // onBeforeSendHeaders, so we should see that modified version.
328 function modifyRequestHeaders() {
331 { label: "onBeforeRequest",
332 event: "onBeforeRequest",
334 url: getURLEchoUserAgent(),
335 frameUrl: getURLEchoUserAgent()
338 { label: "onBeforeSendHeaders",
339 event: "onBeforeSendHeaders",
341 url: getURLEchoUserAgent(),
342 // Note: no requestHeaders because we don't ask for them.
344 retval: {requestHeaders: [{name: "User-Agent", value: "FoobarUA"}]}
346 { label: "onSendHeaders",
347 event: "onSendHeaders",
349 url: getURLEchoUserAgent()
352 { label: "onHeadersReceived",
353 event: "onHeadersReceived",
355 url: getURLEchoUserAgent(),
356 statusLine: "HTTP/1.1 200 OK",
359 { label: "onResponseStarted",
360 event: "onResponseStarted",
362 url: getURLEchoUserAgent(),
366 statusLine: "HTTP/1.1 200 OK",
369 { label: "onCompleted",
370 event: "onCompleted",
372 url: getURLEchoUserAgent(),
376 statusLine: "HTTP/1.1 200 OK",
381 ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
382 "onHeadersReceived", "onResponseStarted", "onCompleted"]
384 {urls: ["<all_urls>"]}, ["blocking"]);
385 // Check the page content for our modified User-Agent string.
386 navigateAndWait(getURLEchoUserAgent(), function() {
387 chrome.test.listenOnce(chrome.extension.onRequest, function(request) {
388 chrome.test.assertTrue(request.pass, "Request header was not set.");
390 chrome.tabs.executeScript(tabId,
392 code: "chrome.extension.sendRequest(" +
393 "{pass: document.body.innerText.indexOf('FoobarUA') >= 0});"
398 // Loads a testserver page that echoes the User-Agent header that was
399 // sent to fetch it. We modify the outgoing User-Agent in
400 // onBeforeSendHeaders, so we should see that modified version.
401 // In this version we check whether we can set binary header values.
402 function modifyBinaryRequestHeaders() {
405 { label: "onBeforeRequest",
406 event: "onBeforeRequest",
408 url: getURLEchoUserAgent(),
409 frameUrl: getURLEchoUserAgent()
412 { label: "onBeforeSendHeaders",
413 event: "onBeforeSendHeaders",
415 url: getURLEchoUserAgent(),
416 // Note: no requestHeaders because we don't ask for them.
418 retval: {requestHeaders: [{name: "User-Agent",
419 binaryValue: toCharCodes("FoobarUA")}]}
421 { label: "onSendHeaders",
422 event: "onSendHeaders",
424 url: getURLEchoUserAgent()
427 { label: "onHeadersReceived",
428 event: "onHeadersReceived",
430 url: getURLEchoUserAgent(),
431 statusLine: "HTTP/1.1 200 OK",
434 { label: "onResponseStarted",
435 event: "onResponseStarted",
437 url: getURLEchoUserAgent(),
441 statusLine: "HTTP/1.1 200 OK",
444 { label: "onCompleted",
445 event: "onCompleted",
447 url: getURLEchoUserAgent(),
451 statusLine: "HTTP/1.1 200 OK",
456 ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
457 "onHeadersReceived", "onResponseStarted", "onCompleted"]
459 {urls: ["<all_urls>"]}, ["blocking"]);
460 // Check the page content for our modified User-Agent string.
461 navigateAndWait(getURLEchoUserAgent(), function() {
462 chrome.test.listenOnce(chrome.extension.onRequest, function(request) {
463 chrome.test.assertTrue(request.pass, "Request header was not set.");
465 chrome.tabs.executeScript(tabId,
467 code: "chrome.extension.sendRequest(" +
468 "{pass: document.body.innerText.indexOf('FoobarUA') >= 0});"
473 // Loads a testserver page that sets a cookie "Foo=Bar" but removes
474 // the cookies from the response headers so that they are not set.
475 function modifyResponseHeaders() {
478 { label: "onBeforeRequest",
479 event: "onBeforeRequest",
483 url: getURLSetCookie(),
484 frameUrl: getURLSetCookie()
487 { label: "onBeforeSendHeaders",
488 event: "onBeforeSendHeaders",
490 url: getURLSetCookie(),
491 // Note: no requestHeaders because we don't ask for them.
494 { label: "onSendHeaders",
495 event: "onSendHeaders",
497 url: getURLSetCookie(),
500 { label: "onHeadersReceived",
501 event: "onHeadersReceived",
503 url: getURLSetCookie(),
504 statusLine: "HTTP/1.1 200 OK",
505 responseHeadersExist: true,
507 retval_function: function(name, details) {
508 responseHeaders = details.responseHeaders;
510 for (var i = 0; i < responseHeaders.length; ++i) {
511 if (responseHeaders[i].name === "Set-Cookie" &&
512 responseHeaders[i].value.indexOf("Foo") != -1) {
514 responseHeaders.splice(i);
518 chrome.test.assertTrue(found);
519 return {responseHeaders: responseHeaders};
522 { label: "onResponseStarted",
523 event: "onResponseStarted",
525 url: getURLSetCookie(),
528 statusLine: "HTTP/1.1 200 OK",
530 responseHeadersExist: true,
533 { label: "onCompleted",
534 event: "onCompleted",
536 url: getURLSetCookie(),
539 statusLine: "HTTP/1.1 200 OK",
541 responseHeadersExist: true,
546 ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
547 "onHeadersReceived", "onResponseStarted", "onCompleted"]
549 {urls: ["<all_urls>"]}, ["blocking", "responseHeaders"]);
550 // Check that the cookie was really removed.
551 navigateAndWait(getURLSetCookie(), function() {
552 chrome.test.listenOnce(chrome.extension.onRequest, function(request) {
553 chrome.test.assertTrue(request.pass, "Cookie was not removed.");
555 chrome.tabs.executeScript(tabId,
556 { code: "chrome.extension.sendRequest(" +
557 "{pass: document.cookie.indexOf('Foo') == -1});"
562 // Loads a testserver page that sets a cookie "Foo=U+FDD1" which is not a
563 // valid UTF-8 code point. Therefore, it cannot be passed to JavaScript
564 // as a normal string.
565 function handleNonUTF8InModifyResponseHeaders() {
568 { label: "onBeforeRequest",
569 event: "onBeforeRequest",
573 url: getURLNonUTF8SetCookie(),
574 frameUrl: getURLNonUTF8SetCookie()
577 { label: "onBeforeSendHeaders",
578 event: "onBeforeSendHeaders",
580 url: getURLNonUTF8SetCookie(),
581 // Note: no requestHeaders because we don't ask for them.
584 { label: "onSendHeaders",
585 event: "onSendHeaders",
587 url: getURLNonUTF8SetCookie(),
590 { label: "onHeadersReceived",
591 event: "onHeadersReceived",
593 url: getURLNonUTF8SetCookie(),
594 statusLine: "HTTP/1.1 200 OK",
595 responseHeadersExist: true,
597 retval_function: function(name, details) {
598 responseHeaders = details.responseHeaders;
600 var expectedValue = [
607 for (var i = 0; i < responseHeaders.length; ++i) {
608 if (responseHeaders[i].name === "Set-Cookie" &&
609 deepEq(responseHeaders[i].binaryValue, expectedValue)) {
611 responseHeaders.splice(i);
615 chrome.test.assertTrue(found);
616 return {responseHeaders: responseHeaders};
619 { label: "onResponseStarted",
620 event: "onResponseStarted",
622 url: getURLNonUTF8SetCookie(),
625 statusLine: "HTTP/1.1 200 OK",
627 responseHeadersExist: true,
630 { label: "onCompleted",
631 event: "onCompleted",
633 url: getURLNonUTF8SetCookie(),
636 statusLine: "HTTP/1.1 200 OK",
638 responseHeadersExist: true,
643 ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
644 "onHeadersReceived", "onResponseStarted", "onCompleted"]
646 {urls: ["<all_urls>"]}, ["blocking", "responseHeaders"]);
647 // Check that the cookie was really removed.
648 navigateAndWait(getURLNonUTF8SetCookie(), function() {
649 chrome.test.listenOnce(chrome.extension.onRequest, function(request) {
650 chrome.test.assertTrue(request.pass, "Cookie was not removed.");
652 chrome.tabs.executeScript(tabId,
653 { code: "chrome.extension.sendRequest(" +
654 "{pass: document.cookie.indexOf('Foo') == -1});"
659 // Navigates to a page with a blocking handler that redirects to a different
660 // non-http page during onHeadersReceived. The requested page should not be
661 // loaded, and the redirect should succeed.
662 function simpleLoadRedirectOnReceiveHeaders() {
665 { label: "onBeforeRequest-1",
666 event: "onBeforeRequest",
670 url: getURLHttpSimpleLoad(),
671 frameUrl: getURLHttpSimpleLoad()
674 { label: "onBeforeSendHeaders",
675 event: "onBeforeSendHeaders",
677 url: getURLHttpSimpleLoad(),
678 // Note: no requestHeaders because we don't ask for them.
681 { label: "onSendHeaders",
682 event: "onSendHeaders",
684 url: getURLHttpSimpleLoad()
687 { label: "onHeadersReceived",
688 event: "onHeadersReceived",
690 url: getURLHttpSimpleLoad(),
691 statusLine: "HTTP/1.1 200 OK",
693 retval: {redirectUrl: getURL("simpleLoad/a.html")}
695 { label: "onBeforeRedirect",
696 event: "onBeforeRedirect",
698 url: getURLHttpSimpleLoad(),
699 redirectUrl: getURL("simpleLoad/a.html"),
700 statusLine: "HTTP/1.1 302 Found",
706 { label: "onBeforeRequest-2",
707 event: "onBeforeRequest",
709 url: getURL("simpleLoad/a.html"),
710 frameUrl: getURL("simpleLoad/a.html"),
713 { label: "onResponseStarted",
714 event: "onResponseStarted",
716 url: getURL("simpleLoad/a.html"),
719 statusLine: "HTTP/1.1 200 OK",
720 // Request to chrome-extension:// url has no IP.
723 { label: "onCompleted",
724 event: "onCompleted",
726 url: getURL("simpleLoad/a.html"),
729 statusLine: "HTTP/1.1 200 OK",
730 // Request to chrome-extension:// url has no IP.
735 ["onBeforeRequest-1", "onBeforeSendHeaders", "onSendHeaders",
736 "onHeadersReceived", "onBeforeRedirect", "onBeforeRequest-2",
737 "onResponseStarted", "onCompleted"]
739 {urls: ["<all_urls>"]}, // filter
741 navigateAndWait(getURLHttpSimpleLoad());
744 // Checks that synchronous XHR requests from ourself are invisible to blocking
746 function syncXhrsFromOurselfAreInvisible() {
749 { label: "a-onBeforeRequest",
750 event: "onBeforeRequest",
752 url: getURL("simpleLoad/a.html"),
753 frameUrl: getURL("simpleLoad/a.html")
756 { label: "a-onResponseStarted",
757 event: "onResponseStarted",
759 url: getURL("simpleLoad/a.html"),
762 statusLine: "HTTP/1.1 200 OK",
763 // Request to chrome-extension:// url has no IP.
766 { label: "a-onCompleted",
767 event: "onCompleted",
769 url: getURL("simpleLoad/a.html"),
772 statusLine: "HTTP/1.1 200 OK",
773 // Request to chrome-extension:// url has no IP.
776 // We do not see onBeforeRequest for the XHR request here because it is
777 // handled by a blocking handler.
778 { label: "x-onSendHeaders",
779 event: "onSendHeaders",
781 url: getURLHttpXHRData(),
783 type: "xmlhttprequest",
786 { label: "x-onResponseStarted",
787 event: "onResponseStarted",
789 url: getURLHttpXHRData(),
792 statusLine: "HTTP/1.1 200 OK",
794 type: "xmlhttprequest",
796 // Request to chrome-extension:// url has no IP.
799 { label: "x-onCompleted",
800 event: "onCompleted",
802 url: getURLHttpXHRData(),
805 statusLine: "HTTP/1.1 200 OK",
807 type: "xmlhttprequest",
809 // Request to chrome-extension:// url has no IP.
812 { label: "b-onBeforeRequest",
813 event: "onBeforeRequest",
815 url: getURL("complexLoad/b.jpg"),
816 frameUrl: getURL("complexLoad/b.jpg")
819 { label: "b-onResponseStarted",
820 event: "onResponseStarted",
822 url: getURL("complexLoad/b.jpg"),
825 statusLine: "HTTP/1.1 200 OK",
826 // Request to chrome-extension:// url has no IP.
829 { label: "b-onCompleted",
830 event: "onCompleted",
832 url: getURL("complexLoad/b.jpg"),
835 statusLine: "HTTP/1.1 200 OK",
836 // Request to chrome-extension:// url has no IP.
841 ["a-onBeforeRequest", "a-onResponseStarted", "a-onCompleted",
842 "x-onSendHeaders", "x-onResponseStarted", "x-onCompleted",
843 "b-onBeforeRequest", "b-onResponseStarted", "b-onCompleted"]
845 {urls: ["<all_urls>"]}, ["blocking"]);
846 // Check the page content for our modified User-Agent string.
847 navigateAndWait(getURL("simpleLoad/a.html"), function() {
848 var req = new XMLHttpRequest();
849 var asynchronous = false;
850 req.open("GET", getURLHttpXHRData(), asynchronous);
852 navigateAndWait(getURL("complexLoad/b.jpg"));
856 // Checks that asynchronous XHR requests from ourself are visible to blocking
858 function asyncXhrsFromOurselfAreVisible() {
861 { label: "a-onBeforeRequest",
862 event: "onBeforeRequest",
864 url: getURL("simpleLoad/a.html"),
865 frameUrl: getURL("simpleLoad/a.html")
868 { label: "a-onResponseStarted",
869 event: "onResponseStarted",
871 url: getURL("simpleLoad/a.html"),
874 statusLine: "HTTP/1.1 200 OK",
875 // Request to chrome-extension:// url has no IP.
878 { label: "a-onCompleted",
879 event: "onCompleted",
881 url: getURL("simpleLoad/a.html"),
884 statusLine: "HTTP/1.1 200 OK",
885 // Request to chrome-extension:// url has no IP.
889 label: "x-onBeforeRequest",
890 event: "onBeforeRequest",
892 url: getURLHttpXHRData(),
894 type: "xmlhttprequest",
895 frameUrl: "unknown frame URL",
899 label: "x-onBeforeSendHeaders",
900 event: "onBeforeSendHeaders",
902 url: getURLHttpXHRData(),
904 type: "xmlhttprequest",
907 { label: "x-onSendHeaders",
908 event: "onSendHeaders",
910 url: getURLHttpXHRData(),
912 type: "xmlhttprequest",
915 { label: "x-onResponseStarted",
916 event: "onResponseStarted",
918 url: getURLHttpXHRData(),
921 statusLine: "HTTP/1.1 200 OK",
923 type: "xmlhttprequest",
925 // Request to chrome-extension:// url has no IP.
929 label: "x-onHeadersReceived",
930 event: "onHeadersReceived",
932 url: getURLHttpXHRData(),
934 type: "xmlhttprequest",
935 statusLine: "HTTP/1.1 200 OK",
938 { label: "x-onCompleted",
939 event: "onCompleted",
941 url: getURLHttpXHRData(),
944 statusLine: "HTTP/1.1 200 OK",
946 type: "xmlhttprequest",
948 // Request to chrome-extension:// url has no IP.
951 { label: "b-onBeforeRequest",
952 event: "onBeforeRequest",
954 url: getURL("complexLoad/b.jpg"),
955 frameUrl: getURL("complexLoad/b.jpg")
958 { label: "b-onResponseStarted",
959 event: "onResponseStarted",
961 url: getURL("complexLoad/b.jpg"),
964 statusLine: "HTTP/1.1 200 OK",
965 // Request to chrome-extension:// url has no IP.
968 { label: "b-onCompleted",
969 event: "onCompleted",
971 url: getURL("complexLoad/b.jpg"),
974 statusLine: "HTTP/1.1 200 OK",
975 // Request to chrome-extension:// url has no IP.
980 ["a-onBeforeRequest", "a-onResponseStarted", "a-onCompleted",
981 "x-onBeforeRequest", "x-onBeforeSendHeaders", "x-onSendHeaders",
982 "x-onHeadersReceived", "x-onResponseStarted", "x-onCompleted"],
983 ["a-onCompleted", "x-onBeforeRequest",
984 "b-onBeforeRequest", "b-onResponseStarted", "b-onCompleted"]
986 {urls: ["<all_urls>"]}, ["blocking"]);
987 // Check the page content for our modified User-Agent string.
988 navigateAndWait(getURL("simpleLoad/a.html"), function() {
989 var req = new XMLHttpRequest();
990 var asynchronous = true;
991 req.open("GET", getURLHttpXHRData(), asynchronous);
993 navigateAndWait(getURL("complexLoad/b.jpg"));