Remove scrolling tree dependency on wheel event handler counts, and use fast scrollin...
[WebKit-https.git] / Source / WebKit2 / WebProcess / WebCoreSupport / WebChromeClient.h
1 /*
2  * Copyright (C) 2010, 2011, 2012 Apple Inc. All rights reserved.
3  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
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 INC. AND ITS CONTRIBUTORS ``AS IS''
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef WebChromeClient_h
28 #define WebChromeClient_h
29
30 #include "WebFrame.h"
31 #include <WebCore/ChromeClient.h>
32 #include <WebCore/ViewportArguments.h>
33 #include <wtf/text/WTFString.h>
34
35 namespace WebKit {
36
37 class WebPage;
38
39 class WebChromeClient : public WebCore::ChromeClient {
40 public:
41     WebChromeClient(WebPage* page)
42         : m_cachedMainFrameHasHorizontalScrollbar(false)
43         , m_cachedMainFrameHasVerticalScrollbar(false)
44         , m_page(page)
45     {
46     }
47     
48     WebPage* page() const { return m_page; }
49
50     virtual void* webView() const { return 0; }
51
52 private:
53     virtual void chromeDestroyed() override;
54     
55     virtual void setWindowRect(const WebCore::FloatRect&) override;
56     virtual WebCore::FloatRect windowRect() override;
57     
58     virtual WebCore::FloatRect pageRect() override;
59     
60     virtual void focus() override;
61     virtual void unfocus() override;
62     
63     virtual bool canTakeFocus(WebCore::FocusDirection) override;
64     virtual void takeFocus(WebCore::FocusDirection) override;
65
66     virtual void focusedElementChanged(WebCore::Element*) override;
67     virtual void focusedFrameChanged(WebCore::Frame*) override;
68
69     // The Frame pointer provides the ChromeClient with context about which
70     // Frame wants to create the new Page.  Also, the newly created window
71     // should not be shown to the user until the ChromeClient of the newly
72     // created Page has its show method called.
73     virtual WebCore::Page* createWindow(WebCore::Frame*, const WebCore::FrameLoadRequest&, const WebCore::WindowFeatures&, const WebCore::NavigationAction&) override;
74     virtual void show() override;
75     
76     virtual bool canRunModal() override;
77     virtual void runModal() override;
78     
79     virtual void setToolbarsVisible(bool) override;
80     virtual bool toolbarsVisible() override;
81     
82     virtual void setStatusbarVisible(bool) override;
83     virtual bool statusbarVisible() override;
84     
85     virtual void setScrollbarsVisible(bool) override;
86     virtual bool scrollbarsVisible() override;
87     
88     virtual void setMenubarVisible(bool) override;
89     virtual bool menubarVisible() override;
90     
91     virtual void setResizable(bool) override;
92     
93     virtual void addMessageToConsole(JSC::MessageSource, JSC::MessageLevel, const String& message, unsigned lineNumber, unsigned columnNumber, const String& sourceID) override;
94     
95     virtual bool canRunBeforeUnloadConfirmPanel() override;
96     virtual bool runBeforeUnloadConfirmPanel(const String& message, WebCore::Frame*) override;
97     
98     virtual void closeWindowSoon() override;
99     
100     virtual void runJavaScriptAlert(WebCore::Frame*, const String&) override;
101     virtual bool runJavaScriptConfirm(WebCore::Frame*, const String&) override;
102     virtual bool runJavaScriptPrompt(WebCore::Frame*, const String& message, const String& defaultValue, String& result) override;
103     virtual void setStatusbarText(const String&) override;
104     virtual bool shouldInterruptJavaScript() override;
105
106     virtual WebCore::KeyboardUIMode keyboardUIMode() override;
107
108     virtual WebCore::IntRect windowResizerRect() const override;
109     
110     // HostWindow member function overrides.
111     virtual void invalidateRootView(const WebCore::IntRect&) override;
112     virtual void invalidateContentsAndRootView(const WebCore::IntRect&) override;
113     virtual void invalidateContentsForSlowScroll(const WebCore::IntRect&) override;
114     virtual void scroll(const WebCore::IntSize& scrollDelta, const WebCore::IntRect& scrollRect, const WebCore::IntRect& clipRect) override;
115 #if USE(TILED_BACKING_STORE)
116     virtual void delegatedScrollRequested(const WebCore::IntPoint& scrollOffset) override;
117 #endif
118     virtual WebCore::IntPoint screenToRootView(const WebCore::IntPoint&) const override;
119     virtual WebCore::IntRect rootViewToScreen(const WebCore::IntRect&) const override;
120 #if PLATFORM(IOS)
121     virtual WebCore::IntPoint accessibilityScreenToRootView(const WebCore::IntPoint&) const override;
122     virtual WebCore::IntRect rootViewToAccessibilityScreen(const WebCore::IntRect&) const override;
123 #endif
124     virtual PlatformPageClient platformPageClient() const override;
125     virtual void contentsSizeChanged(WebCore::Frame*, const WebCore::IntSize&) const override;
126     virtual void scrollRectIntoView(const WebCore::IntRect&) const override; // Currently only Mac has a non empty implementation.
127
128     virtual bool shouldUnavailablePluginMessageBeButton(WebCore::RenderEmbeddedObject::PluginUnavailabilityReason) const override;
129     virtual void unavailablePluginButtonClicked(WebCore::Element*, WebCore::RenderEmbeddedObject::PluginUnavailabilityReason) const override;
130
131     virtual void scrollbarsModeDidChange() const override;
132     virtual void mouseDidMoveOverElement(const WebCore::HitTestResult&, unsigned modifierFlags) override;
133
134     virtual void didBeginTrackingPotentialLongMousePress(const WebCore::IntPoint& mouseDownPosition, const WebCore::HitTestResult&) override;
135     virtual void didRecognizeLongMousePress() override;
136     virtual void didCancelTrackingPotentialLongMousePress() override;
137
138     virtual void setToolTip(const String&, WebCore::TextDirection) override;
139     
140     virtual void print(WebCore::Frame*) override;
141
142     virtual void exceededDatabaseQuota(WebCore::Frame*, const String& databaseName, WebCore::DatabaseDetails) override;
143
144     virtual void reachedMaxAppCacheSize(int64_t spaceNeeded) override;
145     virtual void reachedApplicationCacheOriginQuota(WebCore::SecurityOrigin*, int64_t spaceNeeded) override;
146
147 #if ENABLE(DASHBOARD_SUPPORT)
148     virtual void annotatedRegionsChanged() override;
149 #endif
150
151     virtual bool shouldReplaceWithGeneratedFileForUpload(const String& path, String& generatedFilename) override;
152     virtual String generateReplacementFile(const String& path) override;
153     
154 #if ENABLE(INPUT_TYPE_COLOR)
155     virtual std::unique_ptr<WebCore::ColorChooser> createColorChooser(WebCore::ColorChooserClient*, const WebCore::Color&) override;
156 #endif
157
158 #if ENABLE(IOS_TOUCH_EVENTS)
159     virtual void didPreventDefaultForEvent() override;
160 #endif
161
162 #if PLATFORM(IOS)
163     virtual void didReceiveMobileDocType(bool) override;
164     virtual void setNeedsScrollNotifications(WebCore::Frame*, bool) override;
165     virtual void observedContentChange(WebCore::Frame*) override;
166     virtual void clearContentChangeObservers(WebCore::Frame*) override;
167     virtual void notifyRevealedSelectionByScrollingFrame(WebCore::Frame*) override;
168     virtual bool isStopping() override;
169
170     virtual void didLayout(LayoutType = NormalLayout) override;
171     virtual void didStartOverflowScroll() override;
172     virtual void didEndOverflowScroll() override;
173     virtual bool hasStablePageScaleFactor() const override;
174
175     // FIXME: See <rdar://problem/5975559>
176     virtual void suppressFormNotifications() override;
177     virtual void restoreFormNotifications() override;
178
179     virtual void addOrUpdateScrollingLayer(WebCore::Node*, PlatformLayer* scrollingLayer, PlatformLayer* contentsLayer, const WebCore::IntSize& scrollSize, bool allowHorizontalScrollbar, bool allowVerticalScrollbar) override;
180     virtual void removeScrollingLayer(WebCore::Node*, PlatformLayer* scrollingLayer, PlatformLayer* contentsLayer) override;
181
182     virtual void webAppOrientationsUpdated() override;
183     virtual void showPlaybackTargetPicker(bool hasVideo) override;
184
185     virtual std::chrono::milliseconds eventThrottlingDelay() override;
186 #endif
187
188 #if ENABLE(ORIENTATION_EVENTS)
189     virtual int deviceOrientation() const override;
190 #endif
191
192     virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>) override;
193     virtual void loadIconForFiles(const Vector<String>&, WebCore::FileIconLoader*) override;
194
195 #if !PLATFORM(IOS)
196     virtual void setCursor(const WebCore::Cursor&) override;
197     virtual void setCursorHiddenUntilMouseMoves(bool) override;
198 #endif
199 #if ENABLE(REQUEST_ANIMATION_FRAME) && !USE(REQUEST_ANIMATION_FRAME_TIMER)
200     virtual void scheduleAnimation() override;
201 #endif
202
203     virtual void didAssociateFormControls(const Vector<RefPtr<WebCore::Element>>&) override;
204     virtual bool shouldNotifyOnFormChanges() override;
205
206     virtual bool selectItemWritingDirectionIsNatural() override;
207     virtual bool selectItemAlignmentFollowsMenuWritingDirection() override;
208     virtual bool hasOpenedPopup() const override;
209     virtual PassRefPtr<WebCore::PopupMenu> createPopupMenu(WebCore::PopupMenuClient*) const override;
210     virtual PassRefPtr<WebCore::SearchPopupMenu> createSearchPopupMenu(WebCore::PopupMenuClient*) const override;
211
212     virtual WebCore::GraphicsLayerFactory* graphicsLayerFactory() const override;
213     virtual void attachRootGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*) override;
214     virtual void attachViewOverlayGraphicsLayer(WebCore::Frame*, WebCore::GraphicsLayer*) override;
215     virtual void setNeedsOneShotDrawingSynchronization() override;
216     virtual void scheduleCompositingLayerFlush() override;
217     virtual bool adjustLayerFlushThrottling(WebCore::LayerFlushThrottleState::Flags) override;
218
219 #if USE(REQUEST_ANIMATION_FRAME_DISPLAY_MONITOR)
220     virtual Optional<RefPtr<WebCore::DisplayRefreshMonitor>> createDisplayRefreshMonitor(PlatformDisplayID) const override;
221 #endif
222
223     virtual CompositingTriggerFlags allowedCompositingTriggers() const override
224     {
225         return static_cast<CompositingTriggerFlags>(
226             ThreeDTransformTrigger |
227             VideoTrigger |
228             PluginTrigger|
229             CanvasTrigger |
230 #if PLATFORM(IOS)
231             AnimatedOpacityTrigger | // Allow opacity animations to trigger compositing mode for iPhone: <rdar://problem/7830677>
232 #endif
233             AnimationTrigger);
234     }
235
236     virtual bool layerTreeStateIsFrozen() const override;
237
238 #if ENABLE(ASYNC_SCROLLING)
239     virtual PassRefPtr<WebCore::ScrollingCoordinator> createScrollingCoordinator(WebCore::Page*) const override;
240 #endif
241
242 #if ENABLE(TOUCH_EVENTS)
243     virtual void needTouchEvents(bool) override { }
244 #endif
245
246 #if PLATFORM(IOS)
247     virtual void elementDidFocus(const WebCore::Node*) override;
248     virtual void elementDidBlur(const WebCore::Node*) override;
249 #endif
250
251 #if PLATFORM(IOS)
252     virtual bool supportsVideoFullscreen() override;
253     virtual void enterVideoFullscreenForVideoElement(WebCore::HTMLVideoElement*, WebCore::HTMLMediaElement::VideoFullscreenMode) override;
254     virtual void exitVideoFullscreen() override;
255 #endif
256
257 #if ENABLE(FULLSCREEN_API)
258     virtual bool supportsFullScreenForElement(const WebCore::Element*, bool withKeyboard) override;
259     virtual void enterFullScreenForElement(WebCore::Element*) override;
260     virtual void exitFullScreenForElement(WebCore::Element*) override;
261 #endif
262
263 #if PLATFORM(COCOA)
264     virtual void makeFirstResponder() override;
265 #endif
266
267     virtual void enableSuddenTermination() override;
268     virtual void disableSuddenTermination() override;
269
270 #if PLATFORM(IOS)
271     virtual WebCore::FloatSize screenSize() const override;
272     virtual WebCore::FloatSize availableScreenSize() const override;
273 #endif
274     virtual void dispatchViewportPropertiesDidChange(const WebCore::ViewportArguments&) const override;
275
276     virtual void notifyScrollerThumbIsVisibleInRect(const WebCore::IntRect&) override;
277     virtual void recommendedScrollbarStyleDidChange(WebCore::ScrollbarStyle newStyle) override;
278
279     virtual WebCore::Color underlayColor() const override;
280
281     virtual void pageExtendedBackgroundColorDidChange(WebCore::Color) const override;
282     
283     virtual void wheelEventHandlersChanged(bool) override;
284
285     virtual String plugInStartLabelTitle(const String& mimeType) const override;
286     virtual String plugInStartLabelSubtitle(const String& mimeType) const override;
287     virtual String plugInExtraStyleSheet() const override;
288     virtual String plugInExtraScript() const override;
289
290     virtual void didAddHeaderLayer(WebCore::GraphicsLayer*) override;
291     virtual void didAddFooterLayer(WebCore::GraphicsLayer*) override;
292
293     virtual bool shouldUseTiledBackingForFrameView(const WebCore::FrameView*) const override;
294
295     virtual void isPlayingAudioDidChange(bool) override;
296     virtual void setPageActivityState(WebCore::PageActivityState::Flags) override;
297
298 #if ENABLE(SUBTLE_CRYPTO)
299     virtual bool wrapCryptoKey(const Vector<uint8_t>&, Vector<uint8_t>&) const override;
300     virtual bool unwrapCryptoKey(const Vector<uint8_t>&, Vector<uint8_t>&) const override;
301 #endif
302
303 #if ENABLE(TELEPHONE_NUMBER_DETECTION) && PLATFORM(MAC)
304     virtual void handleTelephoneNumberClick(const String& number, const WebCore::IntPoint&) override;
305 #endif
306 #if ENABLE(SERVICE_CONTROLS)
307     virtual void handleSelectionServiceClick(WebCore::FrameSelection&, const Vector<String>& telephoneNumbers, const WebCore::IntPoint&) override;
308     virtual bool hasRelevantSelectionServices(bool isTextOnly) const override;
309 #endif
310
311     virtual bool shouldDispatchFakeMouseMoveEvents() const override;
312
313     virtual void handleAutoFillButtonClick(WebCore::HTMLInputElement&) override;
314
315 #if ENABLE(WIRELESS_PLAYBACK_TARGET) && !PLATFORM(IOS)
316     virtual void showPlaybackTargetPicker(const WebCore::IntPoint&, bool) override;
317     virtual void startingMonitoringPlaybackTargets() override;
318     virtual void stopMonitoringPlaybackTargets() override;
319 #endif
320
321     String m_cachedToolTip;
322     mutable RefPtr<WebFrame> m_cachedFrameSetLargestFrame;
323     mutable bool m_cachedMainFrameHasHorizontalScrollbar;
324     mutable bool m_cachedMainFrameHasVerticalScrollbar;
325
326     WebPage* m_page;
327 };
328
329 } // namespace WebKit
330
331 #endif // WebChromeClient_h