diff --git a/modules/plugin/test/mochitest/Makefile.in b/modules/plugin/test/mochitest/Makefile.in
index 7380e6a08d48..fc3fac7c305c 100644
--- a/modules/plugin/test/mochitest/Makefile.in
+++ b/modules/plugin/test/mochitest/Makefile.in
@@ -47,6 +47,7 @@ include $(topsrcdir)/config/rules.mk
_MOCHITEST_FILES = \
test_npobject_getters.html \
test_npruntime_npninvoke.html \
+ test_npruntime_npninvokedefault.html \
loremipsum.txt \
loremipsum_file.txt \
post.sjs \
diff --git a/modules/plugin/test/mochitest/test_npruntime_npninvokedefault.html b/modules/plugin/test/mochitest/test_npruntime_npninvokedefault.html
new file mode 100644
index 000000000000..7963f9e471b2
--- /dev/null
+++ b/modules/plugin/test/mochitest/test_npruntime_npninvokedefault.html
@@ -0,0 +1,122 @@
+
+
+ NPN_Invoke_Default Tests
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/modules/plugin/test/testplugin/README b/modules/plugin/test/testplugin/README
index 9d5e5515ab74..21817e7a66bc 100644
--- a/modules/plugin/test/testplugin/README
+++ b/modules/plugin/test/testplugin/README
@@ -39,6 +39,10 @@ passing it 1 or more arguments specified in args. The return value of this
call is compared against 'expected', and if they match, npnInvokeTest will
return true. Otherwise, it will return false.
+* npnInvokeDefaultTest(object, argument)
+Causes the plugin to call NPN_InvokeDefault on the specified object,
+with the specified argument. Returns the result of the invocation.
+
* getError()
If an error has occurred during the last stream or npruntime function,
this will return a string error message, otherwise it returns "pass".
diff --git a/modules/plugin/test/testplugin/nptest.cpp b/modules/plugin/test/testplugin/nptest.cpp
index 48ec576bd545..0728e96bc13b 100644
--- a/modules/plugin/test/testplugin/nptest.cpp
+++ b/modules/plugin/test/testplugin/nptest.cpp
@@ -66,6 +66,7 @@ typedef bool (* ScriptableFunction)
(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool npnInvokeTest(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
+static bool npnInvokeDefaultTest(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool setUndefinedValueTest(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool identifierToStringTest(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool timerTest(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
@@ -86,6 +87,7 @@ static bool doInternalConsistencyCheck(NPObject* npobj, const NPVariant* args, u
static const NPUTF8* sPluginMethodIdentifierNames[] = {
"npnInvokeTest",
+ "npnInvokeDefaultTest",
"setUndefinedValueTest",
"identifierToStringTest",
"timerTest",
@@ -107,6 +109,7 @@ static const NPUTF8* sPluginMethodIdentifierNames[] = {
static NPIdentifier sPluginMethodIdentifiers[ARRAY_LENGTH(sPluginMethodIdentifierNames)];
static const ScriptableFunction sPluginMethodFunctions[ARRAY_LENGTH(sPluginMethodIdentifierNames)] = {
npnInvokeTest,
+ npnInvokeDefaultTest,
setUndefinedValueTest,
identifierToStringTest,
timerTest,
@@ -1001,6 +1004,12 @@ NPN_Invoke(NPP npp, NPObject* obj, NPIdentifier methodName, const NPVariant *arg
return sBrowserFuncs->invoke(npp, obj, methodName, args, argCount, result);
}
+bool
+NPN_InvokeDefault(NPP npp, NPObject* obj, const NPVariant *args, uint32_t argCount, NPVariant *result)
+{
+ return sBrowserFuncs->invokeDefault(npp, obj, args, argCount, result);
+}
+
const char*
NPN_UserAgent(NPP instance)
{
@@ -1325,6 +1334,42 @@ compareVariants(NPP instance, const NPVariant* var1, const NPVariant* var2)
return success;
}
+static bool
+npnInvokeDefaultTest(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result)
+{
+ bool success = false;
+ NPP npp = static_cast(npobj)->npp;
+
+ NPObject* windowObject;
+ NPN_GetValue(npp, NPNVWindowNPObject, &windowObject);
+ if (!windowObject)
+ return false;
+
+ NPIdentifier objectIdentifier = variantToIdentifier(args[0]);
+ if (!objectIdentifier)
+ return false;
+
+ NPVariant objectVariant;
+ if (NPN_GetProperty(npp, windowObject, objectIdentifier,
+ &objectVariant)) {
+ if (NPVARIANT_IS_OBJECT(objectVariant)) {
+ NPObject* selfObject = NPVARIANT_TO_OBJECT(objectVariant);
+ if (selfObject != NULL) {
+ NPVariant resultVariant;
+ if (NPN_InvokeDefault(npp, selfObject, &args[1], argCount - 1,
+ &resultVariant)) {
+ *result = resultVariant;
+ success = true;
+ }
+ }
+ }
+ NPN_ReleaseVariantValue(&objectVariant);
+ }
+
+ NPN_ReleaseObject(windowObject);
+ return success;
+}
+
static bool
npnInvokeTest(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result)
{