2008-11-12 Tor Arne Vestbø <tavestbo@trolltech.com>
[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 PluginView : public Widget, private PluginStreamClient {
101     public:
102         static PluginView* create(Frame* parentFrame, const IntSize&, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
103         virtual ~PluginView();
104
105         PluginPackage* plugin() const { return m_plugin.get(); }
106         NPP instance() const { return m_instance; }
107
108         void setNPWindowRect(const IntRect&);
109         static PluginView* currentPluginView();
110
111         PassRefPtr<JSC::Bindings::Instance> bindingInstance();
112
113         PluginStatus status() const { return m_status; }
114
115         // NPN functions
116         NPError getURLNotify(const char* url, const char* target, void* notifyData);
117         NPError getURL(const char* url, const char* target);
118         NPError postURLNotify(const char* url, const char* target, uint32 len, const char* but, NPBool file, void* notifyData);
119         NPError postURL(const char* url, const char* target, uint32 len, const char* but, NPBool file);
120         NPError newStream(NPMIMEType type, const char* target, NPStream** stream);
121         int32 write(NPStream* stream, int32 len, void* buffer);
122         NPError destroyStream(NPStream* stream, NPReason reason);
123         const char* userAgent();
124 #if ENABLE(NETSCAPE_PLUGIN_API)
125         static const char* userAgentStatic();
126 #endif
127         void status(const char* message);
128         NPError getValue(NPNVariable variable, void* value);
129 #if ENABLE(NETSCAPE_PLUGIN_API)
130         static NPError getValueStatic(NPNVariable variable, void* value);
131 #endif
132         NPError setValue(NPPVariable variable, void* value);
133         void invalidateRect(NPRect*);
134         void invalidateRegion(NPRegion);
135         void forceRedraw();
136         void pushPopupsEnabledState(bool state);
137         void popPopupsEnabledState();
138
139         virtual void invalidateRect(const IntRect&);
140
141         bool arePopupsAllowed() const;
142
143         void setJavaScriptPaused(bool);
144
145         void disconnectStream(PluginStream*);
146         void streamDidFinishLoading(PluginStream* stream) { disconnectStream(stream); }
147
148         // Widget functions
149         virtual void setFrameRect(const IntRect&);
150         virtual void frameRectsChanged() const;
151         virtual void setFocus();
152         virtual void show();
153         virtual void hide();
154         virtual void paint(GraphicsContext*, const IntRect&);
155
156         // This method is used by plugins on all platforms to obtain a clip rect that includes clips set by WebCore,
157         // e.g., in overflow:auto sections.  The clip rects coordinates are in the containing window's coordinate space.
158         // This clip includes any clips that the widget itself sets up for its children.
159         IntRect windowClipRect() const;
160
161         virtual void handleEvent(Event*);
162         virtual void setParent(ScrollView*);
163         virtual void setParentVisible(bool);
164
165         virtual bool isPluginView() const { return true; }
166
167 #if PLATFORM(WIN_OS) && !PLATFORM(WX) && ENABLE(NETSCAPE_PLUGIN_API)
168         static LRESULT CALLBACK PluginViewWndProc(HWND, UINT, WPARAM, LPARAM);
169         LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
170         WNDPROC pluginWndProc() const { return m_pluginWndProc; }
171 #endif
172
173         // Used for manual loading
174         void didReceiveResponse(const ResourceResponse&);
175         void didReceiveData(const char*, int);
176         void didFinishLoading();
177         void didFail(const ResourceError&);
178
179         static bool isCallingPlugin();
180
181 #if PLATFORM(QT)
182         bool isNPAPIPlugin() const { return m_isNPAPIPlugin; }
183         void setIsNPAPIPlugin(bool b) { m_isNPAPIPlugin = b; }
184 #endif
185
186     private:
187         PluginView(Frame* parentFrame, const IntSize&, PluginPackage*, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
188
189         void setParameters(const Vector<String>& paramNames, const Vector<String>& paramValues);
190         void init();
191         bool start();
192         void stop();
193         static void setCurrentPluginView(PluginView*);
194         NPError load(const FrameLoadRequest&, bool sendNotification, void* notifyData);
195         NPError handlePost(const char* url, const char* target, uint32 len, const char* buf, bool file, void* notifyData, bool sendNotification, bool allowHeaders);
196         NPError handlePostReadFile(Vector<char>& buffer, uint32 len, const char* buf);
197         static void freeStringArray(char** stringArray, int length);
198         void setCallingPlugin(bool) const;
199
200         void invalidateWindowlessPluginRect(const IntRect&);
201         
202         Frame* m_parentFrame;
203         RefPtr<PluginPackage> m_plugin;
204         Element* m_element;
205         bool m_isStarted;
206         KURL m_url;
207         KURL m_baseURL;
208         PluginStatus m_status;
209         Vector<IntRect> m_invalidRects;
210
211         void performRequest(PluginRequest*);
212         void scheduleRequest(PluginRequest*);
213         void requestTimerFired(Timer<PluginView>*);
214         void invalidateTimerFired(Timer<PluginView>*);
215         Timer<PluginView> m_requestTimer;
216         Timer<PluginView> m_invalidateTimer;
217
218         void popPopupsStateTimerFired(Timer<PluginView>*);
219         Timer<PluginView> m_popPopupsStateTimer;
220
221 #ifndef NP_NO_CARBON
222         bool dispatchNPEvent(NPEvent&);
223 #endif
224         void updatePluginWidget() const;
225         void paintMissingPluginIcon(GraphicsContext*, const IntRect&);
226
227         void handleKeyboardEvent(KeyboardEvent*);
228         void handleMouseEvent(MouseEvent*);
229
230         int m_mode;
231         int m_paramCount;
232         char** m_paramNames;
233         char** m_paramValues;
234
235         CString m_mimeType;
236         CString m_userAgent;
237         
238         NPP m_instance;
239         NPP_t m_instanceStruct;
240         NPWindow m_npWindow;
241
242         Vector<bool, 4> m_popupStateStack;
243
244         HashSet<RefPtr<PluginStream> > m_streams;
245         Vector<PluginRequest*> m_requests;
246
247         bool m_isWindowed;
248         bool m_isTransparent;
249         bool m_haveInitialized;
250
251 #if PLATFORM(QT)
252         bool m_isNPAPIPlugin;
253 #endif
254
255 #if PLATFORM(GTK) || defined(Q_WS_X11)
256         bool m_needsXEmbed;
257 #endif
258
259 #if PLATFORM(WIN_OS) && !PLATFORM(WX) && ENABLE(NETSCAPE_PLUGIN_API)
260         OwnPtr<PluginMessageThrottlerWin> m_messageThrottler;
261         WNDPROC m_pluginWndProc;
262         unsigned m_lastMessage;
263         bool m_isCallingPluginWndProc;
264 #endif
265
266 #if (PLATFORM(QT) && PLATFORM(WIN_OS)) || defined(XP_MACOSX)
267         // On Mac OSX and Qt/Windows the plugin does not have its own native widget,
268         // but is using the containing window as its reference for positioning/painting.
269         PlatformPluginWidget m_window;
270 public:
271         PlatformPluginWidget platformPluginWidget() const { return m_window; }
272         void setPlatformPluginWidget(PlatformPluginWidget widget) { m_window = widget; }
273 #else
274 public:
275         PlatformPluginWidget platformPluginWidget() const { return platformWidget(); }
276 #endif
277
278 private:
279
280 #if defined(XP_MACOSX)
281         NP_CGContext m_npCgContext;
282         OwnPtr<Timer<PluginView> > m_nullEventTimer;
283
284         void setNPWindowIfNeeded();
285         void nullEventTimerFired(Timer<PluginView>*);
286         Point globalMousePosForPlugin() const;
287 #endif
288
289         mutable IntRect m_clipRect; // The clip rect to apply to a windowed plug-in
290         mutable IntRect m_windowRect; // Our window rect.
291
292         bool m_loadManually;
293         RefPtr<PluginStream> m_manualStream;
294
295         bool m_isJavaScriptPaused;
296
297         static PluginView* s_currentPluginView;
298     };
299
300 } // namespace WebCore
301
302 #endif