summaryrefslogtreecommitdiffstats
path: root/dom/browser-element/mochitest/browserElement_Auth.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/browser-element/mochitest/browserElement_Auth.js')
-rw-r--r--dom/browser-element/mochitest/browserElement_Auth.js246
1 files changed, 246 insertions, 0 deletions
diff --git a/dom/browser-element/mochitest/browserElement_Auth.js b/dom/browser-element/mochitest/browserElement_Auth.js
new file mode 100644
index 000000000..ef95409be
--- /dev/null
+++ b/dom/browser-element/mochitest/browserElement_Auth.js
@@ -0,0 +1,246 @@
+/* Any copyright is dedicated to the public domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// Test that auth prompt works.
+"use strict";
+
+SimpleTest.waitForExplicitFinish();
+browserElementTestHelpers.setEnabledPref(true);
+browserElementTestHelpers.addPermission();
+
+const { NetUtil } = SpecialPowers.Cu.import('resource://gre/modules/NetUtil.jsm');
+
+function testFail(msg) {
+ ok(false, JSON.stringify(msg));
+}
+
+var iframe;
+
+function runTest() {
+ iframe = document.createElement('iframe');
+ iframe.setAttribute('mozbrowser', 'true');
+ document.body.appendChild(iframe);
+
+ // Wait for the initial load to finish, then navigate the page, then start test
+ // by loading SJS with http 401 response.
+ iframe.addEventListener('mozbrowserloadend', function loadend() {
+ iframe.removeEventListener('mozbrowserloadend', loadend);
+ iframe.addEventListener('mozbrowserusernameandpasswordrequired', testHttpAuthCancel);
+ SimpleTest.executeSoon(function() {
+ // Use absolute path because we need to specify host.
+ iframe.src = 'http://test/tests/dom/browser-element/mochitest/file_http_401_response.sjs';
+ });
+ });
+}
+
+function testHttpAuthCancel(e) {
+ iframe.removeEventListener("mozbrowserusernameandpasswordrequired", testHttpAuthCancel);
+ // Will cancel authentication, but prompt should not be shown again. Instead,
+ // we will be led to fail message
+ iframe.addEventListener("mozbrowserusernameandpasswordrequired", testFail);
+ iframe.addEventListener("mozbrowsertitlechange", function onTitleChange(e) {
+ iframe.removeEventListener("mozbrowsertitlechange", onTitleChange);
+ iframe.removeEventListener("mozbrowserusernameandpasswordrequired", testFail);
+ is(e.detail, 'http auth failed', 'expected authentication to fail');
+ iframe.addEventListener('mozbrowserusernameandpasswordrequired', testHttpAuth);
+ SimpleTest.executeSoon(function() {
+ // Use absolute path because we need to specify host.
+ iframe.src = 'http://test/tests/dom/browser-element/mochitest/file_http_401_response.sjs';
+ });
+ });
+
+ is(e.detail.realm, 'http_realm', 'expected realm matches');
+ is(e.detail.host, 'http://test', 'expected host matches');
+ is(e.detail.path,
+ '/tests/dom/browser-element/mochitest/file_http_401_response.sjs',
+ 'expected path matches');
+ e.preventDefault();
+
+ SimpleTest.executeSoon(function() {
+ e.detail.cancel();
+ });
+}
+
+function testHttpAuth(e) {
+ iframe.removeEventListener("mozbrowserusernameandpasswordrequired", testHttpAuth);
+
+ // Will authenticate with correct password, prompt should not be
+ // called again.
+ iframe.addEventListener("mozbrowserusernameandpasswordrequired", testFail);
+ iframe.addEventListener("mozbrowsertitlechange", function onTitleChange(e) {
+ iframe.removeEventListener("mozbrowsertitlechange", onTitleChange);
+ iframe.removeEventListener("mozbrowserusernameandpasswordrequired", testFail);
+ is(e.detail, 'http auth success', 'expect authentication to succeed');
+ SimpleTest.executeSoon(testProxyAuth);
+ });
+
+ is(e.detail.realm, 'http_realm', 'expected realm matches');
+ is(e.detail.host, 'http://test', 'expected host matches');
+ is(e.detail.path,
+ '/tests/dom/browser-element/mochitest/file_http_401_response.sjs',
+ 'expected path matches');
+ is(e.detail.isProxy, false, 'expected isProxy is false');
+ e.preventDefault();
+
+ SimpleTest.executeSoon(function() {
+ e.detail.authenticate("httpuser", "httppass");
+ });
+}
+
+function testProxyAuth(e) {
+ // The testingSJS simulates the 407 proxy authentication required response
+ // for proxy server, which will trigger the browser element to send prompt
+ // event with proxy infomation.
+ var testingSJS = 'http://test/tests/dom/browser-element/mochitest/file_http_407_response.sjs';
+ var mozproxy;
+
+ function onUserNameAndPasswordRequired(e) {
+ iframe.removeEventListener("mozbrowserusernameandpasswordrequired",
+ onUserNameAndPasswordRequired);
+ iframe.addEventListener("mozbrowsertitlechange", function onTitleChange(e) {
+ iframe.removeEventListener("mozbrowsertitlechange", onTitleChange);
+ iframe.removeEventListener("mozbrowserusernameandpasswordrequired", testFail);
+ is(e.detail, 'http auth success', 'expect authentication to succeed');
+ SimpleTest.executeSoon(testAuthJarNoInterfere);
+ });
+
+ is(e.detail.realm, 'http_realm', 'expected realm matches');
+ is(e.detail.host, mozproxy, 'expected host matches');
+ is(e.detail.path,
+ '/tests/dom/browser-element/mochitest/file_http_407_response.sjs',
+ 'expected path matches');
+ is(e.detail.isProxy, true, 'expected isProxy is true');
+ e.preventDefault();
+
+ SimpleTest.executeSoon(function() {
+ e.detail.authenticate("proxyuser", "proxypass");
+ });
+ }
+
+ // Resolve proxy information used by the test suite, we need it to validate
+ // whether the proxy information delivered with the prompt event is correct.
+ var resolveCallback = SpecialPowers.wrapCallbackObject({
+ QueryInterface: function (iid) {
+ const interfaces = [Ci.nsIProtocolProxyCallback, Ci.nsISupports];
+
+ if (!interfaces.some( function(v) { return iid.equals(v) } )) {
+ throw SpecialPowers.Cr.NS_ERROR_NO_INTERFACE;
+ }
+ return this;
+ },
+
+ onProxyAvailable: function (req, channel, pi, status) {
+ isnot(pi, null, 'expected proxy information available');
+ if (pi) {
+ mozproxy = "moz-proxy://" + pi.host + ":" + pi.port;
+ }
+ iframe.addEventListener("mozbrowserusernameandpasswordrequired",
+ onUserNameAndPasswordRequired);
+
+ iframe.src = testingSJS;
+ }
+ });
+
+ var channel = NetUtil.newChannel({
+ uri: testingSJS,
+ loadUsingSystemPrincipal: true
+ });
+
+ var pps = SpecialPowers.Cc["@mozilla.org/network/protocol-proxy-service;1"]
+ .getService();
+
+ pps.asyncResolve(channel, 0, resolveCallback);
+}
+
+function testAuthJarNoInterfere(e) {
+ var authMgr = SpecialPowers.Cc['@mozilla.org/network/http-auth-manager;1']
+ .getService(SpecialPowers.Ci.nsIHttpAuthManager);
+ var secMan = SpecialPowers.Cc["@mozilla.org/scriptsecuritymanager;1"]
+ .getService(SpecialPowers.Ci.nsIScriptSecurityManager);
+ var ioService = SpecialPowers.Cc["@mozilla.org/network/io-service;1"]
+ .getService(SpecialPowers.Ci.nsIIOService);
+ var uri = ioService.newURI("http://test/tests/dom/browser-element/mochitest/file_http_401_response.sjs", null, null);
+
+ // Set a bunch of auth data that should not conflict with the correct auth data already
+ // stored in the cache.
+ var attrs = {appId: 1};
+ var principal = secMan.createCodebasePrincipal(uri, attrs);
+ authMgr.setAuthIdentity('http', 'test', -1, 'basic', 'http_realm',
+ 'tests/dom/browser-element/mochitest/file_http_401_response.sjs',
+ '', 'httpuser', 'wrongpass', false, principal);
+ attrs = {appId: 1, inIsolatedMozBrowser: true};
+ principal = secMan.createCodebasePrincipal(uri, attrs);
+ authMgr.setAuthIdentity('http', 'test', -1, 'basic', 'http_realm',
+ 'tests/dom/browser-element/mochitest/file_http_401_response.sjs',
+ '', 'httpuser', 'wrongpass', false, principal);
+ principal = secMan.createCodebasePrincipal(uri, {});
+ authMgr.setAuthIdentity('http', 'test', -1, 'basic', 'http_realm',
+ 'tests/dom/browser-element/mochitest/file_http_401_response.sjs',
+ '', 'httpuser', 'wrongpass', false, principal);
+
+ // Will authenticate with correct password, prompt should not be
+ // called again.
+ iframe.addEventListener("mozbrowserusernameandpasswordrequired", testFail);
+ iframe.addEventListener("mozbrowsertitlechange", function onTitleChange(e) {
+ iframe.removeEventListener("mozbrowsertitlechange", onTitleChange);
+ iframe.removeEventListener("mozbrowserusernameandpasswordrequired", testFail);
+ is(e.detail, 'http auth success', 'expected authentication success');
+ SimpleTest.executeSoon(testAuthJarInterfere);
+ });
+
+ // Once more with feeling. Ensure that our new auth data doesn't interfere with this mozbrowser's
+ // auth data.
+ iframe.src = 'http://test/tests/dom/browser-element/mochitest/file_http_401_response.sjs';
+}
+
+function testAuthJarInterfere(e) {
+ var authMgr = SpecialPowers.Cc['@mozilla.org/network/http-auth-manager;1']
+ .getService(SpecialPowers.Ci.nsIHttpAuthManager);
+ var secMan = SpecialPowers.Cc["@mozilla.org/scriptsecuritymanager;1"]
+ .getService(SpecialPowers.Ci.nsIScriptSecurityManager);
+ var ioService = SpecialPowers.Cc["@mozilla.org/network/io-service;1"]
+ .getService(SpecialPowers.Ci.nsIIOService);
+ var uri = ioService.newURI("http://test/tests/dom/browser-element/mochitest/file_http_401_response.sjs", null, null);
+
+ // Set some auth data that should overwrite the successful stored details.
+ var principal = secMan.createCodebasePrincipal(uri, {inIsolatedMozBrowser: true});
+ authMgr.setAuthIdentity('http', 'test', -1, 'basic', 'http_realm',
+ 'tests/dom/browser-element/mochitest/file_http_401_response.sjs',
+ '', 'httpuser', 'wrongpass', false, principal);
+
+ // Will authenticate with correct password, prompt should not be
+ // called again.
+ var gotusernamepasswordrequired = false;
+ function onUserNameAndPasswordRequired() {
+ gotusernamepasswordrequired = true;
+ }
+ iframe.addEventListener("mozbrowserusernameandpasswordrequired",
+ onUserNameAndPasswordRequired);
+ iframe.addEventListener("mozbrowsertitlechange", function onTitleChange(e) {
+ iframe.removeEventListener("mozbrowsertitlechange", onTitleChange);
+ iframe.removeEventListener("mozbrowserusernameandpasswordrequired",
+ onUserNameAndPasswordRequired);
+ ok(gotusernamepasswordrequired,
+ "Should have dispatched mozbrowserusernameandpasswordrequired event");
+ testFinish();
+ });
+
+ // Once more with feeling. Ensure that our new auth data interferes with this mozbrowser's
+ // auth data.
+ iframe.src = 'http://test/tests/dom/browser-element/mochitest/file_http_401_response.sjs';
+}
+
+function testFinish() {
+ // Clear login information stored in password manager.
+ var authMgr = SpecialPowers.Cc['@mozilla.org/network/http-auth-manager;1']
+ .getService(SpecialPowers.Ci.nsIHttpAuthManager);
+ authMgr.clearAll();
+
+ var pwmgr = SpecialPowers.Cc["@mozilla.org/login-manager;1"]
+ .getService(SpecialPowers.Ci.nsILoginManager);
+ pwmgr.removeAllLogins();
+
+ SimpleTest.finish();
+}
+
+addEventListener('testready', runTest);