f9fb2857f8581efa0a026759b5f35bee509dfb50
[WebKit-https.git] / WebCore / plugins / PluginView.h
1 /*
2  * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Collabora Ltd. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #ifndef PluginView_H
28 #define PluginView_H
29
30 #include "CString.h"
31 #include "FrameLoadRequest.h"
32 #include "IntRect.h"
33 #include "KURL.h"
34 #include "PlatformString.h"
35 #include "PluginStream.h"
36 #include "ResourceRequest.h"
37 #include "Timer.h"
38 #include "Widget.h"
39 #include "npruntime_internal.h"
40 #include <wtf/HashMap.h>
41 #include <wtf/HashSet.h>
42 #include <wtf/OwnPtr.h>
43 #include <wtf/PassRefPtr.h>
44 #include <wtf/RefPtr.h>
45 #include <wtf/Vector.h>
46
47 #if PLATFORM(WIN_OS) && PLATFORM(QT)
48 typedef struct HWND__* HWND;
49 typedef HWND PlatformPluginWidget;
50 #else
51 typedef PlatformWidget PlatformPluginWidget;
52 #endif
53
54 namespace JSC {
55     namespace Bindings {
56         class Instance;
57     }
58 }
59
60 namespace WebCore {
61     class Element;
62     class Frame;
63     class KeyboardEvent;
64     class MouseEvent;
65     class KURL;
66 #if PLATFORM(WIN_OS) && !PLATFORM(WX) && ENABLE(NETSCAPE_PLUGIN_API)
67     class PluginMessageThrottlerWin;
68 #endif
69     class PluginPackage;
70     class PluginRequest;
71     class PluginStream;
72     class ResourceError;
73     class ResourceResponse;
74
75     enum PluginStatus {
76         PluginStatusCanNotFindPlugin,
77         PluginStatusCanNotLoadPlugin,
78         PluginStatusLoadedSuccessfully
79     };
80
81     class PluginRequest {
82     public:
83         PluginRequest(const FrameLoadRequest& frameLoadRequest, bool sendNotification, void* notifyData, bool shouldAllowPopups)
84             : m_frameLoadRequest(frameLoadRequest)
85             , m_notifyData(notifyData)
86             , m_sendNotification(sendNotification)
87             , m_shouldAllowPopups(shouldAllowPopups) { }
88     public:
89         const FrameLoadRequest& frameLoadRequest() const { return m_frameLoadRequest; }
90         void* notifyData() const { return m_notifyData; }
91         bool sendNotification() const { return m_sendNotification; }
92         bool shouldAllowPopups() const { return m_shouldAllowPopups; }
93     private:
94         FrameLoadRequest m_frameLoadRequest;
95         void* m_notifyData;
96         bool m_sendNotification;
97         bool m_shouldAllowPopups;
98     };
99
100     class PluginManualLoader {
101     public:
102         virtual ~PluginManualLoader() {}
103         virtual void didReceiveResponse(const ResourceResponse&) = 0;
104         virtual void didReceiveData(const char*, int) = 0;
105         virtual void didFinishLoading() = 0;
106         virtual void didFail(const ResourceError&) = 0;
107     };
108
109     class PluginView : public Widget, private PluginStreamClient, public PluginManualLoader {
110     public:
111         static PluginView* create(Frame* parentFrame, const IntSize&, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
112         virtual ~PluginView();
113
114         PluginPackage* plugin() const { return m_plugin.get(); }
115         NPP instance() const { return m_instance; }
116
117         void setNPWindowRect(const IntRect&);
118         static PluginView* currentPluginView();
119
120         PassRefPtr<JSC::Bindings::Instance> bindingInstance();
121
122         PluginStatus status() const { return m_status; }
123
124         // NPN functions
125         NPError getURLNotify(const char* url, const char* target, void* notifyData);
126         NPError getURL(const char* url, const char* target);
127         NPError postURLNotify(const char* url, const char* target, uint32 len, const char* but, NPBool file, void* notifyData);
128         NPError postURL(const char* url, const char* target, uint32 len, const char* but, NPBool file);
129         NPError newStream(NPMIMEType type, const char* target, NPStream** stream);
130         int32 write(NPStream* stream, int32 len, void* buffer);
131         NPError destroyStream(NPStream* stream, NPReason reason);
132         const char* userAgent();
133 #if ENABLE(NETSCAPE_PLUGIN_API)
134         static const char* userAgentStatic();
135 #endif
136         void status(const char* message);
137         NPError getValue(NPNVariable variable, void* value);
138 #if ENABLE(NETSCAPE_PLUGIN_API)
139         static NPError getValueStatic(NPNVariable variable, void* value);
140 #endif
141         NPError setValue(NPPVariable variable, void* value);
142         void invalidateRect(NPRect*);
143         void invalidateRegion(NPRegion);
144         void forceRedraw();
145         void pushPopupsEnabledState(bool state);
146         void popPopupsEnabledState();
147
148         virtual void invalidateRect(const IntRect&);
149
150         bool arePopupsAllowed() const;
151
152         void setJavaScriptPaused(bool);
153
154         void disconnectStream(PluginStream*);
155         void streamDidFinishLoading(PluginStream* stream) { disconnectStream(stream); }
156
157         // Widget functions
158         virtual void setFrameRect(const IntRect&);
159         virtual void frameRectsChanged();
160         virtual void setFocus();
161         virtual void show();
162         virtual void hide();
163         virtual void paint(GraphicsContext*, const IntRect&);
164
165         // This method is used by plugins on all platforms to obtain a clip rect that includes clips set by WebCore,
166         // e.g., in overflow:auto sections.  The clip rects coordinates are in the containing window's coordinate space.
167         // This clip includes any clips that the widget itself sets up for its children.
168         IntRect windowClipRect() const;
169
170         virtual void handleEvent(Event*);
171         virtual void setParent(ScrollView*);
172         virtual void setParentVisible(bool);
173
174         virtual bool isPluginView() const { return true; }
175
176 #if PLATFORM(WIN_OS) && !PLATFORM(WX) && ENABLE(NETSCAPE_PLUGIN_API)
177         static LRESULT CALLBACK PluginViewWndProc(HWND, UINT, WPARAM, LPARAM);
178         LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
179         WNDPROC pluginWndProc() const { return m_pluginWndProc; }
180 #endif
181
182         // Used for manual loading
183         void didReceiveResponse(const ResourceResponse&);
184         void didReceiveData(const char*, int);
185         void didFinishLoading();
186         void didFail(const ResourceError&);
187
188         static bool isCallingPlugin();
189
190 #if PLATFORM(QT)
191         bool isNPAPIPlugin() const { return m_isNPAPIPlugin; }
192         void setIsNPAPIPlugin(bool b) { m_isNPAPIPlugin = b; }
193 #endif
194
195     private:
196         PluginView(Frame* parentFrame, const IntSize&, PluginPackage*, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
197
198         void setParameters(const Vector<String>& paramNames, const Vector<String>& paramValues);
199         void init();
200         bool start();
201         void stop();
202         static void setCurrentPluginView(PluginView*);
203         NPError load(const FrameLoadRequest&, bool sendNotification, void* notifyData);
204         NPError handlePost(const char* url, const char* target, uint32 len, const char* buf, bool file, void* notifyData, bool sendNotification, bool allowHeaders);
205         NPError handlePostReadFile(Vector<char>& buffer, uint32 len, const char* buf);
206         static void freeStringArray(char** stringArray, int length);
207         void setCallingPlugin(bool) const;
208
209         void invalidateWindowlessPluginRect(const IntRect&);
210
211 #if PLATFORM(WIN_OS) && !PLATFORM(WX) && ENABLE(NETSCAPE_PLUGIN_API)
212         void paintWindowedPluginIntoContext(GraphicsContext*, const IntRect&) const;
213         static HDC WINAPI hookedBeginPaint(HWND, PAINTSTRUCT*);
214         static BOOL WINAPI hookedEndPaint(HWND, const PAINTSTRUCT*);
215 #endif
216
217         Frame* m_parentFrame;
218         RefPtr<PluginPackage> m_plugin;
219         Element* m_element;
220         bool m_isStarted;
221         KURL m_url;
222         KURL m_baseURL;
223         PluginStatus m_status;
224         Vector<IntRect> m_invalidRects;
225
226         void performRequest(PluginRequest*);
227         void scheduleRequest(PluginRequest*);
228         void requestTimerFired(Timer<PluginView>*);
229         void invalidateTimerFired(Timer<PluginView>*);
230         Timer<PluginView> m_requestTimer;
231         Timer<PluginView> m_invalidateTimer;
232
233         void popPopupsStateTimerFired(Timer<PluginView>*);
234         Timer<PluginView> m_popPopupsStateTimer;
235
236 #ifndef NP_NO_CARBON
237         bool dispatchNPEvent(NPEvent&);
238 #endif
239         void updatePluginWidget();
240         void paintMissingPluginIcon(GraphicsContext*, const IntRect&);
241
242         void handleKeyboardEvent(KeyboardEvent*);
243         void handleMouseEvent(MouseEvent*);
244
245         int m_mode;
246         int m_paramCount;
247         char** m_paramNames;
248         char** m_paramValues;
249
250         CString m_mimeType;
251         CString m_userAgent;
252         
253         NPP m_instance;
254         NPP_t m_instanceStruct;
255         NPWindow m_npWindow;
256
257         Vector<bool, 4> m_popupStateStack;
258
259         HashSet<RefPtr<PluginStream> > m_streams;
260         Vector<PluginRequest*> m_requests;
261
262         bool m_isWindowed;
263         bool m_isTransparent;
264         bool m_haveInitialized;
265
266 #if PLATFORM(QT)
267         bool m_isNPAPIPlugin;
268 #endif
269
270 #if PLATFORM(GTK) || defined(Q_WS_X11)
271         bool m_needsXEmbed;
272 #endif
273
274 #if PLATFORM(WIN_OS) && !PLATFORM(WX) && ENABLE(NETSCAPE_PLUGIN_API)
275         OwnPtr<PluginMessageThrottlerWin> m_messageThrottler;
276         WNDPROC m_pluginWndProc;
277         unsigned m_lastMessage;
278         bool m_isCallingPluginWndProc;
279         HDC m_wmPrintHDC;
280 #endif
281
282 #if (PLATFORM(QT) && PLATFORM(WIN_OS)) || defined(XP_MACOSX)
283         // On Mac OSX and Qt/Windows the plugin does not have its own native widget,
284         // but is using the containing window as its reference for positioning/painting.
285         PlatformPluginWidget m_window;
286 public:
287         PlatformPluginWidget platformPluginWidget() const { return m_window; }
288         void setPlatformPluginWidget(PlatformPluginWidget widget) { m_window = widget; }
289 #else
290 public:
291         PlatformPluginWidget platformPluginWidget() const { return platformWidget(); }
292 #endif
293
294 private:
295
296 #if defined(XP_MACOSX)
297         NP_CGContext m_npCgContext;
298         OwnPtr<Timer<PluginView> > m_nullEventTimer;
299
300         void setNPWindowIfNeeded();
301         void nullEventTimerFired(Timer<PluginView>*);
302         Point globalMousePosForPlugin() const;
303 #endif
304
305         IntRect m_clipRect; // The clip rect to apply to a windowed plug-in
306         IntRect m_windowRect; // Our window rect.
307
308         bool m_loadManually;
309         RefPtr<PluginStream> m_manualStream;
310
311         bool m_isJavaScriptPaused;
312
313         static PluginView* s_currentPluginView;
314     };
315
316 } // namespace WebCore
317
318 #endif