summaryrefslogtreecommitdiffstats
path: root/dom/plugins/base/nsNPAPIPlugin.h
blob: ebc0404932567a356252efcadf6a31fc177580c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
/* -*- Mode: C++; tab-width: 2; 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 nsNPAPIPlugin_h_
#define nsNPAPIPlugin_h_

#include "prlink.h"
#include "npfunctions.h"
#include "nsPluginHost.h"

#include "mozilla/dom/ScriptSettings.h"
#include "mozilla/PluginLibrary.h"
#include "mozilla/RefCounted.h"

// nsNPAPIPlugin is held alive both by active nsPluginTag instances and
// by active nsNPAPIPluginInstance.
class nsNPAPIPlugin final {
 private:
  typedef mozilla::PluginLibrary PluginLibrary;

 public:
  nsNPAPIPlugin();

  NS_INLINE_DECL_REFCOUNTING(nsNPAPIPlugin)

  // Constructs and initializes an nsNPAPIPlugin object. A nullptr file path
  // will prevent this from calling NP_Initialize.
  static nsresult CreatePlugin(nsPluginTag* aPluginTag,
                               nsNPAPIPlugin** aResult);

  PluginLibrary* GetLibrary();
  // PluginFuncs() can't fail but results are only valid if GetLibrary()
  // succeeds
  NPPluginFuncs* PluginFuncs();

#if defined(XP_MACOSX) && !defined(__LP64__)
  void SetPluginRefNum(short aRefNum);
#endif

  // The IPC mechanism notifies the nsNPAPIPlugin if the plugin
  // crashes and is no longer usable. pluginDumpID is the ID of the minidump
  // that was written, or empty if no minidump was written.
  void PluginCrashed(const nsAString& aPluginDumpID,
                     const nsACString& aAdditionalMinidumps);

  nsresult Shutdown();

  static nsresult RetainStream(NPStream* pstream, nsISupports** aRetainedPeer);

 private:
  ~nsNPAPIPlugin();

  NPPluginFuncs mPluginFuncs;
  PluginLibrary* mLibrary;
};

namespace mozilla {
namespace plugins {
namespace parent {

static_assert(sizeof(NPIdentifier) == sizeof(jsid),
              "NPIdentifier must be binary compatible with jsid.");

inline jsid NPIdentifierToJSId(NPIdentifier id) {
  jsid tmp;
  JSID_BITS(tmp) = (size_t)id;
  return tmp;
}

inline NPIdentifier JSIdToNPIdentifier(jsid id) {
  return (NPIdentifier)JSID_BITS(id);
}

inline bool NPIdentifierIsString(NPIdentifier id) {
  return JSID_IS_STRING(NPIdentifierToJSId(id));
}

inline JSString* NPIdentifierToString(NPIdentifier id) {
  return JSID_TO_STRING(NPIdentifierToJSId(id));
}

inline NPIdentifier StringToNPIdentifier(JSContext* cx, JSString* str) {
  return JSIdToNPIdentifier(JS::PropertyKey::fromPinnedString(str));
}

inline bool NPIdentifierIsInt(NPIdentifier id) {
  return JSID_IS_INT(NPIdentifierToJSId(id));
}

inline int NPIdentifierToInt(NPIdentifier id) {
  return JSID_TO_INT(NPIdentifierToJSId(id));
}

inline NPIdentifier IntToNPIdentifier(int i) {
  return JSIdToNPIdentifier(INT_TO_JSID(i));
}

JSContext* GetJSContext(NPP npp);

inline bool NPStringIdentifierIsPermanent(NPIdentifier id) {
  AutoSafeJSContext cx;
  return JS_StringHasBeenPinned(cx, NPIdentifierToString(id));
}

#define NPIdentifier_VOID (JSIdToNPIdentifier(JSID_VOID))

NPObject* _getwindowobject(NPP npp);

NPObject* _getpluginelement(NPP npp);

NPIdentifier _getstringidentifier(const NPUTF8* name);

void _getstringidentifiers(const NPUTF8** names, int32_t nameCount,
                           NPIdentifier* identifiers);

bool _identifierisstring(NPIdentifier identifiers);

NPIdentifier _getintidentifier(int32_t intid);

NPUTF8* _utf8fromidentifier(NPIdentifier identifier);

int32_t _intfromidentifier(NPIdentifier identifier);

NPObject* _createobject(NPP npp, NPClass* aClass);

NPObject* _retainobject(NPObject* npobj);

void _releaseobject(NPObject* npobj);

bool _invoke(NPP npp, NPObject* npobj, NPIdentifier method,
             const NPVariant* args, uint32_t argCount, NPVariant* result);

bool _invokeDefault(NPP npp, NPObject* npobj, const NPVariant* args,
                    uint32_t argCount, NPVariant* result);

bool _evaluate(NPP npp, NPObject* npobj, NPString* script, NPVariant* result);

bool _getproperty(NPP npp, NPObject* npobj, NPIdentifier property,
                  NPVariant* result);

bool _setproperty(NPP npp, NPObject* npobj, NPIdentifier property,
                  const NPVariant* value);

bool _removeproperty(NPP npp, NPObject* npobj, NPIdentifier property);

bool _hasproperty(NPP npp, NPObject* npobj, NPIdentifier propertyName);

bool _hasmethod(NPP npp, NPObject* npobj, NPIdentifier methodName);

bool _enumerate(NPP npp, NPObject* npobj, NPIdentifier** identifier,
                uint32_t* count);

bool _construct(NPP npp, NPObject* npobj, const NPVariant* args,
                uint32_t argCount, NPVariant* result);

void _releasevariantvalue(NPVariant* variant);

void _setexception(NPObject* npobj, const NPUTF8* message);

void _pushpopupsenabledstate(NPP npp, NPBool enabled);

void _poppopupsenabledstate(NPP npp);

NPError _getvalueforurl(NPP instance, NPNURLVariable variable, const char* url,
                        char** value, uint32_t* len);

NPError _setvalueforurl(NPP instance, NPNURLVariable variable, const char* url,
                        const char* value, uint32_t len);

typedef void (*PluginTimerFunc)(NPP npp, uint32_t timerID);

uint32_t _scheduletimer(NPP instance, uint32_t interval, NPBool repeat,
                        PluginTimerFunc timerFunc);

void _unscheduletimer(NPP instance, uint32_t timerID);

NPError _popupcontextmenu(NPP instance, NPMenu* menu);

NPBool _convertpoint(NPP instance, double sourceX, double sourceY,
                     NPCoordinateSpace sourceSpace, double* destX,
                     double* destY, NPCoordinateSpace destSpace);

NPError _requestread(NPStream* pstream, NPByteRange* rangeList);

NPError _geturlnotify(NPP npp, const char* relativeURL, const char* target,
                      void* notifyData);

NPError _getvalue(NPP npp, NPNVariable variable, void* r_value);

NPError _setvalue(NPP npp, NPPVariable variable, void* r_value);

NPError _geturl(NPP npp, const char* relativeURL, const char* target);

NPError _posturlnotify(NPP npp, const char* relativeURL, const char* target,
                       uint32_t len, const char* buf, NPBool file,
                       void* notifyData);

NPError _posturl(NPP npp, const char* relativeURL, const char* target,
                 uint32_t len, const char* buf, NPBool file);

void _status(NPP npp, const char* message);

void _memfree(void* ptr);

uint32_t _memflush(uint32_t size);

void _reloadplugins(NPBool reloadPages);

void _invalidaterect(NPP npp, NPRect* invalidRect);

void _invalidateregion(NPP npp, NPRegion invalidRegion);

void _forceredraw(NPP npp);

const char* _useragent(NPP npp);

void* _memalloc(uint32_t size);

// Deprecated entry points for the old Java plugin.
void* /* OJI type: JRIEnv* */
_getJavaEnv();

void* /* OJI type: jref */
_getJavaPeer(NPP npp);

void _urlredirectresponse(NPP instance, void* notifyData, NPBool allow);

NPError _initasyncsurface(NPP instance, NPSize* size, NPImageFormat format,
                          void* initData, NPAsyncSurface* surface);

NPError _finalizeasyncsurface(NPP instance, NPAsyncSurface* surface);

void _setcurrentasyncsurface(NPP instance, NPAsyncSurface* surface,
                             NPRect* changed);

} /* namespace parent */
} /* namespace plugins */
} /* namespace mozilla */

const char* PeekException();

void PopException();

class NPPStack {
 public:
  static NPP Peek() { return sCurrentNPP; }

 protected:
  static NPP sCurrentNPP;
};

// XXXjst: The NPPAutoPusher stack is a bit redundant now that
// PluginDestructionGuard exists, and could thus be replaced by code
// that uses the PluginDestructionGuard list of plugins on the
// stack. But they're not identical, and to minimize code changes
// we're keeping both for the moment, and making NPPAutoPusher inherit
// the PluginDestructionGuard class to avoid having to keep two
// separate objects on the stack since we always want a
// PluginDestructionGuard where we use an NPPAutoPusher.

class MOZ_STACK_CLASS NPPAutoPusher : public NPPStack,
                                      protected PluginDestructionGuard {
 public:
  explicit NPPAutoPusher(NPP aNpp)
      : PluginDestructionGuard(aNpp), mOldNPP(sCurrentNPP) {
    NS_ASSERTION(aNpp, "Uh, null aNpp passed to NPPAutoPusher!");

    sCurrentNPP = aNpp;
  }

  ~NPPAutoPusher() { sCurrentNPP = mOldNPP; }

 private:
  NPP mOldNPP;
};

class NPPExceptionAutoHolder {
 public:
  NPPExceptionAutoHolder();
  ~NPPExceptionAutoHolder();

 protected:
  char* mOldException;
};

#endif  // nsNPAPIPlugin_h_