diff options
Diffstat (limited to 'toolkit/components/passwordmgr/test/test_xhr.html')
-rw-r--r-- | toolkit/components/passwordmgr/test/test_xhr.html | 201 |
1 files changed, 201 insertions, 0 deletions
diff --git a/toolkit/components/passwordmgr/test/test_xhr.html b/toolkit/components/passwordmgr/test/test_xhr.html new file mode 100644 index 000000000..296371685 --- /dev/null +++ b/toolkit/components/passwordmgr/test/test_xhr.html @@ -0,0 +1,201 @@ +<!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> |