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