2007-03-22 10:30:00 -07:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* ***** BEGIN LICENSE BLOCK *****
|
|
|
|
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
|
|
|
|
*
|
|
|
|
* The contents of this file are subject to the Mozilla Public License Version
|
|
|
|
* 1.1 (the "License"); you may not use this file except in compliance with
|
|
|
|
* the License. You may obtain a copy of the License at
|
|
|
|
* http://www.mozilla.org/MPL/
|
|
|
|
*
|
|
|
|
* Software distributed under the License is distributed on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
|
|
|
|
* for the specific language governing rights and limitations under the
|
|
|
|
* License.
|
|
|
|
*
|
|
|
|
* The Original Code is mozilla.org code.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is
|
|
|
|
* Netscape Communications Corporation.
|
|
|
|
* Portions created by the Initial Developer are Copyright (C) 1998
|
|
|
|
* the Initial Developer. All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s):
|
2007-03-26 18:07:57 -07:00
|
|
|
* Josh Aas <josh@mozilla.com>
|
2007-03-22 10:30:00 -07:00
|
|
|
*
|
|
|
|
* Alternatively, the contents of this file may be used under the terms of
|
|
|
|
* either the GNU General Public License Version 2 or later (the "GPL"), or
|
|
|
|
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
|
|
|
|
* in which case the provisions of the GPL or the LGPL are applicable instead
|
|
|
|
* of those above. If you wish to allow use of your version of this file only
|
|
|
|
* under the terms of either the GPL or the LGPL, and not to allow others to
|
|
|
|
* use your version of this file under the terms of the MPL, indicate your
|
|
|
|
* decision by deleting the provisions above and replace them with the notice
|
|
|
|
* and other provisions required by the GPL or the LGPL. If you do not delete
|
|
|
|
* the provisions above, a recipient may use your version of this file under
|
|
|
|
* the terms of any one of the MPL, the GPL or the LGPL.
|
|
|
|
*
|
|
|
|
* ***** END LICENSE BLOCK ***** */
|
|
|
|
|
|
|
|
#include "prtypes.h"
|
|
|
|
#include "prmem.h"
|
2007-07-11 16:25:45 -07:00
|
|
|
#include "prclist.h"
|
|
|
|
#include "nsAutoLock.h"
|
2007-03-22 10:30:00 -07:00
|
|
|
#include "ns4xPlugin.h"
|
|
|
|
#include "ns4xPluginInstance.h"
|
|
|
|
#include "ns4xPluginStreamListener.h"
|
|
|
|
#include "nsIServiceManager.h"
|
2007-07-11 16:25:45 -07:00
|
|
|
#include "nsThreadUtils.h"
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
#include "nsIPluginStreamListener.h"
|
|
|
|
#include "nsPluginsDir.h"
|
|
|
|
#include "nsPluginSafety.h"
|
|
|
|
#include "nsIPrefService.h"
|
|
|
|
#include "nsIPrefBranch.h"
|
|
|
|
#include "nsPluginLogging.h"
|
|
|
|
|
|
|
|
#include "nsIPluginInstancePeer2.h"
|
|
|
|
#include "nsIJSContextStack.h"
|
|
|
|
|
|
|
|
#include "nsPIPluginInstancePeer.h"
|
|
|
|
#include "nsIDOMElement.h"
|
|
|
|
#include "nsIDOMDocument.h"
|
|
|
|
#include "nsPIDOMWindow.h"
|
|
|
|
#include "nsIDocument.h"
|
|
|
|
#include "nsIScriptGlobalObject.h"
|
|
|
|
#include "nsIScriptContext.h"
|
|
|
|
#include "nsDOMJSUtils.h"
|
2008-01-14 16:51:29 -08:00
|
|
|
#include "nsIPrincipal.h"
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
#include "jscntxt.h"
|
|
|
|
|
|
|
|
#include "nsIXPConnect.h"
|
|
|
|
|
2008-04-23 16:24:21 -07:00
|
|
|
#include "nsIObserverService.h"
|
|
|
|
#include <prinrval.h>
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
#ifdef XP_MACOSX
|
|
|
|
#include <Carbon/Carbon.h>
|
2007-03-22 10:30:00 -07:00
|
|
|
#endif
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
// needed for nppdf plugin
|
2007-03-22 10:30:00 -07:00
|
|
|
#ifdef MOZ_WIDGET_GTK2
|
|
|
|
#include <gdk/gdk.h>
|
|
|
|
#include <gdk/gdkx.h>
|
|
|
|
#include "gtk2xtbin.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "nsJSNPRuntime.h"
|
|
|
|
|
2007-07-11 16:25:45 -07:00
|
|
|
static PRLock *sPluginThreadAsyncCallLock = nsnull;
|
|
|
|
static PRCList sPendingAsyncCalls = PR_INIT_STATIC_CLIST(&sPendingAsyncCalls);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
// POST/GET stream type
|
|
|
|
enum eNPPStreamTypeInternal {
|
|
|
|
eNPPStreamTypeInternal_Get,
|
|
|
|
eNPPStreamTypeInternal_Post
|
|
|
|
};
|
|
|
|
|
|
|
|
static NS_DEFINE_IID(kCPluginManagerCID, NS_PLUGINMANAGER_CID);
|
|
|
|
static NS_DEFINE_IID(kPluginManagerCID, NS_PLUGINMANAGER_CID);
|
|
|
|
static NS_DEFINE_IID(kMemoryCID, NS_MEMORY_CID);
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
// Static stub functions that are exported to the 4.x plugin as entry
|
|
|
|
// points via the CALLBACKS variable.
|
2007-03-22 10:30:00 -07:00
|
|
|
PR_BEGIN_EXTERN_C
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_requestread(NPStream *pstream, NPByteRange *rangeList);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_geturlnotify(NPP npp, const char* relativeURL, const char* target,
|
|
|
|
void* notifyData);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_getvalue(NPP npp, NPNVariable variable, void *r_value);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_setvalue(NPP npp, NPPVariable variable, void *r_value);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_geturl(NPP npp, const char* relativeURL, const char* target);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_posturlnotify(NPP npp, const char* relativeURL, const char *target,
|
2008-09-11 08:10:26 -07:00
|
|
|
uint32_t len, const char *buf, NPBool file, void* notifyData);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static NPError NP_CALLBACK
|
2008-09-11 08:10:26 -07:00
|
|
|
_posturl(NPP npp, const char* relativeURL, const char *target, uint32_t len,
|
2007-03-22 10:30:00 -07:00
|
|
|
const char *buf, NPBool file);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_newstream(NPP npp, NPMIMEType type, const char* window, NPStream** pstream);
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
static int32_t NP_CALLBACK
|
|
|
|
_write(NPP npp, NPStream *pstream, int32_t len, void *buffer);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_destroystream(NPP npp, NPStream *pstream, NPError reason);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_status(NPP npp, const char *message);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_memfree (void *ptr);
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
static uint32_t NP_CALLBACK
|
|
|
|
_memflush(uint32_t size);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_reloadplugins(NPBool reloadPages);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_invalidaterect(NPP npp, NPRect *invalidRect);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_invalidateregion(NPP npp, NPRegion invalidRegion);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_forceredraw(NPP npp);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_pushpopupsenabledstate(NPP npp, NPBool enabled);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_poppopupsenabledstate(NPP npp);
|
|
|
|
|
2007-07-12 13:38:11 -07:00
|
|
|
typedef void(*PluginThreadCallback)(void *);
|
2007-07-11 16:25:45 -07:00
|
|
|
static void NP_CALLBACK
|
2007-07-12 13:38:11 -07:00
|
|
|
_pluginthreadasynccall(NPP instance, PluginThreadCallback func,
|
|
|
|
void *userData);
|
2007-07-11 16:25:45 -07:00
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static const char* NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_useragent(NPP npp);
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
static void* NP_CALLBACK
|
2008-09-11 08:10:26 -07:00
|
|
|
_memalloc (uint32_t size);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2008-07-11 14:28:12 -07:00
|
|
|
// Deprecated entry points for the old Java plugin.
|
|
|
|
static void* NP_CALLBACK /* OJI type: JRIEnv* */
|
2007-03-22 10:30:00 -07:00
|
|
|
_getJavaEnv(void);
|
2008-07-11 14:28:12 -07:00
|
|
|
static void* NP_CALLBACK /* OJI type: jref */
|
2007-03-22 10:30:00 -07:00
|
|
|
_getJavaPeer(NPP npp);
|
|
|
|
|
|
|
|
PR_END_EXTERN_C
|
|
|
|
|
|
|
|
#if defined(XP_MACOSX) && defined(__POWERPC__)
|
|
|
|
|
|
|
|
#define TV2FP(tvp) _TV2FP((void *)tvp)
|
|
|
|
|
|
|
|
static void*
|
|
|
|
_TV2FP(void *tvp)
|
|
|
|
{
|
2008-09-11 08:10:26 -07:00
|
|
|
static uint32_t glue[6] = {
|
2007-03-22 10:30:00 -07:00
|
|
|
0x3D800000, 0x618C0000, 0x800C0000, 0x804C0004, 0x7C0903A6, 0x4E800420
|
|
|
|
};
|
2008-09-11 08:10:26 -07:00
|
|
|
uint32_t* newGlue = NULL;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
if (tvp != NULL) {
|
2008-09-11 08:10:26 -07:00
|
|
|
newGlue = (uint32_t*) malloc(sizeof(glue));
|
2007-03-22 10:30:00 -07:00
|
|
|
if (newGlue != NULL) {
|
|
|
|
memcpy(newGlue, glue, sizeof(glue));
|
|
|
|
newGlue[0] |= ((UInt32)tvp >> 16);
|
|
|
|
newGlue[1] |= ((UInt32)tvp & 0xFFFF);
|
|
|
|
MakeDataExecutable(newGlue, sizeof(glue));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return newGlue;
|
|
|
|
}
|
|
|
|
|
|
|
|
#define FP2TV(fp) _FP2TV((void *)fp)
|
|
|
|
|
|
|
|
static void*
|
|
|
|
_FP2TV(void *fp)
|
|
|
|
{
|
|
|
|
void **newGlue = NULL;
|
|
|
|
if (fp != NULL) {
|
|
|
|
newGlue = (void**) malloc(2 * sizeof(void *));
|
|
|
|
if (newGlue != NULL) {
|
|
|
|
newGlue[0] = fp;
|
|
|
|
newGlue[1] = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return newGlue;
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
#define TV2FP(f) (f)
|
|
|
|
#define FP2TV(f) (f)
|
|
|
|
|
|
|
|
#endif /* XP_MACOSX && __POWERPC__ */
|
|
|
|
|
2008-04-23 16:32:50 -07:00
|
|
|
// This function sends a notification using the observer service to any object
|
|
|
|
// registered to listen to the "experimental-notify-plugin-call" subject.
|
|
|
|
// Each "experimental-notify-plugin-call" notification carries with it the run
|
|
|
|
// time value in milliseconds that the call took to execute.
|
2008-04-23 16:24:21 -07:00
|
|
|
void NS_NotifyPluginCall(PRIntervalTime startTime)
|
|
|
|
{
|
|
|
|
PRIntervalTime endTime = PR_IntervalNow() - startTime;
|
2008-04-23 16:32:50 -07:00
|
|
|
nsCOMPtr<nsIObserverService> notifyUIService =
|
|
|
|
do_GetService("@mozilla.org/observer-service;1");
|
2008-04-23 16:24:21 -07:00
|
|
|
float runTimeInSeconds = float(endTime) / PR_TicksPerSecond();
|
|
|
|
nsAutoString runTimeString;
|
|
|
|
runTimeString.AppendFloat(runTimeInSeconds);
|
|
|
|
const PRUnichar* runTime = runTimeString.get();
|
2008-04-23 16:32:50 -07:00
|
|
|
notifyUIService->NotifyObservers(nsnull, "experimental-notify-plugin-call",
|
|
|
|
runTime);
|
2008-04-23 16:24:21 -07:00
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
NPNetscapeFuncs ns4xPlugin::CALLBACKS;
|
|
|
|
|
|
|
|
void
|
|
|
|
ns4xPlugin::CheckClassInitialized(void)
|
|
|
|
{
|
|
|
|
static PRBool initialized = FALSE;
|
|
|
|
|
|
|
|
if (initialized)
|
|
|
|
return;
|
|
|
|
|
|
|
|
// XXX It'd be nice to make this const and initialize it statically...
|
|
|
|
CALLBACKS.size = sizeof(CALLBACKS);
|
|
|
|
CALLBACKS.version = (NP_VERSION_MAJOR << 8) + NP_VERSION_MINOR;
|
|
|
|
|
|
|
|
CALLBACKS.geturl =
|
|
|
|
NewNPN_GetURLProc(FP2TV(_geturl));
|
|
|
|
|
|
|
|
CALLBACKS.posturl =
|
|
|
|
NewNPN_PostURLProc(FP2TV(_posturl));
|
|
|
|
|
|
|
|
CALLBACKS.requestread =
|
|
|
|
NewNPN_RequestReadProc(FP2TV(_requestread));
|
|
|
|
|
|
|
|
CALLBACKS.newstream =
|
|
|
|
NewNPN_NewStreamProc(FP2TV(_newstream));
|
|
|
|
|
|
|
|
CALLBACKS.write =
|
|
|
|
NewNPN_WriteProc(FP2TV(_write));
|
|
|
|
|
|
|
|
CALLBACKS.destroystream =
|
|
|
|
NewNPN_DestroyStreamProc(FP2TV(_destroystream));
|
|
|
|
|
|
|
|
CALLBACKS.status =
|
|
|
|
NewNPN_StatusProc(FP2TV(_status));
|
|
|
|
|
|
|
|
CALLBACKS.uagent =
|
|
|
|
NewNPN_UserAgentProc(FP2TV(_useragent));
|
|
|
|
|
|
|
|
CALLBACKS.memalloc =
|
|
|
|
NewNPN_MemAllocProc(FP2TV(_memalloc));
|
|
|
|
|
|
|
|
CALLBACKS.memfree =
|
|
|
|
NewNPN_MemFreeProc(FP2TV(_memfree));
|
|
|
|
|
|
|
|
CALLBACKS.memflush =
|
|
|
|
NewNPN_MemFlushProc(FP2TV(_memflush));
|
|
|
|
|
|
|
|
CALLBACKS.reloadplugins =
|
|
|
|
NewNPN_ReloadPluginsProc(FP2TV(_reloadplugins));
|
|
|
|
|
2008-07-11 14:28:12 -07:00
|
|
|
// Deprecated API callbacks.
|
2007-03-22 10:30:00 -07:00
|
|
|
CALLBACKS.getJavaEnv =
|
|
|
|
NewNPN_GetJavaEnvProc(FP2TV(_getJavaEnv));
|
|
|
|
CALLBACKS.getJavaPeer =
|
|
|
|
NewNPN_GetJavaPeerProc(FP2TV(_getJavaPeer));
|
|
|
|
|
|
|
|
CALLBACKS.geturlnotify =
|
|
|
|
NewNPN_GetURLNotifyProc(FP2TV(_geturlnotify));
|
|
|
|
|
|
|
|
CALLBACKS.posturlnotify =
|
|
|
|
NewNPN_PostURLNotifyProc(FP2TV(_posturlnotify));
|
|
|
|
|
|
|
|
CALLBACKS.getvalue =
|
|
|
|
NewNPN_GetValueProc(FP2TV(_getvalue));
|
|
|
|
|
|
|
|
CALLBACKS.setvalue =
|
|
|
|
NewNPN_SetValueProc(FP2TV(_setvalue));
|
|
|
|
|
|
|
|
CALLBACKS.invalidaterect =
|
|
|
|
NewNPN_InvalidateRectProc(FP2TV(_invalidaterect));
|
|
|
|
|
|
|
|
CALLBACKS.invalidateregion =
|
|
|
|
NewNPN_InvalidateRegionProc(FP2TV(_invalidateregion));
|
|
|
|
|
|
|
|
CALLBACKS.forceredraw =
|
|
|
|
NewNPN_ForceRedrawProc(FP2TV(_forceredraw));
|
|
|
|
|
|
|
|
CALLBACKS.getstringidentifier =
|
|
|
|
NewNPN_GetStringIdentifierProc(FP2TV(_getstringidentifier));
|
|
|
|
|
|
|
|
CALLBACKS.getstringidentifiers =
|
|
|
|
NewNPN_GetStringIdentifiersProc(FP2TV(_getstringidentifiers));
|
|
|
|
|
|
|
|
CALLBACKS.getintidentifier =
|
|
|
|
NewNPN_GetIntIdentifierProc(FP2TV(_getintidentifier));
|
|
|
|
|
|
|
|
CALLBACKS.identifierisstring =
|
|
|
|
NewNPN_IdentifierIsStringProc(FP2TV(_identifierisstring));
|
|
|
|
|
|
|
|
CALLBACKS.utf8fromidentifier =
|
|
|
|
NewNPN_UTF8FromIdentifierProc(FP2TV(_utf8fromidentifier));
|
|
|
|
|
|
|
|
CALLBACKS.intfromidentifier =
|
|
|
|
NewNPN_IntFromIdentifierProc(FP2TV(_intfromidentifier));
|
|
|
|
|
|
|
|
CALLBACKS.createobject =
|
|
|
|
NewNPN_CreateObjectProc(FP2TV(_createobject));
|
|
|
|
|
|
|
|
CALLBACKS.retainobject =
|
|
|
|
NewNPN_RetainObjectProc(FP2TV(_retainobject));
|
|
|
|
|
|
|
|
CALLBACKS.releaseobject =
|
|
|
|
NewNPN_ReleaseObjectProc(FP2TV(_releaseobject));
|
|
|
|
|
|
|
|
CALLBACKS.invoke =
|
|
|
|
NewNPN_InvokeProc(FP2TV(_invoke));
|
|
|
|
|
|
|
|
CALLBACKS.invokeDefault =
|
|
|
|
NewNPN_InvokeDefaultProc(FP2TV(_invokeDefault));
|
|
|
|
|
|
|
|
CALLBACKS.evaluate =
|
|
|
|
NewNPN_EvaluateProc(FP2TV(_evaluate));
|
|
|
|
|
|
|
|
CALLBACKS.getproperty =
|
|
|
|
NewNPN_GetPropertyProc(FP2TV(_getproperty));
|
|
|
|
|
|
|
|
CALLBACKS.setproperty =
|
|
|
|
NewNPN_SetPropertyProc(FP2TV(_setproperty));
|
|
|
|
|
|
|
|
CALLBACKS.removeproperty =
|
|
|
|
NewNPN_RemovePropertyProc(FP2TV(_removeproperty));
|
|
|
|
|
|
|
|
CALLBACKS.hasproperty =
|
|
|
|
NewNPN_HasPropertyProc(FP2TV(_hasproperty));
|
|
|
|
|
|
|
|
CALLBACKS.hasmethod =
|
|
|
|
NewNPN_HasMethodProc(FP2TV(_hasmethod));
|
|
|
|
|
|
|
|
CALLBACKS.enumerate =
|
|
|
|
NewNPN_EnumerateProc(FP2TV(_enumerate));
|
|
|
|
|
2007-10-09 18:24:28 -07:00
|
|
|
CALLBACKS.construct =
|
|
|
|
NewNPN_ConstructProc(FP2TV(_construct));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
CALLBACKS.releasevariantvalue =
|
|
|
|
NewNPN_ReleaseVariantValueProc(FP2TV(_releasevariantvalue));
|
|
|
|
|
|
|
|
CALLBACKS.setexception =
|
|
|
|
NewNPN_SetExceptionProc(FP2TV(_setexception));
|
|
|
|
|
|
|
|
CALLBACKS.pushpopupsenabledstate =
|
|
|
|
NewNPN_PushPopupsEnabledStateProc(FP2TV(_pushpopupsenabledstate));
|
|
|
|
|
|
|
|
CALLBACKS.poppopupsenabledstate =
|
|
|
|
NewNPN_PopPopupsEnabledStateProc(FP2TV(_poppopupsenabledstate));
|
|
|
|
|
2007-07-11 16:25:45 -07:00
|
|
|
CALLBACKS.pluginthreadasynccall =
|
|
|
|
NewNPN_PluginThreadAsyncCallProc(FP2TV(_pluginthreadasynccall));
|
|
|
|
|
|
|
|
if (!sPluginThreadAsyncCallLock) {
|
|
|
|
sPluginThreadAsyncCallLock =
|
|
|
|
nsAutoLock::NewLock("sPluginThreadAsyncCallLock");
|
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
initialized = TRUE;
|
|
|
|
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,("NPN callbacks initialized\n"));
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMPL_ISUPPORTS2(ns4xPlugin, nsIPlugin, nsIFactory)
|
|
|
|
|
|
|
|
ns4xPlugin::ns4xPlugin(NPPluginFuncs* callbacks, PRLibrary* aLibrary,
|
2008-09-11 08:10:26 -07:00
|
|
|
NP_PLUGINSHUTDOWN aShutdown)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
|
|
|
memset((void*) &fCallbacks, 0, sizeof(fCallbacks));
|
|
|
|
fLibrary = nsnull;
|
|
|
|
|
|
|
|
#if defined(XP_WIN) || defined(XP_OS2)
|
|
|
|
// On Windows (and Mac) we need to keep a direct reference to the
|
|
|
|
// fCallbacks and NOT just copy the struct. See Bugzilla 85334
|
|
|
|
|
|
|
|
NP_GETENTRYPOINTS pfnGetEntryPoints =
|
|
|
|
(NP_GETENTRYPOINTS)PR_FindSymbol(aLibrary, "NP_GetEntryPoints");
|
|
|
|
|
|
|
|
if (!pfnGetEntryPoints)
|
|
|
|
return;
|
|
|
|
|
|
|
|
fCallbacks.size = sizeof(fCallbacks);
|
|
|
|
|
|
|
|
nsresult result = pfnGetEntryPoints(&fCallbacks);
|
|
|
|
NS_ASSERTION(result == NS_OK, "Failed to get callbacks");
|
|
|
|
|
|
|
|
NS_ASSERTION(HIBYTE(fCallbacks.version) >= NP_VERSION_MAJOR,
|
|
|
|
"callback version is less than NP version");
|
|
|
|
|
|
|
|
fShutdownEntry = (NP_PLUGINSHUTDOWN)PR_FindSymbol(aLibrary, "NP_Shutdown");
|
|
|
|
#elif defined(XP_MACOSX)
|
|
|
|
NPPluginFuncs np_callbacks;
|
|
|
|
memset((void*) &np_callbacks, 0, sizeof(np_callbacks));
|
|
|
|
np_callbacks.size = sizeof(np_callbacks);
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
/* Since WebKit supports getting function pointers via NP_GetEntryPoints and
|
|
|
|
* sending function pointers via NP_Initialize, it would be nice if we
|
|
|
|
* supported that too. We can't do it on PPC because there is no standard for
|
|
|
|
* whether or not function pointers returned via NP_GetEntryPoints or sent
|
|
|
|
* via NP_Initialize are supposed to be wrapped with tvector glue. However,
|
|
|
|
* since there are no tvectors on Intel we can do it on that arch.
|
|
|
|
*/
|
|
|
|
#ifndef __POWERPC__
|
2007-03-22 10:30:00 -07:00
|
|
|
fShutdownEntry = (NP_PLUGINSHUTDOWN)PR_FindSymbol(aLibrary, "NP_Shutdown");
|
|
|
|
NP_GETENTRYPOINTS pfnGetEntryPoints = (NP_GETENTRYPOINTS)PR_FindSymbol(aLibrary, "NP_GetEntryPoints");
|
|
|
|
NP_PLUGININIT pfnInitialize = (NP_PLUGININIT)PR_FindSymbol(aLibrary, "NP_Initialize");
|
2008-09-11 08:10:26 -07:00
|
|
|
if (pfnGetEntryPoints && pfnInitialize && fShutdownEntry) {
|
2007-03-22 10:30:00 -07:00
|
|
|
// we call NP_Initialize before getting function pointers to match
|
|
|
|
// WebKit's behavior. They implemented this first on Mac OS X.
|
|
|
|
if (pfnInitialize(&(ns4xPlugin::CALLBACKS)) != NPERR_NO_ERROR)
|
|
|
|
return;
|
|
|
|
if (pfnGetEntryPoints(&np_callbacks) != NPERR_NO_ERROR)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
// call into the entry point
|
|
|
|
NP_MAIN pfnMain = (NP_MAIN)PR_FindSymbol(aLibrary, "main");
|
|
|
|
|
|
|
|
if (pfnMain == NULL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
NPError error;
|
|
|
|
NPP_ShutdownUPP pfnMainShutdown;
|
|
|
|
NS_TRY_SAFE_CALL_RETURN(error,
|
|
|
|
CallNPP_MainEntryProc(pfnMain,
|
|
|
|
&(ns4xPlugin::CALLBACKS),
|
|
|
|
&np_callbacks,
|
|
|
|
&pfnMainShutdown),
|
|
|
|
aLibrary,
|
|
|
|
nsnull);
|
|
|
|
|
|
|
|
NPP_PLUGIN_LOG(PLUGIN_LOG_BASIC,
|
|
|
|
("NPP MainEntryProc called: return=%d\n",error));
|
|
|
|
|
|
|
|
if (error != NPERR_NO_ERROR)
|
|
|
|
return;
|
|
|
|
|
|
|
|
fShutdownEntry = (NP_PLUGINSHUTDOWN)TV2FP(pfnMainShutdown);
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
// version is a uint16_t so cast to int to avoid an invalid
|
2007-03-22 10:30:00 -07:00
|
|
|
// comparison due to limited range of the data type
|
|
|
|
int cb_version = np_callbacks.version;
|
|
|
|
if ((cb_version >> 8) < NP_VERSION_MAJOR)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// wrap all plugin entry points tvectors as mach-o callable function
|
|
|
|
// pointers.
|
|
|
|
fCallbacks.size = sizeof(fCallbacks);
|
|
|
|
fCallbacks.version = np_callbacks.version;
|
|
|
|
fCallbacks.newp = (NPP_NewUPP) TV2FP(np_callbacks.newp);
|
|
|
|
fCallbacks.destroy = (NPP_DestroyUPP) TV2FP(np_callbacks.destroy);
|
|
|
|
fCallbacks.setwindow = (NPP_SetWindowUPP) TV2FP(np_callbacks.setwindow);
|
|
|
|
fCallbacks.newstream = (NPP_NewStreamUPP) TV2FP(np_callbacks.newstream);
|
|
|
|
fCallbacks.destroystream =
|
|
|
|
(NPP_DestroyStreamUPP) TV2FP(np_callbacks.destroystream);
|
|
|
|
fCallbacks.asfile = (NPP_StreamAsFileUPP) TV2FP(np_callbacks.asfile);
|
|
|
|
fCallbacks.writeready = (NPP_WriteReadyUPP) TV2FP(np_callbacks.writeready);
|
|
|
|
fCallbacks.write = (NPP_WriteUPP) TV2FP(np_callbacks.write);
|
|
|
|
fCallbacks.print = (NPP_PrintUPP) TV2FP(np_callbacks.print);
|
|
|
|
fCallbacks.event = (NPP_HandleEventUPP) TV2FP(np_callbacks.event);
|
|
|
|
fCallbacks.urlnotify = (NPP_URLNotifyUPP) TV2FP(np_callbacks.urlnotify);
|
|
|
|
fCallbacks.getvalue = (NPP_GetValueUPP) TV2FP(np_callbacks.getvalue);
|
|
|
|
fCallbacks.setvalue = (NPP_SetValueUPP) TV2FP(np_callbacks.setvalue);
|
|
|
|
#else // for everyone else
|
|
|
|
memcpy((void*) &fCallbacks, (void*) callbacks, sizeof(fCallbacks));
|
|
|
|
fShutdownEntry = aShutdown;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
fLibrary = aLibrary;
|
|
|
|
}
|
|
|
|
|
|
|
|
ns4xPlugin::~ns4xPlugin(void)
|
|
|
|
{
|
2008-09-11 08:10:26 -07:00
|
|
|
// reset the callbacks list
|
2007-03-22 10:30:00 -07:00
|
|
|
#if defined(XP_MACOSX) && defined(__POWERPC__)
|
|
|
|
// release all wrapped plugin entry points.
|
|
|
|
if (fCallbacks.newp)
|
|
|
|
free((void *)fCallbacks.newp);
|
|
|
|
if (fCallbacks.destroy)
|
|
|
|
free((void *)fCallbacks.destroy);
|
|
|
|
if (fCallbacks.setwindow)
|
|
|
|
free((void *)fCallbacks.setwindow);
|
|
|
|
if (fCallbacks.newstream)
|
|
|
|
free((void *)fCallbacks.newstream);
|
|
|
|
if (fCallbacks.asfile)
|
|
|
|
free((void *)fCallbacks.asfile);
|
|
|
|
if (fCallbacks.writeready)
|
|
|
|
free((void *)fCallbacks.writeready);
|
|
|
|
if (fCallbacks.write)
|
|
|
|
free((void *)fCallbacks.write);
|
|
|
|
if (fCallbacks.print)
|
|
|
|
free((void *)fCallbacks.print);
|
|
|
|
if (fCallbacks.event)
|
|
|
|
free((void *)fCallbacks.event);
|
|
|
|
if (fCallbacks.urlnotify)
|
|
|
|
free((void *)fCallbacks.urlnotify);
|
|
|
|
if (fCallbacks.getvalue)
|
|
|
|
free((void *)fCallbacks.getvalue);
|
|
|
|
if (fCallbacks.setvalue)
|
|
|
|
free((void *)fCallbacks.setvalue);
|
|
|
|
#endif
|
|
|
|
memset((void*) &fCallbacks, 0, sizeof(fCallbacks));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(XP_MACOSX)
|
|
|
|
void
|
|
|
|
ns4xPlugin::SetPluginRefNum(short aRefNum)
|
|
|
|
{
|
|
|
|
fPluginRefNum = aRefNum;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
// Creates the ns4xPlugin object. One ns4xPlugin object exists per Plugin (not instance).
|
2007-03-22 10:30:00 -07:00
|
|
|
nsresult
|
2008-09-11 08:10:26 -07:00
|
|
|
ns4xPlugin::CreatePlugin(const char* aFileName, const char* aFullPath,
|
2007-03-22 10:30:00 -07:00
|
|
|
PRLibrary* aLibrary, nsIPlugin** aResult)
|
|
|
|
{
|
|
|
|
CheckClassInitialized();
|
|
|
|
|
|
|
|
#if defined(XP_UNIX) && !defined(XP_MACOSX)
|
|
|
|
ns4xPlugin *plptr;
|
|
|
|
|
|
|
|
NPPluginFuncs callbacks;
|
|
|
|
memset((void*) &callbacks, 0, sizeof(callbacks));
|
|
|
|
callbacks.size = sizeof(callbacks);
|
|
|
|
|
|
|
|
NP_PLUGINSHUTDOWN pfnShutdown =
|
2007-07-17 13:02:43 -07:00
|
|
|
(NP_PLUGINSHUTDOWN)PR_FindFunctionSymbol(aLibrary, "NP_Shutdown");
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
// create the new plugin handler
|
|
|
|
*aResult = plptr =
|
2008-09-11 08:10:26 -07:00
|
|
|
new ns4xPlugin(&callbacks, aLibrary, pfnShutdown);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
if (*aResult == NULL)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
|
|
|
|
NS_ADDREF(*aResult);
|
|
|
|
|
|
|
|
if (!aFileName) //do not call NP_Initialize in this case, bug 74938
|
|
|
|
return NS_OK;
|
|
|
|
|
|
|
|
// we must init here because the plugin may call NPN functions
|
|
|
|
// when we call into the NP_Initialize entry point - NPN functions
|
|
|
|
// require that mBrowserManager be set up
|
|
|
|
plptr->Initialize();
|
|
|
|
|
|
|
|
NP_PLUGINUNIXINIT pfnInitialize =
|
2007-07-17 13:02:43 -07:00
|
|
|
(NP_PLUGINUNIXINIT)PR_FindFunctionSymbol(aLibrary, "NP_Initialize");
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
if (pfnInitialize == NULL)
|
|
|
|
return NS_ERROR_UNEXPECTED; // XXX Right error?
|
|
|
|
|
|
|
|
if (pfnInitialize(&(ns4xPlugin::CALLBACKS),&callbacks) != NS_OK)
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
|
|
|
|
// now copy function table back to ns4xPlugin instance
|
|
|
|
memcpy((void*) &(plptr->fCallbacks), (void*)&callbacks, sizeof(callbacks));
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef XP_WIN
|
|
|
|
// Note: on Windows, we must use the fCallback because plugins may
|
|
|
|
// change the function table. The Shockwave installer makes changes
|
|
|
|
// in the table while running
|
2008-09-11 08:10:26 -07:00
|
|
|
*aResult = new ns4xPlugin(nsnull, aLibrary, nsnull);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
if (*aResult == NULL)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
|
|
|
|
NS_ADDREF(*aResult);
|
|
|
|
|
|
|
|
// we must init here because the plugin may call NPN functions
|
|
|
|
// when we call into the NP_Initialize entry point - NPN functions
|
|
|
|
// require that mBrowserManager be set up
|
|
|
|
if (NS_FAILED((*aResult)->Initialize())) {
|
|
|
|
NS_RELEASE(*aResult);
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NP_PLUGININIT pfnInitialize =
|
|
|
|
(NP_PLUGININIT)PR_FindSymbol(aLibrary, "NP_Initialize");
|
|
|
|
|
|
|
|
if (pfnInitialize == NULL)
|
2008-09-11 08:10:26 -07:00
|
|
|
return NS_ERROR_UNEXPECTED;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
if (pfnInitialize(&(ns4xPlugin::CALLBACKS)) != NS_OK)
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef XP_OS2
|
|
|
|
// create the new plugin handler
|
2008-09-11 08:10:26 -07:00
|
|
|
*aResult = new ns4xPlugin(nsnull, aLibrary, nsnull);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
if (*aResult == NULL)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
|
|
|
|
NS_ADDREF(*aResult);
|
|
|
|
|
|
|
|
// we must init here because the plugin may call NPN functions
|
|
|
|
// when we call into the NP_Initialize entry point - NPN functions
|
|
|
|
// require that mBrowserManager be set up
|
|
|
|
if (NS_FAILED((*aResult)->Initialize())) {
|
|
|
|
NS_RELEASE(*aResult);
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NP_PLUGININIT pfnInitialize =
|
|
|
|
(NP_PLUGININIT)PR_FindSymbol(aLibrary, "NP_Initialize");
|
|
|
|
|
|
|
|
if (pfnInitialize == NULL)
|
|
|
|
return NS_ERROR_UNEXPECTED; // XXX Right error?
|
|
|
|
|
|
|
|
// Fixes problem where the OS/2 native multimedia plugins weren't
|
|
|
|
// working on mozilla though did work on 4.x. Problem is that they
|
|
|
|
// expect the current working directory to be the plugins dir.
|
|
|
|
// Since these plugins are no longer maintained and they represent
|
|
|
|
// the majority of the OS/2 plugin contingency, we'll have to make
|
|
|
|
// them work here.
|
|
|
|
|
|
|
|
#define MAP_DISKNUM_TO_LETTER(n) ('A' + (n - 1))
|
|
|
|
#define MAP_LETTER_TO_DISKNUM(c) (toupper(c)-'A'+1)
|
|
|
|
|
|
|
|
unsigned long origDiskNum, pluginDiskNum, logicalDisk;
|
|
|
|
|
|
|
|
char pluginPath[CCHMAXPATH], origPath[CCHMAXPATH];
|
|
|
|
strcpy(pluginPath, aFileName);
|
|
|
|
char* slash = strrchr(pluginPath, '\\');
|
|
|
|
*slash = '\0';
|
|
|
|
|
|
|
|
DosQueryCurrentDisk( &origDiskNum, &logicalDisk );
|
|
|
|
pluginDiskNum = MAP_LETTER_TO_DISKNUM(pluginPath[0]);
|
|
|
|
|
|
|
|
origPath[0] = MAP_DISKNUM_TO_LETTER(origDiskNum);
|
|
|
|
origPath[1] = ':';
|
|
|
|
origPath[2] = '\\';
|
|
|
|
|
|
|
|
ULONG len = CCHMAXPATH-3;
|
|
|
|
APIRET rc = DosQueryCurrentDir(0, &origPath[3], &len);
|
|
|
|
NS_ASSERTION(NO_ERROR == rc,"DosQueryCurrentDir failed");
|
|
|
|
|
|
|
|
BOOL bChangedDir = FALSE;
|
|
|
|
BOOL bChangedDisk = FALSE;
|
|
|
|
if (pluginDiskNum != origDiskNum) {
|
|
|
|
rc = DosSetDefaultDisk(pluginDiskNum);
|
|
|
|
NS_ASSERTION(NO_ERROR == rc,"DosSetDefaultDisk failed");
|
|
|
|
bChangedDisk = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (stricmp(origPath, pluginPath) != 0) {
|
|
|
|
rc = DosSetCurrentDir(pluginPath);
|
|
|
|
NS_ASSERTION(NO_ERROR == rc,"DosSetCurrentDir failed");
|
|
|
|
bChangedDir = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult rv = pfnInitialize(&(ns4xPlugin::CALLBACKS));
|
|
|
|
|
|
|
|
if (bChangedDisk) {
|
|
|
|
rc= DosSetDefaultDisk(origDiskNum);
|
|
|
|
NS_ASSERTION(NO_ERROR == rc,"DosSetDefaultDisk failed");
|
|
|
|
}
|
|
|
|
if (bChangedDir) {
|
|
|
|
rc = DosSetCurrentDir(origPath);
|
|
|
|
NS_ASSERTION(NO_ERROR == rc,"DosSetCurrentDir failed");
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!NS_SUCCEEDED(rv)) {
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(XP_MACOSX)
|
|
|
|
short appRefNum = ::CurResFile();
|
|
|
|
short pluginRefNum;
|
|
|
|
|
|
|
|
nsCOMPtr<nsILocalFile> pluginPath;
|
|
|
|
NS_NewNativeLocalFile(nsDependentCString(aFullPath), PR_TRUE,
|
|
|
|
getter_AddRefs(pluginPath));
|
|
|
|
|
|
|
|
nsPluginFile pluginFile(pluginPath);
|
|
|
|
pluginRefNum = pluginFile.OpenPluginResource();
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
ns4xPlugin* plugin = new ns4xPlugin(nsnull, aLibrary, nsnull);
|
2008-08-19 21:23:19 -07:00
|
|
|
::UseResFile(appRefNum);
|
|
|
|
if (!plugin)
|
2007-03-22 10:30:00 -07:00
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
|
|
|
|
*aResult = plugin;
|
|
|
|
|
|
|
|
NS_ADDREF(*aResult);
|
|
|
|
if (NS_FAILED((*aResult)->Initialize())) {
|
|
|
|
NS_RELEASE(*aResult);
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
plugin->SetPluginRefNum(pluginRefNum);
|
2008-09-11 08:10:26 -07:00
|
|
|
#endif
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
#ifdef XP_BEOS
|
|
|
|
// I just copied UNIX version.
|
|
|
|
// Makoto Hamanaka <VYA04230@nifty.com>
|
|
|
|
|
|
|
|
ns4xPlugin *plptr;
|
|
|
|
|
|
|
|
NPPluginFuncs callbacks;
|
|
|
|
memset((void*) &callbacks, 0, sizeof(callbacks));
|
|
|
|
callbacks.size = sizeof(callbacks);
|
|
|
|
|
|
|
|
NP_PLUGINSHUTDOWN pfnShutdown =
|
|
|
|
(NP_PLUGINSHUTDOWN)PR_FindSymbol(aLibrary, "NP_Shutdown");
|
|
|
|
|
|
|
|
// create the new plugin handler
|
|
|
|
*aResult = plptr =
|
2008-09-11 08:10:26 -07:00
|
|
|
new ns4xPlugin(&callbacks, aLibrary, pfnShutdown);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
if (*aResult == NULL)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
|
|
|
|
NS_ADDREF(*aResult);
|
|
|
|
|
|
|
|
// we must init here because the plugin may call NPN functions
|
|
|
|
// when we call into the NP_Initialize entry point - NPN functions
|
|
|
|
// require that mBrowserManager be set up
|
|
|
|
plptr->Initialize();
|
|
|
|
|
|
|
|
NP_PLUGINUNIXINIT pfnInitialize =
|
|
|
|
(NP_PLUGINUNIXINIT)PR_FindSymbol(aLibrary, "NP_Initialize");
|
|
|
|
|
|
|
|
if (pfnInitialize == NULL)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
if (pfnInitialize(&(ns4xPlugin::CALLBACKS),&callbacks) != NS_OK)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
// now copy function table back to ns4xPlugin instance
|
|
|
|
memcpy((void*) &(plptr->fCallbacks), (void*)&callbacks, sizeof(callbacks));
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ns4xPlugin::CreateInstance(nsISupports *aOuter, const nsIID &aIID,
|
|
|
|
void **aResult)
|
|
|
|
{
|
|
|
|
if (aResult == NULL)
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
|
|
|
|
*aResult = NULL;
|
|
|
|
|
|
|
|
// XXX This is suspicuous!
|
|
|
|
nsRefPtr<ns4xPluginInstance> inst =
|
|
|
|
new ns4xPluginInstance(&fCallbacks, fLibrary);
|
|
|
|
|
|
|
|
if (!inst)
|
|
|
|
return NS_ERROR_OUT_OF_MEMORY;
|
|
|
|
|
|
|
|
return inst->QueryInterface(aIID, aResult);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ns4xPlugin::LockFactory(PRBool aLock)
|
|
|
|
{
|
|
|
|
// Not implemented in simplest case.
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_METHOD
|
|
|
|
ns4xPlugin::CreatePluginInstance(nsISupports *aOuter, REFNSIID aIID,
|
|
|
|
const char *aPluginMIMEType, void **aResult)
|
|
|
|
{
|
|
|
|
return CreateInstance(aOuter, aIID, aResult);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ns4xPlugin::Initialize(void)
|
|
|
|
{
|
|
|
|
if (nsnull == fLibrary)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ns4xPlugin::Shutdown(void)
|
|
|
|
{
|
|
|
|
NPP_PLUGIN_LOG(PLUGIN_LOG_BASIC,
|
|
|
|
("NPP Shutdown to be called: this=%p\n", this));
|
|
|
|
|
|
|
|
if (fShutdownEntry != nsnull) {
|
|
|
|
#if defined(XP_MACOSX)
|
|
|
|
CallNPP_ShutdownProc(fShutdownEntry);
|
2008-08-19 21:23:19 -07:00
|
|
|
if (fPluginRefNum > 0)
|
|
|
|
::CloseResFile(fPluginRefNum);
|
2007-03-22 10:30:00 -07:00
|
|
|
#else
|
|
|
|
NS_TRY_SAFE_CALL_VOID(fShutdownEntry(), fLibrary, nsnull);
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(XP_MACOSX) && defined(__POWERPC__)
|
|
|
|
// release the wrapped plugin function.
|
|
|
|
free((void *)fShutdownEntry);
|
|
|
|
#endif
|
|
|
|
fShutdownEntry = nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("4xPlugin Shutdown done, this=%p", this));
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ns4xPlugin::GetMIMEDescription(const char* *resultingDesc)
|
|
|
|
{
|
|
|
|
const char* (*npGetMIMEDescription)() =
|
2007-07-17 13:02:43 -07:00
|
|
|
(const char* (*)()) PR_FindFunctionSymbol(fLibrary, "NP_GetMIMEDescription");
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
*resultingDesc = npGetMIMEDescription ? npGetMIMEDescription() : "";
|
|
|
|
|
|
|
|
PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("ns4xPlugin::GetMIMEDescription called: this=%p, result=%s\n",
|
|
|
|
this, *resultingDesc));
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
ns4xPlugin::GetValue(nsPluginVariable variable, void *value)
|
|
|
|
{
|
|
|
|
PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("ns4xPlugin::GetValue called: this=%p, variable=%d\n", this, variable));
|
|
|
|
|
|
|
|
NPError (*npGetValue)(void*, nsPluginVariable, void*) =
|
2007-07-17 13:02:43 -07:00
|
|
|
(NPError (*)(void*, nsPluginVariable, void*)) PR_FindFunctionSymbol(fLibrary,
|
2007-03-22 10:30:00 -07:00
|
|
|
"NP_GetValue");
|
|
|
|
|
|
|
|
if (npGetValue && NPERR_NO_ERROR == npGetValue(nsnull, variable, value)) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create a new NPP GET or POST (given in the type argument) url
|
|
|
|
// stream that may have a notify callback
|
|
|
|
NPError
|
|
|
|
MakeNew4xStreamInternal(NPP npp, const char *relativeURL, const char *target,
|
|
|
|
eNPPStreamTypeInternal type,
|
|
|
|
PRBool bDoNotify = PR_FALSE,
|
2008-09-11 08:10:26 -07:00
|
|
|
void *notifyData = nsnull, uint32_t len = 0,
|
2007-03-22 10:30:00 -07:00
|
|
|
const char *buf = nsnull, NPBool file = PR_FALSE)
|
|
|
|
{
|
|
|
|
if (!npp)
|
|
|
|
return NPERR_INVALID_INSTANCE_ERROR;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsIPluginInstance *inst = (nsIPluginInstance *) npp->ndata;
|
|
|
|
|
|
|
|
NS_ASSERTION(inst != NULL, "null instance");
|
|
|
|
if (inst == NULL)
|
|
|
|
return NPERR_INVALID_INSTANCE_ERROR;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPluginManager> pm = do_GetService(kPluginManagerCID);
|
|
|
|
NS_ASSERTION(pm, "failed to get plugin manager");
|
|
|
|
if (!pm) return NPERR_GENERIC_ERROR;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPluginStreamListener> listener;
|
|
|
|
if (target == nsnull)
|
|
|
|
((ns4xPluginInstance*)inst)->NewNotifyStream(getter_AddRefs(listener),
|
|
|
|
notifyData,
|
|
|
|
bDoNotify, relativeURL);
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
case eNPPStreamTypeInternal_Get:
|
|
|
|
{
|
|
|
|
if (NS_FAILED(pm->GetURL(inst, relativeURL, target, listener)))
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case eNPPStreamTypeInternal_Post:
|
|
|
|
{
|
|
|
|
if (NS_FAILED(pm->PostURL(inst, relativeURL, len, buf, file, target,
|
|
|
|
listener)))
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
NS_ASSERTION(0, "how'd I get here");
|
|
|
|
}
|
|
|
|
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
//
|
|
|
|
// Static callbacks that get routed back through the new C++ API
|
|
|
|
//
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_geturl(NPP npp, const char* relativeURL, const char* target)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_geturl called from the wrong thread\n"));
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_GetURL: npp=%p, target=%s, url=%s\n", (void *)npp, target,
|
|
|
|
relativeURL));
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
// Block Adobe Acrobat from loading URLs that are not http:, https:,
|
|
|
|
// or ftp: URLs if the given target is null.
|
|
|
|
if (target == nsnull && relativeURL &&
|
|
|
|
(strncmp(relativeURL, "http:", 5) != 0) &&
|
|
|
|
(strncmp(relativeURL, "https:", 6) != 0) &&
|
|
|
|
(strncmp(relativeURL, "ftp:", 4) != 0)) {
|
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *) npp->ndata;
|
|
|
|
|
|
|
|
const char *name = nsPluginHostImpl::GetPluginName(inst);
|
|
|
|
|
|
|
|
if (name && strstr(name, "Adobe") && strstr(name, "Acrobat")) {
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return MakeNew4xStreamInternal (npp, relativeURL, target,
|
|
|
|
eNPPStreamTypeInternal_Get);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_geturlnotify(NPP npp, const char* relativeURL, const char* target,
|
|
|
|
void* notifyData)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_geturlnotify called from the wrong thread\n"));
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_GetURLNotify: npp=%p, target=%s, notify=%p, url=%s\n", (void*)npp,
|
|
|
|
target, notifyData, relativeURL));
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return MakeNew4xStreamInternal (npp, relativeURL, target,
|
|
|
|
eNPPStreamTypeInternal_Get, PR_TRUE,
|
|
|
|
notifyData);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_posturlnotify(NPP npp, const char *relativeURL, const char *target,
|
2008-09-11 08:10:26 -07:00
|
|
|
uint32_t len, const char *buf, NPBool file, void *notifyData)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_posturlnotify called from the wrong thread\n"));
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_PostURLNotify: npp=%p, target=%s, len=%d, file=%d, "
|
|
|
|
"notify=%p, url=%s, buf=%s\n",
|
|
|
|
(void*)npp, target, len, file, notifyData, relativeURL,
|
|
|
|
buf));
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return MakeNew4xStreamInternal(npp, relativeURL, target,
|
|
|
|
eNPPStreamTypeInternal_Post, PR_TRUE,
|
|
|
|
notifyData, len, buf, file);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_posturl(NPP npp, const char *relativeURL, const char *target,
|
2008-09-11 08:10:26 -07:00
|
|
|
uint32_t len, const char *buf, NPBool file)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_posturl called from the wrong thread\n"));
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_PostURL: npp=%p, target=%s, file=%d, len=%d, url=%s, "
|
|
|
|
"buf=%s\n",
|
|
|
|
(void*)npp, target, file, len, relativeURL, buf));
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
|
|
|
return MakeNew4xStreamInternal(npp, relativeURL, target,
|
|
|
|
eNPPStreamTypeInternal_Post, PR_FALSE, nsnull,
|
|
|
|
len, buf, file);
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// A little helper class used to wrap up plugin manager streams (that is,
|
|
|
|
// streams from the plugin to the browser).
|
|
|
|
class ns4xStreamWrapper : nsISupports
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
|
|
|
|
protected:
|
|
|
|
nsIOutputStream *fStream;
|
|
|
|
NPStream fNPStream;
|
|
|
|
|
|
|
|
public:
|
|
|
|
ns4xStreamWrapper(nsIOutputStream* stream);
|
|
|
|
~ns4xStreamWrapper();
|
|
|
|
|
|
|
|
void GetStream(nsIOutputStream* &result);
|
2007-04-23 07:21:53 -07:00
|
|
|
NPStream* GetNPStream(void) { return &fNPStream; }
|
2007-03-22 10:30:00 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
NS_IMPL_ISUPPORTS1(ns4xStreamWrapper, nsISupports)
|
|
|
|
|
|
|
|
ns4xStreamWrapper::ns4xStreamWrapper(nsIOutputStream* stream)
|
|
|
|
: fStream(stream)
|
|
|
|
{
|
|
|
|
NS_ASSERTION(stream != NULL, "bad stream");
|
|
|
|
|
|
|
|
fStream = stream;
|
|
|
|
NS_ADDREF(fStream);
|
|
|
|
|
|
|
|
memset(&fNPStream, 0, sizeof(fNPStream));
|
|
|
|
fNPStream.ndata = (void*) this;
|
|
|
|
}
|
|
|
|
|
|
|
|
ns4xStreamWrapper::~ns4xStreamWrapper(void)
|
|
|
|
{
|
|
|
|
fStream->Close();
|
|
|
|
NS_IF_RELEASE(fStream);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ns4xStreamWrapper::GetStream(nsIOutputStream* &result)
|
|
|
|
{
|
|
|
|
result = fStream;
|
|
|
|
NS_IF_ADDREF(fStream);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_newstream(NPP npp, NPMIMEType type, const char* target, NPStream* *result)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_newstream called from the wrong thread\n"));
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_NewStream: npp=%p, type=%s, target=%s\n", (void*)npp,
|
|
|
|
(const char *)type, target));
|
|
|
|
|
|
|
|
NPError err = NPERR_INVALID_INSTANCE_ERROR;
|
|
|
|
if (npp && npp->ndata) {
|
|
|
|
nsIPluginInstance *inst = (nsIPluginInstance *) npp->ndata;
|
2008-02-28 18:06:00 -08:00
|
|
|
|
|
|
|
PluginDestructionGuard guard(inst);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIOutputStream> stream;
|
|
|
|
nsCOMPtr<nsIPluginInstancePeer> peer;
|
|
|
|
if (NS_SUCCEEDED(inst->GetPeer(getter_AddRefs(peer))) &&
|
|
|
|
peer &&
|
|
|
|
NS_SUCCEEDED(peer->NewStream((const char*) type, target,
|
|
|
|
getter_AddRefs(stream)))) {
|
|
|
|
ns4xStreamWrapper* wrapper = new ns4xStreamWrapper(stream);
|
|
|
|
if (wrapper) {
|
|
|
|
(*result) = wrapper->GetNPStream();
|
|
|
|
err = NPERR_NO_ERROR;
|
|
|
|
} else {
|
|
|
|
err = NPERR_OUT_OF_MEMORY_ERROR;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
err = NPERR_GENERIC_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return err;
|
|
|
|
}
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
int32_t NP_CALLBACK
|
|
|
|
_write(NPP npp, NPStream *pstream, int32_t len, void *buffer)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_write called from the wrong thread\n"));
|
|
|
|
return 0;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_Write: npp=%p, url=%s, len=%d, buffer=%s\n", (void*)npp,
|
|
|
|
pstream->url, len, (char*)buffer));
|
|
|
|
|
|
|
|
// negative return indicates failure to the plugin
|
|
|
|
if (!npp)
|
|
|
|
return -1;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
ns4xStreamWrapper* wrapper = (ns4xStreamWrapper*) pstream->ndata;
|
|
|
|
NS_ASSERTION(wrapper != NULL, "null stream");
|
|
|
|
|
|
|
|
if (wrapper == NULL)
|
|
|
|
return -1;
|
|
|
|
|
|
|
|
nsIOutputStream* stream;
|
|
|
|
wrapper->GetStream(stream);
|
|
|
|
|
|
|
|
PRUint32 count = 0;
|
|
|
|
nsresult rv = stream->Write((char *)buffer, len, &count);
|
|
|
|
NS_RELEASE(stream);
|
|
|
|
|
|
|
|
if (rv != NS_OK)
|
|
|
|
return -1;
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
return (int32_t)count;
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_destroystream(NPP npp, NPStream *pstream, NPError reason)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_write called from the wrong thread\n"));
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_DestroyStream: npp=%p, url=%s, reason=%d\n", (void*)npp,
|
|
|
|
pstream->url, (int)reason));
|
|
|
|
|
|
|
|
if (!npp)
|
|
|
|
return NPERR_INVALID_INSTANCE_ERROR;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIPluginStreamListener> listener =
|
|
|
|
do_QueryInterface((nsISupports *)pstream->ndata);
|
|
|
|
|
|
|
|
// DestroyStream can kill two kinds of streams: NPP derived and NPN derived.
|
|
|
|
// check to see if they're trying to kill a NPP stream
|
|
|
|
if (listener) {
|
|
|
|
// Tell the stream listner that the stream is now gone.
|
|
|
|
listener->OnStopBinding(nsnull, NS_BINDING_ABORTED);
|
|
|
|
|
|
|
|
// FIXME: http://bugzilla.mozilla.org/show_bug.cgi?id=240131
|
|
|
|
//
|
|
|
|
// Is it ok to leave pstream->ndata set here, and who releases it
|
|
|
|
// (or is it even properly ref counted)? And who closes the stream
|
|
|
|
// etc?
|
|
|
|
} else {
|
|
|
|
ns4xStreamWrapper* wrapper = (ns4xStreamWrapper *)pstream->ndata;
|
|
|
|
NS_ASSERTION(wrapper != NULL, "null wrapper");
|
|
|
|
|
|
|
|
if (wrapper == NULL)
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
|
|
|
|
// This will release the wrapped nsIOutputStream.
|
|
|
|
delete wrapper;
|
|
|
|
pstream->ndata = nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_status(NPP npp, const char *message)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_status called from the wrong thread\n"));
|
|
|
|
return;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_Status: npp=%p, message=%s\n",
|
|
|
|
(void*)npp, message));
|
|
|
|
|
|
|
|
if (!npp || !npp->ndata) {
|
|
|
|
NS_WARNING("_status: npp or npp->ndata == 0");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPluginInstance *inst = (nsIPluginInstance *) npp->ndata;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(inst);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIPluginInstancePeer> peer;
|
|
|
|
if (NS_SUCCEEDED(inst->GetPeer(getter_AddRefs(peer))) && peer) {
|
|
|
|
peer->ShowStatus(message);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_memfree (void *ptr)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_memfree called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY, ("NPN_MemFree: ptr=%p\n", ptr));
|
|
|
|
|
|
|
|
if (ptr)
|
|
|
|
nsMemory::Free(ptr);
|
|
|
|
}
|
|
|
|
|
2008-09-11 08:10:26 -07:00
|
|
|
uint32_t NP_CALLBACK
|
|
|
|
_memflush(uint32_t size)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_memflush called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY, ("NPN_MemFlush: size=%d\n", size));
|
|
|
|
|
|
|
|
nsMemory::HeapMinimize(PR_TRUE);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_reloadplugins(NPBool reloadPages)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_reloadplugins called from the wrong thread\n"));
|
|
|
|
return;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_ReloadPlugins: reloadPages=%d\n", reloadPages));
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPluginManager> pm(do_GetService(kPluginManagerCID));
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!pm)
|
|
|
|
return;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
pm->ReloadPlugins(reloadPages);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_invalidaterect(NPP npp, NPRect *invalidRect)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_invalidaterect called from the wrong thread\n"));
|
|
|
|
return;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_InvalidateRect: npp=%p, top=%d, left=%d, bottom=%d, "
|
|
|
|
"right=%d\n", (void *)npp, invalidRect->top,
|
|
|
|
invalidRect->left, invalidRect->bottom, invalidRect->right));
|
|
|
|
|
|
|
|
if (!npp || !npp->ndata) {
|
|
|
|
NS_WARNING("_invalidaterect: npp or npp->ndata == 0");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPluginInstance *inst = (nsIPluginInstance *) npp->ndata;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(inst);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIPluginInstancePeer> peer;
|
|
|
|
if (NS_SUCCEEDED(inst->GetPeer(getter_AddRefs(peer))) && peer) {
|
|
|
|
nsCOMPtr<nsIWindowlessPluginInstancePeer> wpeer(do_QueryInterface(peer));
|
|
|
|
if (wpeer) {
|
|
|
|
// XXX nsRect & NPRect are structurally equivalent
|
|
|
|
wpeer->InvalidateRect((nsPluginRect *)invalidRect);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_invalidateregion(NPP npp, NPRegion invalidRegion)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_invalidateregion called from the wrong thread\n"));
|
|
|
|
return;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,
|
|
|
|
("NPN_InvalidateRegion: npp=%p, region=%p\n", (void*)npp,
|
|
|
|
(void*)invalidRegion));
|
|
|
|
|
|
|
|
if (!npp || !npp->ndata) {
|
|
|
|
NS_WARNING("_invalidateregion: npp or npp->ndata == 0");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPluginInstance *inst = (nsIPluginInstance *) npp->ndata;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(inst);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIPluginInstancePeer> peer;
|
|
|
|
if (NS_SUCCEEDED(inst->GetPeer(getter_AddRefs(peer))) && peer) {
|
|
|
|
nsCOMPtr<nsIWindowlessPluginInstancePeer> wpeer(do_QueryInterface(peer));
|
|
|
|
if (wpeer) {
|
2007-03-26 18:07:57 -07:00
|
|
|
// nsPluginRegion & NPRegion are typedef'd to the same thing
|
2007-03-22 10:30:00 -07:00
|
|
|
wpeer->InvalidateRegion((nsPluginRegion)invalidRegion);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_forceredraw(NPP npp)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_forceredraw called from the wrong thread\n"));
|
|
|
|
return;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_ForceDraw: npp=%p\n", (void*)npp));
|
|
|
|
|
|
|
|
if (!npp || !npp->ndata) {
|
|
|
|
NS_WARNING("_forceredraw: npp or npp->ndata == 0");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPluginInstance *inst = (nsIPluginInstance *) npp->ndata;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(inst);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIPluginInstancePeer> peer;
|
|
|
|
if (NS_SUCCEEDED(inst->GetPeer(getter_AddRefs(peer))) && peer) {
|
|
|
|
nsCOMPtr<nsIWindowlessPluginInstancePeer> wpeer(do_QueryInterface(peer));
|
|
|
|
if (wpeer) {
|
|
|
|
wpeer->ForceRedraw();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-01-14 16:51:29 -08:00
|
|
|
static nsIDocument *
|
|
|
|
GetDocumentFromNPP(NPP npp)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
|
|
|
NS_ENSURE_TRUE(npp, nsnull);
|
|
|
|
|
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *)npp->ndata;
|
|
|
|
NS_ENSURE_TRUE(inst, nsnull);
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(inst);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIPluginInstancePeer> pip;
|
|
|
|
inst->GetPeer(getter_AddRefs(pip));
|
|
|
|
nsCOMPtr<nsPIPluginInstancePeer> pp(do_QueryInterface(pip));
|
|
|
|
NS_ENSURE_TRUE(pp, nsnull);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPluginInstanceOwner> owner;
|
|
|
|
pp->GetOwner(getter_AddRefs(owner));
|
|
|
|
NS_ENSURE_TRUE(owner, nsnull);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc;
|
|
|
|
owner->GetDocument(getter_AddRefs(doc));
|
|
|
|
|
2008-01-14 16:51:29 -08:00
|
|
|
return doc;
|
|
|
|
}
|
|
|
|
|
|
|
|
static JSContext *
|
|
|
|
GetJSContextFromDoc(nsIDocument *doc)
|
|
|
|
{
|
2007-03-22 10:30:00 -07:00
|
|
|
nsIScriptGlobalObject *sgo = doc->GetScriptGlobalObject();
|
|
|
|
NS_ENSURE_TRUE(sgo, nsnull);
|
|
|
|
|
|
|
|
nsIScriptContext *scx = sgo->GetContext();
|
|
|
|
NS_ENSURE_TRUE(scx, nsnull);
|
|
|
|
|
|
|
|
return (JSContext *)scx->GetNativeContext();
|
|
|
|
}
|
|
|
|
|
2008-01-14 16:51:29 -08:00
|
|
|
static JSContext *
|
|
|
|
GetJSContextFromNPP(NPP npp)
|
|
|
|
{
|
|
|
|
nsIDocument *doc = GetDocumentFromNPP(npp);
|
|
|
|
NS_ENSURE_TRUE(doc, nsnull);
|
|
|
|
|
|
|
|
return GetJSContextFromDoc(doc);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPObject* NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_getwindowobject(NPP npp)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_getwindowobject called from the wrong thread\n"));
|
|
|
|
return nsnull;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
JSContext *cx = GetJSContextFromNPP(npp);
|
|
|
|
NS_ENSURE_TRUE(cx, nsnull);
|
|
|
|
|
|
|
|
// Using ::JS_GetGlobalObject(cx) is ok here since the window we
|
|
|
|
// want to return here is the outer window, *not* the inner (since
|
|
|
|
// we don't know what the plugin will do with it).
|
|
|
|
return nsJSObjWrapper::GetNewOrUsed(npp, cx, ::JS_GetGlobalObject(cx));
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPObject* NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_getpluginelement(NPP npp)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_getpluginelement called from the wrong thread\n"));
|
|
|
|
return nsnull;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
nsIDOMElement *elementp = nsnull;
|
|
|
|
NPError nperr = _getvalue(npp, NPNVDOMElement, &elementp);
|
|
|
|
|
|
|
|
if (nperr != NPERR_NO_ERROR) {
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pass ownership of elementp to element
|
|
|
|
nsCOMPtr<nsIDOMElement> element;
|
|
|
|
element.swap(elementp);
|
|
|
|
|
|
|
|
JSContext *cx = GetJSContextFromNPP(npp);
|
|
|
|
NS_ENSURE_TRUE(cx, nsnull);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID()));
|
|
|
|
NS_ENSURE_TRUE(xpc, nsnull);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXPConnectJSObjectHolder> holder;
|
|
|
|
xpc->WrapNative(cx, ::JS_GetGlobalObject(cx), element,
|
|
|
|
NS_GET_IID(nsIDOMElement),
|
|
|
|
getter_AddRefs(holder));
|
|
|
|
NS_ENSURE_TRUE(holder, nsnull);
|
|
|
|
|
|
|
|
JSObject* obj = nsnull;
|
|
|
|
holder->GetJSObject(&obj);
|
|
|
|
NS_ENSURE_TRUE(obj, nsnull);
|
|
|
|
|
|
|
|
return nsJSObjWrapper::GetNewOrUsed(npp, cx, obj);
|
|
|
|
}
|
|
|
|
|
|
|
|
static NPIdentifier
|
|
|
|
doGetIdentifier(JSContext *cx, const NPUTF8* name)
|
|
|
|
{
|
|
|
|
NS_ConvertUTF8toUTF16 utf16name(name);
|
|
|
|
|
|
|
|
JSString *str = ::JS_InternUCStringN(cx, (jschar *)utf16name.get(),
|
|
|
|
utf16name.Length());
|
|
|
|
|
|
|
|
if (!str)
|
2008-03-30 07:55:42 -07:00
|
|
|
return NULL;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
return (NPIdentifier)STRING_TO_JSVAL(str);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPIdentifier NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_getstringidentifier(const NPUTF8* name)
|
|
|
|
{
|
2008-03-30 07:55:42 -07:00
|
|
|
if (!name) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS, ("NPN_getstringidentifier: passed null name"));
|
|
|
|
return NULL;
|
|
|
|
}
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_getstringidentifier called from the wrong thread\n"));
|
|
|
|
}
|
2008-03-30 07:55:42 -07:00
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIThreadJSContextStack> stack =
|
|
|
|
do_GetService("@mozilla.org/js/xpc/ContextStack;1");
|
|
|
|
if (!stack)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
stack->GetSafeJSContext(&cx);
|
|
|
|
if (!cx)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
JSAutoRequest ar(cx);
|
|
|
|
return doGetIdentifier(cx, name);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_getstringidentifiers(const NPUTF8** names, int32_t nameCount,
|
|
|
|
NPIdentifier *identifiers)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_getstringidentifiers called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
nsCOMPtr<nsIThreadJSContextStack> stack =
|
|
|
|
do_GetService("@mozilla.org/js/xpc/ContextStack;1");
|
|
|
|
if (!stack)
|
|
|
|
return;
|
|
|
|
|
|
|
|
JSContext *cx = nsnull;
|
|
|
|
stack->GetSafeJSContext(&cx);
|
|
|
|
if (!cx)
|
|
|
|
return;
|
|
|
|
|
|
|
|
JSAutoRequest ar(cx);
|
|
|
|
|
|
|
|
for (int32_t i = 0; i < nameCount; ++i) {
|
2008-03-30 07:55:42 -07:00
|
|
|
if (names[i]) {
|
|
|
|
identifiers[i] = doGetIdentifier(cx, names[i]);
|
|
|
|
} else {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS, ("NPN_getstringidentifiers: passed null name"));
|
|
|
|
identifiers[i] = NULL;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPIdentifier NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_getintidentifier(int32_t intid)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_getstringidentifier called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
return (NPIdentifier)INT_TO_JSVAL(intid);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPUTF8* NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_utf8fromidentifier(NPIdentifier identifier)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_utf8fromidentifier called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!identifier)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
jsval v = (jsval)identifier;
|
|
|
|
|
|
|
|
if (!JSVAL_IS_STRING(v)) {
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
JSString *str = JSVAL_TO_STRING(v);
|
|
|
|
|
|
|
|
return
|
|
|
|
ToNewUTF8String(nsDependentString((PRUnichar *)::JS_GetStringChars(str),
|
|
|
|
::JS_GetStringLength(str)));
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
int32_t NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_intfromidentifier(NPIdentifier identifier)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_intfromidentifier called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
jsval v = (jsval)identifier;
|
|
|
|
|
|
|
|
if (!JSVAL_IS_INT(v)) {
|
|
|
|
return PR_INT32_MIN;
|
|
|
|
}
|
|
|
|
|
|
|
|
return JSVAL_TO_INT(v);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_identifierisstring(NPIdentifier identifier)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_identifierisstring called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
jsval v = (jsval)identifier;
|
|
|
|
|
|
|
|
return JSVAL_IS_STRING(v);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPObject* NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_createobject(NPP npp, NPClass* aClass)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_createobject called from the wrong thread\n"));
|
|
|
|
return nsnull;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp) {
|
|
|
|
NS_ERROR("Null npp passed to _createobject()!");
|
|
|
|
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!aClass) {
|
|
|
|
NS_ERROR("Null class passed to _createobject()!");
|
|
|
|
|
|
|
|
return nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
|
|
|
NPObject *npobj;
|
|
|
|
|
|
|
|
if (aClass->allocate) {
|
|
|
|
npobj = aClass->allocate(npp, aClass);
|
|
|
|
} else {
|
|
|
|
npobj = (NPObject *)PR_Malloc(sizeof(NPObject));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (npobj) {
|
|
|
|
npobj->_class = aClass;
|
|
|
|
npobj->referenceCount = 1;
|
|
|
|
}
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("Created NPObject %p, NPClass %p\n", npobj, aClass));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return npobj;
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPObject* NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_retainobject(NPObject* npobj)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_retainobject called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (npobj) {
|
|
|
|
PR_AtomicIncrement((PRInt32*)&npobj->referenceCount);
|
|
|
|
}
|
|
|
|
|
|
|
|
return npobj;
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_releaseobject(NPObject* npobj)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_releaseobject called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npobj)
|
|
|
|
return;
|
|
|
|
|
|
|
|
int32_t refCnt = PR_AtomicDecrement((PRInt32*)&npobj->referenceCount);
|
|
|
|
|
|
|
|
if (refCnt == 0) {
|
2007-08-09 15:22:26 -07:00
|
|
|
nsNPObjWrapper::OnDestroy(npobj);
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("Deleting NPObject %p, refcount hit 0\n", npobj));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
if (npobj->_class && npobj->_class->deallocate) {
|
|
|
|
npobj->_class->deallocate(npobj);
|
|
|
|
} else {
|
|
|
|
PR_Free(npobj);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_invoke(NPP npp, NPObject* npobj, NPIdentifier method, const NPVariant *args,
|
|
|
|
uint32_t argCount, NPVariant *result)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_invoke called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp || !npobj || !npobj->_class || !npobj->_class->invoke)
|
|
|
|
return false;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
NPPExceptionAutoHolder nppExceptionHolder;
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("NPN_Invoke(npp %p, npobj %p, method %p, args %d\n", npp,
|
|
|
|
npobj, method, argCount));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return npobj->_class->invoke(npobj, method, args, argCount, result);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_invokeDefault(NPP npp, NPObject* npobj, const NPVariant *args,
|
|
|
|
uint32_t argCount, NPVariant *result)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_invokedefault called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp || !npobj || !npobj->_class || !npobj->_class->invokeDefault)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder nppExceptionHolder;
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("NPN_InvokeDefault(npp %p, npobj %p, args %d\n", npp,
|
|
|
|
npobj, argCount));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return npobj->_class->invokeDefault(npobj, args, argCount, result);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_evaluate(NPP npp, NPObject* npobj, NPString *script, NPVariant *result)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_evaluate called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
2008-01-14 16:51:29 -08:00
|
|
|
nsIDocument *doc = GetDocumentFromNPP(npp);
|
|
|
|
NS_ENSURE_TRUE(doc, false);
|
|
|
|
|
|
|
|
JSContext *cx = GetJSContextFromDoc(doc);
|
2007-03-22 10:30:00 -07:00
|
|
|
NS_ENSURE_TRUE(cx, false);
|
|
|
|
|
|
|
|
JSObject *obj =
|
|
|
|
nsNPObjWrapper::GetNewOrUsed(npp, cx, npobj);
|
|
|
|
|
|
|
|
if (!obj) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Root obj and the rval (below).
|
|
|
|
jsval vec[] = { OBJECT_TO_JSVAL(obj), JSVAL_NULL };
|
|
|
|
JSAutoTempValueRooter tvr(cx, NS_ARRAY_LENGTH(vec), vec);
|
|
|
|
jsval *rval = &vec[1];
|
|
|
|
|
|
|
|
if (result) {
|
|
|
|
// Initialize the out param to void
|
|
|
|
VOID_TO_NPVARIANT(*result);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!script || !script->utf8length || !script->utf8characters) {
|
|
|
|
// Nothing to evaluate.
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_ConvertUTF8toUTF16 utf16script(script->utf8characters,
|
|
|
|
script->utf8length);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIScriptContext> scx = GetScriptContextFromJSContext(cx);
|
|
|
|
NS_ENSURE_TRUE(scx, false);
|
|
|
|
|
2008-01-14 16:51:29 -08:00
|
|
|
nsIPrincipal *principal = doc->NodePrincipal();
|
|
|
|
|
|
|
|
nsCAutoString specStr;
|
|
|
|
const char *spec;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIURI> uri;
|
|
|
|
principal->GetURI(getter_AddRefs(uri));
|
|
|
|
|
|
|
|
if (uri) {
|
|
|
|
uri->GetSpec(specStr);
|
|
|
|
spec = specStr.get();
|
|
|
|
} else {
|
|
|
|
// No URI in a principal means it's the system principal. If the
|
|
|
|
// document URI is a chrome:// URI, pass that in as the URI of the
|
|
|
|
// script, else pass in null for the filename as there's no way to
|
|
|
|
// know where this document really came from. Passing in null here
|
|
|
|
// also means that the script gets treated by XPConnect as if it
|
|
|
|
// needs additional protection, which is what we want for unknown
|
|
|
|
// chrome code anyways.
|
|
|
|
|
|
|
|
uri = doc->GetDocumentURI();
|
|
|
|
PRBool isChrome = PR_FALSE;
|
|
|
|
|
|
|
|
if (uri && NS_SUCCEEDED(uri->SchemeIs("chrome", &isChrome)) && isChrome) {
|
|
|
|
uri->GetSpec(specStr);
|
|
|
|
spec = specStr.get();
|
|
|
|
} else {
|
|
|
|
spec = nsnull;
|
|
|
|
}
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("NPN_Evaluate(npp %p, npobj %p, script <<<%s>>>) called\n",
|
|
|
|
npp, npobj, script->utf8characters));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
nsresult rv = scx->EvaluateStringWithValue(utf16script, obj, principal,
|
2008-01-14 16:51:29 -08:00
|
|
|
spec, 0, 0, rval, nsnull);
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
return NS_SUCCEEDED(rv) &&
|
|
|
|
(!result || JSValToNPVariant(npp, cx, *rval, result));
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_getproperty(NPP npp, NPObject* npobj, NPIdentifier property,
|
|
|
|
NPVariant *result)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_getproperty called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp || !npobj || !npobj->_class || !npobj->_class->getProperty)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder nppExceptionHolder;
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("NPN_GetProperty(npp %p, npobj %p, property %p) called\n",
|
|
|
|
npp, npobj, property));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return npobj->_class->getProperty(npobj, property, result);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_setproperty(NPP npp, NPObject* npobj, NPIdentifier property,
|
|
|
|
const NPVariant *value)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_setproperty called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp || !npobj || !npobj->_class || !npobj->_class->setProperty)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder nppExceptionHolder;
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("NPN_SetProperty(npp %p, npobj %p, property %p) called\n",
|
|
|
|
npp, npobj, property));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return npobj->_class->setProperty(npobj, property, value);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_removeproperty(NPP npp, NPObject* npobj, NPIdentifier property)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_removeproperty called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp || !npobj || !npobj->_class || !npobj->_class->removeProperty)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder nppExceptionHolder;
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("NPN_RemoveProperty(npp %p, npobj %p, property %p) called\n",
|
|
|
|
npp, npobj, property));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return npobj->_class->removeProperty(npobj, property);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_hasproperty(NPP npp, NPObject* npobj, NPIdentifier propertyName)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_hasproperty called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp || !npobj || !npobj->_class || !npobj->_class->hasProperty)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder nppExceptionHolder;
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("NPN_HasProperty(npp %p, npobj %p, property %p) called\n",
|
|
|
|
npp, npobj, propertyName));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return npobj->_class->hasProperty(npobj, propertyName);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_hasmethod(NPP npp, NPObject* npobj, NPIdentifier methodName)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_hasmethod called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp || !npobj || !npobj->_class || !npobj->_class->hasMethod)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder nppExceptionHolder;
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("NPN_HasMethod(npp %p, npobj %p, property %p) called\n",
|
|
|
|
npp, npobj, methodName));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
return npobj->_class->hasProperty(npobj, methodName);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_enumerate(NPP npp, NPObject *npobj, NPIdentifier **identifier,
|
|
|
|
uint32_t *count)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_enumerate called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!npp || !npobj || !npobj->_class)
|
|
|
|
return false;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,
|
|
|
|
("NPN_Enumerate(npp %p, npobj %p) called\n", npp, npobj));
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
if (!NP_CLASS_STRUCT_VERSION_HAS_ENUM(npobj->_class) ||
|
|
|
|
!npobj->_class->enumerate) {
|
|
|
|
*identifier = 0;
|
|
|
|
*count = 0;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder nppExceptionHolder;
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
|
|
|
return npobj->_class->enumerate(npobj, identifier, count);
|
|
|
|
}
|
|
|
|
|
2007-10-09 18:24:28 -07:00
|
|
|
bool NP_CALLBACK
|
|
|
|
_construct(NPP npp, NPObject* npobj, const NPVariant *args,
|
|
|
|
uint32_t argCount, NPVariant *result)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_construct called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
2007-10-09 18:24:28 -07:00
|
|
|
if (!npp || !npobj || !npobj->_class ||
|
|
|
|
!NP_CLASS_STRUCT_VERSION_HAS_CTOR(npobj->_class) ||
|
|
|
|
!npobj->_class->construct) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder nppExceptionHolder;
|
|
|
|
NPPAutoPusher nppPusher(npp);
|
|
|
|
|
|
|
|
return npobj->_class->construct(npobj, args, argCount, result);
|
|
|
|
}
|
|
|
|
|
2008-04-30 17:17:54 -07:00
|
|
|
#ifdef MOZ_MEMORY_WINDOWS
|
|
|
|
extern "C" size_t malloc_usable_size(const void *ptr);
|
|
|
|
|
|
|
|
BOOL
|
|
|
|
InHeap(HANDLE hHeap, LPVOID lpMem)
|
|
|
|
{
|
|
|
|
BOOL success = FALSE;
|
|
|
|
PROCESS_HEAP_ENTRY he;
|
|
|
|
he.lpData = NULL;
|
|
|
|
while (HeapWalk(hHeap, &he) != 0) {
|
|
|
|
if (he.lpData == lpMem) {
|
|
|
|
success = TRUE;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
HeapUnlock(hHeap);
|
|
|
|
return success;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_releasevariantvalue(NPVariant* variant)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_releasevariantvalue called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
switch (variant->type) {
|
|
|
|
case NPVariantType_Void :
|
|
|
|
case NPVariantType_Null :
|
|
|
|
case NPVariantType_Bool :
|
|
|
|
case NPVariantType_Int32 :
|
|
|
|
case NPVariantType_Double :
|
|
|
|
break;
|
|
|
|
case NPVariantType_String :
|
|
|
|
{
|
|
|
|
const NPString *s = &NPVARIANT_TO_STRING(*variant);
|
|
|
|
|
2008-04-30 17:17:54 -07:00
|
|
|
if (s->utf8characters) {
|
|
|
|
#ifdef MOZ_MEMORY_WINDOWS
|
|
|
|
if (malloc_usable_size((void *)s->utf8characters) != 0) {
|
|
|
|
PR_Free((void *)s->utf8characters);
|
|
|
|
} else {
|
|
|
|
void *p = (void *)s->utf8characters;
|
|
|
|
DWORD nheaps = 0;
|
|
|
|
nsAutoTArray<HANDLE, 50> heaps;
|
|
|
|
nheaps = GetProcessHeaps(0, heaps.Elements());
|
|
|
|
heaps.AppendElements(nheaps);
|
|
|
|
GetProcessHeaps(nheaps, heaps.Elements());
|
|
|
|
for (DWORD i = 0; i < nheaps; i++) {
|
|
|
|
if (InHeap(heaps[i], p)) {
|
|
|
|
HeapFree(heaps[i], 0, p);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#else
|
2007-03-22 10:30:00 -07:00
|
|
|
PR_Free((void *)s->utf8characters);
|
2008-04-30 17:17:54 -07:00
|
|
|
#endif
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case NPVariantType_Object:
|
|
|
|
{
|
|
|
|
NPObject *npobj = NPVARIANT_TO_OBJECT(*variant);
|
|
|
|
|
|
|
|
if (npobj)
|
|
|
|
_releaseobject(npobj);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
NS_ERROR("Unknown NPVariant type!");
|
|
|
|
}
|
|
|
|
|
|
|
|
VOID_TO_NPVARIANT(*variant);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
bool NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_tostring(NPObject* npobj, NPVariant *result)
|
|
|
|
{
|
|
|
|
NS_ERROR("Write me!");
|
|
|
|
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_tostring called from the wrong thread\n"));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static char *gNPPException;
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_setexception(NPObject* npobj, const NPUTF8 *message)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_setexception called from the wrong thread\n"));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
if (gNPPException) {
|
|
|
|
// If a plugin throws multiple exceptions, we'll only report the
|
|
|
|
// last one for now.
|
|
|
|
free(gNPPException);
|
|
|
|
}
|
|
|
|
|
|
|
|
gNPPException = strdup(message);
|
|
|
|
}
|
|
|
|
|
|
|
|
const char *
|
|
|
|
PeekException()
|
|
|
|
{
|
|
|
|
return gNPPException;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
PopException()
|
|
|
|
{
|
|
|
|
NS_ASSERTION(gNPPException, "Uh, no NPP exception to pop!");
|
|
|
|
|
|
|
|
if (gNPPException) {
|
|
|
|
free(gNPPException);
|
|
|
|
|
|
|
|
gNPPException = nsnull;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder::NPPExceptionAutoHolder()
|
|
|
|
: mOldException(gNPPException)
|
|
|
|
{
|
|
|
|
gNPPException = nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
NPPExceptionAutoHolder::~NPPExceptionAutoHolder()
|
|
|
|
{
|
|
|
|
NS_ASSERTION(!gNPPException, "NPP exception not properly cleared!");
|
|
|
|
|
|
|
|
gNPPException = mOldException;
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_getvalue(NPP npp, NPNVariable variable, void *result)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_getvalue called from the wrong thread\n"));
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_GetValue: npp=%p, var=%d\n",
|
|
|
|
(void*)npp, (int)variable));
|
|
|
|
|
|
|
|
nsresult res;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(npp);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
switch(variable) {
|
|
|
|
#if defined(XP_UNIX) && !defined(XP_MACOSX)
|
|
|
|
case NPNVxDisplay : {
|
|
|
|
#ifdef MOZ_WIDGET_GTK2
|
|
|
|
if (npp) {
|
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *) npp->ndata;
|
2008-07-16 18:19:54 -07:00
|
|
|
PRBool windowless = PR_FALSE;
|
|
|
|
inst->GetValue(nsPluginInstanceVariable_WindowlessBool, &windowless);
|
|
|
|
NPBool needXEmbed = PR_FALSE;
|
|
|
|
if (!windowless) {
|
|
|
|
inst->GetValue((nsPluginInstanceVariable)NPPVpluginNeedsXEmbed, &needXEmbed);
|
|
|
|
}
|
|
|
|
if (windowless || needXEmbed) {
|
2007-03-22 10:30:00 -07:00
|
|
|
(*(Display **)result) = GDK_DISPLAY();
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// adobe nppdf calls XtGetApplicationNameAndClass(display,
|
|
|
|
// &instance, &class) we have to init Xt toolkit before get
|
|
|
|
// XtDisplay just call gtk_xtbin_new(w,0) once
|
|
|
|
static GtkWidget *gtkXtBinHolder = 0;
|
|
|
|
if (!gtkXtBinHolder) {
|
|
|
|
gtkXtBinHolder = gtk_xtbin_new(GDK_ROOT_PARENT(),0);
|
|
|
|
// it crashes on destroy, let it leak
|
|
|
|
// gtk_widget_destroy(gtkXtBinHolder);
|
|
|
|
}
|
|
|
|
(*(Display **)result) = GTK_XTBIN(gtkXtBinHolder)->xtdisplay;
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
#endif
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPNVxtAppContext:
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
#endif
|
|
|
|
|
2007-07-02 20:41:34 -07:00
|
|
|
#if defined(XP_WIN) || defined(XP_OS2) || defined(MOZ_WIDGET_GTK2)
|
2007-03-22 10:30:00 -07:00
|
|
|
case NPNVnetscapeWindow: {
|
|
|
|
if (!npp || !npp->ndata)
|
|
|
|
return NPERR_INVALID_INSTANCE_ERROR;
|
|
|
|
|
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *) npp->ndata;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPluginInstancePeer> peer;
|
|
|
|
if (NS_SUCCEEDED(inst->GetPeer(getter_AddRefs(peer))) &&
|
|
|
|
peer &&
|
|
|
|
NS_SUCCEEDED(peer->GetValue(nsPluginInstancePeerVariable_NetscapeWindow,
|
|
|
|
result))) {
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
case NPNVjavascriptEnabledBool: {
|
|
|
|
*(NPBool*)result = PR_FALSE;
|
|
|
|
nsCOMPtr<nsIPrefBranch> prefs(do_GetService(NS_PREFSERVICE_CONTRACTID));
|
|
|
|
if (prefs) {
|
|
|
|
PRBool js = PR_FALSE;;
|
|
|
|
res = prefs->GetBoolPref("javascript.enabled", &js);
|
|
|
|
if (NS_SUCCEEDED(res))
|
|
|
|
*(NPBool*)result = js;
|
|
|
|
}
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPNVasdEnabledBool:
|
|
|
|
*(NPBool*)result = FALSE;
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
|
|
|
|
case NPNVisOfflineBool: {
|
|
|
|
PRBool offline = PR_FALSE;
|
|
|
|
nsCOMPtr<nsIIOService> ioservice =
|
|
|
|
do_GetService(NS_IOSERVICE_CONTRACTID, &res);
|
|
|
|
if (NS_SUCCEEDED(res))
|
|
|
|
res = ioservice->GetOffline(&offline);
|
|
|
|
if (NS_FAILED(res))
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
|
|
|
|
*(NPBool*)result = offline;
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPNVserviceManager: {
|
|
|
|
nsIServiceManager * sm;
|
|
|
|
res = NS_GetServiceManager(&sm);
|
|
|
|
if (NS_SUCCEEDED(res)) {
|
|
|
|
*(nsIServiceManager**)result = sm;
|
|
|
|
return NPERR_NO_ERROR;
|
2008-08-14 05:47:04 -07:00
|
|
|
} else {
|
2007-03-22 10:30:00 -07:00
|
|
|
return NPERR_GENERIC_ERROR;
|
2008-08-14 05:47:04 -07:00
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
case NPNVDOMElement: {
|
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *) npp->ndata;
|
|
|
|
NS_ENSURE_TRUE(inst, NPERR_GENERIC_ERROR);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPluginInstancePeer> pip;
|
|
|
|
inst->GetPeer(getter_AddRefs(pip));
|
|
|
|
nsCOMPtr<nsIPluginTagInfo2> pti2 (do_QueryInterface(pip));
|
|
|
|
if (pti2) {
|
|
|
|
nsCOMPtr<nsIDOMElement> e;
|
|
|
|
pti2->GetDOMElement(getter_AddRefs(e));
|
|
|
|
if (e) {
|
|
|
|
NS_ADDREF(*(nsIDOMElement**)result = e.get());
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPNVDOMWindow: {
|
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *)npp->ndata;
|
|
|
|
NS_ENSURE_TRUE(inst, NPERR_GENERIC_ERROR);
|
|
|
|
|
|
|
|
nsIDOMWindow *domWindow = inst->GetDOMWindow().get();
|
|
|
|
|
|
|
|
if (domWindow) {
|
|
|
|
// Pass over ownership of domWindow to the caller.
|
|
|
|
(*(nsIDOMWindow**)result) = domWindow;
|
|
|
|
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPNVToolkit: {
|
|
|
|
#ifdef MOZ_WIDGET_GTK2
|
|
|
|
*((NPNToolkitType*)result) = NPNVGtk2;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (*(NPNToolkitType*)result)
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPNVSupportsXEmbedBool: {
|
|
|
|
#ifdef MOZ_WIDGET_GTK2
|
|
|
|
*(NPBool*)result = PR_TRUE;
|
|
|
|
#else
|
|
|
|
*(NPBool*)result = PR_FALSE;
|
|
|
|
#endif
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPNVWindowNPObject: {
|
|
|
|
*(NPObject **)result = _getwindowobject(npp);
|
|
|
|
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPNVPluginElementNPObject: {
|
|
|
|
*(NPObject **)result = _getpluginelement(npp);
|
|
|
|
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
2007-09-05 18:45:08 -07:00
|
|
|
case NPNVSupportsWindowless: {
|
|
|
|
#if defined(XP_WIN) || defined(XP_MACOSX) || (defined(MOZ_X11) && defined(MOZ_WIDGET_GTK2))
|
|
|
|
*(NPBool*)result = PR_TRUE;
|
|
|
|
#else
|
|
|
|
*(NPBool*)result = PR_FALSE;
|
|
|
|
#endif
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
|
2007-03-26 18:07:57 -07:00
|
|
|
#ifdef XP_MACOSX
|
|
|
|
case NPNVpluginDrawingModel: {
|
|
|
|
if (npp) {
|
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance*)npp->ndata;
|
|
|
|
if (inst) {
|
|
|
|
*(NPDrawingModel*)result = inst->GetDrawingModel();
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef NP_NO_QUICKDRAW
|
|
|
|
case NPNVsupportsQuickDrawBool: {
|
|
|
|
*(NPBool*)result = PR_TRUE;
|
|
|
|
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
case NPNVsupportsCoreGraphicsBool: {
|
|
|
|
*(NPBool*)result = PR_TRUE;
|
|
|
|
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2008-08-14 05:47:04 -07:00
|
|
|
default:
|
|
|
|
return NPERR_GENERIC_ERROR;
|
2007-03-22 10:30:00 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_setvalue(NPP npp, NPPVariable variable, void *result)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_setvalue called from the wrong thread\n"));
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_SetValue: npp=%p, var=%d\n",
|
|
|
|
(void*)npp, (int)variable));
|
|
|
|
|
|
|
|
if (!npp)
|
|
|
|
return NPERR_INVALID_INSTANCE_ERROR;
|
|
|
|
|
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *) npp->ndata;
|
|
|
|
|
|
|
|
NS_ASSERTION(inst != NULL, "null instance");
|
|
|
|
|
|
|
|
if (inst == NULL)
|
|
|
|
return NPERR_INVALID_INSTANCE_ERROR;
|
|
|
|
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(inst);
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
switch (variable) {
|
|
|
|
|
|
|
|
// we should keep backward compatibility with 4x where the
|
|
|
|
// actual pointer value is checked rather than its content
|
|
|
|
// when passing booleans
|
|
|
|
case NPPVpluginWindowBool: {
|
|
|
|
NPBool bWindowless = (result == nsnull);
|
|
|
|
return inst->SetWindowless(bWindowless);
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPPVpluginTransparentBool: {
|
|
|
|
NPBool bTransparent = (result != nsnull);
|
|
|
|
return inst->SetTransparent(bTransparent);
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPPVjavascriptPushCallerBool:
|
|
|
|
{
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIJSContextStack> contextStack =
|
|
|
|
do_GetService("@mozilla.org/js/xpc/ContextStack;1", &rv);
|
|
|
|
if (NS_SUCCEEDED(rv)) {
|
|
|
|
NPBool bPushCaller = (result != nsnull);
|
|
|
|
|
|
|
|
if (bPushCaller) {
|
|
|
|
rv = NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPluginInstancePeer> peer;
|
|
|
|
if (NS_SUCCEEDED(inst->GetPeer(getter_AddRefs(peer))) && peer) {
|
|
|
|
nsCOMPtr<nsIPluginInstancePeer2> peer2 =
|
|
|
|
do_QueryInterface(peer);
|
|
|
|
|
|
|
|
if (peer2) {
|
|
|
|
JSContext *cx;
|
|
|
|
rv = peer2->GetJSContext(&cx);
|
|
|
|
|
|
|
|
if (NS_SUCCEEDED(rv))
|
|
|
|
rv = contextStack->Push(cx);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
rv = contextStack->Pop(nsnull);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NS_SUCCEEDED(rv) ? NPERR_NO_ERROR : NPERR_GENERIC_ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
case NPPVpluginKeepLibraryInMemory: {
|
|
|
|
NPBool bCached = (result != nsnull);
|
|
|
|
return inst->SetCached(bCached);
|
|
|
|
}
|
2008-08-04 14:17:55 -07:00
|
|
|
|
|
|
|
case NPPVpluginWantsAllNetworkStreams: {
|
|
|
|
PRBool bWantsAllNetworkStreams = (result != nsnull);
|
|
|
|
return inst->SetWantsAllNetworkStreams(bWantsAllNetworkStreams);
|
|
|
|
}
|
|
|
|
|
2007-03-26 18:07:57 -07:00
|
|
|
#ifdef XP_MACOSX
|
2007-11-13 12:02:03 -08:00
|
|
|
case NPPVpluginDrawingModel: {
|
2007-03-26 18:07:57 -07:00
|
|
|
if (inst) {
|
|
|
|
int dModelValue = (int)result;
|
|
|
|
inst->SetDrawingModel((NPDrawingModel)dModelValue);
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return NPERR_GENERIC_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
default:
|
|
|
|
return NPERR_NO_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
NPError NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_requestread(NPStream *pstream, NPByteRange *rangeList)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_requestread called from the wrong thread\n"));
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_RequestRead: stream=%p\n",
|
|
|
|
(void*)pstream));
|
|
|
|
|
|
|
|
#ifdef PLUGIN_LOGGING
|
|
|
|
for(NPByteRange * range = rangeList; range != nsnull; range = range->next)
|
|
|
|
PR_LOG(nsPluginLogging::gNPNLog,PLUGIN_LOG_NOISY,
|
|
|
|
("%i-%i", range->offset, range->offset + range->length - 1));
|
|
|
|
|
|
|
|
PR_LOG(nsPluginLogging::gNPNLog,PLUGIN_LOG_NOISY, ("\n\n"));
|
|
|
|
PR_LogFlush();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (!pstream || !rangeList || !pstream->ndata)
|
|
|
|
return NPERR_INVALID_PARAM;
|
|
|
|
|
|
|
|
ns4xPluginStreamListener * streamlistener =
|
|
|
|
(ns4xPluginStreamListener *)pstream->ndata;
|
|
|
|
|
|
|
|
nsPluginStreamType streamtype = nsPluginStreamType_Normal;
|
|
|
|
|
|
|
|
streamlistener->GetStreamType(&streamtype);
|
|
|
|
|
|
|
|
if (streamtype != nsPluginStreamType_Seek)
|
|
|
|
return NPERR_STREAM_NOT_SEEKABLE;
|
|
|
|
|
|
|
|
if (streamlistener->mStreamInfo)
|
|
|
|
streamlistener->mStreamInfo->RequestRead((nsByteRange *)rangeList);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2008-07-11 14:28:12 -07:00
|
|
|
// Deprecated, only stubbed out
|
|
|
|
void* NP_CALLBACK /* OJI type: JRIEnv* */
|
2007-03-22 10:30:00 -07:00
|
|
|
_getJavaEnv(void)
|
|
|
|
{
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_GetJavaEnv\n"));
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
const char * NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_useragent(NPP npp)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_useragent called from the wrong thread\n"));
|
|
|
|
return nsnull;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_UserAgent: npp=%p\n", (void*)npp));
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPluginManager> pm(do_GetService(kPluginManagerCID));
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!pm)
|
|
|
|
return nsnull;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
2008-03-30 08:23:21 -07:00
|
|
|
const char *retstr;
|
|
|
|
nsresult rv = pm->UserAgent(&retstr);
|
|
|
|
if (NS_FAILED(rv))
|
|
|
|
return nsnull;
|
2007-03-22 10:30:00 -07:00
|
|
|
|
|
|
|
return retstr;
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void * NP_CALLBACK
|
2008-09-11 08:10:26 -07:00
|
|
|
_memalloc (uint32_t size)
|
2007-03-22 10:30:00 -07:00
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL,("NPN_memalloc called from the wrong thread\n"));
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY, ("NPN_MemAlloc: size=%d\n", size));
|
|
|
|
return nsMemory::Alloc(size);
|
|
|
|
}
|
|
|
|
|
2008-07-11 14:28:12 -07:00
|
|
|
// Deprecated, only stubbed out
|
|
|
|
void* NP_CALLBACK /* OJI type: jref */
|
2007-03-22 10:30:00 -07:00
|
|
|
_getJavaPeer(NPP npp)
|
|
|
|
{
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NORMAL, ("NPN_GetJavaPeer: npp=%p\n", (void*)npp));
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_pushpopupsenabledstate(NPP npp, NPBool enabled)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_pushpopupsenabledstate called from the wrong thread\n"));
|
|
|
|
return;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *)npp->ndata;
|
|
|
|
if (!inst)
|
|
|
|
return;
|
|
|
|
|
|
|
|
inst->PushPopupsEnabledState(enabled);
|
|
|
|
}
|
|
|
|
|
2007-06-26 17:41:08 -07:00
|
|
|
void NP_CALLBACK
|
2007-03-22 10:30:00 -07:00
|
|
|
_poppopupsenabledstate(NPP npp)
|
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (!NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_ALWAYS,("NPN_poppopupsenabledstate called from the wrong thread\n"));
|
|
|
|
return;
|
|
|
|
}
|
2007-03-22 10:30:00 -07:00
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *)npp->ndata;
|
|
|
|
if (!inst)
|
|
|
|
return;
|
|
|
|
|
|
|
|
inst->PopPopupsEnabledState();
|
|
|
|
}
|
|
|
|
|
2007-07-11 16:25:45 -07:00
|
|
|
class nsPluginThreadRunnable : public nsRunnable,
|
|
|
|
public PRCList
|
|
|
|
{
|
|
|
|
public:
|
2007-07-12 13:38:11 -07:00
|
|
|
nsPluginThreadRunnable(NPP instance, PluginThreadCallback func,
|
|
|
|
void *userData);
|
2007-07-11 16:25:45 -07:00
|
|
|
virtual ~nsPluginThreadRunnable();
|
|
|
|
|
|
|
|
NS_IMETHOD Run();
|
|
|
|
|
|
|
|
PRBool IsForInstance(NPP instance)
|
|
|
|
{
|
|
|
|
return (mInstance == instance);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Invalidate()
|
|
|
|
{
|
|
|
|
mFunc = nsnull;
|
|
|
|
}
|
|
|
|
|
|
|
|
PRBool IsValid()
|
|
|
|
{
|
|
|
|
return (mFunc != nsnull);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
NPP mInstance;
|
2007-07-12 13:38:11 -07:00
|
|
|
PluginThreadCallback mFunc;
|
2007-07-11 16:25:45 -07:00
|
|
|
void *mUserData;
|
|
|
|
};
|
|
|
|
|
|
|
|
nsPluginThreadRunnable::nsPluginThreadRunnable(NPP instance,
|
2007-07-12 13:38:11 -07:00
|
|
|
PluginThreadCallback func,
|
2007-07-11 16:25:45 -07:00
|
|
|
void *userData)
|
|
|
|
: mInstance(instance), mFunc(func), mUserData(userData)
|
|
|
|
{
|
|
|
|
if (!sPluginThreadAsyncCallLock) {
|
|
|
|
// Failed to create lock, not much we can do here then...
|
|
|
|
mFunc = nsnull;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
PR_INIT_CLIST(this);
|
|
|
|
|
|
|
|
{
|
|
|
|
nsAutoLock lock(sPluginThreadAsyncCallLock);
|
|
|
|
|
|
|
|
ns4xPluginInstance *inst = (ns4xPluginInstance *)instance->ndata;
|
|
|
|
if (!inst || !inst->IsStarted()) {
|
|
|
|
// The plugin was stopped, ignore this async call.
|
|
|
|
mFunc = nsnull;
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
PR_APPEND_LINK(this, &sPendingAsyncCalls);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nsPluginThreadRunnable::~nsPluginThreadRunnable()
|
|
|
|
{
|
|
|
|
if (!sPluginThreadAsyncCallLock) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
nsAutoLock lock(sPluginThreadAsyncCallLock);
|
|
|
|
|
|
|
|
PR_REMOVE_LINK(this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsPluginThreadRunnable::Run()
|
|
|
|
{
|
|
|
|
if (mFunc) {
|
2008-02-28 18:06:00 -08:00
|
|
|
PluginDestructionGuard guard(mInstance);
|
|
|
|
|
2007-07-11 16:25:45 -07:00
|
|
|
NS_TRY_SAFE_CALL_VOID(mFunc(mUserData), nsnull, nsnull);
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
void NP_CALLBACK
|
2007-07-12 13:38:11 -07:00
|
|
|
_pluginthreadasynccall(NPP instance, PluginThreadCallback func, void *userData)
|
2007-07-11 16:25:45 -07:00
|
|
|
{
|
2008-03-30 08:23:21 -07:00
|
|
|
if (NS_IsMainThread()) {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,("NPN_pluginthreadasynccall called from the main thread\n"));
|
|
|
|
} else {
|
|
|
|
NPN_PLUGIN_LOG(PLUGIN_LOG_NOISY,("NPN_pluginthreadasynccall called from a non main thread\n"));
|
|
|
|
}
|
2007-07-11 16:25:45 -07:00
|
|
|
nsRefPtr<nsPluginThreadRunnable> evt =
|
|
|
|
new nsPluginThreadRunnable(instance, func, userData);
|
|
|
|
|
|
|
|
if (evt && evt->IsValid()) {
|
|
|
|
NS_DispatchToMainThread(evt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
OnPluginDestroy(NPP instance)
|
|
|
|
{
|
|
|
|
if (!sPluginThreadAsyncCallLock) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
{
|
|
|
|
nsAutoLock lock(sPluginThreadAsyncCallLock);
|
|
|
|
|
|
|
|
if (PR_CLIST_IS_EMPTY(&sPendingAsyncCalls)) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsPluginThreadRunnable *r =
|
|
|
|
(nsPluginThreadRunnable *)PR_LIST_HEAD(&sPendingAsyncCalls);
|
|
|
|
|
|
|
|
do {
|
|
|
|
if (r->IsForInstance(instance)) {
|
|
|
|
r->Invalidate();
|
|
|
|
}
|
|
|
|
|
|
|
|
r = (nsPluginThreadRunnable *)PR_NEXT_LINK(r);
|
|
|
|
} while (r != &sPendingAsyncCalls);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
OnShutdown()
|
|
|
|
{
|
|
|
|
NS_ASSERTION(PR_CLIST_IS_EMPTY(&sPendingAsyncCalls),
|
|
|
|
"Pending async plugin call list not cleaned up!");
|
|
|
|
|
|
|
|
if (sPluginThreadAsyncCallLock) {
|
|
|
|
nsAutoLock::DestroyLock(sPluginThreadAsyncCallLock);
|
2007-10-09 18:24:28 -07:00
|
|
|
|
|
|
|
sPluginThreadAsyncCallLock = nsnull;
|
2007-07-11 16:25:45 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
EnterAsyncPluginThreadCallLock()
|
|
|
|
{
|
|
|
|
if (sPluginThreadAsyncCallLock) {
|
|
|
|
PR_Lock(sPluginThreadAsyncCallLock);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
ExitAsyncPluginThreadCallLock()
|
|
|
|
{
|
|
|
|
if (sPluginThreadAsyncCallLock) {
|
|
|
|
PR_Unlock(sPluginThreadAsyncCallLock);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-03-22 10:30:00 -07:00
|
|
|
NPP NPPStack::sCurrentNPP = nsnull;
|