--- a/modules/plugin/test/testplugin/nptest.cpp
+++ b/modules/plugin/test/testplugin/nptest.cpp
@@ -55,26 +55,24 @@
using namespace std;
#define PLUGIN_NAME "Test Plug-in"
#define PLUGIN_DESCRIPTION "Plug-in for testing purposes."
#define PLUGIN_VERSION "1.0.0.0"
#define ARRAY_LENGTH(a) (sizeof(a)/sizeof(a[0]))
-#define STATIC_ASSERT(condition) \
- extern void np_static_assert(int arg[(condition) ? 1 : -1])
//
// Intentional crash
//
int gCrashCount = 0;
-void
+static void
NoteIntentionalCrash()
{
char* bloatLog = getenv("XPCOM_MEM_BLOAT_LOG");
if (bloatLog) {
char* logExt = strstr(bloatLog, ".log");
if (logExt) {
bloatLog[strlen(bloatLog) - strlen(logExt)] = '\0';
}
@@ -84,19 +82,21 @@ NoteIntentionalCrash()
bloatName << ".log";
}
FILE* processfd = fopen(bloatName.str().c_str(), "a");
fprintf(processfd, "==> process %d will purposefully crash\n", getpid());
fclose(processfd);
}
}
-void
+static void
IntentionalCrash()
{
+ NoteIntentionalCrash();
+
int *pi = NULL;
*pi = 55; // Crash dereferencing null pointer
++gCrashCount;
}
//
// static data
//
@@ -151,17 +151,16 @@ static bool enableFPExceptions(NPObject*
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 bool asyncCallbackTest(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool checkGCRace(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool hangPlugin(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool getClipboardText(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static bool callOnDestroy(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
-static bool crashPluginInNestedLoop(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result);
static const NPUTF8* sPluginMethodIdentifierNames[] = {
"npnEvaluateTest",
"npnInvokeTest",
"npnInvokeDefaultTest",
"setUndefinedValueTest",
"identifierToStringTest",
"timerTest",
@@ -193,20 +192,19 @@ static const NPUTF8* sPluginMethodIdenti
"setCookie",
"getCookie",
"getAuthInfo",
"asyncCallbackTest",
"checkGCRace",
"hang",
"getClipboardText",
"callOnDestroy",
- "crashInNestedLoop",
};
static NPIdentifier sPluginMethodIdentifiers[ARRAY_LENGTH(sPluginMethodIdentifierNames)];
-static const ScriptableFunction sPluginMethodFunctions[] = {
+static const ScriptableFunction sPluginMethodFunctions[ARRAY_LENGTH(sPluginMethodIdentifierNames)] = {
npnEvaluateTest,
npnInvokeTest,
npnInvokeDefaultTest,
setUndefinedValueTest,
identifierToStringTest,
timerTest,
queryPrivateModeState,
lastReportedPrivateModeState,
@@ -236,22 +234,18 @@ static const ScriptableFunction sPluginM
setCookie,
getCookie,
getAuthInfo,
asyncCallbackTest,
checkGCRace,
hangPlugin,
getClipboardText,
callOnDestroy,
- crashPluginInNestedLoop,
};
-STATIC_ASSERT(ARRAY_LENGTH(sPluginMethodIdentifierNames) ==
- ARRAY_LENGTH(sPluginMethodFunctions));
-
struct URLNotifyData
{
const char* cookie;
NPObject* callback;
uint32_t size;
char* data;
};
@@ -706,17 +700,16 @@ NPP_New(NPMIMEType pluginType, NPP insta
}
if (range.length()) addRange(instanceData, range.c_str());
}
if (strcmp(argn[i], "newstream") == 0 &&
strcmp(argv[i], "true") == 0) {
instanceData->npnNewStream = true;
}
if (strcmp(argn[i], "newcrash") == 0) {
- NoteIntentionalCrash();
IntentionalCrash();
}
}
if (!browserSupportsWindowless || !pluginSupportsWindowlessMode()) {
requestWindow = true;
} else if (!pluginSupportsWindowMode()) {
requestWindow = false;
@@ -789,20 +782,18 @@ NPP_New(NPMIMEType pluginType, NPP insta
}
NPError
NPP_Destroy(NPP instance, NPSavedData** save)
{
printf("NPP_Destroy\n");
InstanceData* instanceData = (InstanceData*)(instance->pdata);
- if (instanceData->crashOnDestroy) {
- NoteIntentionalCrash();
+ if (instanceData->crashOnDestroy)
IntentionalCrash();
- }
if (instanceData->callOnDestroy) {
NPVariant result;
NPN_InvokeDefault(instance, instanceData->callOnDestroy, NULL, 0, &result);
NPN_ReleaseVariantValue(&result);
NPN_ReleaseObject(instanceData->callOnDestroy);
}
@@ -2149,17 +2140,16 @@ streamTest(NPObject* npobj, const NPVari
}
return true;
}
static bool
crashPlugin(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result)
{
- NoteIntentionalCrash();
IntentionalCrash();
VOID_TO_NPVARIANT(*result);
return true;
}
static bool
crashOnDestroy(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result)
{
@@ -2636,39 +2626,22 @@ getClipboardText(NPObject* npobj, const
selCopy[len] = '\0';
STRINGN_TO_NPVARIANT(selCopy, len, *result);
// *result owns str now
return true;
}
-bool
-crashPluginInNestedLoop(NPObject* npobj, const NPVariant* args,
- uint32_t argCount, NPVariant* result)
-{
- NPP npp = static_cast<TestNPObject*>(npobj)->npp;
- InstanceData* id = static_cast<InstanceData*>(npp->pdata);
- return pluginCrashInNestedLoop(id);
-}
-
#else
bool
getClipboardText(NPObject* npobj, const NPVariant* args, uint32_t argCount,
NPVariant* result)
{
- // XXX Not implemented!
- return false;
-}
-
-bool
-crashPluginInNestedLoop(NPObject* npobj, const NPVariant* args,
- uint32_t argCount, NPVariant* result)
-{
- // XXX Not implemented!
+ /// XXX Not implemented!
return false;
}
#endif
bool
callOnDestroy(NPObject* npobj, const NPVariant* args, uint32_t argCount, NPVariant* result)
{
NPP npp = static_cast<TestNPObject*>(npobj)->npp;
--- a/modules/plugin/test/testplugin/nptest_gtk2.cpp
+++ b/modules/plugin/test/testplugin/nptest_gtk2.cpp
@@ -30,25 +30,22 @@
* Contributor(s):
* Josh Aas <josh@mozilla.com>
* Michael Ventnor <mventnor@mozilla.com>
*
* ***** END LICENSE BLOCK ***** */
#include "nptest_platform.h"
#include "npapi.h"
-#include <pthread.h>
#include <gdk/gdk.h>
#ifdef MOZ_X11
#include <gdk/gdkx.h>
#include <X11/extensions/shape.h>
#endif
-#include <glib.h>
#include <gtk/gtk.h>
-#include <unistd.h>
using namespace std;
struct _PlatformData {
#ifdef MOZ_X11
Display* display;
Visual* visual;
Colormap colormap;
@@ -633,73 +630,8 @@ pluginGetClipboardText(InstanceData* ins
// deprecated interface only to test nested event loop handling.
gchar* text = gtk_clipboard_wait_for_text(cb);
string retText = text ? text : "";
g_free(text);
return retText;
}
-
-//-----------------------------------------------------------------------------
-// NB: this test is quite gross in that it's not only
-// nondeterministic, but dependent on the guts of the nested glib
-// event loop handling code in PluginModule. We first sleep long
-// enough to make sure that the "detection timer" will be pending when
-// we enter the nested glib loop, then similarly for the "process browser
-// events" timer. Then we "schedule" the crasher thread to run at about the
-// same time we expect that the PluginModule "process browser events" task
-// will run. If all goes well, the plugin process will crash and generate the
-// XPCOM "plugin crashed" task, and the browser will run that task while still
-// in the "process some events" loop.
-
-static void*
-CrasherThread(void* data)
-{
- // Give the parent thread a chance to send the message.
- usleep(200);
-
- IntentionalCrash();
-
- // not reached
- return(NULL);
-}
-
-bool
-pluginCrashInNestedLoop(InstanceData* instanceData)
-{
- // wait at least long enough for nested loop detector task to be pending ...
- sleep(1);
-
- // Run the nested loop detector. Other events are not expected.
- if (!g_main_context_iteration(NULL, TRUE)) {
- g_warning("DetectNestedEventLoop did not fire");
- return true; // trigger a test failure
-
- }
-
- // wait at least long enough for the "process browser events" task to be
- // pending ...
- sleep(1);
-
- // we'll be crashing soon, note that fact now to avoid messing with
- // timing too much
- NoteIntentionalCrash();
-
- // schedule the crasher thread ...
- pthread_t crasherThread;
- if (0 != pthread_create(&crasherThread, NULL, CrasherThread, NULL)) {
- g_warning("Failed to create thread");
- return true; // trigger a test failure
- }
-
- // .. and hope the time it takes to spawn means that it crashes at about the
- // same time as the "process browser events" task that should run next is
- // being processed in the parent. Other events are not expected.
- if (g_main_context_iteration(NULL, TRUE)) {
- g_warning("Should have crashed in ProcessBrowserEvents");
- } else {
- g_warning("ProcessBrowserEvents did not fire");
- }
-
- // if we get here without crashing, then we'll trigger a test failure
- return true;
-}