83dd3fb7435716811b3ef482d8f9143d999b5df4
[WebKit-https.git] / Source / WebKit2 / PluginProcess / PluginControllerProxy.h
1 /*
2  * Copyright (C) 2010 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef PluginControllerProxy_h
27 #define PluginControllerProxy_h
28
29 #if ENABLE(PLUGIN_PROCESS)
30
31 #include "Connection.h"
32 #include "Plugin.h"
33 #include "PluginController.h"
34 #include "PluginControllerProxyMessages.h"
35 #include "ShareableBitmap.h"
36 #include "WebProcessConnectionMessages.h"
37 #include <WebCore/RunLoop.h>
38 #include <WebCore/SecurityOrigin.h>
39 #include <wtf/Noncopyable.h>
40
41 namespace CoreIPC {
42     class DataReference;
43 }
44
45 namespace WebKit {
46
47 class LayerHostingContext;
48 class ShareableBitmap;
49 class WebProcessConnection;
50 struct PluginCreationParameters;
51
52 class PluginControllerProxy : PluginController {
53     WTF_MAKE_NONCOPYABLE(PluginControllerProxy);
54
55 public:
56     static PassOwnPtr<PluginControllerProxy> create(WebProcessConnection*, const PluginCreationParameters&);
57     ~PluginControllerProxy();
58
59     uint64_t pluginInstanceID() const { return m_pluginInstanceID; }
60
61     bool initialize(const PluginCreationParameters&);
62     void destroy();
63
64     void didReceivePluginControllerProxyMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*);
65     void didReceiveSyncPluginControllerProxyMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::ArgumentDecoder*, OwnPtr<CoreIPC::ArgumentEncoder>&);
66
67     bool wantsWheelEvents() const;
68
69 #if PLATFORM(MAC)
70     uint32_t remoteLayerClientID() const;
71 #endif
72
73     PluginController* asPluginController() { return this; }
74
75     bool isInitializing() const { return m_isInitializing; }
76     
77     void setInitializationReply(PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply>);
78     PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> takeInitializationReply();
79
80 private:
81     PluginControllerProxy(WebProcessConnection*, const PluginCreationParameters&);
82
83     void startPaintTimer();
84     void paint();
85
86     // PluginController
87     virtual bool isPluginVisible();
88     virtual void invalidate(const WebCore::IntRect&);
89     virtual String userAgent();
90     virtual void loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, const WebCore::HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups);
91     virtual void cancelStreamLoad(uint64_t streamID);
92     virtual void cancelManualStreamLoad();
93     virtual NPObject* windowScriptNPObject();
94     virtual NPObject* pluginElementNPObject();
95     virtual bool evaluate(NPObject*, const String& scriptString, NPVariant* result, bool allowPopups);
96     virtual void setStatusbarText(const String&);
97     virtual bool isAcceleratedCompositingEnabled();
98     virtual void pluginProcessCrashed();
99     virtual void willSendEventToPlugin();
100     virtual void didInitializePlugin() OVERRIDE;
101     virtual void didFailToInitializePlugin() OVERRIDE;
102
103 #if PLATFORM(MAC)
104     virtual void pluginFocusOrWindowFocusChanged(bool);
105     virtual void setComplexTextInputState(PluginComplexTextInputState);
106     virtual mach_port_t compositingRenderServerPort();
107 #endif
108
109     virtual float contentsScaleFactor();
110     virtual String proxiesForURL(const String&);
111     virtual String cookiesForURL(const String&);
112     virtual void setCookiesForURL(const String& urlString, const String& cookieString);
113     virtual bool isPrivateBrowsingEnabled();
114     virtual bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password);
115     virtual void protectPluginFromDestruction();
116     virtual void unprotectPluginFromDestruction();
117 #if PLUGIN_ARCHITECTURE(X11)
118     virtual uint64_t createPluginContainer();
119     virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID);
120 #endif
121     
122     // Message handlers.
123     void frameDidFinishLoading(uint64_t requestID);
124     void frameDidFail(uint64_t requestID, bool wasCancelled);
125     void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform, float contentsScaleFactor, const ShareableBitmap::Handle& backingStoreHandle);
126     void didEvaluateJavaScript(uint64_t requestID, const String& result);
127     void streamDidReceiveResponse(uint64_t streamID, const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers);
128     void streamDidReceiveData(uint64_t streamID, const CoreIPC::DataReference& data);
129     void streamDidFinishLoading(uint64_t streamID);
130     void streamDidFail(uint64_t streamID, bool wasCancelled);
131     void manualStreamDidReceiveResponse(const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers);
132     void manualStreamDidReceiveData(const CoreIPC::DataReference& data);
133     void manualStreamDidFinishLoading();
134     void manualStreamDidFail(bool wasCancelled);
135     void handleMouseEvent(const WebMouseEvent&, PassRefPtr<Messages::PluginControllerProxy::HandleMouseEvent::DelayedReply>);
136     void handleWheelEvent(const WebWheelEvent&, bool& handled);
137     void handleMouseEnterEvent(const WebMouseEvent&, bool& handled);
138     void handleMouseLeaveEvent(const WebMouseEvent&, bool& handled);
139     void handleKeyboardEvent(const WebKeyboardEvent&, bool& handled);
140     void handleEditingCommand(const String&, const String&, bool&);
141     void isEditingCommandEnabled(const String&, bool&);
142     void handlesPageScaleFactor(bool&);
143     void paintEntirePlugin();
144     void snapshot(ShareableBitmap::Handle& backingStoreHandle);
145     void setFocus(bool);
146     void didUpdate();
147     void getPluginScriptableNPObject(uint64_t& pluginScriptableNPObjectID);
148
149 #if PLATFORM(MAC)
150     void windowFocusChanged(bool);
151     void windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates);
152     void windowVisibilityChanged(bool);
153     void sendComplexTextInput(const String& textInput);
154     void setLayerHostingMode(uint32_t);
155
156     void updateLayerHostingContext(LayerHostingMode);
157 #endif
158
159     void storageBlockingStateChanged(bool);
160     void privateBrowsingStateChanged(bool);
161     void getFormValue(bool& returnValue, String& formValue);
162
163     void platformInitialize(const PluginCreationParameters&);
164     void platformDestroy();
165     void platformGeometryDidChange();
166
167     WebProcessConnection* m_connection;
168     uint64_t m_pluginInstanceID;
169
170     String m_userAgent;
171     bool m_storageBlockingEnabled;
172     bool m_isPrivateBrowsingEnabled;
173     bool m_isAcceleratedCompositingEnabled;
174     bool m_isInitializing;
175
176     RefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> m_initializationReply;
177
178     RefPtr<Plugin> m_plugin;
179
180     WebCore::IntSize m_pluginSize;
181
182     // The dirty rect in plug-in coordinates.
183     WebCore::IntRect m_dirtyRect;
184
185     // The paint timer, used for coalescing painting.
186     WebCore::RunLoop::Timer<PluginControllerProxy> m_paintTimer;
187     
188     // A counter used to prevent the plug-in from being destroyed.
189     unsigned m_pluginDestructionProtectCount;
190
191     // A timer that we use to prevent destruction of the plug-in while plug-in
192     // code is on the stack.
193     WebCore::RunLoop::Timer<PluginControllerProxy> m_pluginDestroyTimer;
194
195     // Whether we're waiting for the plug-in proxy in the web process to draw the contents of its
196     // backing store into the web process backing store.
197     bool m_waitingForDidUpdate;
198
199     // Whether the plug-in has canceled the manual stream load.
200     bool m_pluginCanceledManualStreamLoad;
201
202 #if PLATFORM(MAC)
203     // Whether complex text input is enabled for this plug-in.
204     bool m_isComplexTextInputEnabled;
205
206     // For CA plug-ins, this holds the information needed to export the layer hierarchy to the UI process.
207     OwnPtr<LayerHostingContext> m_layerHostingContext;
208 #endif
209
210     // The contents scale factor of this plug-in.
211     float m_contentsScaleFactor;
212     
213     // The backing store that this plug-in draws into.
214     RefPtr<ShareableBitmap> m_backingStore;
215
216     // The window NPObject.
217     NPObject* m_windowNPObject;
218
219     // The plug-in element NPObject.
220     NPObject* m_pluginElementNPObject;
221 };
222
223 } // namespace WebKit
224
225 #endif // ENABLE(PLUGIN_PROCESS)
226
227 #endif // PluginControllerProxy_h