first bit of implementation for the textinputcontroller.
[WebKit-https.git] / WebKitTools / DumpRenderTree / qt / jsobjects.cpp
1 /*
2  * Copyright (C) 2006 Trolltech ASA
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer.
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution.
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 #include <jsobjects.h>
29 #include <qwebpage.h>
30 #include <qwebframe.h>
31 #include <qevent.h>
32 #include <qapplication.h>
33 #include <qevent.h>
34
35 #include "DumpRenderTree.h"
36 extern void qt_dump_editing_callbacks(bool b);
37
38 class HackWebFrame : public QWebFrame
39 {
40 public:
41     void mousePressEvent(QMouseEvent *e) {
42         QWebFrame::mousePressEvent(e);
43     }
44     void mouseReleaseEvent(QMouseEvent *e) {
45         QWebFrame::mouseReleaseEvent(e);
46     }
47     void mouseMoveEvent(QMouseEvent *e) {
48         QWebFrame::mouseMoveEvent(e);
49     }
50
51 protected:
52     HackWebFrame(QWebPage *parent, QWebFrameData *frameData) : QWebFrame(parent, frameData) {}
53     HackWebFrame(QWebFrame *parent, QWebFrameData *frameData) : QWebFrame(parent, frameData) {}
54     ~HackWebFrame() {}
55 };
56
57 LayoutTestController::LayoutTestController(WebCore::DumpRenderTree *drt)
58     : QObject()
59     , m_drt(drt)
60 {
61     m_timeoutTimer = 0;
62     reset();
63 }
64
65 void LayoutTestController::reset()
66 {
67     m_isLoading = true;
68     m_textDump = false;
69     m_dumpChildrenAsText = false;
70     m_canOpenWindows = false;
71     m_waitForDone = false;
72     m_dumpTitleChanges = false;
73     if (m_timeoutTimer) {
74         killTimer(m_timeoutTimer);
75         m_timeoutTimer = 0;
76     }
77     m_topLoadingFrame = 0;
78     qt_dump_editing_callbacks(false);
79 }
80
81 void LayoutTestController::maybeDump(bool ok)
82 {
83     QWebFrame *frame = qobject_cast<QWebFrame*>(sender());
84     if (frame != m_topLoadingFrame)
85         return;
86
87     m_topLoadingFrame = 0;
88
89     if (!shouldWaitUntilDone()) {
90         emit done();
91         m_isLoading = false;
92     }
93 }
94
95 void LayoutTestController::waitUntilDone()
96 {
97     //qDebug() << ">>>>waitForDone";
98     m_waitForDone = true;
99     m_timeoutTimer = startTimer(5000);
100 }
101
102 void LayoutTestController::notifyDone()
103 {
104     //qDebug() << ">>>>notifyDone";
105     if (!m_timeoutTimer)
106         return;
107     killTimer(m_timeoutTimer);
108     m_timeoutTimer = 0;
109     emit done();
110     m_isLoading = false;
111 }
112
113 int LayoutTestController::windowCount()
114 {
115     return m_drt->windowCount();
116 }
117
118 void LayoutTestController::clearBackForwardList()
119 {
120     m_drt->webPage()->history().clear();
121 }
122
123
124 void LayoutTestController::dumpEditingCallbacks()
125 {
126     qDebug() << ">>>dumpEditingCallbacks";
127     qt_dump_editing_callbacks(true);
128 }
129
130 void LayoutTestController::queueReload()
131 {
132     //qDebug() << ">>>queueReload";
133 }
134
135 void LayoutTestController::provisionalLoad()
136 {
137     QWebFrame *frame = qobject_cast<QWebFrame*>(sender());
138     if (!m_topLoadingFrame && m_isLoading)
139         m_topLoadingFrame = frame;
140 }
141
142 void LayoutTestController::timerEvent(QTimerEvent *)
143 {
144     qDebug() << ">>>>>>>>>>>>> timeout";
145     notifyDone();
146 }
147
148 QString LayoutTestController::encodeHostName(const QString &host)
149 {
150     QString encoded = QString::fromLatin1(QUrl::toAce(host + QLatin1String(".no")));
151     encoded.truncate(encoded.length() - 3); // strip .no
152     return encoded;
153 }
154
155 QString LayoutTestController::decodeHostName(const QString &host)
156 {
157     QString decoded = QUrl::fromAce(host.toLatin1() + QByteArray(".no"));
158     decoded.truncate(decoded.length() - 3);
159     return decoded;
160 }
161
162
163 EventSender::EventSender(QWebPage *parent)
164     : QObject(parent)
165 {
166     m_page = parent;
167 }
168
169 void EventSender::mouseDown()
170 {
171     QWebFrame *frame = frameUnderMouse();
172 //     qDebug() << "EventSender::mouseDown" << frame;
173     if (!frame)
174         return;
175     QMouseEvent event(QEvent::MouseButtonPress, m_mousePos - frame->pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
176     static_cast<HackWebFrame *>(frame)->mousePressEvent(&event);
177 }
178
179 void EventSender::mouseUp()
180 {
181     QWebFrame *frame = frameUnderMouse();
182 //     qDebug() << "EventSender::mouseUp" << frame;
183     if (!frame)
184         return;
185     QMouseEvent event(QEvent::MouseButtonRelease, m_mousePos - frame->pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
186     static_cast<HackWebFrame *>(frame)->mouseReleaseEvent(&event);
187 }
188
189 void EventSender::mouseMoveTo(int x, int y)
190 {
191     QWebFrame *frame = frameUnderMouse();
192 //     qDebug() << "EventSender::mouseMoveTo" << x << y;
193     m_mousePos = QPoint(x, y);
194     QMouseEvent event(QEvent::MouseMove, m_mousePos - frame->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier);
195     static_cast<HackWebFrame *>(frame)->mouseMoveEvent(&event);
196 }
197
198 void EventSender::leapForward(int ms)
199 {
200     m_timeLeap += ms;
201     qDebug() << "EventSender::leapForward" << ms;
202 }
203
204 void EventSender::keyDown(const QString &string, const QStringList &modifiers)
205 {
206     qDebug() << "EventSender::keyDown" << string << modifiers;
207 }
208
209 QWebFrame *EventSender::frameUnderMouse() const
210 {
211     QWebFrame *frame = m_page->mainFrame();
212
213 redo:
214     QList<QWebFrame*> children = frame->childFrames();
215     for (int i = 0; i < children.size(); ++i) {
216         if (children.at(i)->geometry().contains(m_mousePos)) {
217             frame = children.at(i);
218             goto redo;
219         }
220     }
221     if (frame->geometry().contains(m_mousePos))
222         return frame;
223     return 0;
224 }
225
226
227 TextInputController::TextInputController(QWebPage *parent)
228 {
229 }
230
231 void TextInputController::doCommand(const QString &command)
232 {
233     Qt::KeyboardModifiers modifiers = Qt::NoModifier;
234     int keycode = 0;
235     if (command == "moveBackwardAndModifySelection:") {
236         modifiers |= Qt::ShiftModifier;
237         keycode = Qt::Key_Left;
238     } else if(command =="moveDown:") {
239         keycode = Qt::Key_Down;
240     } else if(command =="moveDownAndModifySelection:") {
241         modifiers |= Qt::ShiftModifier;
242         keycode = Qt::Key_Down;
243     } else if(command =="moveForward:") {
244         keycode = Qt::Key_Right;
245     } else if(command =="moveForwardAndModifySelection:") {
246         modifiers |= Qt::ShiftModifier;
247         keycode = Qt::Key_Right;
248     } else if(command =="moveLeft:") {
249         keycode = Qt::Key_Left;
250     } else if(command =="moveLeftAndModifySelection:") {
251         modifiers |= Qt::ShiftModifier;
252         keycode = Qt::Key_Left;
253     } else if(command =="moveRight:") {
254         keycode = Qt::Key_Right;
255     } else if(command =="moveRightAndModifySelection:") {
256         modifiers |= Qt::ShiftModifier;
257         keycode = Qt::Key_Right;
258     } else if(command =="moveToBeginningOfDocument:") {
259         modifiers |= Qt::ControlModifier;
260         keycode = Qt::Key_Home;
261     } else if(command =="moveToBeginningOfLine:") {
262         keycode = Qt::Key_Home;
263 //     } else if(command =="moveToBeginningOfParagraph:") {
264     } else if(command =="moveToEndOfDocument:") {
265         modifiers |= Qt::ControlModifier;
266         keycode = Qt::Key_End;
267     } else if(command =="moveToEndOfLine:") {
268         keycode = Qt::Key_End;
269 //     } else if(command =="moveToEndOfParagraph:") {
270     } else if(command =="moveUp:") {
271         keycode = Qt::Key_Up;
272     } else if(command =="moveUpAndModifySelection:") {
273         modifiers |= Qt::ShiftModifier;
274         keycode = Qt::Key_Up;
275     } else if(command =="moveWordBackward:") {
276         modifiers |= Qt::ControlModifier;
277         keycode = Qt::Key_Up;
278     } else if(command =="moveWordBackwardAndModifySelection:") {
279         modifiers |= Qt::ShiftModifier;
280         modifiers |= Qt::ControlModifier;
281         keycode = Qt::Key_Left;
282     } else if(command =="moveWordForward:") {
283         modifiers |= Qt::ControlModifier;
284         keycode = Qt::Key_Right;
285     } else if(command =="moveWordForwardAndModifySelection:") {
286         modifiers |= Qt::ControlModifier;
287         modifiers |= Qt::ShiftModifier;
288         keycode = Qt::Key_Right;
289     } else if(command =="moveWordLeft:") {
290         modifiers |= Qt::ControlModifier;
291         keycode = Qt::Key_Left;
292     } else if(command =="moveWordRight:") {
293         modifiers |= Qt::ControlModifier;
294         keycode = Qt::Key_Left;
295     } else if(command =="moveWordRightAndModifySelection:") {
296         modifiers |= Qt::ShiftModifier;
297         modifiers |= Qt::ControlModifier;
298         keycode = Qt::Key_Right;
299     } else if(command =="moveWordLeftAndModifySelection:") {
300         modifiers |= Qt::ShiftModifier;
301         modifiers |= Qt::ControlModifier;
302         keycode = Qt::Key_Left;
303     } else if(command =="pageDown:") {
304         keycode = Qt::Key_PageDown;        
305     } else if(command =="pageUp:") {
306         keycode = Qt::Key_PageUp;        
307     }
308     QKeyEvent event(QEvent::KeyPress, keycode, modifiers);
309     QApplication::sendEvent(parent(), &event);
310     QKeyEvent event2(QEvent::KeyRelease, keycode, modifiers);
311     QApplication::sendEvent(parent(), &event2);
312 }