1/*
2 * Copyright (C) 2009 Google 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 are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef ChromeClientImpl_h
32#define ChromeClientImpl_h
33
34#include "ChromeClientChromium.h"
35
36namespace WebCore {
37class AccessibilityObject;
38class HTMLParserQuirks;
39class PopupContainer;
40class SecurityOrigin;
41struct WindowFeatures;
42}
43
44namespace WebKit {
45class WebViewImpl;
46struct WebCursorInfo;
47struct WebPopupMenuInfo;
48
49// Handles window-level notifications from WebCore on behalf of a WebView.
50class ChromeClientImpl : public WebCore::ChromeClientChromium {
51public:
52    explicit ChromeClientImpl(WebViewImpl* webView);
53    virtual ~ChromeClientImpl();
54
55    WebViewImpl* webView() const { return m_webView; }
56
57    // ChromeClient methods:
58    virtual void chromeDestroyed();
59    virtual void setWindowRect(const WebCore::FloatRect&);
60    virtual WebCore::FloatRect windowRect();
61    virtual WebCore::FloatRect pageRect();
62    virtual float scaleFactor();
63    virtual void focus();
64    virtual void unfocus();
65    virtual bool canTakeFocus(WebCore::FocusDirection);
66    virtual void takeFocus(WebCore::FocusDirection);
67    virtual void focusedNodeChanged(WebCore::Node*);
68    virtual WebCore::Page* createWindow(
69        WebCore::Frame*, const WebCore::FrameLoadRequest&, const WebCore::WindowFeatures&);
70    virtual void show();
71    virtual bool canRunModal();
72    virtual void runModal();
73    virtual void setToolbarsVisible(bool);
74    virtual bool toolbarsVisible();
75    virtual void setStatusbarVisible(bool);
76    virtual bool statusbarVisible();
77    virtual void setScrollbarsVisible(bool);
78    virtual bool scrollbarsVisible();
79    virtual void setMenubarVisible(bool);
80    virtual bool menubarVisible();
81    virtual void setResizable(bool);
82    virtual void addMessageToConsole(
83        WebCore::MessageSource, WebCore::MessageType, WebCore::MessageLevel,
84        const WebCore::String& message, unsigned lineNumber,
85        const WebCore::String& sourceID);
86    virtual bool canRunBeforeUnloadConfirmPanel();
87    virtual bool runBeforeUnloadConfirmPanel(
88        const WebCore::String& message, WebCore::Frame*);
89    virtual void closeWindowSoon();
90    virtual void runJavaScriptAlert(WebCore::Frame*, const WebCore::String&);
91    virtual bool runJavaScriptConfirm(WebCore::Frame*, const WebCore::String&);
92    virtual bool runJavaScriptPrompt(
93        WebCore::Frame*, const WebCore::String& message,
94        const WebCore::String& defaultValue, WebCore::String& result);
95    virtual void setStatusbarText(const WebCore::String& message);
96    virtual bool shouldInterruptJavaScript();
97    virtual bool tabsToLinks() const;
98    virtual WebCore::IntRect windowResizerRect() const;
99    virtual void repaint(
100        const WebCore::IntRect&, bool contentChanged, bool immediate = false,
101        bool repaintContentOnly = false);
102    virtual void scroll(
103        const WebCore::IntSize& scrollDelta, const WebCore::IntRect& rectToScroll,
104        const WebCore::IntRect& clipRect);
105    virtual WebCore::IntPoint screenToWindow(const WebCore::IntPoint&) const;
106    virtual WebCore::IntRect windowToScreen(const WebCore::IntRect&) const;
107    virtual PlatformPageClient platformPageClient() const { return 0; }
108    virtual void contentsSizeChanged(WebCore::Frame*, const WebCore::IntSize&) const;
109    virtual void scrollRectIntoView(
110        const WebCore::IntRect&, const WebCore::ScrollView*) const { }
111    virtual void scrollbarsModeDidChange() const;
112    virtual void mouseDidMoveOverElement(
113        const WebCore::HitTestResult& result, unsigned modifierFlags);
114    virtual void setToolTip(const WebCore::String& tooltipText, WebCore::TextDirection);
115    virtual void print(WebCore::Frame*);
116    virtual void exceededDatabaseQuota(
117        WebCore::Frame*, const WebCore::String& databaseName);
118#if ENABLE(OFFLINE_WEB_APPLICATIONS)
119    virtual void reachedMaxAppCacheSize(int64_t spaceNeeded);
120#endif
121#if ENABLE(NOTIFICATIONS)
122    virtual WebCore::NotificationPresenter* notificationPresenter() const;
123#endif
124    virtual void requestGeolocationPermissionForFrame(
125        WebCore::Frame*, WebCore::Geolocation*) { }
126    virtual void runOpenPanel(WebCore::Frame*, PassRefPtr<WebCore::FileChooser>);
127    virtual bool setCursor(WebCore::PlatformCursorHandle) { return false; }
128    virtual void formStateDidChange(const WebCore::Node*);
129    virtual PassOwnPtr<WebCore::HTMLParserQuirks> createHTMLParserQuirks() { return 0; }
130
131    // ChromeClientChromium methods:
132    virtual void popupOpened(WebCore::PopupContainer* popupContainer,
133                             const WebCore::IntRect& bounds,
134                             bool activatable,
135                             bool handleExternally);
136    virtual void didChangeAccessibilityObjectState(WebCore::AccessibilityObject*);
137
138    // ChromeClientImpl:
139    void setCursor(const WebCursorInfo& cursor);
140    void setCursorForPlugin(const WebCursorInfo& cursor);
141
142private:
143    void getPopupMenuInfo(WebCore::PopupContainer*, WebPopupMenuInfo*);
144
145    WebViewImpl* m_webView;  // weak pointer
146    bool m_toolbarsVisible;
147    bool m_statusbarVisible;
148    bool m_scrollbarsVisible;
149    bool m_menubarVisible;
150    bool m_resizable;
151    // Set to true if the next SetCursor is to be ignored.
152    bool m_ignoreNextSetCursor;
153};
154
155} // namespace WebKit
156
157#endif
158