2007-12-19 Alp Toker <alp@atoker.com>
[WebKit-https.git] / WebKit / gtk / WebCoreSupport / ChromeClientGtk.cpp
1 /*
2  * Copyright (C) 2007 Holger Hans Peter Freyther
3  * Copyright (C) 2007 Christian Dywan <christian@twotoasts.de>
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser 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  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19
20 #include "config.h"
21 #include "ChromeClientGtk.h"
22
23 #include "FloatRect.h"
24 #include "IntRect.h"
25 #include "PlatformString.h"
26 #include "CString.h"
27 #include "HitTestResult.h"
28 #include "KURL.h"
29 #include "webkitwebview.h"
30 #include "webkitprivate.h"
31 #include "NotImplemented.h"
32 #include "WindowFeatures.h"
33
34 using namespace WebCore;
35
36 namespace WebKit {
37 ChromeClient::ChromeClient(WebKitWebView* webView)
38     : m_webView(webView)
39 {
40 }
41
42 void ChromeClient::chromeDestroyed()
43 {
44     delete this;
45 }
46
47 FloatRect ChromeClient::windowRect()
48 {
49     notImplemented();
50     return FloatRect();
51 }
52
53 void ChromeClient::setWindowRect(const FloatRect& r)
54 {
55     notImplemented();
56 }
57
58 FloatRect ChromeClient::pageRect()
59 {
60     notImplemented();
61     return FloatRect();
62 }
63
64 float ChromeClient::scaleFactor()
65 {
66     notImplemented();
67     return 1.0;
68 }
69
70 void ChromeClient::focus()
71 {
72     notImplemented();
73 }
74
75 void ChromeClient::unfocus()
76 {
77     notImplemented();
78 }
79
80 Page* ChromeClient::createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures& features)
81 {
82     if (features.dialog) {
83         notImplemented();
84         return 0;
85     } else {
86         /* TODO: FrameLoadRequest is not used */
87         WebKitWebView* webView = WEBKIT_WEB_VIEW_GET_CLASS(m_webView)->create_web_view(m_webView);
88         if (!webView)
89             return 0;
90
91         WebKitWebViewPrivate* privateData = WEBKIT_WEB_VIEW_GET_PRIVATE(webView);
92         return privateData->corePage;
93     }
94 }
95
96 void ChromeClient::show()
97 {
98     notImplemented();
99 }
100
101 bool ChromeClient::canRunModal()
102 {
103     notImplemented();
104     return false;
105 }
106
107 void ChromeClient::runModal()
108 {
109     notImplemented();
110 }
111
112 void ChromeClient::setToolbarsVisible(bool)
113 {
114     notImplemented();
115 }
116
117 bool ChromeClient::toolbarsVisible()
118 {
119     notImplemented();
120     return false;
121 }
122
123 void ChromeClient::setStatusbarVisible(bool)
124 {
125     notImplemented();
126 }
127
128 bool ChromeClient::statusbarVisible()
129 {
130     notImplemented();
131     return false;
132 }
133
134 void ChromeClient::setScrollbarsVisible(bool)
135 {
136     notImplemented();
137 }
138
139 bool ChromeClient::scrollbarsVisible() {
140     notImplemented();
141     return false;
142 }
143
144 void ChromeClient::setMenubarVisible(bool)
145 {
146     notImplemented();
147 }
148
149 bool ChromeClient::menubarVisible()
150 {
151     notImplemented();
152     return false;
153 }
154
155 void ChromeClient::setResizable(bool)
156 {
157     notImplemented();
158 }
159
160 void ChromeClient::closeWindowSoon()
161 {
162     notImplemented();
163 }
164
165 bool ChromeClient::canTakeFocus(FocusDirection)
166 {
167     notImplemented();
168     return true;
169 }
170
171 void ChromeClient::takeFocus(FocusDirection)
172 {
173     notImplemented();
174 }
175
176 bool ChromeClient::canRunBeforeUnloadConfirmPanel()
177 {
178     notImplemented();
179     return false;
180 }
181
182 bool ChromeClient::runBeforeUnloadConfirmPanel(const WebCore::String&, WebCore::Frame*)
183 {
184     notImplemented();
185     return false;
186 }
187
188 void ChromeClient::addMessageToConsole(const WebCore::String& message, unsigned int lineNumber, const WebCore::String& sourceId)
189 {
190     gboolean retval;
191     g_signal_emit_by_name(m_webView, "console-message", message.utf8().data(), lineNumber, sourceId.utf8().data(), &retval);
192 }
193
194 void ChromeClient::runJavaScriptAlert(Frame* frame, const String& message)
195 {
196     gboolean retval;
197     g_signal_emit_by_name(m_webView, "script-alert", kit(frame), message.utf8().data(), &retval);
198 }
199
200 bool ChromeClient::runJavaScriptConfirm(Frame* frame, const String& message)
201 {
202     gboolean retval;
203     gboolean didConfirm;
204     g_signal_emit_by_name(m_webView, "script-confirm", kit(frame), message.utf8().data(), &didConfirm, &retval);
205     return didConfirm == TRUE;
206 }
207
208 bool ChromeClient::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
209 {
210     gboolean retval;
211     gchar* value = 0;
212     g_signal_emit_by_name(m_webView, "script-prompt", kit(frame), message.utf8().data(), defaultValue.utf8().data(), &value, &retval);
213     if (value) {
214         result = String::fromUTF8(value);
215         g_free(value);
216         return true;
217     }
218     return false;
219 }
220
221 void ChromeClient::setStatusbarText(const String& string)
222 {
223     CString stringMessage = string.utf8();
224     g_signal_emit_by_name(m_webView, "status-bar-text-changed", stringMessage.data());
225 }
226
227 bool ChromeClient::shouldInterruptJavaScript()
228 {
229     notImplemented();
230     return false;
231 }
232
233 bool ChromeClient::tabsToLinks() const
234 {
235     return true;
236 }
237
238 IntRect ChromeClient::windowResizerRect() const
239 {
240     notImplemented();
241     return IntRect();
242 }
243
244 void ChromeClient::addToDirtyRegion(const IntRect&)
245 {
246     notImplemented();
247 }
248
249 void ChromeClient::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
250 {
251     notImplemented();
252 }
253
254 void ChromeClient::updateBackingStore()
255 {
256     notImplemented();
257 }
258
259 void ChromeClient::mouseDidMoveOverElement(const HitTestResult& hit, unsigned modifierFlags)
260 {
261     // check if the element is a link...
262     bool isLink = hit.isLiveLink();
263     if (isLink) {
264         KURL url = hit.absoluteLinkURL();
265         if (!url.isEmpty() && url != m_hoveredLinkURL) {
266             CString titleString = hit.title().utf8();
267             DeprecatedCString urlString = url.prettyURL().utf8();
268             g_signal_emit_by_name(m_webView, "hovering-over-link", titleString.data(), urlString.data());
269             m_hoveredLinkURL = url;
270         }
271     } else if (!isLink && !m_hoveredLinkURL.isEmpty()) {
272         g_signal_emit_by_name(m_webView, "hovering-over-link", 0, 0);
273         m_hoveredLinkURL = KURL();
274     }
275 }
276
277 void ChromeClient::setToolTip(const String& toolTip)
278 {
279 #if GTK_CHECK_VERSION(2,12,0)
280     if (toolTip.isEmpty())
281         g_object_set(G_OBJECT(m_webView), "has-tooltip", FALSE, NULL);
282     else
283         gtk_widget_set_tooltip_text(GTK_WIDGET(m_webView), toolTip.utf8().data());
284 #else
285     // TODO: Support older GTK+ versions
286     // See http://bugs.webkit.org/show_bug.cgi?id=15793
287     notImplemented();
288 #endif
289 }
290
291 void ChromeClient::print(Frame* frame)
292 {
293     webkit_web_frame_print(kit(frame));
294 }
295
296 unsigned long long ChromeClient::requestQuotaIncreaseForNewDatabase(Frame*, const SecurityOriginData&, const String&, unsigned long long)
297 {
298     notImplemented();
299     return 0;
300 }
301
302 unsigned long long ChromeClient::requestQuotaIncreaseForDatabaseOperation(Frame*, const SecurityOriginData&, const String&, unsigned long long)
303 {
304     notImplemented();
305     return 0;
306 }
307         
308 }