<!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>