Files
palemoon27/dom/plugins/base/nsNPAPIPluginInstance.h
T
roytam1 4e6138a54f import changes from `dev' branch of rmottola/Arctic-Fox:
- remove PM alertTime custom (911dd825ec)
- Bug 1208346 - Alert service Do Not Disturb backend. r=jaws (0047051b4e)
- Bug 1208346 - Fix manualDoNotDisturb build bustage on Android. r=bustage (39275a49bd)
- Add some shadow warnings back (64eb2adf55)
- some window fixes by Roy (72e6a9b98e)
- remove parameter of DoesD3D11DeviceWork (243dfb24f4)
- Bug 1197296. Check the error code of Map. r=bas (9debd274fd)
- Bug 1221348 - Part 1: Unify crash signatures. r=jrmuizel (80763d326d)
- Bug 1221348 - Part 2: Fix texture sharing detection code on Intel. r=jrmuizel (fb0390850d)
- Bug 1097321 - Add layers.amd-switchable-gfx.enabled pref. r=jrmuizel (3963a35cbc)
- Bug 720589 - mMatchCounts may be accessed with a nonexisting index. r=neil (fdbdd7e228)
- Bug 1224975 - add telemetry for font loading. r=m_kato (013a6e8fc7)
- Bug 1188376: Split Hello Telemetry values from general WebRTC r=jib (3887cc3201)
- Bug 1198883 - Part 1: Improve ICE candidates telemetry probes. r=bwc (2d02a3d752)
- Bug 1198883 - Part 2: Added WebRTC ICE candidates to Telemetry. r+vladan (fa8032043f)
- Bug 1201926 - Add support for keyed histograms to Fennec's Telemetry module, r=nalexander (8b96ebf026)
- Bug 1213780 - Fix Telemetry reporting repeated hang annotations for Chrome hangs. r=aklotz (afde812b08)
- Bug 1128768: Part 4 - Update telemetry to serialize BHR hang annotations; r=gfritzsche (7c1b8f5fa5)
- Bug 1215540 - Fix Telemetry reporting repeated hang annotations for Thread hangs. r=aklotz (afed35f06f)
- Bug 896740 - Limit the number of chrome-hangs reported to Telemetry. r=vladan (a37ba72225)
- missing bits of Bug 932865 - Expose thread hang stats (c19c41ae06)
- Bug 1187138 (part 1) - Replace nsBaseHashtable::Enumerate() calls in toolkit/ with iterators. r=froydnj. (ba92a8464f)
- Bug 1121040 - Don't send RETURN keypresses to content while a satchel autocomplete entry is selected. r=Gijs,smaug (762efd7cc8)
- Bug 1145146 - Remove offensive comment from nsFormFillController r=mak (7a6b0eb4e1)
- Bug 1136085 - Part 1 - Don't store & collect subsession histograms on mobile. r=vladan (911084001c)
- missing bits of  Bug 1023461 - Add HangStack class to support internal string buffer; r=vladan (599bee2150)
- Bug 1196381 - Eliminate breakpad dependency in ThreadStackHelper; r=nfroyd r=snorp (ff8a632975)
- fix misspatch of 1157282 and 1198883 (9a216ab188)
- Bug 1034138 - a. Get native stack for permahangs in BHM; r=snorp (772970d0e0)
- Bug 1211411 - Limit the number of thread hang stats reported to Telemetry. r=vladan (fd72bc8b62)
- Bug 1219751 - Change the the depth limit of the thread hangs stack to use the 99th percentile. r=gfritzsche (fc59bd7598)
- Bug 1133521 - Enable BHR on Beta. r=vladan (2501c6a0ff)
- Bug 1219216 - Fix a wrong comment in BackgroundHangMonitor.h. r=gfritzsche (e974320361)
- bits of  Bug 1134279 - Change Telemetry data producers to use the correct (d00e84b7f3)
- bits of Bug 977026 - Part 2: B2G loader (bf1208a73a)
- bug 1198450 - Firefox fails to load about:home if Firefox was installed to a folder with non-Latin name r=jimm (c4df06a69e)
- Bug 1222167 - fix initialization order in GeckoChildProcessHost; r=jld (6bad274479)
- Bug 1141693 - Build and use a PIE plugin-container on Android 5.0+. Based on a patch by Mike Hommey. r=me,glandium (78dc877aec)
- Bug 1187533 - Change how Gtk+2 plugin-container is started on Gtk+3 builds. r=billm (93c2b8a1b0)
- Bug 1063359 - Unconditionally use -Wl,--no-as-needed when building with GNU ld/gold. r=mshal (643e92ca49)
- Bug 971811 - Don't prepend an empty existing DYLD_INSERT_LIBRARIES path when launching the plugin. r=smichaud (c72df0073c)
- Bug 1189352: Fix NSPR_LOG_FILE with absolute paths for sandboxed child on Windows. r=bbondy (f4bb51c123)
- Bug 1189967 - Be slightly more explicit about some conversions to std::wstring. r=nfroyd (7bec611359)
- Bug 1201438: Add non-sandboxed Windows content processes as target peers for handle duplication. r=bbondy (1ca7f499e9)
- Bug 1201438 - Fixup for builds with disabled sandbox. (de125d156e)
- Bug 1165895: Add NPAPI sandbox rule for the crash server pipe and x64 Temp dir write access. r=bbondy (e9f601912d)
- Bug 1202988 - Don't use GetTempPath for flash's mms.cfg hack for low integrity. r=aklotz (b4a0d7f856)
- Bug 1225023: Allow Flash Player to create Adobe\Flash Player and Macromedia\Flash Player directories. r=bbondy (c5120afc1d)
- Bug 1218681 - add plugin-container standalone process code. The Code associate with ARCH. r=hev (03dfb21776)
- bug 1130976 - Flash context menu causes CPOW deadlock with AdBlock Plus, plugins should spin even loop in content process instead of the chrome process r=billm (52f4d33633)
- Bug 1157237: Move invocation of async NPP_New to an async task; r=jimm (7b6c1a577e)
- Bug 1175147 - Don't do threadsafety asserts for NPN_MemAlloc and friends, r=jimm (b4ce5b33ce)
- fix strange misspatch (8a96a61819)
- Bug 1219244 - use UniquePtr instead of nsAutoArrayPtr in dom/plugins/; r=aklotz (19fabc55b5)
- Bug 1155503: BrowserStreamParent should null out its NPStream pointer and we should check for it; r=jimm (eddb82b8b4)
- some crashrep stuff (bb2b046090)
- Bug 1192077 - Convert AndroidBridge JNIEnv calls; r=esawin (821453089e)
- Bug 554171 - Add plugin thread checks to functions that must only be called on the main thread. r=jimm (f2eb3822da)
- Bug 1149358: Ensure that plugin streams are not manipulated by PluginAsyncSurrogate if plugin destruction is imminent; r=jimm (6dd99c94ee)
- Bug 1198302 - Ensure that PluginAsyncSurrogate::NotifyAsyncInitFailed properly aborts any PluginAsyncSurrogate::WaitForInit calls. r=jimm (23c1fbfcfe)
- Bug 1201239 - Add a proper null check in PluginAsyncSurrogate::NotifyAsyncInitFailed; r=jimm (5d8ff9f8aa)
- Bug 1208059: Make nsNPAPIPluginInstance support WeakPtr and modify PluginAsyncSurrogate to use it; r=jimm (174a3166b1)
- Bug 1171453: Make ParentNPObjects aware of AsyncNPObject wrappers; r=jimm (92e608831d)
- Bug 1217726 - Fix -Wimplicit-fallthrough warnings in dom/plugins. r=jimm (32db26ede8)
- Bug 1167720 - Fix invalid window ID provided to GTK3 plugin container children. r=karlt (d8c2de0c19)
- Remove Windows-specific synchronous plugin drawing code. (bug 1218688 part 1, r=jimm) (5e4b60ea33)
- Remove Linux-specific synchronous plugin drawing code. (bug 1218688 part 2, r=jimm) (edb29f27b8)
- Remove Mac-specific synchronous plugin drawing code. (bug 1218688 part 3, r=benwa) (acc6b57b23)
- Assert that we do not attempt synchronous painting of windowless Desktop plugins. (bug 1218688 part 4, r=bsmedberg) (c34094b038)
- Bug 1195472 - Call Show after Enable on puppet widgets to avoid an assertion when running crash tests. r=aklotz (405ed2c1d1)
- Add explicit keyword to AsyncScrollBase constructor to fix static analysis build (bug 1139220 part 6, r=shu) (4cc37b9a3b)
- Bug 1146561 - Add back the visibility check for Mac plugins. r=jmuizelaar (91a4a5a8e9)
- namespace (9b4919f8fa)
- Bug 1217307 - Remove some unnecessary null checks in rest of dom/. r=njn (de5d69880a)
- Bug 1225137 - Avoid crash on some platforms if scrollbar fading is enabled and the duration is set to zero. r=spohl (a16954de2f)
- Bug 1114554 - Disable NotificationStorage debug logging. r=dholbert (c2722fa4ed)
- Bug 1073551 - fix doorhangers to not steal focus unless explicitly opened using mouse or keyboard, r=jaws (be6109cf6d)
- Bug 1169629: Add-on install confirmation notification appears anchored to older dismissed anchors. r=dao (684535c7cc)
- Bug 1194706: make sure that the notification icons and doorhangers are shown in undocked chat windows too. r=Mossop (68e0ced913)
- Bug 1207089 - Telemetry for permission notifications. r=MattN,vladan (ff421236ea)
- Bug 1215526 - part 4 - make preprocess-tab-svgs.py report extra dependencies; r=glandium (98b64b5c45)
2023-02-24 08:22:17 +08:00

454 lines
13 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsNPAPIPluginInstance_h_
#define nsNPAPIPluginInstance_h_
#include "nsSize.h"
#include "nsCOMPtr.h"
#include "nsTArray.h"
#include "nsPIDOMWindow.h"
#include "nsITimer.h"
#include "nsIPluginInstanceOwner.h"
#include "nsIURI.h"
#include "nsIChannel.h"
#include "nsHashKeys.h"
#include <prinrval.h>
#include "js/TypeDecls.h"
#include "nsIAudioChannelAgent.h"
#ifdef MOZ_WIDGET_ANDROID
#include "nsAutoPtr.h"
#include "nsIRunnable.h"
#include "GLContextTypes.h"
#include "AndroidSurfaceTexture.h"
#include "AndroidBridge.h"
#include <map>
class PluginEventRunnable;
class SharedPluginTexture;
#endif
#include "mozilla/TimeStamp.h"
#include "mozilla/PluginLibrary.h"
#include "mozilla/RefPtr.h"
#include "mozilla/WeakPtr.h"
class nsPluginStreamListenerPeer; // browser-initiated stream class
class nsNPAPIPluginStreamListener; // plugin-initiated stream class
class nsIPluginInstanceOwner;
class nsIOutputStream;
class nsPluginInstanceOwner;
#if defined(OS_WIN)
const NPDrawingModel kDefaultDrawingModel = NPDrawingModelSyncWin;
#elif defined(MOZ_X11)
const NPDrawingModel kDefaultDrawingModel = NPDrawingModelSyncX;
#elif defined(XP_MACOSX)
#ifndef NP_NO_QUICKDRAW
const NPDrawingModel kDefaultDrawingModel = NPDrawingModelQuickDraw; // Not supported
#else
const NPDrawingModel kDefaultDrawingModel = NPDrawingModelCoreGraphics;
#endif
#else
const NPDrawingModel kDefaultDrawingModel = static_cast<NPDrawingModel>(0);
#endif
/**
* Used to indicate whether it's OK to reenter Gecko and repaint, flush frames,
* run scripts, etc, during this plugin call.
* When NS_PLUGIN_CALL_UNSAFE_TO_REENTER_GECKO is set, we try to avoid dangerous
* Gecko activities when the plugin spins a nested event loop, on a best-effort
* basis.
*/
enum NSPluginCallReentry {
NS_PLUGIN_CALL_SAFE_TO_REENTER_GECKO,
NS_PLUGIN_CALL_UNSAFE_TO_REENTER_GECKO
};
class nsNPAPITimer
{
public:
NPP npp;
uint32_t id;
nsCOMPtr<nsITimer> timer;
void (*callback)(NPP npp, uint32_t timerID);
bool inCallback;
bool needUnschedule;
};
class nsNPAPIPluginInstance final : public nsIAudioChannelAgentCallback
, public mozilla::SupportsWeakPtr<nsNPAPIPluginInstance>
{
private:
typedef mozilla::PluginLibrary PluginLibrary;
public:
MOZ_DECLARE_WEAKREFERENCE_TYPENAME(nsNPAPIPluginInstance)
NS_DECL_THREADSAFE_ISUPPORTS
NS_DECL_NSIAUDIOCHANNELAGENTCALLBACK
nsresult Initialize(nsNPAPIPlugin *aPlugin, nsPluginInstanceOwner* aOwner, const nsACString& aMIMEType);
nsresult Start();
nsresult Stop();
nsresult SetWindow(NPWindow* window);
nsresult NewStreamFromPlugin(const char* type, const char* target, nsIOutputStream* *result);
nsresult Print(NPPrint* platformPrint);
nsresult HandleEvent(void* event, int16_t* result,
NSPluginCallReentry aSafeToReenterGecko = NS_PLUGIN_CALL_UNSAFE_TO_REENTER_GECKO);
nsresult GetValueFromPlugin(NPPVariable variable, void* value);
nsresult GetDrawingModel(int32_t* aModel);
nsresult IsRemoteDrawingCoreAnimation(bool* aDrawing);
nsresult ContentsScaleFactorChanged(double aContentsScaleFactor);
nsresult GetJSObject(JSContext *cx, JSObject** outObject);
bool ShouldCache();
nsresult IsWindowless(bool* isWindowless);
nsresult AsyncSetWindow(NPWindow* window);
nsresult GetImageContainer(mozilla::layers::ImageContainer **aContainer);
nsresult GetImageSize(nsIntSize* aSize);
nsresult NotifyPainted(void);
nsresult GetIsOOP(bool* aIsOOP);
nsresult SetBackgroundUnknown();
nsresult BeginUpdateBackground(nsIntRect* aRect, gfxContext** aContext);
nsresult EndUpdateBackground(gfxContext* aContext, nsIntRect* aRect);
nsresult IsTransparent(bool* isTransparent);
nsresult GetFormValue(nsAString& aValue);
nsresult PushPopupsEnabledState(bool aEnabled);
nsresult PopPopupsEnabledState();
nsresult GetPluginAPIVersion(uint16_t* version);
nsresult InvalidateRect(NPRect *invalidRect);
nsresult InvalidateRegion(NPRegion invalidRegion);
nsresult GetMIMEType(const char* *result);
nsresult GetJSContext(JSContext* *outContext);
nsPluginInstanceOwner* GetOwner();
void SetOwner(nsPluginInstanceOwner *aOwner);
bool HasAudioChannelAgent() const
{
return !!mAudioChannelAgent;
}
nsresult GetOrCreateAudioChannelAgent(nsIAudioChannelAgent** aAgent);
nsresult SetMuted(bool aIsMuted);
nsNPAPIPlugin* GetPlugin();
nsresult GetNPP(NPP * aNPP);
NPError SetWindowless(bool aWindowless);
NPError SetTransparent(bool aTransparent);
NPError SetWantsAllNetworkStreams(bool aWantsAllNetworkStreams);
NPError SetUsesDOMForCursor(bool aUsesDOMForCursor);
bool UsesDOMForCursor();
void SetDrawingModel(NPDrawingModel aModel);
void RedrawPlugin();
#ifdef XP_MACOSX
void SetEventModel(NPEventModel aModel);
void* GetCurrentEvent() {
return mCurrentPluginEvent;
}
#endif
#ifdef MOZ_WIDGET_ANDROID
void NotifyForeground(bool aForeground);
void NotifyOnScreen(bool aOnScreen);
void MemoryPressure();
void NotifyFullScreen(bool aFullScreen);
void NotifySize(nsIntSize size);
nsIntSize CurrentSize() { return mCurrentSize; }
bool IsOnScreen() {
return mOnScreen;
}
uint32_t GetANPDrawingModel() { return mANPDrawingModel; }
void SetANPDrawingModel(uint32_t aModel);
void* GetJavaSurface();
void PostEvent(void* event);
// These are really mozilla::dom::ScreenOrientation, but it's
// difficult to include that here
uint32_t FullScreenOrientation() { return mFullScreenOrientation; }
void SetFullScreenOrientation(uint32_t orientation);
void SetWakeLock(bool aLock);
mozilla::gl::GLContext* GLContext();
// For ANPOpenGL
class TextureInfo {
public:
TextureInfo() :
mTexture(0), mWidth(0), mHeight(0), mInternalFormat(0)
{
}
TextureInfo(GLuint aTexture, int32_t aWidth, int32_t aHeight, GLuint aInternalFormat) :
mTexture(aTexture), mWidth(aWidth), mHeight(aHeight), mInternalFormat(aInternalFormat)
{
}
GLuint mTexture;
int32_t mWidth;
int32_t mHeight;
GLuint mInternalFormat;
};
TextureInfo LockContentTexture();
void ReleaseContentTexture(TextureInfo& aTextureInfo);
// For ANPNativeWindow
void* AcquireContentWindow();
EGLImage AsEGLImage();
mozilla::gl::AndroidSurfaceTexture* AsSurfaceTexture();
// For ANPVideo
class VideoInfo {
public:
VideoInfo(mozilla::gl::AndroidSurfaceTexture* aSurfaceTexture) :
mSurfaceTexture(aSurfaceTexture)
{
}
~VideoInfo()
{
mSurfaceTexture = nullptr;
}
RefPtr<mozilla::gl::AndroidSurfaceTexture> mSurfaceTexture;
gfxRect mDimensions;
};
void* AcquireVideoWindow();
void ReleaseVideoWindow(void* aWindow);
void SetVideoDimensions(void* aWindow, gfxRect aDimensions);
void GetVideos(nsTArray<VideoInfo*>& aVideos);
void SetOriginPos(mozilla::gl::OriginPos aOriginPos) {
mOriginPos = aOriginPos;
}
mozilla::gl::OriginPos OriginPos() const { return mOriginPos; }
static nsNPAPIPluginInstance* GetFromNPP(NPP npp);
#endif
nsresult NewStreamListener(const char* aURL, void* notifyData,
nsNPAPIPluginStreamListener** listener);
nsNPAPIPluginInstance();
// To be called when an instance becomes orphaned, when
// it's plugin is no longer guaranteed to be around.
void Destroy();
// Indicates whether the plugin is running normally.
bool IsRunning() {
return RUNNING == mRunning;
}
bool HasStartedDestroying() {
return mRunning >= DESTROYING;
}
// Indicates whether the plugin is running normally or being shut down
bool CanFireNotifications() {
return mRunning == RUNNING || mRunning == DESTROYING;
}
// return is only valid when the plugin is not running
mozilla::TimeStamp StopTime();
// cache this NPAPI plugin
void SetCached(bool aCache);
already_AddRefed<nsPIDOMWindow> GetDOMWindow();
nsresult PrivateModeStateChanged(bool aEnabled);
nsresult IsPrivateBrowsing(bool *aEnabled);
nsresult GetDOMElement(nsIDOMElement* *result);
nsNPAPITimer* TimerWithID(uint32_t id, uint32_t* index);
uint32_t ScheduleTimer(uint32_t interval, NPBool repeat, void (*timerFunc)(NPP npp, uint32_t timerID));
void UnscheduleTimer(uint32_t timerID);
NPBool ConvertPoint(double sourceX, double sourceY, NPCoordinateSpace sourceSpace, double *destX, double *destY, NPCoordinateSpace destSpace);
nsTArray<nsNPAPIPluginStreamListener*> *StreamListeners();
nsTArray<nsPluginStreamListenerPeer*> *FileCachedStreamListeners();
nsresult AsyncSetWindow(NPWindow& window);
void URLRedirectResponse(void* notifyData, NPBool allow);
// Called when the instance fails to instantiate beceause the Carbon
// event model is not supported.
void CarbonNPAPIFailure();
// Returns the contents scale factor of the screen the plugin is drawn on.
double GetContentsScaleFactor();
nsresult GetRunID(uint32_t *aRunID);
static bool InPluginCallUnsafeForReentry() { return gInUnsafePluginCalls > 0; }
static void BeginPluginCall(NSPluginCallReentry aReentryState)
{
if (aReentryState == NS_PLUGIN_CALL_UNSAFE_TO_REENTER_GECKO) {
++gInUnsafePluginCalls;
}
}
static void EndPluginCall(NSPluginCallReentry aReentryState)
{
if (aReentryState == NS_PLUGIN_CALL_UNSAFE_TO_REENTER_GECKO) {
NS_ASSERTION(gInUnsafePluginCalls > 0, "Must be in plugin call");
--gInUnsafePluginCalls;
}
}
protected:
virtual ~nsNPAPIPluginInstance();
nsresult GetTagType(nsPluginTagType *result);
nsresult GetMode(int32_t *result);
// check if this is a Java applet and affected by bug 750480
void CheckJavaC2PJSObjectQuirk(uint16_t paramCount,
const char* const* names,
const char* const* values);
// The structure used to communicate between the plugin instance and
// the browser.
NPP_t mNPP;
NPDrawingModel mDrawingModel;
#ifdef MOZ_WIDGET_ANDROID
uint32_t mANPDrawingModel;
friend class PluginEventRunnable;
nsTArray<RefPtr<PluginEventRunnable>> mPostedEvents;
void PopPostedEvent(PluginEventRunnable* r);
void OnSurfaceTextureFrameAvailable();
uint32_t mFullScreenOrientation;
bool mWakeLocked;
bool mFullScreen;
mozilla::gl::OriginPos mOriginPos;
RefPtr<SharedPluginTexture> mContentTexture;
RefPtr<mozilla::gl::AndroidSurfaceTexture> mContentSurface;
#endif
enum {
NOT_STARTED,
RUNNING,
DESTROYING,
DESTROYED
} mRunning;
// these are used to store the windowless properties
// which the browser will later query
bool mWindowless;
bool mTransparent;
bool mCached;
bool mUsesDOMForCursor;
public:
// True while creating the plugin, or calling NPP_SetWindow() on it.
bool mInPluginInitCall;
nsXPIDLCString mFakeURL;
private:
RefPtr<nsNPAPIPlugin> mPlugin;
nsTArray<nsNPAPIPluginStreamListener*> mStreamListeners;
nsTArray<nsPluginStreamListenerPeer*> mFileCachedStreamListeners;
nsTArray<PopupControlState> mPopupStates;
char* mMIMEType;
// Weak pointer to the owner. The owner nulls this out (by calling
// InvalidateOwner()) when it's no longer our owner.
nsPluginInstanceOwner *mOwner;
nsTArray<nsNPAPITimer*> mTimers;
#ifdef XP_MACOSX
// non-null during a HandleEvent call
void* mCurrentPluginEvent;
#endif
// Timestamp for the last time this plugin was stopped.
// This is only valid when the plugin is actually stopped!
mozilla::TimeStamp mStopTime;
#ifdef MOZ_WIDGET_ANDROID
void EnsureSharedTexture();
already_AddRefed<mozilla::gl::AndroidSurfaceTexture> CreateSurfaceTexture();
std::map<void*, VideoInfo*> mVideos;
bool mOnScreen;
nsIntSize mCurrentSize;
#endif
// is this instance Java and affected by bug 750480?
bool mHaveJavaC2PJSObjectQuirk;
static uint32_t gInUnsafePluginCalls;
// The arrays can only be released when the plugin instance is destroyed,
// because the plugin, in in-process mode, might keep a reference to them.
uint32_t mCachedParamLength;
char **mCachedParamNames;
char **mCachedParamValues;
nsCOMPtr<nsIAudioChannelAgent> mAudioChannelAgent;
};
// On Android, we need to guard against plugin code leaking entries in the local
// JNI ref table. See https://bugzilla.mozilla.org/show_bug.cgi?id=780831#c21
#ifdef MOZ_WIDGET_ANDROID
#define MAIN_THREAD_JNI_REF_GUARD mozilla::AutoLocalJNIFrame jniFrame
#else
#define MAIN_THREAD_JNI_REF_GUARD
#endif
PRIntervalTime NS_NotifyBeginPluginCall(NSPluginCallReentry aReentryState);
void NS_NotifyPluginCall(PRIntervalTime aTime, NSPluginCallReentry aReentryState);
#define NS_TRY_SAFE_CALL_RETURN(ret, fun, pluginInst, pluginCallReentry) \
PR_BEGIN_MACRO \
MAIN_THREAD_JNI_REF_GUARD; \
PRIntervalTime startTime = NS_NotifyBeginPluginCall(pluginCallReentry); \
ret = fun; \
NS_NotifyPluginCall(startTime, pluginCallReentry); \
PR_END_MACRO
#define NS_TRY_SAFE_CALL_VOID(fun, pluginInst, pluginCallReentry) \
PR_BEGIN_MACRO \
MAIN_THREAD_JNI_REF_GUARD; \
PRIntervalTime startTime = NS_NotifyBeginPluginCall(pluginCallReentry); \
fun; \
NS_NotifyPluginCall(startTime, pluginCallReentry); \
PR_END_MACRO
#endif // nsNPAPIPluginInstance_h_