WebCore:
[WebKit-https.git] / WebKitTools / DumpRenderTree / win / TestNetscapePlugin / main.c
1 /*
2  * Copyright (C) 2007 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "PluginObject.h"
27
28 #include <stdio.h>
29
30 extern "C"
31 NPError __stdcall NP_Initialize(NPNetscapeFuncs* browserFuncs)
32 {
33     browser = browserFuncs;
34     return NPERR_NO_ERROR;
35 }
36
37 extern "C" 
38 NPError __stdcall NP_GetEntryPoints(NPPluginFuncs* pluginFuncs)
39 {
40     pluginFuncs->version = 11;
41     pluginFuncs->size = sizeof(pluginFuncs);
42     pluginFuncs->newp = NPP_New;
43     pluginFuncs->destroy = NPP_Destroy;
44     pluginFuncs->setwindow = NPP_SetWindow;
45     pluginFuncs->newstream = NPP_NewStream;
46     pluginFuncs->destroystream = NPP_DestroyStream;
47     pluginFuncs->asfile = NPP_StreamAsFile;
48     pluginFuncs->writeready = NPP_WriteReady;
49     pluginFuncs->write = (NPP_WriteProcPtr)NPP_Write;
50     pluginFuncs->print = NPP_Print;
51     pluginFuncs->event = NPP_HandleEvent;
52     pluginFuncs->urlnotify = NPP_URLNotify;
53     pluginFuncs->getvalue = NPP_GetValue;
54     pluginFuncs->setvalue = NPP_SetValue;
55     
56     return NPERR_NO_ERROR;
57 }
58
59
60 extern "C"
61 NPError __stdcall NP_Shutdown()
62 {
63     return NPERR_NO_ERROR;
64 }
65
66
67 NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16 mode, int16 argc, char *argn[], char *argv[], NPSavedData *saved)
68 {
69     if (browser->version >= 14) {
70         PluginObject* obj = (PluginObject*)browser->createobject(instance, getPluginClass());
71     
72         obj->onStreamLoad = NULL;
73         
74         for (int16 i = 0; i < argc; i++) {
75             if (_stricmp(argn[i], "onstreamload") == 0 && !obj->onStreamLoad)
76                 obj->onStreamLoad = _strdup(argv[i]);
77         }
78         
79         instance->pdata = obj;
80     }
81     
82     return NPERR_NO_ERROR;
83 }
84
85 NPError NPP_Destroy(NPP instance, NPSavedData **save)
86 {
87     PluginObject *obj = (PluginObject*)instance->pdata;
88     if (obj) {
89         if (obj->onStreamLoad)
90             free(obj->onStreamLoad);
91         
92         if (obj->logDestroy)
93             printf("PLUGIN: NPP_Destroy\n");
94
95         browser->releaseobject(&obj->header);
96     }
97     return NPERR_NO_ERROR;
98 }
99
100 NPError NPP_SetWindow(NPP instance, NPWindow *window)
101 {
102     return NPERR_NO_ERROR;
103 }
104
105 NPError NPP_NewStream(NPP instance, NPMIMEType type, NPStream *stream, NPBool seekable, uint16 *stype)
106 {
107     PluginObject* obj = (PluginObject*)instance->pdata;
108     obj->stream = stream;
109     *stype = NP_ASFILEONLY;
110
111     if (obj->onStreamLoad) {
112         NPObject *windowScriptObject;
113         browser->getvalue(obj->npp, NPNVWindowNPObject, &windowScriptObject);
114                 
115         NPString script;
116         script.UTF8Characters = obj->onStreamLoad;
117         script.UTF8Length = strlen(obj->onStreamLoad);
118         
119         NPVariant browserResult;
120         browser->evaluate(obj->npp, windowScriptObject, &script, &browserResult);
121         browser->releasevariantvalue(&browserResult);
122     }
123     
124     return NPERR_NO_ERROR;
125 }
126
127 NPError NPP_DestroyStream(NPP instance, NPStream *stream, NPReason reason)
128 {
129     return NPERR_NO_ERROR;
130 }
131
132 int32 NPP_WriteReady(NPP instance, NPStream *stream)
133 {
134     return 0;
135 }
136
137 int32 NPP_Write(NPP instance, NPStream *stream, int32 offset, int32 len, void *buffer)
138 {
139     return 0;
140 }
141
142 void NPP_StreamAsFile(NPP instance, NPStream *stream, const char *fname)
143 {
144 }
145
146 void NPP_Print(NPP instance, NPPrint *platformPrint)
147 {
148 }
149
150 int16 NPP_HandleEvent(NPP instance, void *event)
151 {
152     PluginObject *obj = (PluginObject*)instance->pdata;
153     if (!obj->eventLogging)
154         return 0;
155     
156     // FIXME: Implement this
157     return 0;
158 }
159
160 void NPP_URLNotify(NPP instance, const char *url, NPReason reason, void *notifyData)
161 {
162     PluginObject *obj = (PluginObject*)instance->pdata;
163         
164     handleCallback(obj, url, reason, notifyData);
165 }
166
167 NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value)
168 {
169     if (variable == NPPVpluginScriptableNPObject) {
170         void **v = (void **)value;
171         PluginObject *obj = (PluginObject*)instance->pdata;
172         // Return value is expected to be retained
173         browser->retainobject((NPObject *)obj);
174         *v = obj;
175         return NPERR_NO_ERROR;
176     }
177     return NPERR_GENERIC_ERROR;
178 }
179
180 NPError NPP_SetValue(NPP instance, NPNVariable variable, void *value)
181 {
182     return NPERR_GENERIC_ERROR;
183 }