Simplify visibility activity accounting for plugins
[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(NETSCAPE_PLUGIN_API)
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/SecurityOrigin.h>
38 #include <WebCore/UserActivity.h>
39 #include <wtf/Noncopyable.h>
40 #include <wtf/RunLoop.h>
41
42 namespace IPC {
43     class DataReference;
44 }
45
46 namespace WebKit {
47
48 class LayerHostingContext;
49 class ShareableBitmap;
50 class WebProcessConnection;
51 struct PluginCreationParameters;
52
53 class PluginControllerProxy : PluginController {
54     WTF_MAKE_NONCOPYABLE(PluginControllerProxy);
55
56 public:
57     PluginControllerProxy(WebProcessConnection*, const PluginCreationParameters&);
58     ~PluginControllerProxy();
59
60     uint64_t pluginInstanceID() const { return m_pluginInstanceID; }
61
62     bool initialize(const PluginCreationParameters&);
63     void destroy();
64
65     void didReceivePluginControllerProxyMessage(IPC::Connection*, IPC::MessageDecoder&);
66     void didReceiveSyncPluginControllerProxyMessage(IPC::Connection*, IPC::MessageDecoder&, std::unique_ptr<IPC::MessageEncoder>&);
67
68     bool wantsWheelEvents() const;
69
70 #if PLATFORM(COCOA)
71     uint32_t remoteLayerClientID() const;
72 #endif
73
74     PluginController* asPluginController() { return this; }
75
76     bool isInitializing() const { return m_isInitializing; }
77     
78     void setInitializationReply(PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply>);
79     PassRefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> takeInitializationReply();
80
81 private:
82     void startPaintTimer();
83     void paint();
84
85     // PluginController
86     virtual bool isPluginVisible() override;
87     virtual void invalidate(const WebCore::IntRect&) override;
88     virtual String userAgent() override;
89     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) override;
90     virtual void cancelStreamLoad(uint64_t streamID) override;
91     virtual void cancelManualStreamLoad() override;
92     virtual NPObject* windowScriptNPObject() override;
93     virtual NPObject* pluginElementNPObject() override;
94     virtual bool evaluate(NPObject*, const String& scriptString, NPVariant* result, bool allowPopups) override;
95     virtual void setStatusbarText(const String&) override;
96     virtual bool isAcceleratedCompositingEnabled() override;
97     virtual void pluginProcessCrashed() override;
98     virtual void willSendEventToPlugin() override;
99     virtual void didInitializePlugin() override;
100     virtual void didFailToInitializePlugin() override;
101
102 #if PLATFORM(COCOA)
103     virtual void pluginFocusOrWindowFocusChanged(bool) override;
104     virtual void setComplexTextInputState(PluginComplexTextInputState) override;
105     virtual mach_port_t compositingRenderServerPort() override;
106     virtual void openPluginPreferencePane() override;
107 #endif
108
109     virtual float contentsScaleFactor() override;
110     virtual String proxiesForURL(const String&) override;
111     virtual String cookiesForURL(const String&) override;
112     virtual void setCookiesForURL(const String& urlString, const String& cookieString) override;
113     virtual bool isPrivateBrowsingEnabled() override;
114     virtual bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password) override;
115     virtual void protectPluginFromDestruction() override;
116     virtual void unprotectPluginFromDestruction() override;
117 #if PLUGIN_ARCHITECTURE(X11)
118     virtual uint64_t createPluginContainer() override;
119     virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID) override;
120     virtual void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID) override;
121 #endif
122     
123     // Message handlers.
124     void frameDidFinishLoading(uint64_t requestID);
125     void frameDidFail(uint64_t requestID, bool wasCancelled);
126     void geometryDidChange(const WebCore::IntSize& pluginSize, const WebCore::IntRect& clipRect, const WebCore::AffineTransform& pluginToRootViewTransform, float contentsScaleFactor, const ShareableBitmap::Handle& backingStoreHandle);
127     void visibilityDidChange(bool isVisible);
128     void didEvaluateJavaScript(uint64_t requestID, const String& result);
129     void streamDidReceiveResponse(uint64_t streamID, const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers);
130     void streamDidReceiveData(uint64_t streamID, const IPC::DataReference& data);
131     void streamDidFinishLoading(uint64_t streamID);
132     void streamDidFail(uint64_t streamID, bool wasCancelled);
133     void manualStreamDidReceiveResponse(const String& responseURLString, uint32_t streamLength, uint32_t lastModifiedTime, const String& mimeType, const String& headers);
134     void manualStreamDidReceiveData(const IPC::DataReference& data);
135     void manualStreamDidFinishLoading();
136     void manualStreamDidFail(bool wasCancelled);
137     void handleMouseEvent(const WebMouseEvent&, PassRefPtr<Messages::PluginControllerProxy::HandleMouseEvent::DelayedReply>);
138     void handleWheelEvent(const WebWheelEvent&, bool& handled);
139     void handleMouseEnterEvent(const WebMouseEvent&, bool& handled);
140     void handleMouseLeaveEvent(const WebMouseEvent&, bool& handled);
141     void handleKeyboardEvent(const WebKeyboardEvent&, bool& handled);
142     void handleEditingCommand(const String&, const String&, bool&);
143     void isEditingCommandEnabled(const String&, bool&);
144     void handlesPageScaleFactor(bool&);
145     void paintEntirePlugin();
146     void supportsSnapshotting(bool&);
147     void snapshot(ShareableBitmap::Handle& backingStoreHandle);
148     void setFocus(bool);
149     void didUpdate();
150     void getPluginScriptableNPObject(uint64_t& pluginScriptableNPObjectID);
151
152 #if PLATFORM(COCOA)
153     void windowFocusChanged(bool);
154     void windowAndViewFramesChanged(const WebCore::IntRect& windowFrameInScreenCoordinates, const WebCore::IntRect& viewFrameInWindowCoordinates);
155     void windowVisibilityChanged(bool);
156     void sendComplexTextInput(const String& textInput);
157     void setLayerHostingMode(uint32_t);
158
159     void updateLayerHostingContext(LayerHostingMode);
160 #endif
161
162     void storageBlockingStateChanged(bool);
163     void privateBrowsingStateChanged(bool);
164     void getFormValue(bool& returnValue, String& formValue);
165
166     void platformInitialize(const PluginCreationParameters&);
167     void platformDestroy();
168     void platformGeometryDidChange();
169
170     WebProcessConnection* m_connection;
171     uint64_t m_pluginInstanceID;
172
173     String m_userAgent;
174     bool m_storageBlockingEnabled;
175     bool m_isPrivateBrowsingEnabled;
176     bool m_isAcceleratedCompositingEnabled;
177     bool m_isInitializing;
178
179     RefPtr<Messages::WebProcessConnection::CreatePlugin::DelayedReply> m_initializationReply;
180
181     RefPtr<Plugin> m_plugin;
182
183     WebCore::IntSize m_pluginSize;
184
185     // The dirty rect in plug-in coordinates.
186     WebCore::IntRect m_dirtyRect;
187
188     // The paint timer, used for coalescing painting.
189     RunLoop::Timer<PluginControllerProxy> m_paintTimer;
190     
191     // A counter used to prevent the plug-in from being destroyed.
192     unsigned m_pluginDestructionProtectCount;
193
194     // A timer that we use to prevent destruction of the plug-in while plug-in
195     // code is on the stack.
196     RunLoop::Timer<PluginControllerProxy> m_pluginDestroyTimer;
197
198     // Whether we're waiting for the plug-in proxy in the web process to draw the contents of its
199     // backing store into the web process backing store.
200     bool m_waitingForDidUpdate;
201
202     // Whether the plug-in has canceled the manual stream load.
203     bool m_pluginCanceledManualStreamLoad;
204
205 #if PLATFORM(COCOA)
206     // Whether complex text input is enabled for this plug-in.
207     bool m_isComplexTextInputEnabled;
208
209     // For CA plug-ins, this holds the information needed to export the layer hierarchy to the UI process.
210     std::unique_ptr<LayerHostingContext> m_layerHostingContext;
211 #endif
212
213     // The contents scale factor of this plug-in.
214     float m_contentsScaleFactor;
215     
216     // The backing store that this plug-in draws into.
217     RefPtr<ShareableBitmap> m_backingStore;
218
219     // The window NPObject.
220     NPObject* m_windowNPObject;
221
222     // The plug-in element NPObject.
223     NPObject* m_pluginElementNPObject;
224
225     // Hold an activity when the plugin is visible to prevent throttling.
226     UserActivity m_visiblityActivity;
227 };
228
229 } // namespace WebKit
230
231 #endif // ENABLE(NETSCAPE_PLUGIN_API)
232
233 #endif // PluginControllerProxy_h