Fix focus chain handling and cycling through focusable objects (links) using tab...
[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 "NotImplemented.h"
37 #include "WindowFeatures.h"
38
39 #include "qwebpage.h"
40 #include "qwebpage_p.h"
41 #include "qwebframe_p.h"
42
43 namespace WebCore
44 {
45
46     
47 ChromeClientQt::ChromeClientQt(QWebPage* webPage)
48     : m_webPage(webPage)
49 {
50     
51 }
52
53
54 ChromeClientQt::~ChromeClientQt()
55 {
56     
57 }
58
59 void ChromeClientQt::setWindowRect(const FloatRect& rect)
60 {
61     if (!m_webPage)
62         return;
63     emit m_webPage->geometryChangeRequest(QRect(qRound(rect.x()), qRound(rect.y()),
64                             qRound(rect.width()), qRound(rect.height())));
65 }
66
67
68 FloatRect ChromeClientQt::windowRect()
69 {
70     if (!m_webPage)
71         return FloatRect();
72
73     QWidget* view = m_webPage->view();
74     if (!view)
75         return FloatRect();
76     return IntRect(view->topLevelWidget()->geometry());
77 }
78
79
80 FloatRect ChromeClientQt::pageRect()
81 {
82     if (!m_webPage)
83         return FloatRect();
84     return FloatRect(QRectF(QPointF(0,0), m_webPage->viewportSize()));
85 }
86
87
88 float ChromeClientQt::scaleFactor()
89 {
90     notImplemented();
91     return 1;
92 }
93
94
95 void ChromeClientQt::focus()
96 {
97     if (!m_webPage)
98         return;
99     QWidget* view = m_webPage->view();
100     if (!view)
101         return;
102     
103     view->setFocus();
104 }
105
106
107 void ChromeClientQt::unfocus()
108 {
109     if (!m_webPage)
110         return;
111     QWidget* view = m_webPage->view();
112     if (!view)
113         return;
114     view->clearFocus();
115 }
116
117 bool ChromeClientQt::canTakeFocus(FocusDirection)
118 {
119     // This is called when cycling through links/focusable objects and we
120     // reach the last focusable object. Then we want to claim that we can
121     // take the focus to avoid wrapping.
122     return true;
123 }
124
125 void ChromeClientQt::takeFocus(FocusDirection)
126 {
127     // don't do anything. This is only called when cycling to links/focusable objects,
128     // which in turn is called from focusNextPrevChild. We let focusNextPrevChild
129     // call QWidget::focusNextPrevChild accordingly, so there is no need to do anything
130     // here.
131 }
132
133
134 Page* ChromeClientQt::createWindow(Frame*, const FrameLoadRequest& request, const WindowFeatures& features)
135 {
136     QWebPage *newPage = features.dialog ? m_webPage->createModalDialog() : m_webPage->createWindow();
137     if (!newPage)
138         return 0;
139     newPage->mainFrame()->load(request.resourceRequest().url());
140     return newPage->d->page;
141 }
142
143 void ChromeClientQt::show()
144 {
145     if (!m_webPage)
146         return;
147     QWidget* view = m_webPage->view();
148     if (!view)
149         return;
150     view->topLevelWidget()->show();
151 }
152
153
154 bool ChromeClientQt::canRunModal()
155 {
156     notImplemented();
157     return false;
158 }
159
160
161 void ChromeClientQt::runModal()
162 {
163     notImplemented();
164 }
165
166
167 void ChromeClientQt::setToolbarsVisible(bool)
168 {
169     notImplemented();
170 }
171
172
173 bool ChromeClientQt::toolbarsVisible()
174 {
175     notImplemented();
176     return false;
177 }
178
179
180 void ChromeClientQt::setStatusbarVisible(bool)
181 {
182     notImplemented();
183 }
184
185
186 bool ChromeClientQt::statusbarVisible()
187 {
188     notImplemented();
189     return false;
190 }
191
192
193 void ChromeClientQt::setScrollbarsVisible(bool)
194 {
195     notImplemented();
196 }
197
198
199 bool ChromeClientQt::scrollbarsVisible()
200 {
201     notImplemented();
202     return true;
203 }
204
205
206 void ChromeClientQt::setMenubarVisible(bool)
207 {
208     notImplemented();
209 }
210
211 bool ChromeClientQt::menubarVisible()
212 {
213     notImplemented();
214     return false;
215 }
216
217 void ChromeClientQt::setResizable(bool)
218 {
219     notImplemented();
220 }
221
222 void ChromeClientQt::addMessageToConsole(const String& message, unsigned int lineNumber,
223                                          const String& sourceID)
224 {
225     QString x = message;
226     QString y = sourceID;
227     m_webPage->javaScriptConsoleMessage(x, lineNumber, y);
228 }
229
230 void ChromeClientQt::chromeDestroyed()
231 {
232     delete this;
233 }
234
235 bool ChromeClientQt::canRunBeforeUnloadConfirmPanel()
236 {
237     return true;
238 }
239
240 bool ChromeClientQt::runBeforeUnloadConfirmPanel(const String& message, Frame* frame)
241 {
242     return runJavaScriptConfirm(frame, message);
243 }
244
245 void ChromeClientQt::closeWindowSoon()
246 {
247     m_webPage->mainFrame()->d->frame->loader()->stopAllLoaders();
248     m_webPage->deleteLater();
249 }
250
251 void ChromeClientQt::runJavaScriptAlert(Frame* f, const String& msg)
252 {
253     QString x = msg;
254     FrameLoaderClientQt *fl = static_cast<FrameLoaderClientQt*>(f->loader()->client());
255     m_webPage->javaScriptAlert(fl->webFrame(), x);
256 }
257
258 bool ChromeClientQt::runJavaScriptConfirm(Frame* f, const String& msg)
259 {
260     QString x = msg;
261     FrameLoaderClientQt *fl = static_cast<FrameLoaderClientQt*>(f->loader()->client());
262     return m_webPage->javaScriptConfirm(fl->webFrame(), x);
263 }
264
265 bool ChromeClientQt::runJavaScriptPrompt(Frame* f, const String& message, const String& defaultValue, String& result)
266 {
267     QString x = result;
268     FrameLoaderClientQt *fl = static_cast<FrameLoaderClientQt*>(f->loader()->client());
269     bool rc = m_webPage->javaScriptPrompt(fl->webFrame(), (QString)message, (QString)defaultValue, &x);
270     result = x;
271     return rc;
272 }
273
274 void ChromeClientQt::setStatusbarText(const String& msg)
275 {
276     QString x = msg;
277     emit m_webPage->statusBarTextChanged(x);
278 }
279
280 bool ChromeClientQt::shouldInterruptJavaScript()
281 {
282     notImplemented();
283     return false;
284 }
285
286 bool ChromeClientQt::tabsToLinks() const
287 {
288     return m_webPage->settings()->testAttribute(QWebSettings::LinksIncludedInFocusChain);
289 }
290
291 IntRect ChromeClientQt::windowResizerRect() const
292 {
293     return IntRect();
294 }
295
296 void ChromeClientQt::addToDirtyRegion(const IntRect& r)
297 {
298     QWidget* view = m_webPage->view();
299     if (view) {
300         QRect rect(r);
301         rect = rect.intersected(QRect(QPoint(0, 0), m_webPage->viewportSize()));
302         if (!r.isEmpty())
303             view->update(r);
304     }
305 }
306
307 void ChromeClientQt::scrollBackingStore(int dx, int dy, const IntRect& scrollViewRect, const IntRect& clipRect)
308 {
309     QWidget* view = m_webPage->view();
310     if (view)
311         view->scroll(dx, dy, scrollViewRect);
312 }
313
314 void ChromeClientQt::updateBackingStore()
315 {
316 }
317
318 void ChromeClientQt::mouseDidMoveOverElement(const HitTestResult&, unsigned /*modifierFlags*/)
319 {
320     notImplemented();
321 }
322
323 void ChromeClientQt::setToolTip(const String&)
324 {
325     notImplemented();
326 }
327
328 void ChromeClientQt::print(Frame*)
329 {
330     notImplemented();
331 }
332
333 unsigned long long ChromeClientQt::requestQuotaIncreaseForNewDatabase(Frame*, SecurityOrigin*, const String&, unsigned long long)
334 {
335     notImplemented();
336     return 0;
337 }
338
339 unsigned long long ChromeClientQt::requestQuotaIncreaseForDatabaseOperation(Frame*, SecurityOrigin*, const String&, unsigned long long)
340 {
341     notImplemented();
342     return 0;
343 }
344
345 }
346
347