1 /*
2 * Copyright 2010 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19 #include "mshtml_private.h"
20
21 /* Parts of npapi.h */
22
23 #define NP_VERSION_MAJOR 0
24 #define NP_VERSION_MINOR 25
25
26 typedef unsigned char NPBool;
27 typedef INT16 NPError;
28 typedef INT16 NPReason;
29 typedef char *NPMIMEType;
30
31 typedef struct _NPP {
32 void *pdata;
33 void *ndata;
34 } NPP_t, *NPP;
35
36 typedef struct _NPStream {
37 void *pdata;
38 void *ndata;
39 const char *url;
40 UINT32 end;
41 UINT32 lastmodified;
42 void *notifyData;
43 const char *headers;
44 } NPStream;
45
46 typedef struct _NPSavedData {
47 INT32 len;
48 void *buf;
49 } NPSavedData;
50
51 typedef struct _NPRect {
52 UINT16 top;
53 UINT16 left;
54 UINT16 bottom;
55 UINT16 right;
56 } NPRect;
57
58 typedef enum {
59 NPFocusNext = 0,
60 NPFocusPrevious = 1
61 } NPFocusDirection;
62
63 #define NP_ABI_MASK 0
64
65 typedef enum {
66 NPPVpluginNameString = 1,
67 NPPVpluginDescriptionString,
68 NPPVpluginWindowBool,
69 NPPVpluginTransparentBool,
70 NPPVjavaClass,
71 NPPVpluginWindowSize,
72 NPPVpluginTimerInterval,
73 NPPVpluginScriptableInstance = (10 | NP_ABI_MASK),
74 NPPVpluginScriptableIID = 11,
75 NPPVjavascriptPushCallerBool = 12,
76 NPPVpluginKeepLibraryInMemory = 13,
77 NPPVpluginNeedsXEmbed = 14,
78 NPPVpluginScriptableNPObject = 15,
79 NPPVformValue = 16,
80 NPPVpluginUrlRequestsDisplayedBool = 17,
81 NPPVpluginWantsAllNetworkStreams = 18,
82 NPPVpluginNativeAccessibleAtkPlugId = 19,
83 NPPVpluginCancelSrcStream = 20,
84 NPPVSupportsAdvancedKeyHandling = 21
85 } NPPVariable;
86
87 typedef enum {
88 NPNVxDisplay = 1,
89 NPNVxtAppContext,
90 NPNVnetscapeWindow,
91 NPNVjavascriptEnabledBool,
92 NPNVasdEnabledBool,
93 NPNVisOfflineBool,
94 NPNVserviceManager = (10 | NP_ABI_MASK),
95 NPNVDOMElement = (11 | NP_ABI_MASK),
96 NPNVDOMWindow = (12 | NP_ABI_MASK),
97 NPNVToolkit = (13 | NP_ABI_MASK),
98 NPNVSupportsXEmbedBool = 14,
99 NPNVWindowNPObject = 15,
100 NPNVPluginElementNPObject = 16,
101 NPNVSupportsWindowless = 17,
102 NPNVprivateModeBool = 18,
103 NPNVsupportsAdvancedKeyHandling = 21
104 } NPNVariable;
105
106 typedef enum {
107 NPWindowTypeWindow = 1,
108 NPWindowTypeDrawable
109 } NPWindowType;
110
111 typedef struct _NPWindow {
112 void *window;
113 INT32 x;
114 INT32 y;
115 UINT32 width;
116 UINT32 height;
117 NPRect clipRect;
118 NPWindowType type;
119 } NPWindow;
120
121 typedef struct _NPFullPrint {
122 NPBool pluginPrinted;
123 NPBool printOne;
124 void *platformPrint;
125 } NPFullPrint;
126
127 typedef struct _NPEmbedPrint {
128 NPWindow window;
129 void *platformPrint;
130 } NPEmbedPrint;
131
132 typedef struct _NPPrint {
133 UINT16 mode;
134 union {
135 NPFullPrint fullPrint;
136 NPEmbedPrint embedPrint;
137 } print;
138 } NPPrint;
139
140 typedef HRGN NPRegion;
141
142 #define NPERR_BASE 0
143 #define NPERR_NO_ERROR (NPERR_BASE + 0)
144 #define NPERR_GENERIC_ERROR (NPERR_BASE + 1)
145 #define NPERR_INVALID_INSTANCE_ERROR (NPERR_BASE + 2)
146 #define NPERR_INVALID_FUNCTABLE_ERROR (NPERR_BASE + 3)
147 #define NPERR_MODULE_LOAD_FAILED_ERROR (NPERR_BASE + 4)
148 #define NPERR_OUT_OF_MEMORY_ERROR (NPERR_BASE + 5)
149 #define NPERR_INVALID_PLUGIN_ERROR (NPERR_BASE + 6)
150 #define NPERR_INVALID_PLUGIN_DIR_ERROR (NPERR_BASE + 7)
151 #define NPERR_INCOMPATIBLE_VERSION_ERROR (NPERR_BASE + 8)
152 #define NPERR_INVALID_PARAM (NPERR_BASE + 9)
153 #define NPERR_INVALID_URL (NPERR_BASE + 10)
154 #define NPERR_FILE_NOT_FOUND (NPERR_BASE + 11)
155 #define NPERR_NO_DATA (NPERR_BASE + 12)
156 #define NPERR_STREAM_NOT_SEEKABLE (NPERR_BASE + 13)
157
158 /* Parts of npfunctions.h */
159
160 typedef NPError (CDECL *NPP_NewProcPtr)(NPMIMEType,NPP,UINT16,INT16,char**,char**,NPSavedData*);
161 typedef NPError (CDECL *NPP_DestroyProcPtr)(NPP,NPSavedData**);
162 typedef NPError (CDECL *NPP_SetWindowProcPtr)(NPP,NPWindow*);
163 typedef NPError (CDECL *NPP_NewStreamProcPtr)(NPP,NPMIMEType,NPStream*,NPBool,UINT16*);
164 typedef NPError (CDECL *NPP_DestroyStreamProcPtr)(NPP,NPStream*,NPReason);
165 typedef INT32 (CDECL *NPP_WriteReadyProcPtr)(NPP,NPStream*);
166 typedef INT32 (CDECL *NPP_WriteProcPtr)(NPP,NPStream*,INT32,INT32,void*);
167 typedef void (CDECL *NPP_StreamAsFileProcPtr)(NPP,NPStream*,const char*);
168 typedef void (CDECL *NPP_PrintProcPtr)(NPP,NPPrint*);
169 typedef INT16 (CDECL *NPP_HandleEventProcPtr)(NPP,void*);
170 typedef void (CDECL *NPP_URLNotifyProcPtr)(NPP,const char*,NPReason,void*);
171 typedef NPError (CDECL *NPP_GetValueProcPtr)(NPP,NPPVariable,void*);
172 typedef NPError (CDECL *NPP_SetValueProcPtr)(NPP,NPNVariable,void*);
173 typedef NPBool (CDECL *NPP_GotFocusPtr)(NPP,NPFocusDirection);
174 typedef void (CDECL *NPP_LostFocusPtr)(NPP);
175
176 typedef struct _NPPluginFuncs {
177 UINT16 size;
178 UINT16 version;
179 NPP_NewProcPtr newp;
180 NPP_DestroyProcPtr destroy;
181 NPP_SetWindowProcPtr setwindow;
182 NPP_NewStreamProcPtr newstream;
183 NPP_DestroyStreamProcPtr destroystream;
184 NPP_StreamAsFileProcPtr asfile;
185 NPP_WriteReadyProcPtr writeready;
186 NPP_WriteProcPtr write;
187 NPP_PrintProcPtr print;
188 NPP_HandleEventProcPtr event;
189 NPP_URLNotifyProcPtr urlnotify;
190 void *javaClass;
191 NPP_GetValueProcPtr getvalue;
192 NPP_SetValueProcPtr setvalue;
193 NPP_GotFocusPtr gotfocus;
194 NPP_LostFocusPtr lostfocus;
195 } NPPluginFuncs;
196
get_dom_element(NPP instance)197 static nsIDOMHTMLElement *get_dom_element(NPP instance)
198 {
199 nsISupports *instance_unk = (nsISupports*)instance->ndata;
200 nsIPluginInstance *plugin_instance;
201 nsIDOMHTMLElement *html_elem;
202 nsIDOMElement *elem;
203 nsresult nsres;
204
205 nsres = nsISupports_QueryInterface(instance_unk, &IID_nsIPluginInstance, (void**)&plugin_instance);
206 if(NS_FAILED(nsres)) {
207 ERR("Could not get nsIPluginInstance interface: %08x\n", nsres);
208 return NULL;
209 }
210
211 nsres = nsIPluginInstance_GetDOMElement(plugin_instance, &elem);
212 nsIPluginInstance_Release(plugin_instance);
213 if(NS_FAILED(nsres)) {
214 ERR("GetDOMElement failed: %08x\n", nsres);
215 return NULL;
216 }
217
218 nsres = nsIDOMElement_QueryInterface(elem, &IID_nsIDOMHTMLElement, (void**)&html_elem);
219 nsIDOMElement_Release(elem);
220 if(NS_FAILED(nsres)) {
221 ERR("Could not get nsIDOMHTMLElement iface: %08x\n", nsres);
222 return NULL;
223 }
224
225 return html_elem;
226 }
227
get_elem_window(nsIDOMHTMLElement * elem)228 static HTMLInnerWindow *get_elem_window(nsIDOMHTMLElement *elem)
229 {
230 nsIDOMWindow *nswindow;
231 nsIDOMDocument *nsdoc;
232 HTMLOuterWindow *window;
233 nsresult nsres;
234
235 nsres = nsIDOMHTMLElement_GetOwnerDocument(elem, &nsdoc);
236 if(NS_FAILED(nsres))
237 return NULL;
238
239 nsres = nsIDOMDocument_GetDefaultView(nsdoc, &nswindow);
240 nsIDOMDocument_Release(nsdoc);
241 if(NS_FAILED(nsres) || !nswindow)
242 return NULL;
243
244 window = nswindow_to_window(nswindow);
245 nsIDOMWindow_Release(nswindow);
246
247 return window->base.inner_window;
248 }
249
NPP_New(NPMIMEType pluginType,NPP instance,UINT16 mode,INT16 argc,char ** argn,char ** argv,NPSavedData * saved)250 static NPError CDECL NPP_New(NPMIMEType pluginType, NPP instance, UINT16 mode, INT16 argc, char **argn,
251 char **argv, NPSavedData *saved)
252 {
253 HTMLPluginContainer *container;
254 nsIDOMHTMLElement *nselem;
255 HTMLInnerWindow *window;
256 HTMLDOMNode *node;
257 NPError err = NPERR_NO_ERROR;
258 HRESULT hres;
259
260 TRACE("(%s %p %x %d %p %p %p)\n", debugstr_a(pluginType), instance, mode, argc, argn, argv, saved);
261
262 nselem = get_dom_element(instance);
263 if(!nselem) {
264 ERR("Could not get DOM element\n");
265 return NPERR_GENERIC_ERROR;
266 }
267
268 window = get_elem_window(nselem);
269 if(!window) {
270 ERR("Could not get element's window object\n");
271 nsIDOMHTMLElement_Release(nselem);
272 return NPERR_GENERIC_ERROR;
273 }
274
275 hres = get_node(window->doc, (nsIDOMNode*)nselem, TRUE, &node);
276 nsIDOMHTMLElement_Release(nselem);
277 if(FAILED(hres))
278 return NPERR_GENERIC_ERROR;
279
280 hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_HTMLPluginContainer,
281 (void**)&container);
282 node_release(node);
283 if(FAILED(hres)) {
284 ERR("Not an object element\n");
285 return NPERR_GENERIC_ERROR;
286 }
287
288 if(!container->plugin_host) {
289 hres = create_plugin_host(window->doc, container);
290 if(FAILED(hres))
291 err = NPERR_GENERIC_ERROR;
292 }else {
293 TRACE("plugin host already associated.\n");
294 }
295
296 instance->pdata = container->plugin_host;
297
298 node_release(&container->element.node);
299 return err;
300 }
301
NPP_Destroy(NPP instance,NPSavedData ** save)302 static NPError CDECL NPP_Destroy(NPP instance, NPSavedData **save)
303 {
304 PluginHost *host = instance->pdata;
305
306 TRACE("(%p %p)\n", instance, save);
307
308 if(!host)
309 return NPERR_GENERIC_ERROR;
310
311 detach_plugin_host(host);
312 IOleClientSite_Release(&host->IOleClientSite_iface);
313 instance->pdata = NULL;
314 return NPERR_NO_ERROR;
315 }
316
NPP_SetWindow(NPP instance,NPWindow * window)317 static NPError CDECL NPP_SetWindow(NPP instance, NPWindow *window)
318 {
319 PluginHost *host = instance->pdata;
320 RECT pos_rect = {0, 0, window->width, window->height};
321
322 TRACE("(%p %p)\n", instance, window);
323
324 if(!host)
325 return NPERR_GENERIC_ERROR;
326
327 update_plugin_window(host, window->window, &pos_rect);
328 return NPERR_NO_ERROR;
329 }
330
NPP_NewStream(NPP instance,NPMIMEType type,NPStream * stream,NPBool seekable,UINT16 * stype)331 static NPError CDECL NPP_NewStream(NPP instance, NPMIMEType type, NPStream *stream, NPBool seekable, UINT16 *stype)
332 {
333 TRACE("\n");
334 return NPERR_GENERIC_ERROR;
335 }
336
NPP_DestroyStream(NPP instance,NPStream * stream,NPReason reason)337 static NPError CDECL NPP_DestroyStream(NPP instance, NPStream *stream, NPReason reason)
338 {
339 TRACE("\n");
340 return NPERR_GENERIC_ERROR;
341 }
342
NPP_WriteReady(NPP instance,NPStream * stream)343 static INT32 CDECL NPP_WriteReady(NPP instance, NPStream *stream)
344 {
345 TRACE("\n");
346 return NPERR_GENERIC_ERROR;
347 }
348
NPP_Write(NPP instance,NPStream * stream,INT32 offset,INT32 len,void * buffer)349 static INT32 CDECL NPP_Write(NPP instance, NPStream *stream, INT32 offset, INT32 len, void *buffer)
350 {
351 TRACE("\n");
352 return NPERR_GENERIC_ERROR;
353 }
354
NPP_StreamAsFile(NPP instance,NPStream * stream,const char * fname)355 static void CDECL NPP_StreamAsFile(NPP instance, NPStream *stream, const char *fname)
356 {
357 TRACE("\n");
358 }
359
NPP_Print(NPP instance,NPPrint * platformPrint)360 static void CDECL NPP_Print(NPP instance, NPPrint *platformPrint)
361 {
362 FIXME("\n");
363 }
364
NPP_HandleEvent(NPP instance,void * event)365 static INT16 CDECL NPP_HandleEvent(NPP instance, void *event)
366 {
367 TRACE("\n");
368 return NPERR_GENERIC_ERROR;
369 }
370
NPP_URLNotify(NPP instance,const char * url,NPReason reason,void * notifyData)371 static void CDECL NPP_URLNotify(NPP instance, const char *url, NPReason reason, void *notifyData)
372 {
373 TRACE("\n");
374 }
375
NPP_GetValue(NPP instance,NPPVariable variable,void * ret_value)376 static NPError CDECL NPP_GetValue(NPP instance, NPPVariable variable, void *ret_value)
377 {
378 TRACE("\n");
379 return NPERR_GENERIC_ERROR;
380 }
381
NPP_SetValue(NPP instance,NPNVariable variable,void * value)382 static NPError CDECL NPP_SetValue(NPP instance, NPNVariable variable, void *value)
383 {
384 TRACE("\n");
385 return NPERR_GENERIC_ERROR;
386 }
387
NPP_GotFocus(NPP instance,NPFocusDirection direction)388 static NPBool CDECL NPP_GotFocus(NPP instance, NPFocusDirection direction)
389 {
390 FIXME("\n");
391 return NPERR_GENERIC_ERROR;
392 }
393
NPP_LostFocus(NPP instance)394 static void CDECL NPP_LostFocus(NPP instance)
395 {
396 FIXME("\n");
397 }
398
399 /***********************************************************************
400 * NP_GetEntryPoints (mshtml.@)
401 */
NP_GetEntryPoints(NPPluginFuncs * funcs)402 NPError WINAPI NP_GetEntryPoints(NPPluginFuncs* funcs)
403 {
404 TRACE("(%p)\n", funcs);
405
406 funcs->version = (NP_VERSION_MAJOR << 8) | NP_VERSION_MINOR;
407 funcs->newp = NPP_New;
408 funcs->destroy = NPP_Destroy;
409 funcs->setwindow = NPP_SetWindow;
410 funcs->newstream = NPP_NewStream;
411 funcs->destroystream = NPP_DestroyStream;
412 funcs->asfile = NPP_StreamAsFile;
413 funcs->writeready = NPP_WriteReady;
414 funcs->write = NPP_Write;
415 funcs->print = NPP_Print;
416 funcs->event = NPP_HandleEvent;
417 funcs->urlnotify = NPP_URLNotify;
418 funcs->javaClass = NULL;
419 funcs->getvalue = NPP_GetValue;
420 funcs->setvalue = NPP_SetValue;
421 funcs->gotfocus = NPP_GotFocus;
422 funcs->lostfocus = NPP_LostFocus;
423
424 return NPERR_NO_ERROR;
425 }
426