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