<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <title>Test for XHR prompts</title>
  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="pwmgr_common.js"></script>
  <script type="text/javascript" src="prompt_common.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
Login Manager test: XHR prompt
<p id="display"></p>

<div id="content" style="display: none">
  <iframe id="iframe"></iframe>
</div>

<pre id="test">
<script class="testbody" type="text/javascript">

/** Test for Login Manager: XHR prompts. **/
var pwmgr, login1, login2;

function initLogins() {
  pwmgr = Cc["@mozilla.org/login-manager;1"].
          getService(Ci.nsILoginManager);

  login1 = Cc["@mozilla.org/login-manager/loginInfo;1"].
            createInstance(Ci.nsILoginInfo);
  login2 = Cc["@mozilla.org/login-manager/loginInfo;1"].
            createInstance(Ci.nsILoginInfo);

  login1.init("http://mochi.test:8888", null, "xhr",
               "xhruser1", "xhrpass1", "", "");
  login2.init("http://mochi.test:8888", null, "xhr2",
               "xhruser2", "xhrpass2", "", "");

  pwmgr.addLogin(login1);
  pwmgr.addLogin(login2);
}

function finishTest() {
  ok(true, "finishTest removing testing logins...");
  pwmgr.removeLogin(login1);
  pwmgr.removeLogin(login2);

  SimpleTest.finish();
}

function handleDialog(doc, testNum) {
  ok(true, "handleDialog running for test " + testNum);

  var clickOK = true;
  var userfield = doc.getElementById("loginTextbox");
  var passfield = doc.getElementById("password1Textbox");
  var username = userfield.getAttribute("value");
  var password = passfield.getAttribute("value");
  var dialog    = doc.getElementById("commonDialog");

  switch (testNum) {
    case 1:
        is(username, "xhruser1", "Checking provided username");
        is(password, "xhrpass1", "Checking provided password");
        break;

    case 2:
        is(username, "xhruser2", "Checking provided username");
        is(password, "xhrpass2", "Checking provided password");

        // Check that the dialog is modal, chrome and dependent;
        // We can't just check window.opener because that'll be
        // a content window, which therefore isn't exposed (it'll lie and
        // be null).
        var win = doc.defaultView;
        var Ci = SpecialPowers.Ci;
        var treeOwner = win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIWebNavigation).
                            QueryInterface(Ci.nsIDocShellTreeItem).treeOwner;
        treeOwner.QueryInterface(Ci.nsIInterfaceRequestor);
        var flags = treeOwner.getInterface(Ci.nsIXULWindow).chromeFlags;
        var wbc = treeOwner.getInterface(Ci.nsIWebBrowserChrome);
        info("Flags: " + flags);
        ok((flags & Ci.nsIWebBrowserChrome.CHROME_OPENAS_CHROME) != 0,
           "Dialog should be opened as chrome");
        ok((flags & Ci.nsIWebBrowserChrome.CHROME_OPENAS_DIALOG) != 0,
           "Dialog should be opened as a dialog");
        ok((flags & Ci.nsIWebBrowserChrome.CHROME_DEPENDENT) != 0,
           "Dialog should be opened as dependent.");
        ok(wbc.isWindowModal(), "Dialog should be modal");

        // Check that the right tab is focused:
        var browserWin = SpecialPowers.Services.wm.getMostRecentWindow("navigator:browser");
        var spec = browserWin.gBrowser.selectedBrowser.currentURI.spec;
        ok(spec.startsWith("http://mochi.test:8888"),
           "Tab with remote URI (rather than about:blank) should be focused (" + spec + ")");


        break;

    default:
        ok(false, "Uhh, unhandled switch for testNum #" + testNum);
        break;
  }

  // Explicitly cancel the dialog and report a fail in this failure
  // case, rather than letting the dialog get stuck due to an auth
  // failure and having the test timeout.
  if (!username && !password) {
      ok(false, "No values prefilled");
      clickOK = false;
  }

  if (clickOK)
    dialog.acceptDialog();
  else
    dialog.cancelDialog();

  ok(true, "handleDialog done");
  didDialog = true;
}

var newWin;
function xhrLoad(xmlDoc) {
  ok(true, "xhrLoad running for test " + testNum);

  // The server echos back the user/pass it received.
  var username = xmlDoc.getElementById("user").textContent;
  var password = xmlDoc.getElementById("pass").textContent;
  var authok = xmlDoc.getElementById("ok").textContent;


  switch (testNum) {
    case 1:
        is(username, "xhruser1", "Checking provided username");
        is(password, "xhrpass1", "Checking provided password");
        break;

    case 2:
        is(username, "xhruser2", "Checking provided username");
        is(password, "xhrpass2", "Checking provided password");

        newWin.close();
        break;

    default:
        ok(false, "Uhh, unhandled switch for testNum #" + testNum);
        break;
  }

  doTest();
}

function doTest() {
  switch (++testNum) {
    case 1:
        startCallbackTimer();
        makeRequest("authenticate.sjs?user=xhruser1&pass=xhrpass1&realm=xhr");
        break;

    case 2:
        // Test correct parenting, by opening another tab in the foreground,
        // and making sure the prompt re-focuses the original tab when shown:
        newWin = window.open();
        newWin.focus();
        startCallbackTimer();
        makeRequest("authenticate.sjs?user=xhruser2&pass=xhrpass2&realm=xhr2");
        break;

    default:
        finishTest();
  }
}

function makeRequest(uri) {
  var request = new XMLHttpRequest();
  request.open("GET", uri, true);
  request.onreadystatechange = function () {
    if (request.readyState == 4)
      xhrLoad(request.responseXML);
  };
  request.send(null);
}


initLogins();

// clear plain HTTP auth sessions before the test, to allow
// running them more than once.
var authMgr = SpecialPowers.Cc['@mozilla.org/network/http-auth-manager;1']
                        .getService(SpecialPowers.Ci.nsIHttpAuthManager);
authMgr.clearAll();

// start the tests
testNum = 0;
doTest();

SimpleTest.waitForExplicitFinish();
</script>
</pre>
</body>
</html>