2008-12-07 22:35 Gwenole Beauchesne * src/npw-viewer.c: Destroy plugin window only if PluginInstance is finalize'd. This is because an NPPVpluginScriptableNPObject can still hold a reference to it (and a call to NPClass::Invalidate() would fail in that case). 2008-12-07 22:30 Gwenole Beauchesne * src/npruntime-impl.h, src/npruntime.c: Use NPW memory allocator for NPObjectInfo objects. Reference count PluginInstance bound to an NPObject if it is known at NPClass::allocate() time. Index: src/npw-viewer.c =================================================================== --- src/npw-viewer.c (revision 801) +++ src/npw-viewer.c (revision 803) @@ -99,7 +99,10 @@ GtkWidget *socket; } GtkData; +// Prototypes +static void destroy_window(PluginInstance *plugin); + /* ====================================================================== */ /* === Helpers === */ /* ====================================================================== */ @@ -107,10 +110,12 @@ // PluginInstance vfuncs static void *plugin_instance_allocate(void); static void plugin_instance_deallocate(PluginInstance *plugin); +static void plugin_instance_finalize(PluginInstance *plugin); static NPW_PluginInstanceClass PluginInstanceClass = { (NPW_PluginInstanceAllocateFunctionPtr)plugin_instance_allocate, (NPW_PluginInstanceDeallocateFunctionPtr)plugin_instance_deallocate, + (NPW_PluginInstanceFinalizeFunctionPtr)plugin_instance_finalize }; static void *plugin_instance_allocate(void) @@ -123,6 +128,15 @@ NPW_MemFree(plugin); } +static void plugin_instance_finalize(PluginInstance *plugin) +{ + if (plugin->browser_toplevel) { + g_object_unref(plugin->browser_toplevel); + plugin->browser_toplevel = NULL; + } + destroy_window(plugin); +} + // Pid support routines static void pid_init(void) { @@ -3021,12 +3035,6 @@ NPError ret = plugin_funcs.destroy(instance, sdata); D(bugiD("NPP_Destroy return: %d [%s]\n", ret, string_of_NPError(ret))); - if (plugin->browser_toplevel) { - g_object_unref(plugin->browser_toplevel); - plugin->browser_toplevel = NULL; - } - destroy_window(plugin); - /* NPP instance is no longer valid beyond this point. So, let's also drop the link to the PluginInstance now */ plugin->instance = NULL; Index: src/npruntime.c =================================================================== --- src/npruntime.c (revision 801) +++ src/npruntime.c (revision 803) @@ -24,6 +24,7 @@ #include /* */ #include "utils.h" #include "npw-common.h" +#include "npw-malloc.h" #define DEBUG 1 #include "debug.h" @@ -733,7 +734,7 @@ NPObjectInfo *npobject_info_new(NPObject *npobj) { - NPObjectInfo *npobj_info = malloc(sizeof(*npobj_info)); + NPObjectInfo *npobj_info = NPW_MemNew0(NPObjectInfo, 1); if (npobj_info) { static uint32_t id; npobj_info->npobj = npobj; @@ -745,8 +746,10 @@ void npobject_info_destroy(NPObjectInfo *npobj_info) { - if (npobj_info) - free(npobj_info); + if (npobj_info) { + npw_plugin_instance_unref(npobj_info->plugin); + NPW_MemFree(npobj_info); + } } @@ -793,6 +796,7 @@ return NULL; } npobj_info->npobj_id = npobj_id; + npobj_info->plugin = npw_plugin_instance_ref(NPW_PLUGIN_INSTANCE(instance)); npobject_associate(npobj, npobj_info); return npobj; } Index: src/npruntime-impl.h =================================================================== --- src/npruntime-impl.h (revision 801) +++ src/npruntime-impl.h (revision 803) @@ -26,6 +26,7 @@ NPObject *npobj; uint32_t npobj_id; bool is_valid; + void *plugin; } NPObjectInfo; extern NPObjectInfo *npobject_info_new(NPObject *npobj) attribute_hidden;