1/*
2 * Copyright (C) 2007 Holger Hans Peter Freyther
3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB.  If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 */
20
21#ifndef ChromeClientGtk_h
22#define ChromeClientGtk_h
23
24#include "ChromeClient.h"
25#include "GtkAdjustmentWatcher.h"
26#include "IntRect.h"
27#include "IntSize.h"
28#include "KURL.h"
29#include "PopupMenu.h"
30#include "Region.h"
31#include "SearchPopupMenu.h"
32#include "Timer.h"
33
34using namespace WebCore;
35typedef struct _WebKitWebView WebKitWebView;
36
37namespace WebCore {
38class PopupMenuClient;
39}
40
41namespace WebKit {
42
43    class ChromeClient : public WebCore::ChromeClient {
44    public:
45        ChromeClient(WebKitWebView*);
46        GtkAdjustmentWatcher* adjustmentWatcher() { return &m_adjustmentWatcher; }
47
48        virtual void chromeDestroyed();
49
50        virtual void setWindowRect(const FloatRect&);
51        virtual FloatRect windowRect();
52
53        virtual FloatRect pageRect();
54
55        virtual void focus();
56        virtual void unfocus();
57
58        virtual bool canTakeFocus(FocusDirection);
59        virtual void takeFocus(FocusDirection);
60
61        virtual void focusedNodeChanged(Node*);
62        virtual void focusedFrameChanged(Frame*);
63
64        virtual Page* createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures&, const NavigationAction&);
65        virtual void show();
66
67        virtual bool canRunModal();
68        virtual void runModal();
69
70        virtual void setToolbarsVisible(bool);
71        virtual bool toolbarsVisible();
72
73        virtual void setStatusbarVisible(bool);
74        virtual bool statusbarVisible();
75
76        virtual void setScrollbarsVisible(bool);
77        virtual bool scrollbarsVisible();
78
79        virtual void setMenubarVisible(bool);
80        virtual bool menubarVisible();
81
82        virtual void setResizable(bool);
83
84        virtual void addMessageToConsole(MessageSource, MessageLevel, const WTF::String& message, unsigned lineNumber, unsigned columnNumber, const WTF::String& sourceID);
85
86        virtual bool canRunBeforeUnloadConfirmPanel();
87        virtual bool runBeforeUnloadConfirmPanel(const WTF::String& message, Frame* frame);
88
89        virtual void closeWindowSoon();
90
91        virtual void runJavaScriptAlert(Frame*, const WTF::String&);
92        virtual bool runJavaScriptConfirm(Frame*, const WTF::String&);
93        virtual bool runJavaScriptPrompt(Frame*, const WTF::String& message, const WTF::String& defaultValue, WTF::String& result);
94        virtual void setStatusbarText(const WTF::String&);
95        virtual bool shouldInterruptJavaScript();
96        virtual KeyboardUIMode keyboardUIMode();
97
98        virtual IntRect windowResizerRect() const;
99        virtual void invalidateRootView(const IntRect&, bool);
100        virtual void invalidateContentsAndRootView(const IntRect&, bool);
101        virtual void invalidateContentsForSlowScroll(const IntRect&, bool);
102        virtual void scroll(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
103
104        virtual IntPoint screenToRootView(const IntPoint&) const;
105        virtual IntRect rootViewToScreen(const IntRect&) const;
106        virtual PlatformPageClient platformPageClient() const;
107        virtual void contentsSizeChanged(Frame*, const IntSize&) const;
108
109        virtual void scrollbarsModeDidChange() const;
110        virtual void mouseDidMoveOverElement(const HitTestResult&, unsigned modifierFlags);
111
112        virtual void setToolTip(const WTF::String&, TextDirection);
113
114        virtual void dispatchViewportPropertiesDidChange(const ViewportArguments&) const;
115
116        virtual void print(Frame*);
117#if ENABLE(SQL_DATABASE)
118        virtual void exceededDatabaseQuota(Frame*, const WTF::String&, DatabaseDetails);
119#endif
120        virtual void reachedMaxAppCacheSize(int64_t spaceNeeded);
121        virtual void reachedApplicationCacheOriginQuota(SecurityOrigin*, int64_t totalSpaceNeeded);
122        virtual void runOpenPanel(Frame*, PassRefPtr<FileChooser>);
123        virtual void loadIconForFiles(const Vector<WTF::String>&, FileIconLoader*);
124
125        virtual void formStateDidChange(const Node*) { }
126
127        virtual void setCursor(const Cursor&);
128        virtual void setCursorHiddenUntilMouseMoves(bool);
129
130        virtual void scrollRectIntoView(const IntRect&) const { }
131
132        virtual bool selectItemWritingDirectionIsNatural();
133        virtual bool selectItemAlignmentFollowsMenuWritingDirection();
134        virtual bool hasOpenedPopup() const;
135        virtual PassRefPtr<PopupMenu> createPopupMenu(PopupMenuClient*) const;
136        virtual PassRefPtr<SearchPopupMenu> createSearchPopupMenu(PopupMenuClient*) const;
137#if ENABLE(VIDEO) && USE(NATIVE_FULLSCREEN_VIDEO)
138        virtual bool supportsFullscreenForNode(const Node*);
139        virtual void enterFullscreenForNode(Node*);
140        virtual void exitFullscreenForNode(Node*);
141#endif
142
143#if ENABLE(FULLSCREEN_API)
144        virtual bool supportsFullScreenForElement(const Element*, bool withKeyboard);
145        virtual void enterFullScreenForElement(Element*);
146        virtual void exitFullScreenForElement(Element*);
147        void cancelFullScreen();
148#endif
149
150        virtual bool shouldRubberBandInDirection(ScrollDirection) const { return true; }
151        virtual void numWheelEventHandlersChanged(unsigned) { }
152
153#if USE(ACCELERATED_COMPOSITING)
154        virtual void attachRootGraphicsLayer(Frame*, GraphicsLayer*);
155        virtual void setNeedsOneShotDrawingSynchronization();
156        virtual void scheduleCompositingLayerFlush();
157        virtual CompositingTriggerFlags allowedCompositingTriggers() const;
158#endif
159
160        void performAllPendingScrolls();
161        void paint(Timer<ChromeClient>*);
162        void forcePaint();
163        void widgetSizeChanged(const IntSize& oldWidgetSize, IntSize newSize);
164
165        WebKitWebView* webView() { return m_webView; }
166
167    private:
168        WebKitWebView* m_webView;
169        GtkAdjustmentWatcher m_adjustmentWatcher;
170        KURL m_hoveredLinkURL;
171        unsigned int m_closeSoonTimer;
172
173        Timer <ChromeClient> m_displayTimer;
174        bool m_forcePaint;
175        Region m_dirtyRegion;
176        Vector<IntRect> m_rectsToScroll;
177        Vector<IntSize> m_scrollOffsets;
178        double m_lastDisplayTime;
179        unsigned int m_repaintSoonSourceId;
180
181#if ENABLE(FULLSCREEN_API)
182        RefPtr<Element> m_fullScreenElement;
183#endif
184    };
185}
186
187#endif // ChromeClient_h
188