chromium/chrome/test/data/extensions/api_test/cross_origin_xhr/background_page/test.js

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

chrome.test.getConfig(function(config) {

  function rewriteURL(url) {
    return url.replace(/PORT/, config.testServer.port);
  }

  function doReq(domain, expectSuccess) {
    var req = new XMLHttpRequest();
    var url = rewriteURL(domain + ":PORT/extensions/test_file.txt");
    var isErrorTriggered = false;

    chrome.test.log("Requesting url: " + url);
    req.open("GET", url, true);


    if (expectSuccess) {
      req.onload = function() {
        if (/^https?:/i.test(url))
          chrome.test.assertEq(200, req.status);
        chrome.test.assertEq("Hello!", req.responseText);
        chrome.test.succeed();
      }
      req.onerror = function() {
        isErrorTriggered = true;
        chrome.test.log("status: " + req.status);
        chrome.test.log("text: " + req.responseText);
        chrome.test.fail("Unexpected error for domain: " + domain);
      }
    } else {
      req.onload = function() {
        chrome.test.fail("Unexpected success for domain: " + domain);
      }
      req.onerror = function() {
        isErrorTriggered = true;
        chrome.test.assertEq(0, req.status);
        chrome.test.succeed();
      }
    }

    try {
      req.send(null);
    } catch (e) {
      if (/^https?:/i.test(url)) {
        chrome.test.fail(
                "req.send() has thrown an error for " + domain + ": " + e);
      } else if (!isErrorTriggered) {
        // A NetworkError will synchronously be be thrown whenever a
        // FTP request fails. This should be handled by req.onerror.
        chrome.test.fail("req.send() has thrown an error without dispatching " +
                         "the req.onerror event for " + domain + ": " + e);
      }
    }
  }

  chrome.test.runTests([
    function allowedOrigin() {
      doReq("http://a.com", true);
    },
    function diallowedOrigin() {
      doReq("http://c.com", false);
    },
    function allowedSubdomain() {
      doReq("http://foo.b.com", true);
    },
    function noSubdomain() {
      doReq("http://b.com", true);
    },
    function disallowedSubdomain() {
      doReq("http://foob.com", false);
    },
    // TODO(asargent): Explicitly create SSL test server and enable the test.
    // function disallowedSSL() {
    //   doReq("https://a.com", false);
    // }
  ]);
});