diff --git a/modules/plugin/test/mochitest/Makefile.in b/modules/plugin/test/mochitest/Makefile.in
index 94b7549d3136..344110652c92 100644
--- a/modules/plugin/test/mochitest/Makefile.in
+++ b/modules/plugin/test/mochitest/Makefile.in
@@ -45,6 +45,7 @@ include $(DEPTH)/config/autoconf.mk
include $(topsrcdir)/config/rules.mk
_MOCHITEST_FILES = \
+ test_getauthenticationinfo.html \
test_npobject_getters.html \
test_npruntime_npnevaluate.html \
test_npruntime_npninvoke.html \
diff --git a/modules/plugin/test/mochitest/test_getauthenticationinfo.html b/modules/plugin/test/mochitest/test_getauthenticationinfo.html
new file mode 100644
index 000000000000..8cf711c5e4eb
--- /dev/null
+++ b/modules/plugin/test/mochitest/test_getauthenticationinfo.html
@@ -0,0 +1,75 @@
+
+
+
+ Test for Login Manager
+
+
+
+
+
+Test for NPN_GetAuthenticationInfo
+
+
+
+
+
+
+
+
+
diff --git a/modules/plugin/test/testplugin/README b/modules/plugin/test/testplugin/README
index 7ed9e797b28c..f679bcb8002e 100644
--- a/modules/plugin/test/testplugin/README
+++ b/modules/plugin/test/testplugin/README
@@ -80,6 +80,11 @@ arguments passed to the method.
the object is passed to the same plugin instance, and false when passed
to other plugin instances, see bug 532246 and
test_multipleinstanceobjects.html.
+
+* getAuthInfo(protocol, host, port, scheme, realm) - a wrapper for
+NPN_GetAuthenticationInfo(). Returns a string "username|password" for
+the specified auth criteria, or throws an exception if no data is
+available.
== Private browsing ==
diff --git a/modules/plugin/test/testplugin/nptest.cpp b/modules/plugin/test/testplugin/nptest.cpp
index a48d57760091..10688ac07ca7 100644
--- a/modules/plugin/test/testplugin/nptest.cpp
+++ b/modules/plugin/test/testplugin/nptest.cpp
@@ -137,6 +137,7 @@ static bool checkObjectValue(NPObject* npobj, const NPVariant* args, uint32_t ar
static bool enableFPExceptions(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool setCookie(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool getCookie(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
+static bool getAuthInfo(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static const NPUTF8* sPluginMethodIdentifierNames[] = {
"npnEvaluateTest",
@@ -173,6 +174,7 @@ static const NPUTF8* sPluginMethodIdentifierNames[] = {
"enableFPExceptions",
"setCookie",
"getCookie",
+ "getAuthInfo",
};
static NPIdentifier sPluginMethodIdentifiers[ARRAY_LENGTH(sPluginMethodIdentifierNames)];
static const ScriptableFunction sPluginMethodFunctions[ARRAY_LENGTH(sPluginMethodIdentifierNames)] = {
@@ -210,6 +212,7 @@ static const ScriptableFunction sPluginMethodFunctions[ARRAY_LENGTH(sPluginMetho
enableFPExceptions,
setCookie,
getCookie,
+ getAuthInfo,
};
struct URLNotifyData
@@ -1331,6 +1334,20 @@ NPN_GetValueForURL(NPP instance, NPNURLVariable variable, const char *url, char
return sBrowserFuncs->getvalueforurl(instance, variable, url, value, len);
}
+NPError
+NPN_GetAuthenticationInfo(NPP instance,
+ const char *protocol,
+ const char *host, int32_t port,
+ const char *scheme,
+ const char *realm,
+ char **username, uint32_t *ulen,
+ char **password,
+ uint32_t *plen)
+{
+ return sBrowserFuncs->getauthenticationinfo(instance, protocol, host, port, scheme, realm,
+ username, ulen, password, plen);
+}
+
//
// npruntime object functions
//
@@ -2279,3 +2296,55 @@ getCookie(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant*
STRINGZ_TO_NPVARIANT(cookie, *result);
return true;
}
+
+static bool
+getAuthInfo(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result)
+{
+ if (argCount != 5)
+ return false;
+
+ NPP npp = static_cast(npobj)->npp;
+
+ if (!NPVARIANT_IS_STRING(args[0]) || !NPVARIANT_IS_STRING(args[1]) ||
+ !NPVARIANT_IS_INT32(args[2]) || !NPVARIANT_IS_STRING(args[3]) ||
+ !NPVARIANT_IS_STRING(args[4]))
+ return false;
+
+ const NPString* protocol = &NPVARIANT_TO_STRING(args[0]);
+ const NPString* host = &NPVARIANT_TO_STRING(args[1]);
+ uint32_t port = NPVARIANT_TO_INT32(args[2]);
+ const NPString* scheme = &NPVARIANT_TO_STRING(args[3]);
+ const NPString* realm = &NPVARIANT_TO_STRING(args[4]);
+
+ char* username = NULL;
+ char* password = NULL;
+ uint32_t ulen = 0, plen = 0;
+
+ NPError err = NPN_GetAuthenticationInfo(npp,
+ protocol->UTF8Characters,
+ host->UTF8Characters,
+ port,
+ scheme->UTF8Characters,
+ realm->UTF8Characters,
+ &username,
+ &ulen,
+ &password,
+ &plen);
+
+ if (err != NPERR_NO_ERROR) {
+ return false;
+ }
+
+ char* outstring = (char*)NPN_MemAlloc(ulen + plen + 2);
+ memset(outstring, 0, ulen + plen + 2);
+ strncpy(outstring, username, ulen);
+ strcat(outstring, "|");
+ strncat(outstring, password, plen);
+
+ STRINGZ_TO_NPVARIANT(outstring, *result);
+
+ NPN_MemFree(username);
+ NPN_MemFree(password);
+
+ return true;
+}
diff --git a/toolkit/components/passwordmgr/test/authenticate.sjs b/toolkit/components/passwordmgr/test/authenticate.sjs
index 284aebda3fba..7c2102fd0dbb 100644
--- a/toolkit/components/passwordmgr/test/authenticate.sjs
+++ b/toolkit/components/passwordmgr/test/authenticate.sjs
@@ -19,7 +19,7 @@ function reallyHandleRequest(request, response) {
var expected_user = "", expected_pass = "", realm = "mochitest";
var proxy_expected_user = "", proxy_expected_pass = "", proxy_realm = "mochi-proxy";
- var huge = false;
+ var huge = false, plugin = false;
var authHeaderCount = 1;
// user=xxx
match = /user=([^&]*)/.exec(query);
@@ -56,6 +56,11 @@ function reallyHandleRequest(request, response) {
if (match)
huge = true;
+ // plugin=1
+ match = /plugin=1/.exec(query);
+ if (match)
+ plugin = true;
+
// multiple=1
match = /multiple=([^&]*)/.exec(query);
if (match)
@@ -139,6 +144,11 @@ function reallyHandleRequest(request, response) {
response.write("");
}
+ if (plugin) {
+ response.write("\n");
+ }
+
response.write("