// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

var pass = chrome.test.callbackPass;

// Constants as functions, not to be called until after runTests.
function getURLEchoUserAgent() {
  return getServerURL('echoheader?User-Agent');
}

function getURLSetCookie() {
  return getServerURL('set-cookie?Foo=Bar');
}

function getURLNonUTF8SetCookie() {
  return getServerURL('set-header?Set-Cookie%3A%20Foo%3D%FE%D1');
}

function getURLHttpSimpleLoad() {
  return getServerURL('extensions/api_test/webrequest/simpleLoad/a.html');
}
function getURLHttpXHRData() {
  return getServerURL('extensions/api_test/webrequest/xhr/data.json');
}

function toCharCodes(str) {
  var result = [];
  for (var i = 0; i < str.length; ++i) {
    result[i] = str.charCodeAt(i);
  }
  return result;
}

runTests([
  // Navigates to a page with subresources, with a blocking handler that
  // cancels the page request. The page will not load, and we should not
  // see the subresources.
  function complexLoadCancelled() {
    expect(
      [  // events
        { label: "onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            type: "main_frame",
            url: getURL("complexLoad/b.html"),
            frameUrl: getURL("complexLoad/b.html"),
            initiator: getDomain(initiators.BROWSER_INITIATED)
          },
          retval: {cancel: true}
        },
        // Cancelling is considered an error.
        { label: "onErrorOccurred",
          event: "onErrorOccurred",
          details: {
            url: getURL("complexLoad/b.html"),
            fromCache: false,
            error: "net::ERR_BLOCKED_BY_CLIENT",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
      ],
      [  // event order
        ["onBeforeRequest", "onErrorOccurred"]
      ],
      {urls: ["<all_urls>"]},  // filter
      ["blocking"]);
    navigateAndWait(getURL("complexLoad/b.html"));
  },

  // Navigates to a page with subresources, with a blocking handler that
  // cancels the page request. The page will not load, and we should not
  // see the subresources.
  function simpleLoadCancelledOnReceiveHeaders() {
    expect(
      [  // events
        { label: "onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            method: "GET",
            type: "main_frame",
            url: getURLHttpSimpleLoad(),
            frameUrl: getURLHttpSimpleLoad(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          },
          retval: {cancel: false}
        },
        { label: "onBeforeSendHeaders",
          event: "onBeforeSendHeaders",
          details: {
            url: getURLHttpSimpleLoad(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
            // Note: no requestHeaders because we don't ask for them.
          },
        },
        { label: "onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLHttpSimpleLoad(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onHeadersReceived",
          event: "onHeadersReceived",
          details: {
            url: getURLHttpSimpleLoad(),
            statusLine: "HTTP/1.1 200 OK",
            statusCode: 200,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          },
          retval: {cancel: true}
        },
        // Cancelling is considered an error.
        { label: "onErrorOccurred",
          event: "onErrorOccurred",
          details: {
            url: getURLHttpSimpleLoad(),
            fromCache: false,
            error: "net::ERR_BLOCKED_BY_CLIENT",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
      ],
      [  // event order
        ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
         "onHeadersReceived", "onErrorOccurred"]
      ],
      {urls: ["<all_urls>"]},  // filter
      ["blocking"]);
    navigateAndWait(getURLHttpSimpleLoad());
  },

  // Navigates to a page and provides invalid header information. The request
  // should continue as if the headers were not changed.
  function simpleLoadIgnoreOnBeforeSendHeadersInvalidHeaders() {
    expect(
      [  // events
        { label: "onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            method: "GET",
            type: "main_frame",
            url: getURLHttpSimpleLoad(),
            frameUrl: getURLHttpSimpleLoad()
          },
        },
        { label: "onBeforeSendHeaders",
          event: "onBeforeSendHeaders",
          details: {
            url: getURLHttpSimpleLoad(),
            requestHeadersValid: true
          },
          retval: {requestHeaders: [{name: "User-Agent"}]}
        },
        // The headers were invalid, so they should not be modified.
        // TODO(robwu): Test whether an error is logged to the console.
        { label: "onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLHttpSimpleLoad(),
            requestHeadersValid: true
          }
        },
        { label: "onHeadersReceived",
          event: "onHeadersReceived",
          details: {
            url: getURLHttpSimpleLoad(),
            statusLine: "HTTP/1.1 200 OK",
            statusCode: 200
          }
        },
        { label: "onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURLHttpSimpleLoad(),
            fromCache: false,
            statusCode: 200,
            ip: "127.0.0.1",
            statusLine: "HTTP/1.1 200 OK"
          }
        },
        { label: "onCompleted",
          event: "onCompleted",
          details: {
            url: getURLHttpSimpleLoad(),
            fromCache: false,
            statusCode: 200,
            ip: "127.0.0.1",
            statusLine: "HTTP/1.1 200 OK"
          }
        },
      ],
      [  // event order
        ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
         "onHeadersReceived", "onResponseStarted", "onCompleted"]
      ],
      {urls: ["<all_urls>"]},  // filter
      ["blocking", "requestHeaders"]);
    navigateAndWait(getURLHttpSimpleLoad());
  },

  // Navigates to a page and provides invalid header information. The request
  // should continue as if the headers were not changed.
  function simpleLoadIgnoreOnBeforeSendHeadersInvalidResponse() {
    // Exception handling seems to break this test, so disable it.
    // See http://crbug.com/370897. TODO(robwu): Fix me.
    chrome.test.setExceptionHandler(function(){});
    expect(
      [  // events
        { label: "onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            method: "GET",
            type: "main_frame",
            url: getURLHttpSimpleLoad(),
            frameUrl: getURLHttpSimpleLoad(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          },
        },
        { label: "onBeforeSendHeaders",
          event: "onBeforeSendHeaders",
          details: {
            url: getURLHttpSimpleLoad(),
            requestHeadersValid: true,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          },
          retval: {foo: "bar"}
        },
        // TODO(robwu): Test whether an error is logged to the console.
        { label: "onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLHttpSimpleLoad(),
            requestHeadersValid: true,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onHeadersReceived",
          event: "onHeadersReceived",
          details: {
            url: getURLHttpSimpleLoad(),
            statusLine: "HTTP/1.1 200 OK",
            statusCode: 200,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURLHttpSimpleLoad(),
            fromCache: false,
            statusCode: 200,
            ip: "127.0.0.1",
            statusLine: "HTTP/1.1 200 OK",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onCompleted",
          event: "onCompleted",
          details: {
            url: getURLHttpSimpleLoad(),
            fromCache: false,
            statusCode: 200,
            ip: "127.0.0.1",
            statusLine: "HTTP/1.1 200 OK",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
      ],
      [  // event order
        ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
         "onHeadersReceived", "onResponseStarted", "onCompleted"]
      ],
      {urls: ["<all_urls>"]},  // filter
      ["blocking", "requestHeaders"]);
    navigateAndWait(getURLHttpSimpleLoad());
  },

  // Navigates to a page with a blocking handler that redirects to a different
  // page.
  function complexLoadRedirected() {
    expect(
      [  // events
        { label: "onBeforeRequest-1",
          event: "onBeforeRequest",
          details: {
            url: getURL("complexLoad/a.html"),
            frameUrl: getURL("complexLoad/a.html"),
            initiator: getDomain(initiators.BROWSER_INITIATED)
          },
          retval: {redirectUrl: getURL("simpleLoad/a.html")}
        },
        { label: "onBeforeRedirect",
          event: "onBeforeRedirect",
          details: {
            url: getURL("complexLoad/a.html"),
            redirectUrl: getURL("simpleLoad/a.html"),
            fromCache: false,
            statusLine: "HTTP/1.1 307 Internal Redirect",
            statusCode: 307,
            initiator: getDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onBeforeRequest-2",
          event: "onBeforeRequest",
          details: {
            url: getURL("simpleLoad/a.html"),
            frameUrl: getURL("simpleLoad/a.html"),
            initiator: getDomain(initiators.BROWSER_INITIATED)
          },
        },
        { label: "onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURL("simpleLoad/a.html"),
            fromCache: false,
            statusCode: 200,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        { label: "onCompleted",
          event: "onCompleted",
          details: {
            url: getURL("simpleLoad/a.html"),
            fromCache: false,
            statusCode: 200,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
      ],
      [  // event order
        ["onBeforeRequest-1", "onBeforeRedirect", "onBeforeRequest-2",
         "onResponseStarted", "onCompleted"],
      ],
      {urls: ["<all_urls>"]}, // filter
      ["blocking"]);
    navigateAndWait(getURL("complexLoad/a.html"));
  },

  // Tests redirect of <img crossorigin="anonymous" src="...">
  function crossOriginAnonymousRedirect() {
    testLoadCORSImage("anonymous");
  },

  // Tests redirect of <img crossorigin="use-credentials" src="...">
  function crossOriginCredentialedRedirect() {
    testLoadCORSImage("use-credentials");
  },

  // Loads a testserver page that echoes the User-Agent header that was
  // sent to fetch it. We modify the outgoing User-Agent in
  // onBeforeSendHeaders, so we should see that modified version.
  function modifyRequestHeaders() {
    expect(
      [  // events
        { label: "onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            url: getURLEchoUserAgent(),
            frameUrl: getURLEchoUserAgent(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onBeforeSendHeaders",
          event: "onBeforeSendHeaders",
          details: {
            url: getURLEchoUserAgent(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
            // Note: no requestHeaders because we don't ask for them.
          },
          retval: {requestHeaders: [{name: "User-Agent", value: "FoobarUA"}]}
        },
        { label: "onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLEchoUserAgent(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onHeadersReceived",
          event: "onHeadersReceived",
          details: {
            url: getURLEchoUserAgent(),
            statusLine: "HTTP/1.1 200 OK",
            statusCode: 200,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURLEchoUserAgent(),
            fromCache: false,
            statusCode: 200,
            ip: "127.0.0.1",
            statusLine: "HTTP/1.1 200 OK",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onCompleted",
          event: "onCompleted",
          details: {
            url: getURLEchoUserAgent(),
            fromCache: false,
            statusCode: 200,
            ip: "127.0.0.1",
            statusLine: "HTTP/1.1 200 OK",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
      ],
      [  // event order
        ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
         "onHeadersReceived", "onResponseStarted", "onCompleted"]
      ],
      {urls: ["<all_urls>"]}, ["blocking"]);
    // Check the page content for our modified User-Agent string.
    navigateAndWait(getURLEchoUserAgent(), function() {
      chrome.test.listenOnce(chrome.extension.onRequest, function(request) {
        chrome.test.assertTrue(request.pass, "Request header was not set.");
      });
      chrome.tabs.executeScript(tabId,
        {
          code: "chrome.extension.sendRequest(" +
              "{pass: document.body.innerText.indexOf('FoobarUA') >= 0});"
        });
    });
  },

  // Loads a testserver page that echoes the User-Agent header that was
  // sent to fetch it. We modify the outgoing User-Agent in
  // onBeforeSendHeaders, so we should see that modified version.
  // In this version we check whether we can set binary header values.
  function modifyBinaryRequestHeaders() {
    expect(
      [  // events
        { label: "onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            url: getURLEchoUserAgent(),
            frameUrl: getURLEchoUserAgent(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onBeforeSendHeaders",
          event: "onBeforeSendHeaders",
          details: {
            url: getURLEchoUserAgent(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
            // Note: no requestHeaders because we don't ask for them.
          },
          retval: {requestHeaders: [{name: "User-Agent",
                                     binaryValue: toCharCodes("FoobarUA")}]}
        },
        { label: "onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLEchoUserAgent(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onHeadersReceived",
          event: "onHeadersReceived",
          details: {
            url: getURLEchoUserAgent(),
            statusLine: "HTTP/1.1 200 OK",
            statusCode: 200,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURLEchoUserAgent(),
            fromCache: false,
            statusCode: 200,
            ip: "127.0.0.1",
            statusLine: "HTTP/1.1 200 OK",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onCompleted",
          event: "onCompleted",
          details: {
            url: getURLEchoUserAgent(),
            fromCache: false,
            statusCode: 200,
            ip: "127.0.0.1",
            statusLine: "HTTP/1.1 200 OK",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
      ],
      [  // event order
        ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
         "onHeadersReceived", "onResponseStarted", "onCompleted"]
      ],
      {urls: ["<all_urls>"]}, ["blocking"]);
    // Check the page content for our modified User-Agent string.
    navigateAndWait(getURLEchoUserAgent(), function() {
      chrome.test.listenOnce(chrome.extension.onRequest, function(request) {
        chrome.test.assertTrue(request.pass, "Request header was not set.");
      });
      chrome.tabs.executeScript(tabId,
        {
          code: "chrome.extension.sendRequest(" +
              "{pass: document.body.innerText.indexOf('FoobarUA') >= 0});"
        });
    });
  },

  // Loads a testserver page that sets a cookie "Foo=Bar" but removes
  // the cookies from the response headers so that they are not set.
  function modifyResponseHeaders() {
    expect(
      [  // events
        { label: "onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            method: "GET",
            type: "main_frame",
            url: getURLSetCookie(),
            frameUrl: getURLSetCookie(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onBeforeSendHeaders",
          event: "onBeforeSendHeaders",
          details: {
            url: getURLSetCookie(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
            // Note: no requestHeaders because we don't ask for them.
          },
        },
        { label: "onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLSetCookie(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onHeadersReceived",
          event: "onHeadersReceived",
          details: {
            url: getURLSetCookie(),
            statusLine: "HTTP/1.1 200 OK",
            statusCode: 200,
            responseHeadersExist: true,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          },
          retval_function: function(name, details) {
            responseHeaders = details.responseHeaders;
            var found = false;
            for (var i = 0; i < responseHeaders.length; ++i) {
              if (responseHeaders[i].name === "Set-Cookie" &&
                  responseHeaders[i].value.indexOf("Foo") != -1) {
                found = true;
                responseHeaders.splice(i);
                break;
              }
            }
            chrome.test.assertTrue(found);
            return {responseHeaders: responseHeaders};
          }
        },
        { label: "onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURLSetCookie(),
            fromCache: false,
            statusCode: 200,
            statusLine: "HTTP/1.1 200 OK",
            ip: "127.0.0.1",
            responseHeadersExist: true,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onCompleted",
          event: "onCompleted",
          details: {
            url: getURLSetCookie(),
            fromCache: false,
            statusCode: 200,
            statusLine: "HTTP/1.1 200 OK",
            ip: "127.0.0.1",
            responseHeadersExist: true,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
      ],
      [  // event order
        ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
         "onHeadersReceived", "onResponseStarted", "onCompleted"]
      ],
      {urls: ["<all_urls>"]}, ["blocking", "responseHeaders"]);
    // Check that the cookie was really removed.
    navigateAndWait(getURLSetCookie(), function() {
      chrome.test.listenOnce(chrome.extension.onRequest, function(request) {
        chrome.test.assertTrue(request.pass, "Cookie was not removed.");
      });
      chrome.tabs.executeScript(tabId,
      { code: "chrome.extension.sendRequest(" +
            "{pass: document.cookie.indexOf('Foo') == -1});"
        });
    });
  },

  // Loads a testserver page that sets a cookie "Foo=U+FDD1" which is not a
  // valid UTF-8 code point. Therefore, it cannot be passed to JavaScript
  // as a normal string.
  function handleNonUTF8InModifyResponseHeaders() {
    expect(
      [  // events
        { label: "onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            method: "GET",
            type: "main_frame",
            url: getURLNonUTF8SetCookie(),
            frameUrl: getURLNonUTF8SetCookie(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onBeforeSendHeaders",
          event: "onBeforeSendHeaders",
          details: {
            url: getURLNonUTF8SetCookie(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
            // Note: no requestHeaders because we don't ask for them.
          },
        },
        { label: "onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLNonUTF8SetCookie(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onHeadersReceived",
          event: "onHeadersReceived",
          details: {
            url: getURLNonUTF8SetCookie(),
            statusLine: "HTTP/1.1 200 OK",
            statusCode: 200,
            responseHeadersExist: true,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          },
          retval_function: function(name, details) {
            responseHeaders = details.responseHeaders;
            var found = false;
            var expectedValue = [
              "F".charCodeAt(0),
              "o".charCodeAt(0),
              "o".charCodeAt(0),
              0x3D, 0xFE, 0xD1
              ];

            for (var i = 0; i < responseHeaders.length; ++i) {
              if (responseHeaders[i].name === "Set-Cookie" &&
                  deepEq(responseHeaders[i].binaryValue, expectedValue)) {
                found = true;
                responseHeaders.splice(i);
                break;
              }
            }
            chrome.test.assertTrue(found);
            return {responseHeaders: responseHeaders};
          }
        },
        { label: "onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURLNonUTF8SetCookie(),
            fromCache: false,
            statusCode: 200,
            statusLine: "HTTP/1.1 200 OK",
            ip: "127.0.0.1",
            responseHeadersExist: true,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onCompleted",
          event: "onCompleted",
          details: {
            url: getURLNonUTF8SetCookie(),
            fromCache: false,
            statusCode: 200,
            statusLine: "HTTP/1.1 200 OK",
            ip: "127.0.0.1",
            responseHeadersExist: true,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
      ],
      [  // event order
        ["onBeforeRequest", "onBeforeSendHeaders", "onSendHeaders",
         "onHeadersReceived", "onResponseStarted", "onCompleted"]
      ],
      {urls: ["<all_urls>"]}, ["blocking", "responseHeaders"]);
    // Check that the cookie was really removed.
    navigateAndWait(getURLNonUTF8SetCookie(), function() {
      chrome.test.listenOnce(chrome.extension.onRequest, function(request) {
        chrome.test.assertTrue(request.pass, "Cookie was not removed.");
      });
      chrome.tabs.executeScript(tabId,
      { code: "chrome.extension.sendRequest(" +
            "{pass: document.cookie.indexOf('Foo') == -1});"
        });
    });
  },

  // Navigates to a page with a blocking handler that redirects to a different
  // non-http page during onHeadersReceived. The requested page should not be
  // loaded, and the redirect should succeed.
  function simpleLoadRedirectOnReceiveHeaders() {
    expect(
      [  // events
        { label: "onBeforeRequest-1",
          event: "onBeforeRequest",
          details: {
            method: "GET",
            type: "main_frame",
            url: getURLHttpSimpleLoad(),
            frameUrl: getURLHttpSimpleLoad(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          },
        },
        { label: "onBeforeSendHeaders",
          event: "onBeforeSendHeaders",
          details: {
            url: getURLHttpSimpleLoad(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
            // Note: no requestHeaders because we don't ask for them.
          },
        },
        { label: "onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLHttpSimpleLoad(),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onHeadersReceived",
          event: "onHeadersReceived",
          details: {
            url: getURLHttpSimpleLoad(),
            statusLine: "HTTP/1.1 200 OK",
            statusCode: 200,
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          },
          retval: {redirectUrl: getURL("simpleLoad/a.html")}
        },
        { label: "onBeforeRedirect",
          event: "onBeforeRedirect",
          details: {
            url: getURLHttpSimpleLoad(),
            redirectUrl: getURL("simpleLoad/a.html"),
            statusLine: "HTTP/1.1 302 Found",
            statusCode: 302,
            fromCache: false,
            ip: "127.0.0.1",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "onBeforeRequest-2",
          event: "onBeforeRequest",
          details: {
            url: getURL("simpleLoad/a.html"),
            frameUrl: getURL("simpleLoad/a.html"),
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
          },
        },
        { label: "onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURL("simpleLoad/a.html"),
            fromCache: false,
            statusCode: 200,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        { label: "onCompleted",
          event: "onCompleted",
          details: {
            url: getURL("simpleLoad/a.html"),
            fromCache: false,
            statusCode: 200,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getServerDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
      ],
      [  // event order
        ["onBeforeRequest-1", "onBeforeSendHeaders", "onSendHeaders",
         "onHeadersReceived", "onBeforeRedirect", "onBeforeRequest-2",
         "onResponseStarted", "onCompleted"]
      ],
      {urls: ["<all_urls>"]},  // filter
      ["blocking"]);
    navigateAndWait(getURLHttpSimpleLoad());
  },

  // Checks that synchronous XHR requests from ourself are invisible to
  // blocking handlers.
  function syncXhrsFromOurselfAreInvisible() {
    expect(
      [  // events
        { label: "a-onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            url: getURL("simpleLoad/a.html"),
            frameUrl: getURL("simpleLoad/a.html"),
            initiator: getDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "a-onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURL("simpleLoad/a.html"),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        { label: "a-onCompleted",
          event: "onCompleted",
          details: {
            url: getURL("simpleLoad/a.html"),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        // We do not see onBeforeRequest for the XHR request here because it
        // is handled by a blocking handler.
        { label: "x-onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLHttpXHRData(),
            tabId: 1,
            type: "xmlhttprequest",
            initiator: getDomain(initiators.WEB_INITIATED)
          }
        },
        { label: "x-onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURLHttpXHRData(),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            tabId: 1,
            type: "xmlhttprequest",
            ip: "127.0.0.1",
            initiator: getDomain(initiators.WEB_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        { label: "x-onCompleted",
          event: "onCompleted",
          details: {
            url: getURLHttpXHRData(),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            tabId: 1,
            type: "xmlhttprequest",
            ip: "127.0.0.1",
            initiator: getDomain(initiators.WEB_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        { label: "b-onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            url: getURL("complexLoad/b.jpg"),
            frameUrl: getURL("complexLoad/b.jpg"),
            initiator: getDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "b-onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURL("complexLoad/b.jpg"),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        { label: "b-onCompleted",
          event: "onCompleted",
          details: {
            url: getURL("complexLoad/b.jpg"),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
      ],
      [  // event order
        ["a-onBeforeRequest", "a-onResponseStarted", "a-onCompleted",
         "x-onSendHeaders", "x-onResponseStarted", "x-onCompleted",
         "b-onBeforeRequest", "b-onResponseStarted", "b-onCompleted"]
      ],
      {urls: ["<all_urls>"]}, ["blocking"]);
    // Check the page content for our modified User-Agent string.
    navigateAndWait(getURL("simpleLoad/a.html"), function() {
        var req = new XMLHttpRequest();
        var asynchronous = false;
        req.open("GET", getURLHttpXHRData(), asynchronous);
        req.send(null);
        navigateAndWait(getURL("complexLoad/b.jpg"));
    });
  },

  // Checks that asynchronous XHR requests from ourself are visible to
  // blocking handlers.
  function asyncXhrsFromOurselfAreVisible() {
    expect(
      [  // events
        { label: "a-onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            url: getURL("simpleLoad/a.html"),
            frameUrl: getURL("simpleLoad/a.html"),
            initiator: getDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "a-onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURL("simpleLoad/a.html"),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        { label: "a-onCompleted",
          event: "onCompleted",
          details: {
            url: getURL("simpleLoad/a.html"),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        {
          label: "x-onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            url: getURLHttpXHRData(),
            tabId: 1,
            type: "xmlhttprequest",
            frameUrl: "unknown frame URL",
            initiator: getDomain(initiators.WEB_INITIATED)
          }
        },
        {
          label: "x-onBeforeSendHeaders",
          event: "onBeforeSendHeaders",
          details: {
            url: getURLHttpXHRData(),
            tabId: 1,
            type: "xmlhttprequest",
            initiator: getDomain(initiators.WEB_INITIATED)
          }
        },
        { label: "x-onSendHeaders",
          event: "onSendHeaders",
          details: {
            url: getURLHttpXHRData(),
            tabId: 1,
            type: "xmlhttprequest",
            initiator: getDomain(initiators.WEB_INITIATED)
          }
        },
        { label: "x-onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURLHttpXHRData(),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            tabId: 1,
            type: "xmlhttprequest",
            ip: "127.0.0.1",
            // Request to chrome-extension:// url has no IP.
            initiator: getDomain(initiators.WEB_INITIATED)
          }
        },
        {
          label: "x-onHeadersReceived",
          event: "onHeadersReceived",
          details: {
            url: getURLHttpXHRData(),
            tabId: 1,
            type: "xmlhttprequest",
            statusLine: "HTTP/1.1 200 OK",
            statusCode: 200,
            initiator: getDomain(initiators.WEB_INITIATED)
          }
        },
        { label: "x-onCompleted",
          event: "onCompleted",
          details: {
            url: getURLHttpXHRData(),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            tabId: 1,
            type: "xmlhttprequest",
            ip: "127.0.0.1",
            // Request to chrome-extension:// url has no IP.
            initiator: getDomain(initiators.WEB_INITIATED)
          }
        },
        { label: "b-onBeforeRequest",
          event: "onBeforeRequest",
          details: {
            url: getURL("complexLoad/b.jpg"),
            frameUrl: getURL("complexLoad/b.jpg"),
            initiator: getDomain(initiators.BROWSER_INITIATED)
          }
        },
        { label: "b-onResponseStarted",
          event: "onResponseStarted",
          details: {
            url: getURL("complexLoad/b.jpg"),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
        { label: "b-onCompleted",
          event: "onCompleted",
          details: {
            url: getURL("complexLoad/b.jpg"),
            statusCode: 200,
            fromCache: false,
            statusLine: "HTTP/1.1 200 OK",
            initiator: getDomain(initiators.BROWSER_INITIATED)
            // Request to chrome-extension:// url has no IP.
          }
        },
      ],
      [  // event order
        ["a-onBeforeRequest", "a-onResponseStarted", "a-onCompleted",
         "x-onBeforeRequest", "x-onBeforeSendHeaders", "x-onSendHeaders",
         "x-onHeadersReceived", "x-onResponseStarted", "x-onCompleted"],
        ["a-onCompleted", "x-onBeforeRequest",
         "b-onBeforeRequest", "b-onResponseStarted", "b-onCompleted"]
      ],
      {urls: ["<all_urls>"]}, ["blocking"]);
    // Check the page content for our modified User-Agent string.
    navigateAndWait(getURL("simpleLoad/a.html"), function() {
        var req = new XMLHttpRequest();
        var asynchronous = true;
        req.open("GET", getURLHttpXHRData(), asynchronous);
        req.send(null);
        navigateAndWait(getURL("complexLoad/b.jpg"));
    });
  },
]);


// This helper verifies that extensions can successfully redirect resources even
// if cross-origin access control is in effect via the crossorigin attribute.
// Used by crossOriginAnonymousRedirect and crossOriginCredentialedRedirect.
function testLoadCORSImage(crossOriginAttributeValue) {
  // (Non-existent) image URL, with random query string to bust the cache.
  var requestedUrl = getServerURL("cors/intercepted_by_extension.gif?" +
                                  Math.random(), "original.tld");
  var frameUrl = getServerURL(
      "extensions/api_test/webrequest/cors/load_image.html?" +
      "crossOrigin=" + crossOriginAttributeValue +
      "&src=" + encodeURIComponent(requestedUrl));
  var redirectTarget = getServerURL(
      "extensions/api_test/webrequest/cors/redirect_target.gif", "domain.tld");
  var initiator = getServerDomain(initiators.WEB_INITIATED);
  expect(
    [  // events
      { label: "onBeforeRequest-1",
        event: "onBeforeRequest",
        details: {
          type: "image",
          url: requestedUrl,
          // Frame URL unavailable because requests are filtered by type=image.
          frameUrl: "unknown frame URL",
          initiator: initiator
        },
        retval: {redirectUrl: redirectTarget}
      },
      { label: "onBeforeRedirect",
        event: "onBeforeRedirect",
        details: {
          type: "image",
          url: requestedUrl,
          redirectUrl: redirectTarget,
          statusLine: "HTTP/1.1 307 Internal Redirect",
          statusCode: 307,
          fromCache: false,
          initiator: initiator
        }
      },
      { label: "onBeforeRequest-2",
        event: "onBeforeRequest",
        details: {
          type: "image",
          url: redirectTarget,
          // Frame URL unavailable because requests are filtered by type=image.
          frameUrl: "unknown frame URL",
          initiator: initiator
        },
      },
      {
        label: "onBeforeSendHeaders",
        event: "onBeforeSendHeaders",
        details: {
          type: "image",
          url: redirectTarget,
          initiator: initiator
        }
      },
      {
        label: "onSendHeaders",
        event: "onSendHeaders",
        details: {
          type: "image",
          url: redirectTarget,
          initiator: initiator
        }
      },
      {
        label: "onHeadersReceived",
        event: "onHeadersReceived",
        details: {
          type: "image",
          url: redirectTarget,
          statusLine: "HTTP/1.1 200 OK",
          statusCode: 200,
          initiator: initiator
        }
      },
      { label: "onResponseStarted",
        event: "onResponseStarted",
        details: {
          type: "image",
          url: redirectTarget,
          fromCache: false,
          statusCode: 200,
          ip: "127.0.0.1",
          statusLine: "HTTP/1.1 200 OK",
          initiator: initiator
        }
      },
      { label: "onCompleted",
        event: "onCompleted",
        details: {
          type: "image",
          url: redirectTarget,
          fromCache: false,
          statusCode: 200,
          ip: "127.0.0.1",
          statusLine: "HTTP/1.1 200 OK",
          initiator: initiator
        }
      },
      // After the image loads, the test will load the following URL
      // to signal that the test succeeded.
      {
        label: "onBeforeRequest-3",
        event: "onBeforeRequest",
        details: {
          type: "image",
          url: getServerURL("signal_that_image_loaded_successfully"),
          // Frame URL unavailable because requests are filtered by type=image.
          frameUrl: "unknown frame URL",
          initiator: initiator
        },
        retval: {cancel: true}
      },
      { label: "onErrorOccurred",
        event: "onErrorOccurred",
        details: {
          type: "image",
          url: getServerURL("signal_that_image_loaded_successfully"),
          fromCache: false,
          error: "net::ERR_BLOCKED_BY_CLIENT",
          initiator: initiator
        }
      },
    ],
    [  // event order
      ["onBeforeRequest-1", "onBeforeRedirect", "onBeforeRequest-2",
       "onBeforeSendHeaders", "onSendHeaders", "onHeadersReceived",
       "onResponseStarted", "onCompleted",
       "onBeforeRequest-3", "onErrorOccurred"],
    ],
    {urls: ["<all_urls>"], types: ['image']}, // filter
    ["blocking"]);
  navigateAndWait(frameUrl);
}
