56d773048a55b2a74db5a9220dccf104102609b5
[WebKit-https.git] / WebKit / qt / WebCoreSupport / ChromeClientQt.cpp
1 /*
2  * Copyright (C) 2006 Zack Rusin <zack@kde.org>
3  * Copyright (C) 2006 Apple Computer, Inc.  All rights reserved.
4  *
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
20  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 #include "config.h"
29 #include "ChromeClientQt.h"
30
31 #include "Frame.h"
32 #include "FrameLoadRequest.h"
33 #include "FrameLoader.h"
34 #include "FrameLoaderClientQt.h"
35 #include "FrameView.h"
36 #include "PlatformScrollBar.h"
37 #include "HitTestResult.h"
38 #include "NotImplemented.h"
39 #include "WindowFeatures.h"
40
41 #include "qwebpage.h"
42 #include "qwebpage_p.h"
43 #include "qwebframe_p.h"
44
45 namespace WebCore
46 {
47
48
49 ChromeClientQt::ChromeClientQt(QWebPage* webPage)
50     : m_webPage(webPage)
51 {
52     toolBarsVisible = statusBarVisible = menuBarVisible = true;
53 }
54
55 ChromeClientQt::~ChromeClientQt()
56 {
57
58 }
59
60 void ChromeClientQt::setWindowRect(const FloatRect& rect)
61 {
62     if (!m_webPage)
63         return;
64     emit m_webPage->geometryChangeRequested(QRect(qRound(rect.x()), qRound(rect.y()),
65                             qRound(rect.width()), qRound(rect.height())));
66 }
67
68
69 FloatRect ChromeClientQt::windowRect()
70 {
71     if (!m_webPage)
72         return FloatRect();
73
74     QWidget* view = m_webPage->view();
75     if (!view)
76         return FloatRect();
77     return IntRect(view->topLevelWidget()->geometry());
78 }
79
80
81 FloatRect ChromeClientQt::pageRect()
82 {
83     if (!m_webPage)
84         return FloatRect();
85     return FloatRect(QRectF(QPointF(0,0), m_webPage->viewportSize()));
86 }
87
88
89 float ChromeClientQt::scaleFactor()
90 {
91     notImplemented();
92     return 1;
93 }
94
95
96 void ChromeClientQt::focus()
97 {
98     if (!m_webPage)
99         return;
100     QWidget* view = m_webPage->view();
101     if (!view)
102         return;
103
104     view->setFocus();
105 }
106
107
108 void ChromeClientQt::unfocus()
109 {
110     if (!m_webPage)
111         return;
112     QWidget* view = m_webPage->view();
113     if (!view)
114         return;
115     view->clearFocus();
116 }
117
118 bool ChromeClientQt::canTakeFocus(FocusDirection)
119 {
120     // This is called when cycling through links/focusable objects and we
121     // reach the last focusable object. Then we want to claim that we can
122     // take the focus to avoid wrapping.
123     return true;
124 }
125
126 void ChromeClientQt::takeFocus(FocusDirection)
127 {
128     // don't do anything. This is only called when cycling to links/focusable objects,
129     // which in turn is called from focusNextPrevChild. We let focusNextPrevChild
130     // call QWidget::focusNextPrevChild accordingly, so there is no need to do anything
131     // here.
132 }
133
134
135 Page* ChromeClientQt::createWindow(Frame*, const FrameLoadRequest& request, const WindowFeatures& features)
136 {
137     QWebPage *newPage = m_webPage->createWindow(features.dialog ? QWebPage::WebModalDialog : QWebPage::WebBrowserWindow);
138     if (!newPage)
139         return 0;
140     newPage->mainFrame()->load(request.resourceRequest().url());
141     return newPage->d->page;
142 }
143
144 void ChromeClientQt::show()
145 {
146     if (!m_webPage)
147         return;
148     QWidget* view = m_webPage->view();
149     if (!view)
150         return;
151     view->topLevelWidget()->show();
152 }
153
154
155 bool ChromeClientQt::canRunModal()
156 {
157     notImplemented();
158     return false;
159 }
160
161
162 void ChromeClientQt::runModal()
163 {
164     notImplemented();
165 }
166
167
168 void ChromeClientQt::setToolbarsVisible(bool visible)
169 {
170     toolBarsVisible = visible;
171     emit m_webPage->toolBarVisibilityChangeRequested(visible);
172 }
173
174
175 bool ChromeClientQt::toolbarsVisible()
176 {
177     return toolBarsVisible;
178 }
179
180
181 void ChromeClientQt::setStatusbarVisible(bool visible)
182 {
183     emit m_webPage->statusBarVisibilityChangeRequested(visible);
184     statusBarVisible = visible;
185 }
186
187
188 bool ChromeClientQt::statusbarVisible()
189 {
190     return statusBarVisible;
191     return false;
192 }
193
194
195 void ChromeClientQt::setScrollbarsVisible(bool)
196 {
197     notImplemented();
198 }
199
200
201 bool ChromeClientQt::scrollbarsVisible()
202 {
203     notImplemented();
204     return true;
205 }
206
207
208 void ChromeClientQt::setMenubarVisible(bool visible)
209 {
210     menuBarVisible = visible;
211     emit m_webPage->menuBarVisibilityChangeRequested(visible);
212 }
213
214 bool ChromeClientQt::menubarVisible()
215 {
216     return menuBarVisible;
217 }
218
219 void ChromeClientQt::setResizable(bool)
220 {
221     notImplemented();
222 }
223
224 void ChromeClientQt::addMessageToConsole(const String& message, unsigned int lineNumber,
225                                          const String& sourceID)
226 {
227     QString x = message;
228     QString y = sourceID;
229     m_webPage->javaScriptConsoleMessage(x, lineNumber, y);
230 }
231
232 void ChromeClientQt::chromeDestroyed()
233 {
234     delete this;
235 }
236
237 bool ChromeClientQt::canRunBeforeUnloadConfirmPanel()
238 {
239     return true;
240 }
241
242 bool ChromeClientQt::runBeforeUnloadConfirmPanel(const String& message, Frame* frame)
243 {
244     return runJavaScriptConfirm(frame, message);
245 }
246
247 void ChromeClientQt::closeWindowSoon()
248 {
249     m_webPage->mainFrame()->d->frame->loader()->stopAllLoaders();
250     m_webPage->deleteLater();
251 }
252
253 void ChromeClientQt::runJavaScriptAlert(Frame* f, const String& msg)
254 {
255     QString x = msg;
256     FrameLoaderClientQt *fl = static_cast<FrameLoaderClientQt*>(f->loader()->client());
257     m_webPage->javaScriptAlert(fl->webFrame(), x);
258 }
259
260 bool ChromeClientQt::runJavaScriptConfirm(Frame* f, const String& msg)
261 {
262     QString x = msg;
263     FrameLoaderClientQt *fl = static_cast<FrameLoaderClientQt*>(f->loader()->client());
264     return m_webPage->javaScriptConfirm(fl->webFrame(), x);
265 }
266
267 bool ChromeClientQt::runJavaScriptPrompt(Frame* f, const String& message, const String& defaultValue, String& result)
268 {
269     QString x = result;
270     FrameLoaderClientQt *fl = static_cast<FrameLoaderClientQt*>(f->loader()->client());
271     bool rc = m_webPage->javaScriptPrompt(fl->webFrame(), (QString)message, (QString)defaultValue, &x);
272     result = x;
273     return rc;
274 }
275
276 void ChromeClientQt::setStatusbarText(const String& msg)
277 {
278     QString x = msg;
279     emit m_webPage->statusBarMessage(x);
280 }
281
282 bool ChromeClientQt::shouldInterruptJavaScript()
283 {
284     notImplemented();
285     return false;
286 }
287
288 bool ChromeClientQt::tabsToLinks() const
289 {
290     return m_webPage->settings()->testAttribute(QWebSettings::LinksIncludedInFocusChain);
291 }
292
293 IntRect ChromeClientQt::windowResizerRect() const
294 {
295     return IntRect();
296 }
297
298 void ChromeClientQt::addToDirtyRegion(const IntRect& r)
299 {
300     QWidget* view = m_webPage->view();
301     if (view) {
302         QRect rect(r);
303         rect = rect.intersected(QRect(QPoint(0, 0), m_webPage->viewportSize()));
304         if (!r.isEmpty())
305             view->update(r);
306     } else
307         emit m_webPage->repaintRequested(r);
308 }
309
310 void ChromeClientQt::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
311 {
312     QWidget* view = m_webPage->view();
313     if (view)
314         view->scroll(dx, dy, scrollViewRect);
315     else
316         emit m_webPage->scrollRequested(dx, dy, scrollViewRect);
317 }
318
319 void ChromeClientQt::updateBackingStore()
320 {
321 }
322
323 void ChromeClientQt::mouseDidMoveOverElement(const HitTestResult& result, unsigned modifierFlags)
324 {
325     if (result.absoluteLinkURL() != lastHoverURL
326         || result.title() != lastHoverTitle
327         || result.textContent() != lastHoverContent) {
328         lastHoverURL = result.absoluteLinkURL();
329         lastHoverTitle = result.title();
330         lastHoverContent = result.textContent();
331         emit m_webPage->linkHovered(lastHoverURL.prettyURL(),
332                 lastHoverTitle, lastHoverContent);
333     }
334 }
335
336 void ChromeClientQt::setToolTip(const String &tip)
337 {
338 #ifndef QT_NO_TOOLTIP
339     QWidget* view = m_webPage->view();
340     if (view)
341         view->setToolTip(tip);
342 #else
343     Q_UNUSED(tip);
344 #endif
345 }
346
347 void ChromeClientQt::print(Frame*)
348 {
349     notImplemented();
350 }
351
352 void ChromeClientQt::exceededDatabaseQuota(Frame*, const String&)
353 {
354     notImplemented();
355 }
356
357 }
358
359