- Update to 1.3.2 and remove obsolete local patches.
- Replace the defunct URL with a new upstream location. Now this project has a new maintainer: https://www.redhat.com/archives/nspluginwrapper-devel-list/2011-April/msg00003.html For more information about this release, please see the following thread: https://www.redhat.com/archives/nspluginwrapper-devel-list/2011-April/msg00006.html Prodded by: Benjamin Kaduk (kaduk at MIT dot EDU), arundel
This commit is contained in:
parent
dc898af0e9
commit
cb3864f6b7
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=273224
@ -6,11 +6,11 @@
|
||||
#
|
||||
|
||||
PORTNAME= nspluginwrapper
|
||||
PORTVERSION= 1.3.0
|
||||
PORTREVISION= 9
|
||||
PORTVERSION= 1.3.2
|
||||
CATEGORIES= www linux emulators
|
||||
MASTER_SITES= LOCAL/jkim
|
||||
DISTFILES= ${DISTNAME}${EXTRACT_SUFX} ${BINFILE}${EXTRACT_SUFX}
|
||||
MASTER_SITES= http://web.mit.edu/davidben/Public/nspluginwrapper/ \
|
||||
LOCAL/jkim:binfile
|
||||
DISTFILES= ${DISTNAME}${EXTRACT_SUFX} ${BINFILE}:binfile
|
||||
|
||||
MAINTAINER= jkim@FreeBSD.org
|
||||
COMMENT= A compatibility plugin for Mozilla NPAPI (development version)
|
||||
@ -21,11 +21,11 @@ LATEST_LINK= ${PORTNAME}-devel
|
||||
|
||||
CONFLICTS= nspluginwrapper-1.2.*
|
||||
|
||||
BINFILE= ${PORTNAME}-i386-${PORTVERSION}-5
|
||||
BINBUILD= 1
|
||||
BINFILE= ${PORTNAME}-i386-${PORTVERSION}-${BINBUILD}${EXTRACT_SUFX}
|
||||
|
||||
ONLY_FOR_ARCHS= i386 amd64
|
||||
|
||||
USE_BZIP2= yes
|
||||
USE_LINUX= yes
|
||||
USE_LINUX_APPS= gtk2
|
||||
USE_XORG= x11 xext xt
|
||||
@ -39,8 +39,7 @@ HAS_CONFIGURE= yes
|
||||
|
||||
CONFIGURE_ARGS= --enable-generic --enable-strip --prefix=${PREFIX} \
|
||||
--target-os=linux --target-cpu=i386 \
|
||||
--with-cc=${CC} --with-cxx=${CXX} \
|
||||
--with-x11-prefix=${LOCALBASE}
|
||||
--with-cc=${CC} --with-cxx=${CXX}
|
||||
|
||||
LIBDIR= ${PREFIX}/lib/${PORTNAME}
|
||||
|
||||
@ -58,7 +57,7 @@ HOST_ARCH= ${ARCH}
|
||||
.endif
|
||||
|
||||
post-patch:
|
||||
${REINPLACE_CMD} -e 's,/usr/X11R6,${LOCALBASE},g' \
|
||||
${REINPLACE_CMD} -e 's,%%LOCALBASE%%,${LOCALBASE},g' \
|
||||
${WRKSRC}/src/npw-config.c
|
||||
|
||||
post-install:
|
||||
|
@ -1,4 +1,4 @@
|
||||
SHA256 (nspluginwrapper-1.3.0.tar.bz2) = b8900bd5f0bd950f95b963e5c8f5e20d7d15cc70e777b6058289687ad968b21c
|
||||
SIZE (nspluginwrapper-1.3.0.tar.bz2) = 336049
|
||||
SHA256 (nspluginwrapper-i386-1.3.0-5.tar.bz2) = 57904964581c0b171be392fce30542941caf9a848b8b1db4987171949615283a
|
||||
SIZE (nspluginwrapper-i386-1.3.0-5.tar.bz2) = 62313
|
||||
SHA256 (nspluginwrapper-1.3.2.tar.gz) = f3a40d160601520d36b6f5c342e1e9751b2bdc70dff5e2e880e1d18ed8830201
|
||||
SIZE (nspluginwrapper-1.3.2.tar.gz) = 410887
|
||||
SHA256 (nspluginwrapper-i386-1.3.2-1.tar.gz) = 56bc1e4699456e6798929da47a867cf9e47bf29b3d5e7a88885a4f05f8de3be0
|
||||
SIZE (nspluginwrapper-i386-1.3.2-1.tar.gz) = 64964
|
||||
|
@ -1,43 +0,0 @@
|
||||
--- npapi/npapi.h 2009-01-02 09:22:28.000000000 -0500
|
||||
+++ npapi/npapi.h 2010-08-18 19:07:09.000000000 -0400
|
||||
@@ -439,7 +439,9 @@ typedef enum {
|
||||
/* Get the NPObject wrapper for the plugins DOM element. */
|
||||
NPNVPluginElementNPObject = 16,
|
||||
|
||||
- NPNVSupportsWindowless = 17
|
||||
+ NPNVSupportsWindowless = 17,
|
||||
+
|
||||
+ NPNVprivateModeBool = 18
|
||||
|
||||
} NPNVariable;
|
||||
|
||||
--- src/npw-rpc.c 2010-08-18 19:10:19.000000000 -0400
|
||||
+++ src/npw-rpc.c 2010-08-18 19:08:24.000000000 -0400
|
||||
@@ -41,6 +41,7 @@ int rpc_type_of_NPNVariable(int variable
|
||||
case NPNVisOfflineBool:
|
||||
case NPNVSupportsXEmbedBool:
|
||||
case NPNVSupportsWindowless:
|
||||
+ case NPNVprivateModeBool:
|
||||
type = RPC_TYPE_BOOLEAN;
|
||||
break;
|
||||
case NPNVToolkit:
|
||||
--- src/npw-viewer.c 2010-08-18 19:10:19.000000000 -0400
|
||||
+++ src/npw-viewer.c 2010-08-18 19:05:46.000000000 -0400
|
||||
@@ -1266,6 +1266,7 @@ g_NPN_GetValue(NPP instance, NPNVariable
|
||||
case NPNVSupportsXEmbedBool:
|
||||
case NPNVWindowNPObject:
|
||||
case NPNVPluginElementNPObject:
|
||||
+ case NPNVprivateModeBool:
|
||||
return g_NPN_GetValue_real(instance, variable, value);
|
||||
default:
|
||||
switch (variable & 0xff) {
|
||||
--- src/utils.c 2009-01-02 09:22:29.000000000 -0500
|
||||
+++ src/utils.c 2010-08-18 19:09:31.000000000 -0400
|
||||
@@ -283,6 +283,7 @@ const char *string_of_NPNVariable(int va
|
||||
_(NPNVWindowNPObject);
|
||||
_(NPNVPluginElementNPObject);
|
||||
_(NPNVSupportsWindowless);
|
||||
+ _(NPNVprivateModeBool);
|
||||
#undef _
|
||||
default:
|
||||
switch (variable & 0xff) {
|
@ -1,178 +0,0 @@
|
||||
Index: src/npw-viewer.c
|
||||
===================================================================
|
||||
--- src/npw-viewer.c (revision 942)
|
||||
+++ src/npw-viewer.c (working copy)
|
||||
@@ -2059,7 +2059,7 @@
|
||||
RPC_METHOD_NPN_INVOKE,
|
||||
RPC_TYPE_NPW_PLUGIN_INSTANCE, plugin,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, methodName,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &methodName,
|
||||
RPC_TYPE_ARRAY, RPC_TYPE_NP_VARIANT, argCount, args,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
@@ -2249,7 +2249,7 @@
|
||||
RPC_METHOD_NPN_GET_PROPERTY,
|
||||
RPC_TYPE_NPW_PLUGIN_INSTANCE, plugin,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, propertyName,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &propertyName,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
@@ -2311,7 +2311,7 @@
|
||||
RPC_METHOD_NPN_SET_PROPERTY,
|
||||
RPC_TYPE_NPW_PLUGIN_INSTANCE, plugin,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, propertyName,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &propertyName,
|
||||
RPC_TYPE_NP_VARIANT, value,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
@@ -2370,7 +2370,7 @@
|
||||
RPC_METHOD_NPN_REMOVE_PROPERTY,
|
||||
RPC_TYPE_NPW_PLUGIN_INSTANCE, plugin,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, propertyName,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &propertyName,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
@@ -2427,7 +2427,7 @@
|
||||
RPC_METHOD_NPN_HAS_PROPERTY,
|
||||
RPC_TYPE_NPW_PLUGIN_INSTANCE, plugin,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, propertyName,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &propertyName,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
@@ -2484,7 +2484,7 @@
|
||||
RPC_METHOD_NPN_HAS_METHOD,
|
||||
RPC_TYPE_NPW_PLUGIN_INSTANCE, plugin,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, methodName,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &methodName,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
@@ -2780,7 +2780,7 @@
|
||||
|
||||
int error = rpc_method_invoke(g_rpc_connection,
|
||||
RPC_METHOD_NPN_IDENTIFIER_IS_STRING,
|
||||
- RPC_TYPE_NP_IDENTIFIER, identifier,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &identifier,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
@@ -2838,7 +2838,7 @@
|
||||
|
||||
int error = rpc_method_invoke(g_rpc_connection,
|
||||
RPC_METHOD_NPN_UTF8_FROM_IDENTIFIER,
|
||||
- RPC_TYPE_NP_IDENTIFIER, identifier,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &identifier,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
@@ -2902,7 +2902,7 @@
|
||||
|
||||
int error = rpc_method_invoke(g_rpc_connection,
|
||||
RPC_METHOD_NPN_INT_FROM_IDENTIFIER,
|
||||
- RPC_TYPE_NP_IDENTIFIER, identifier,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &identifier,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
Index: src/npw-wrapper.c
|
||||
===================================================================
|
||||
--- src/npw-wrapper.c (revision 942)
|
||||
+++ src/npw-wrapper.c (working copy)
|
||||
@@ -1528,7 +1528,7 @@
|
||||
free(name);
|
||||
|
||||
return rpc_method_send_reply(connection,
|
||||
- RPC_TYPE_NP_IDENTIFIER, ident,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &ident,
|
||||
RPC_TYPE_INVALID);
|
||||
}
|
||||
|
||||
@@ -1601,7 +1601,7 @@
|
||||
NPIdentifier ident = g_NPN_GetIntIdentifier(intid);
|
||||
|
||||
return rpc_method_send_reply(connection,
|
||||
- RPC_TYPE_NP_IDENTIFIER, ident,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &ident,
|
||||
RPC_TYPE_INVALID);
|
||||
}
|
||||
|
||||
Index: src/npruntime.c
|
||||
===================================================================
|
||||
--- src/npruntime.c (revision 942)
|
||||
+++ src/npruntime.c (working copy)
|
||||
@@ -221,7 +221,7 @@
|
||||
int error = rpc_method_invoke(g_rpc_connection,
|
||||
RPC_METHOD_NPCLASS_HAS_METHOD,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, name,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &name,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
@@ -327,7 +327,7 @@
|
||||
int error = rpc_method_invoke(g_rpc_connection,
|
||||
RPC_METHOD_NPCLASS_INVOKE,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, name,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &name,
|
||||
RPC_TYPE_ARRAY, RPC_TYPE_NP_VARIANT, argCount, args,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
@@ -509,7 +509,7 @@
|
||||
int error = rpc_method_invoke(g_rpc_connection,
|
||||
RPC_METHOD_NPCLASS_HAS_PROPERTY,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, name,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &name,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
@@ -599,7 +599,7 @@
|
||||
int error = rpc_method_invoke(g_rpc_connection,
|
||||
RPC_METHOD_NPCLASS_GET_PROPERTY,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, name,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &name,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
@@ -684,7 +684,7 @@
|
||||
int error = rpc_method_invoke(g_rpc_connection,
|
||||
RPC_METHOD_NPCLASS_SET_PROPERTY,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, name,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &name,
|
||||
RPC_TYPE_NP_VARIANT, value,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
@@ -763,7 +763,7 @@
|
||||
int error = rpc_method_invoke(g_rpc_connection,
|
||||
RPC_METHOD_NPCLASS_REMOVE_PROPERTY,
|
||||
RPC_TYPE_NP_OBJECT, npobj,
|
||||
- RPC_TYPE_NP_IDENTIFIER, name,
|
||||
+ RPC_TYPE_NP_IDENTIFIER, &name,
|
||||
RPC_TYPE_INVALID);
|
||||
|
||||
if (error != RPC_ERROR_NO_ERROR) {
|
||||
Index: src/npw-rpc.c
|
||||
===================================================================
|
||||
--- src/npw-rpc.c (revision 942)
|
||||
+++ src/npw-rpc.c (working copy)
|
||||
@@ -1252,7 +1252,7 @@
|
||||
// the browser side
|
||||
static int do_send_NPIdentifier(rpc_message_t *message, void *p_value)
|
||||
{
|
||||
- NPIdentifier ident = (NPIdentifier)p_value;
|
||||
+ NPIdentifier ident = *(NPIdentifier *)p_value;
|
||||
int id = 0;
|
||||
if (ident) {
|
||||
#ifdef BUILD_WRAPPER
|
@ -1,55 +0,0 @@
|
||||
--- src/npw-wrapper.c.orig 2009-01-02 09:22:29.000000000 -0500
|
||||
+++ src/npw-wrapper.c 2011-03-31 12:34:33.000000000 -0400
|
||||
@@ -2560,6 +2561,35 @@
|
||||
return ret;
|
||||
}
|
||||
|
||||
+#define NPW_ADOBE_FLASH_PLUGIN "Shockwave Flash"
|
||||
+
|
||||
+struct flash_version {
|
||||
+ unsigned int major;
|
||||
+ unsigned int minor;
|
||||
+};
|
||||
+
|
||||
+// Detect Adobe Flash plugin version
|
||||
+static void adobe_flash_version(struct flash_version *vers)
|
||||
+{
|
||||
+ static struct flash_version fv = { 0, 0 };
|
||||
+ static bool tested = false;
|
||||
+
|
||||
+ if (!tested) {
|
||||
+ if (g_plugin.name != NULL && g_plugin.description != NULL &&
|
||||
+ strcmp(g_plugin.name, NPW_ADOBE_FLASH_PLUGIN) == 0 &&
|
||||
+ strncmp(g_plugin.description, NPW_ADOBE_FLASH_PLUGIN,
|
||||
+ strlen(NPW_ADOBE_FLASH_PLUGIN)) == 0) {
|
||||
+ char *ptr, *endp;
|
||||
+ ptr = g_plugin.description + strlen(NPW_ADOBE_FLASH_PLUGIN);
|
||||
+ fv.major = strtol(ptr, &endp, 10);
|
||||
+ if (*endp == '.')
|
||||
+ fv.minor = strtol(endp + 1, NULL, 10);
|
||||
+ }
|
||||
+ tested = true;
|
||||
+ }
|
||||
+ *vers = fv;
|
||||
+}
|
||||
+
|
||||
static int16 g_NPP_HandleEvent(NPP instance, void *event)
|
||||
{
|
||||
if (instance == NULL)
|
||||
@@ -2569,6 +2599,16 @@
|
||||
if (plugin == NULL)
|
||||
return NPERR_INVALID_INSTANCE_ERROR;
|
||||
|
||||
+ if (((NPEvent *)event)->type == ButtonPress && ((XButtonEvent *)event)->button == Button3) {
|
||||
+ static struct flash_version vers;
|
||||
+ adobe_flash_version(&vers);
|
||||
+ /* XXX: work around "right click" hang with Flash plugin 10.1 and later */
|
||||
+ if ((vers.major == 10 && vers.minor >= 1) || vers.major > 10) {
|
||||
+ D(bug("NPP_HandleEvent instance=%p, ignoring ButtonPress event for "
|
||||
+ NPW_ADOBE_FLASH_PLUGIN " %u.%u\n", instance, vers.major, vers.minor));
|
||||
+ return false;
|
||||
+ }
|
||||
+ }
|
||||
if (((NPEvent *)event)->type == GraphicsExpose) {
|
||||
/* XXX: flush the X output buffer so that the call to
|
||||
gdk_pixmap_foreign_new() in the viewer can work */
|
@ -1,209 +0,0 @@
|
||||
--- src/npw-viewer.c.orig 2011-03-28 17:46:24.000000000 -0400
|
||||
+++ src/npw-viewer.c 2011-03-28 17:52:16.000000000 -0400
|
||||
@@ -221,8 +221,17 @@
|
||||
static GList *g_delayed_calls = NULL;
|
||||
static guint g_delayed_calls_id = 0;
|
||||
|
||||
+// We put delayed NPP_Destroy calls on a separate list because, unlike
|
||||
+// NPN_ReleaseObject, these must be called on a clean stack and have no
|
||||
+// other cause to get cleared. Otherwise, it is possible for the
|
||||
+// delayed_calls_process in g_NPP_Destroy_Now to call it early.
|
||||
+static GList *g_delayed_destroys = NULL;
|
||||
+static guint g_delayed_destroys_id = 0;
|
||||
+
|
||||
static void g_NPN_ReleaseObject_Now(NPObject *npobj);
|
||||
+static NPError g_NPP_Destroy_Now(PluginInstance *plugin, NPSavedData **sdata);
|
||||
static gboolean delayed_calls_process_cb(gpointer user_data);
|
||||
+static gboolean delayed_destroys_process_cb(gpointer user_data);
|
||||
|
||||
static void delayed_calls_add(int type, gpointer data)
|
||||
{
|
||||
@@ -238,13 +247,19 @@
|
||||
delayed_calls_process_cb, NULL, NULL);
|
||||
}
|
||||
|
||||
+static void delayed_destroys_add(PluginInstance *plugin)
|
||||
+{
|
||||
+ g_delayed_destroys = g_list_append(g_delayed_destroys, plugin);
|
||||
+
|
||||
+ if (g_delayed_destroys_id == 0)
|
||||
+ g_delayed_destroys_id = g_idle_add_full(G_PRIORITY_LOW,
|
||||
+ delayed_destroys_process_cb, NULL, NULL);
|
||||
+}
|
||||
+
|
||||
// Returns whether there are pending calls left in the queue
|
||||
static gboolean delayed_calls_process(PluginInstance *plugin, gboolean is_in_NPP_Destroy)
|
||||
{
|
||||
- GList *l = g_delayed_calls;
|
||||
- while (l != NULL) {
|
||||
- GList *cl = l;
|
||||
- l = l->next;
|
||||
+ while (g_delayed_calls != NULL) {
|
||||
|
||||
if (!is_in_NPP_Destroy) {
|
||||
/* Continue later if there is incoming RPC */
|
||||
@@ -252,7 +267,11 @@
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
- DelayedCall *dcall = (DelayedCall *)cl->data;
|
||||
+ DelayedCall *dcall = (DelayedCall *)g_delayed_calls->data;
|
||||
+ /* XXX: Remove the link first; this function /must/ be
|
||||
+ * re-entrant. We may be called again while processing the
|
||||
+ * delayed call. */
|
||||
+ g_delayed_calls = g_list_delete_link(g_delayed_calls, g_delayed_calls);
|
||||
switch (dcall->type) {
|
||||
case RPC_DELAYED_NPN_RELEASE_OBJECT:
|
||||
{
|
||||
@@ -262,7 +281,6 @@
|
||||
}
|
||||
}
|
||||
NPW_MemFree(dcall);
|
||||
- g_delayed_calls = g_list_delete_link(g_delayed_calls, cl);
|
||||
}
|
||||
|
||||
if (g_delayed_calls)
|
||||
@@ -280,6 +298,25 @@
|
||||
return delayed_calls_process(NULL, FALSE);
|
||||
}
|
||||
|
||||
+static gboolean delayed_destroys_process_cb(gpointer user_data)
|
||||
+{
|
||||
+ while (g_delayed_destroys != NULL) {
|
||||
+ PluginInstance *plugin = (PluginInstance *)g_delayed_destroys->data;
|
||||
+ g_delayed_destroys = g_list_delete_link(g_delayed_destroys,
|
||||
+ g_delayed_destroys);
|
||||
+ g_NPP_Destroy_Now(plugin, NULL);
|
||||
+ }
|
||||
+
|
||||
+ if (g_delayed_destroys)
|
||||
+ return TRUE;
|
||||
+
|
||||
+ if (g_delayed_destroys_id) {
|
||||
+ g_source_remove(g_delayed_destroys_id);
|
||||
+ g_delayed_destroys_id = 0;
|
||||
+ }
|
||||
+ return FALSE;
|
||||
+}
|
||||
+
|
||||
// NPIdentifier cache
|
||||
static inline bool use_npidentifier_cache(void)
|
||||
{
|
||||
@@ -741,7 +778,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
-
|
||||
/* ====================================================================== */
|
||||
/* === XPCOM glue === */
|
||||
/* ====================================================================== */
|
||||
@@ -3338,6 +3374,13 @@
|
||||
return error;
|
||||
}
|
||||
|
||||
+ /* Clear any NPP_Destroys we may have delayed. Although it doesn't
|
||||
+ really matter, and the plugin is going to die soon.
|
||||
+
|
||||
+ XXX: To be really picky, we should probably delay this and make
|
||||
+ sure it is run on a new event loop iteration. */
|
||||
+ delayed_destroys_process_cb(NULL);
|
||||
+
|
||||
NPError ret = g_NP_Shutdown();
|
||||
return rpc_method_send_reply(connection, RPC_TYPE_INT32, ret, RPC_TYPE_INVALID);
|
||||
}
|
||||
@@ -3459,6 +3502,8 @@
|
||||
|
||||
// Process all pending calls as the data could become junk afterwards
|
||||
// XXX: this also processes delayed calls from other instances
|
||||
+ // XXX: Also, if this was delayed, the NPN_ReleaseObject calls will
|
||||
+ // be ignored; the browser thinks we've already died.
|
||||
delayed_calls_process(plugin, TRUE);
|
||||
|
||||
D(bugiI("NPP_Destroy instance=%p\n", instance));
|
||||
@@ -3473,6 +3518,22 @@
|
||||
return ret;
|
||||
}
|
||||
|
||||
+static NPError g_NPP_Destroy_Now(PluginInstance *plugin, NPSavedData **save)
|
||||
+{
|
||||
+ D(bug("g_NPP_Destroy_Now\n"));
|
||||
+
|
||||
+ NPSavedData *save_area = NULL;
|
||||
+ NPError ret = g_NPP_Destroy(PLUGIN_INSTANCE_NPP(plugin), &save_area);
|
||||
+ if (save) {
|
||||
+ *save = save_area;
|
||||
+ } else if (save_area) {
|
||||
+ npw_printf("WARNING: NPP_Destroy returned save_area, but it was ignored\n");
|
||||
+ }
|
||||
+
|
||||
+ rpc_connection_unref(g_rpc_connection);
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static int handle_NPP_Destroy(rpc_connection_t *connection)
|
||||
{
|
||||
D(bug("handle_NPP_Destroy\n"));
|
||||
@@ -3488,8 +3549,26 @@
|
||||
return error;
|
||||
}
|
||||
|
||||
- NPSavedData *save_area;
|
||||
- NPError ret = g_NPP_Destroy(PLUGIN_INSTANCE_NPP(plugin), &save_area);
|
||||
+ NPSavedData *save_area = NULL;
|
||||
+ NPError ret = NPERR_NO_ERROR;
|
||||
+ /* Take a ref for the rpc_method_send_reply; otherwise the
|
||||
+ * rpc_connection_unref in g_NPP_Destroy_Now may cause a slight
|
||||
+ * nuisance. */
|
||||
+ rpc_connection_ref(connection);
|
||||
+ if (!rpc_method_in_invoke(connection)) {
|
||||
+ /* The plugin is not on the stack; it's safe to call this. */
|
||||
+ D(bug("NPP_Destroy is fine.\n"));
|
||||
+ ret = g_NPP_Destroy_Now(plugin, &save_area);
|
||||
+ } else {
|
||||
+ /* It is not safe to call NPP_Destroy right now. Delay it until we
|
||||
+ * return to the event loop.
|
||||
+ *
|
||||
+ * NOTE: This means that the browser never sees the real return
|
||||
+ * value of NPP_Destroy; the NPSavedData will be discarded, and any
|
||||
+ * error code will be ignored. */
|
||||
+ D(bug("NPP_Destroy raced; delaying it to get a clean stack.\n"));
|
||||
+ delayed_destroys_add(plugin);
|
||||
+ }
|
||||
|
||||
error = rpc_method_send_reply(connection,
|
||||
RPC_TYPE_INT32, ret,
|
||||
--- src/rpc.c.orig 2009-01-02 09:22:29.000000000 -0500
|
||||
+++ src/rpc.c 2011-03-28 17:52:16.000000000 -0400
|
||||
@@ -2097,6 +2097,22 @@
|
||||
return ret;
|
||||
}
|
||||
|
||||
+bool rpc_method_in_invoke(rpc_connection_t *connection)
|
||||
+{
|
||||
+ D(bug("rpc_method_in_invoke\n"));
|
||||
+ if (connection == NULL)
|
||||
+ return false;
|
||||
+ // Our stack should alternate between handle/dispatch and
|
||||
+ // invokes. Some calls are only safe to handle called from an event
|
||||
+ // loop. In this case, we should have values invoke_depth = 0;
|
||||
+ // handle_depth = 1; dispatch_depth = 1
|
||||
+ D(bug("invoke_depth = %d; dispatch_depth = %d; handle_depth = %d\n",
|
||||
+ connection->invoke_depth,
|
||||
+ connection->dispatch_depth,
|
||||
+ connection->handle_depth));
|
||||
+ return connection->invoke_depth > 0;
|
||||
+}
|
||||
+
|
||||
|
||||
/* ====================================================================== */
|
||||
/* === Test Program === */
|
||||
--- src/rpc.h.orig 2009-01-02 09:22:29.000000000 -0500
|
||||
+++ src/rpc.h 2011-03-28 17:52:16.000000000 -0400
|
||||
@@ -119,6 +119,7 @@
|
||||
extern int rpc_method_wait_for_reply(rpc_connection_t *connection, ...) attribute_hidden;
|
||||
extern int rpc_method_get_args(rpc_connection_t *connection, ...) attribute_hidden;
|
||||
extern int rpc_method_send_reply(rpc_connection_t *connection, ...) attribute_hidden;
|
||||
+extern bool rpc_method_in_invoke(rpc_connection_t *connection) attribute_hidden;
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
@ -1,11 +0,0 @@
|
||||
--- src/npw-common.h.orig 2009-01-02 15:22:29.000000000 +0100
|
||||
+++ src/npw-common.h 2009-11-10 09:58:34.000000000 +0100
|
||||
@@ -115,7 +115,7 @@ npw_plugin_instance_is_valid(void *ptr)
|
||||
static inline NPW_PluginInstance *
|
||||
_npw_get_plugin_instance (NPP instance)
|
||||
{
|
||||
- return (NPW_PluginInstance *)instance->_NPW_INSTANCE_PRIVATE_DATA;
|
||||
+ return instance ? (NPW_PluginInstance *)instance->_NPW_INSTANCE_PRIVATE_DATA : NULL;
|
||||
}
|
||||
|
||||
static inline NPW_PluginInstance *
|
@ -1,13 +1,33 @@
|
||||
--- ./src/npw-config.c.orig Sun Mar 4 23:01:22 2007
|
||||
+++ ./src/npw-config.c Wed Apr 4 20:20:59 2007
|
||||
@@ -119,8 +119,8 @@
|
||||
--- src/npw-config.c.orig 2011-04-23 14:47:21.000000000 -0400
|
||||
+++ src/npw-config.c 2011-04-25 17:46:44.000000000 -0400
|
||||
@@ -186,8 +186,9 @@
|
||||
#if defined(__FreeBSD__)
|
||||
{
|
||||
static const char *freebsd_dirs[] = {
|
||||
- "/usr/X11R6/" LIB "/browser_plugins",
|
||||
- "/usr/X11R6/" LIB "/firefox/plugins",
|
||||
+ "/usr/local/" LIB "/browser_plugins",
|
||||
+ "/usr/local/" LIB "/firefox/plugins",
|
||||
+ "%%LOCALBASE%%/" LIB "/browser_plugins",
|
||||
+ "%%LOCALBASE%%/" LIB "/firefox/plugins",
|
||||
+ "%%LOCALBASE%%/" LIB "/seamonkey/plugins",
|
||||
};
|
||||
dirs = freebsd_dirs;
|
||||
}
|
||||
@@ -283,11 +284,13 @@
|
||||
"/usr/lib32/nsbrowser/plugins", // XXX how unfortunate
|
||||
"/usr/lib64/nsbrowser/plugins",
|
||||
#if defined(__FreeBSD__)
|
||||
- "/usr/X11R6/lib/browser_plugins",
|
||||
- "/usr/X11R6/lib/firefox/plugins",
|
||||
- "/usr/X11R6/lib/linux-mozilla/plugins",
|
||||
- "/usr/local/lib/npapi/linux-flashplugin",
|
||||
- "/usr/X11R6/Adobe/Acrobat7.0/ENU/Browser/intellinux",
|
||||
+ "%%LOCALBASE%%/lib/browser_plugins",
|
||||
+ "%%LOCALBASE%%/lib/firefox/plugins",
|
||||
+ "%%LOCALBASE%%/lib/seamonkey/plugins",
|
||||
+ "%%LOCALBASE%%/lib/npapi/linux-flashplugin",
|
||||
+ "%%LOCALBASE%%/lib/npapi/linux-f10-flashplugin",
|
||||
+ "%%LOCALBASE%%/Adobe/Acrobat7.0/ENU/Browser/intellinux",
|
||||
+ "%%LOCALBASE%%/Adobe/Reader8/ENU/Adobe/Reader8/Browser/intellinux",
|
||||
#endif
|
||||
#if defined(__DragonFly__)
|
||||
"/usr/pkg/lib/netscape/plugins",
|
||||
|
@ -1,10 +0,0 @@
|
||||
--- ./src/npw-wrapper.c.orig Sun Mar 4 23:01:22 2007
|
||||
+++ ./src/npw-wrapper.c Wed Apr 4 20:20:59 2007
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <unistd.h>
|
||||
#include <pthread.h>
|
||||
#include <semaphore.h>
|
||||
+#include <signal.h>
|
||||
#include <sys/wait.h>
|
||||
|
||||
#include <glib.h>
|
@ -1,11 +0,0 @@
|
||||
--- src/rpc.c.orig 2009-01-02 15:22:29.000000000 +0100
|
||||
+++ src/rpc.c 2010-06-29 14:24:39.000000000 +0200
|
||||
@@ -68,7 +68,7 @@
|
||||
|
||||
// Define the maximum amount of time (in seconds) to wait for a message
|
||||
#ifndef RPC_MESSAGE_TIMEOUT
|
||||
-#define RPC_MESSAGE_TIMEOUT 30
|
||||
+#define RPC_MESSAGE_TIMEOUT 10
|
||||
#endif
|
||||
|
||||
// Define the maximum amount of time (in seconds) to wait for plugin connection
|
@ -3,4 +3,4 @@ The nspluginwrapper is an Open Source compatibility plugin for Netscape 4
|
||||
not built for. For example, you can use the Adobe Flash plugin on Linux/x86_64,
|
||||
NetBSD and FreeBSD platforms.
|
||||
|
||||
WWW: http://gwenole.beauchesne.info/projects/nspluginwrapper/
|
||||
WWW: https://github.com/davidben/nspluginwrapper
|
||||
|
@ -4,7 +4,6 @@ bin/nspluginwrapper
|
||||
%%LIBDIR%%/%%HOST_ARCH%%/freebsd/npplayer
|
||||
%%LIBDIR%%/%%HOST_ARCH%%/freebsd/npwrapper.so
|
||||
%%LIBDIR%%/i386/linux/libnoxshm.so
|
||||
%%LIBDIR%%/i386/linux/libxpcom.so
|
||||
%%LIBDIR%%/i386/linux/npviewer
|
||||
%%LIBDIR%%/i386/linux/npviewer.bin
|
||||
%%LIBDIR%%/noarch/npviewer.sh
|
||||
|
Loading…
Reference in New Issue
Block a user