DOM timer throttling for hidden plugins
[WebKit-https.git] / Source / WebKit2 / WebProcess / Plugins / PluginView.h
1 /*
2  * Copyright (C) 2010, 2012 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 PluginView_h
27 #define PluginView_h
28
29 #include "LayerTreeContext.h"
30 #include "NPRuntimeObjectMap.h"
31 #include "Plugin.h"
32 #include "PluginController.h"
33 #include "WebFrame.h"
34 #include <WebCore/FindOptions.h>
35 #include <WebCore/Image.h>
36 #include <WebCore/MediaCanStartListener.h>
37 #include <WebCore/PluginViewBase.h>
38 #include <WebCore/ResourceError.h>
39 #include <WebCore/ResourceResponse.h>
40 #include <WebCore/Timer.h>
41 #include <WebCore/ViewState.h>
42 #include <memory>
43 #include <wtf/Deque.h>
44 #include <wtf/RunLoop.h>
45
46 // FIXME: Eventually this should move to WebCore.
47
48 namespace WebCore {
49 class Frame;
50 class HTMLPlugInElement;
51 class MouseEvent;
52 class RenderBoxModelObject;
53 }
54
55 namespace WebKit {
56
57 class WebEvent;
58
59 class PluginView : public WebCore::PluginViewBase, public PluginController, private WebCore::MediaCanStartListener, private WebFrame::LoadListener {
60 public:
61     static PassRefPtr<PluginView> create(PassRefPtr<WebCore::HTMLPlugInElement>, PassRefPtr<Plugin>, const Plugin::Parameters&);
62
63     void recreateAndInitialize(PassRefPtr<Plugin>);
64
65     WebCore::Frame* frame() const;
66
67     bool isBeingDestroyed() const { return m_isBeingDestroyed; }
68
69     void manualLoadDidReceiveResponse(const WebCore::ResourceResponse&);
70     void manualLoadDidReceiveData(const char* bytes, int length);
71     void manualLoadDidFinishLoading();
72     void manualLoadDidFail(const WebCore::ResourceError&);
73
74     void viewStateDidChange(WebCore::ViewState::Flags changed);
75     void setLayerHostingMode(LayerHostingMode);
76
77 #if PLATFORM(COCOA)
78     void setDeviceScaleFactor(float);
79     void windowAndViewFramesChanged(const WebCore::FloatRect& windowFrameInScreenCoordinates, const WebCore::FloatRect& viewFrameInWindowCoordinates);
80     bool sendComplexTextInput(uint64_t pluginComplexTextInputIdentifier, const String& textInput);
81     RetainPtr<PDFDocument> pdfDocumentForPrinting() const { return m_plugin->pdfDocumentForPrinting(); }
82     NSObject *accessibilityObject() const;
83 #endif
84
85     WebCore::HTMLPlugInElement* pluginElement() const { return m_pluginElement.get(); }
86     const Plugin::Parameters& initialParameters() const { return m_parameters; }
87
88     // FIXME: Remove this; nobody should have to know about the plug-in view's renderer except the plug-in view itself.
89     WebCore::RenderBoxModelObject* renderer() const;
90     
91     void setPageScaleFactor(double scaleFactor, WebCore::IntPoint origin);
92     double pageScaleFactor() const;
93     bool handlesPageScaleFactor() const;
94
95     void pageScaleFactorDidChange();
96     void topContentInsetDidChange();
97
98     void webPageDestroyed();
99
100     bool handleEditingCommand(const String& commandName, const String& argument);
101     bool isEditingCommandEnabled(const String& commandName);
102     
103     unsigned countFindMatches(const String& target, WebCore::FindOptions, unsigned maxMatchCount);
104     bool findString(const String& target, WebCore::FindOptions, unsigned maxMatchCount);
105
106     String getSelectionString() const;
107
108     bool shouldAllowScripting();
109
110     PassRefPtr<WebCore::SharedBuffer> liveResourceData() const;
111     bool performDictionaryLookupAtLocation(const WebCore::FloatPoint&);
112     virtual WebCore::AudioHardwareActivityType audioHardwareActivity() const override;
113
114 private:
115     PluginView(PassRefPtr<WebCore::HTMLPlugInElement>, PassRefPtr<Plugin>, const Plugin::Parameters& parameters);
116     virtual ~PluginView();
117
118     void initializePlugin();
119
120     void viewGeometryDidChange();
121     void viewVisibilityDidChange();
122     WebCore::IntRect clipRectInWindowCoordinates() const;
123     void focusPluginElement();
124     
125     void pendingURLRequestsTimerFired();
126     class URLRequest;
127     void performURLRequest(URLRequest*);
128
129     // Perform a URL request where the frame target is not null.
130     void performFrameLoadURLRequest(URLRequest*);
131
132     // Perform a URL request where the URL protocol is "javascript:".
133     void performJavaScriptURLRequest(URLRequest*);
134
135     class Stream;
136     void addStream(Stream*);
137     void removeStream(Stream*);
138     void cancelAllStreams();
139
140     void redeliverManualStream();
141
142     void pluginSnapshotTimerFired();
143     void pluginDidReceiveUserInteraction();
144
145     bool shouldCreateTransientPaintingSnapshot() const;
146
147     // WebCore::PluginViewBase
148 #if PLATFORM(COCOA)
149     virtual PlatformLayer* platformLayer() const override;
150 #endif
151     virtual JSC::JSObject* scriptObject(JSC::JSGlobalObject*) override;
152     virtual void storageBlockingStateChanged() override;
153     virtual void privateBrowsingStateChanged(bool) override;
154     virtual bool getFormValue(String&) override;
155     virtual bool scroll(WebCore::ScrollDirection, WebCore::ScrollGranularity) override;
156     virtual WebCore::Scrollbar* horizontalScrollbar() override;
157     virtual WebCore::Scrollbar* verticalScrollbar() override;
158     virtual bool wantsWheelEvents() override;
159     virtual bool shouldAlwaysAutoStart() const override;
160     virtual void beginSnapshottingRunningPlugin() override;
161     virtual bool shouldAllowNavigationFromDrags() const override;
162     virtual bool shouldNotAddLayer() const override;
163
164     // WebCore::Widget
165     virtual void setFrameRect(const WebCore::IntRect&) override;
166     virtual void paint(WebCore::GraphicsContext*, const WebCore::IntRect&) override;
167     virtual void invalidateRect(const WebCore::IntRect&) override;
168     virtual void setFocus(bool) override;
169     virtual void frameRectsChanged() override;
170     virtual void setParent(WebCore::ScrollView*) override;
171     virtual void handleEvent(WebCore::Event*) override;
172     virtual void notifyWidget(WebCore::WidgetNotification) override;
173     virtual void show() override;
174     virtual void hide() override;
175     virtual void setParentVisible(bool) override;
176     virtual bool transformsAffectFrameRect() override;
177     virtual void clipRectChanged() override;
178
179     // WebCore::MediaCanStartListener
180     virtual void mediaCanStart() override;
181
182     // PluginController
183     virtual bool isPluginVisible() override;
184     virtual void invalidate(const WebCore::IntRect&) override;
185     virtual String userAgent() override;
186     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;
187     virtual void cancelStreamLoad(uint64_t streamID) override;
188     virtual void cancelManualStreamLoad() override;
189 #if ENABLE(NETSCAPE_PLUGIN_API)
190     virtual NPObject* windowScriptNPObject() override;
191     virtual NPObject* pluginElementNPObject() override;
192     virtual bool evaluate(NPObject*, const String& scriptString, NPVariant* result, bool allowPopups) override;
193 #endif
194     virtual void setStatusbarText(const String&) override;
195     virtual bool isAcceleratedCompositingEnabled() override;
196     virtual void pluginProcessCrashed() override;
197     virtual void willSendEventToPlugin() override;
198 #if PLATFORM(COCOA)
199     virtual void pluginFocusOrWindowFocusChanged(bool pluginHasFocusAndWindowHasFocus) override;
200     virtual void setComplexTextInputState(PluginComplexTextInputState) override;
201     virtual mach_port_t compositingRenderServerPort() override;
202     virtual void openPluginPreferencePane() override;
203 #endif
204     virtual float contentsScaleFactor() override;
205     virtual String proxiesForURL(const String&) override;
206     virtual String cookiesForURL(const String&) override;
207     virtual void setCookiesForURL(const String& urlString, const String& cookieString) override;
208     virtual bool getAuthenticationInfo(const WebCore::ProtectionSpace&, String& username, String& password) override;
209     virtual bool isPrivateBrowsingEnabled() override;
210     virtual bool asynchronousPluginInitializationEnabled() const override;
211     virtual bool asynchronousPluginInitializationEnabledForAllPlugins() const override;
212     virtual bool artificialPluginInitializationDelayEnabled() const override;
213     virtual void protectPluginFromDestruction() override;
214     virtual void unprotectPluginFromDestruction() override;
215 #if PLUGIN_ARCHITECTURE(X11)
216     virtual uint64_t createPluginContainer() override;
217     virtual void windowedPluginGeometryDidChange(const WebCore::IntRect& frameRect, const WebCore::IntRect& clipRect, uint64_t windowID) override;
218     virtual void windowedPluginVisibilityDidChange(bool isVisible, uint64_t windowID) override;
219 #endif
220
221     virtual void didInitializePlugin() override;
222     virtual void didFailToInitializePlugin() override;
223     void destroyPluginAndReset();
224
225     // WebFrame::LoadListener
226     virtual void didFinishLoad(WebFrame*) override;
227     virtual void didFailLoad(WebFrame*, bool wasCancelled) override;
228
229     std::unique_ptr<WebEvent> createWebEvent(WebCore::MouseEvent*) const;
230
231     RefPtr<WebCore::HTMLPlugInElement> m_pluginElement;
232     RefPtr<Plugin> m_plugin;
233     WebPage* m_webPage;
234     Plugin::Parameters m_parameters;
235     
236     bool m_isInitialized;
237     bool m_isWaitingForSynchronousInitialization;
238     bool m_isWaitingUntilMediaCanStart;
239     bool m_isBeingDestroyed;
240     bool m_pluginProcessHasCrashed;
241     bool m_didPlugInStartOffScreen;
242
243     // Pending URLRequests that the plug-in has made.
244     Deque<RefPtr<URLRequest>> m_pendingURLRequests;
245     RunLoop::Timer<PluginView> m_pendingURLRequestsTimer;
246
247     // Pending frame loads that the plug-in has made.
248     typedef HashMap<RefPtr<WebFrame>, RefPtr<URLRequest>> FrameLoadMap;
249     FrameLoadMap m_pendingFrameLoads;
250
251     // Streams that the plug-in has requested to load. 
252     HashMap<uint64_t, RefPtr<Stream>> m_streams;
253
254 #if ENABLE(NETSCAPE_PLUGIN_API)
255     // A map of all related NPObjects for this plug-in view.
256     NPRuntimeObjectMap m_npRuntimeObjectMap;
257 #endif
258
259     // The manual stream state. This is used so we can deliver a manual stream to a plug-in
260     // when it is initialized.
261     enum ManualStreamState {
262         StreamStateInitial,
263         StreamStateHasReceivedResponse,
264         StreamStateFinished,
265         StreamStateFailed
266     };
267     ManualStreamState m_manualStreamState;
268
269     WebCore::ResourceResponse m_manualStreamResponse;
270     WebCore::ResourceError m_manualStreamError;
271     RefPtr<WebCore::SharedBuffer> m_manualStreamData;
272     
273     // This snapshot is used to avoid side effects should the plugin run JS during painting.
274     RefPtr<ShareableBitmap> m_transientPaintingSnapshot;
275     // This timer is used when plugin snapshotting is enabled, to capture a plugin placeholder.
276     WebCore::DeferrableOneShotTimer m_pluginSnapshotTimer;
277     unsigned m_countSnapshotRetries;
278     bool m_didReceiveUserInteraction;
279
280     double m_pageScaleFactor;
281 };
282
283 } // namespace WebKit
284
285 #endif // PluginView_h