Fix <rdar://5517707> Crash on wptv.wp.pl when "make bigger" button is clicked
[WebKit-https.git] / WebCore / plugins / win / PluginViewWin.h
1 /*
2  * Copyright (C) 2006, 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 COMPUTER, 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 COMPUTER, 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 #ifndef PluginViewWin_H
27 #define PluginViewWin_H
28
29 #include <winsock2.h>
30 #include <windows.h>
31
32 #include "CString.h"
33 #include "IntRect.h"
34 #include "KURL.h"
35 #include "PlatformString.h"
36 #include "ResourceRequest.h"
37 #include "Timer.h"
38 #include "Widget.h"
39 #include "npapi.h"
40 #include <wtf/HashMap.h>
41 #include <wtf/HashSet.h>
42 #include <wtf/OwnPtr.h>
43 #include <wtf/RefPtr.h>
44 #include <wtf/Vector.h>
45
46 namespace KJS {
47     namespace Bindings {
48         class Instance;
49     }
50 }
51
52 namespace WebCore {
53     class Element;
54     class Frame;
55     struct FrameLoadRequest;
56     class KeyboardEvent;
57     class MouseEvent;
58     class KURL;
59     class PluginMessageThrottlerWin;
60     class PluginPackageWin;
61     class PluginRequestWin;
62     class PluginStreamWin;
63     class ResourceError;
64     class ResourceResponse;
65     
66     enum PluginQuirks {
67         PluginQuirkWantsMozillaUserAgent = 1 << 0,
68         PluginQuirkDeferFirstSetWindowCall = 1 << 1,
69         PluginQuirkThrottleInvalidate = 1 << 2, 
70         PluginQuirkRemoveWindowlessVideoParam = 1 << 3,
71         PluginQuirkThrottleWMUserPlusOneMessages = 1 << 4,
72         PluginQuirkDontUnloadPlugin = 1 << 5,
73         PluginQuirkDontCallWndProcForSameMessageRecursively = 1 << 6,
74         PluginQuirkHasModalMessageLoop = 1 << 7
75     };
76
77     enum PluginStatus {
78         PluginStatusCanNotFindPlugin,
79         PluginStatusCanNotLoadPlugin,
80         PluginStatusLoadedSuccessfully
81     };
82
83     class PluginViewWin : public Widget {
84     friend static LRESULT CALLBACK PluginViewWndProc(HWND, UINT, WPARAM, LPARAM);
85
86     public:
87         PluginViewWin(Frame* parentFrame, const IntSize&, PluginPackageWin* plugin, Element*, const KURL&, const Vector<String>& paramNames, const Vector<String>& paramValues, const String& mimeType, bool loadManually);
88         virtual ~PluginViewWin();
89
90         PluginPackageWin* plugin() const { return m_plugin.get(); }
91         NPP instance() const { return m_instance; }
92
93         void setNPWindowRect(const IntRect&);
94         static PluginViewWin* currentPluginView();
95
96         KJS::Bindings::Instance* bindingInstance();
97
98         PluginStatus status() const { return m_status; }
99
100         // NPN functions
101         NPError getURLNotify(const char* url, const char* target, void* notifyData);
102         NPError getURL(const char* url, const char* target);
103         NPError postURLNotify(const char* url, const char* target, uint32 len, const char* but, NPBool file, void* notifyData);
104         NPError postURL(const char* url, const char* target, uint32 len, const char* but, NPBool file);
105         NPError newStream(NPMIMEType type, const char* target, NPStream** stream);
106         int32 write(NPStream* stream, int32 len, void* buffer);
107         NPError destroyStream(NPStream* stream, NPReason reason);
108         const char* userAgent();
109         void status(const char* message);
110         NPError getValue(NPNVariable variable, void* value);
111         NPError setValue(NPPVariable variable, void* value);
112         void invalidateRect(NPRect*);
113         void invalidateRegion(NPRegion);
114         void forceRedraw();
115         void pushPopupsEnabledState(bool state);
116         void popPopupsEnabledState();
117
118         bool arePopupsAllowed() const;
119
120         void disconnectStream(PluginStreamWin*);
121
122         // Widget functions
123         virtual void setFrameGeometry(const IntRect&);
124         virtual void geometryChanged() const;
125         virtual void setFocus();
126         virtual void show();
127         virtual void hide();
128         virtual void paint(GraphicsContext*, const IntRect&);
129         virtual IntRect windowClipRect() const;
130         virtual void handleEvent(Event*);
131         virtual void setParent(ScrollView*);
132
133         virtual void attachToWindow();
134         virtual void detachFromWindow();
135
136         LRESULT wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
137         WNDPROC pluginWndProc() const { return m_pluginWndProc; }
138
139         // Used for manual loading
140         void didReceiveResponse(const ResourceResponse&);
141         void didReceiveData(const char*, int);
142         void didFinishLoading();
143         void didFail(const ResourceError&);
144
145         static bool isCallingPlugin();
146
147     private:
148         void setParameters(const Vector<String>& paramNames, const Vector<String>& paramValues);
149         void init();
150         bool start();
151         void stop();
152         static void setCurrentPluginView(PluginViewWin*);
153         NPError load(const FrameLoadRequest&, bool sendNotification, void* notifyData);
154         NPError handlePost(const char* url, const char* target, uint32 len, const char* buf, bool file, void* notifyData, bool sendNotification, bool allowHeaders);
155         void setCallingPlugin(bool) const;
156         RefPtr<PluginPackageWin> m_plugin;
157         Element* m_element;
158         Frame* m_parentFrame;
159         bool m_isStarted;
160         KURL m_url;
161         KURL m_baseURL;
162         PluginStatus m_status;
163         Vector<IntRect> m_invalidRects;
164
165         void performRequest(PluginRequestWin*);
166         void scheduleRequest(PluginRequestWin*);
167         void requestTimerFired(Timer<PluginViewWin>*);
168         void invalidateTimerFired(Timer<PluginViewWin>*);
169         Timer<PluginViewWin> m_requestTimer;
170         Timer<PluginViewWin> m_invalidateTimer;
171
172         void popPopupsStateTimerFired(Timer<PluginViewWin>*);
173         Timer<PluginViewWin> m_popPopupsStateTimer;
174
175         bool dispatchNPEvent(NPEvent*);
176         OwnPtr<PluginMessageThrottlerWin> m_messageThrottler;
177
178         void updateWindow() const;
179         void determineQuirks(const String& mimeType);
180         void paintMissingPluginIcon(GraphicsContext*, const IntRect&);
181
182         void handleKeyboardEvent(KeyboardEvent*);
183         void handleMouseEvent(MouseEvent*);
184
185         int m_mode;
186         int m_paramCount;
187         char** m_paramNames;
188         char** m_paramValues;
189
190         CString m_mimeType;
191         CString m_userAgent;
192         
193         NPP m_instance;
194         NPP_t m_instanceStruct;
195         NPWindow m_npWindow;
196
197         Vector<bool, 4> m_popupStateStack;
198
199         HashSet<RefPtr<PluginStreamWin> > m_streams;
200         Vector<PluginRequestWin*> m_requests;
201
202         int m_quirks;
203         bool m_isWindowed;
204         bool m_isTransparent;
205         bool m_isVisible;
206         bool m_attachedToWindow;
207         bool m_haveInitialized;
208
209         WNDPROC m_pluginWndProc;
210         HWND m_window; // for windowed plug-ins
211         mutable IntRect m_clipRect; // The clip rect to apply to a windowed plug-in
212         mutable IntRect m_windowRect; // Our window rect.
213
214         unsigned m_lastMessage;
215         bool m_isCallingPluginWndProc;
216
217         bool m_loadManually;
218         RefPtr<PluginStreamWin> m_manualStream;
219
220         static PluginViewWin* s_currentPluginView;
221     };
222
223 } // namespace WebCore
224
225 #endif