diff -r 000000000000 -r dd21522fd290 webengine/osswebengine/WebKitTools/DumpRenderTree/qt/jsobjects.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webengine/osswebengine/WebKitTools/DumpRenderTree/qt/jsobjects.cpp Mon Mar 30 12:54:55 2009 +0300 @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2006 Trolltech ASA + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include +#include +#include +#include +#include + +#include "DumpRenderTree.h" + +class HackWebFrame : public QWebFrame +{ +public: + void mousePressEvent(QMouseEvent *e) { + QWebFrame::mousePressEvent(e); + } + void mouseReleaseEvent(QMouseEvent *e) { + QWebFrame::mouseReleaseEvent(e); + } + void mouseMoveEvent(QMouseEvent *e) { + QWebFrame::mouseMoveEvent(e); + } + +protected: + HackWebFrame(QWebPage *parent, QWebFrameData *frameData) : QWebFrame(parent, frameData) {} + HackWebFrame(QWebFrame *parent, QWebFrameData *frameData) : QWebFrame(parent, frameData) {} + ~HackWebFrame() {} +}; + +LayoutTestController::LayoutTestController(WebCore::DumpRenderTree *drt) + : QObject() + , m_drt(drt) +{ + m_timeoutTimer = 0; + reset(); +} + +void LayoutTestController::reset() +{ + m_isLoading = true; + m_textDump = false; + m_dumpChildrenAsText = false; + m_canOpenWindows = false; + m_waitForDone = false; + m_dumpTitleChanges = false; + if (m_timeoutTimer) { + killTimer(m_timeoutTimer); + m_timeoutTimer = 0; + } + m_topLoadingFrame = 0; +} + +void LayoutTestController::maybeDump(bool ok) +{ + QWebFrame *frame = qobject_cast(sender()); + if (frame != m_topLoadingFrame) + return; + + m_topLoadingFrame = 0; + + if (!shouldWaitUntilDone()) { + emit done(); + m_isLoading = false; + } +} + +void LayoutTestController::waitUntilDone() +{ + //qDebug() << ">>>>waitForDone"; + m_waitForDone = true; + m_timeoutTimer = startTimer(5000); +} + +void LayoutTestController::notifyDone() +{ + //qDebug() << ">>>>notifyDone"; + if (!m_timeoutTimer) + return; + killTimer(m_timeoutTimer); + m_timeoutTimer = 0; + emit done(); + m_isLoading = false; +} + +int LayoutTestController::windowCount() +{ + return m_drt->windowCount(); +} + +void LayoutTestController::clearBackForwardList() +{ + m_drt->webPage()->history().clear(); +} + + +void LayoutTestController::dumpEditingCallbacks() +{ + //qDebug() << ">>>dumpEditingCallbacks"; +} + +void LayoutTestController::queueReload() +{ + //qDebug() << ">>>queueReload"; +} + +void LayoutTestController::provisionalLoad() +{ + QWebFrame *frame = qobject_cast(sender()); + if (!m_topLoadingFrame && m_isLoading) + m_topLoadingFrame = frame; +} + +void LayoutTestController::timerEvent(QTimerEvent *) +{ + qDebug() << ">>>>>>>>>>>>> timeout"; + notifyDone(); +} + +QString LayoutTestController::encodeHostName(const QString &host) +{ + QString encoded = QString::fromLatin1(QUrl::toAce(host + QLatin1String(".no"))); + encoded.truncate(encoded.length() - 3); // strip .no + return encoded; +} + +QString LayoutTestController::decodeHostName(const QString &host) +{ + QString decoded = QUrl::fromAce(host.toLatin1() + QByteArray(".no")); + decoded.truncate(decoded.length() - 3); + return decoded; +} + + +EventSender::EventSender(QWebPage *parent) + : QObject(parent) +{ + m_page = parent; +} + +void EventSender::mouseDown() +{ + QWebFrame *frame = frameUnderMouse(); +// qDebug() << "EventSender::mouseDown" << frame; + if (!frame) + return; + QMouseEvent event(QEvent::MouseButtonPress, m_mousePos - frame->pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + static_cast(frame)->mousePressEvent(&event); +} + +void EventSender::mouseUp() +{ + QWebFrame *frame = frameUnderMouse(); +// qDebug() << "EventSender::mouseUp" << frame; + if (!frame) + return; + QMouseEvent event(QEvent::MouseButtonRelease, m_mousePos - frame->pos(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier); + static_cast(frame)->mouseReleaseEvent(&event); +} + +void EventSender::mouseMoveTo(int x, int y) +{ + QWebFrame *frame = frameUnderMouse(); +// qDebug() << "EventSender::mouseMoveTo" << x << y; + m_mousePos = QPoint(x, y); + QMouseEvent event(QEvent::MouseMove, m_mousePos - frame->pos(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); + static_cast(frame)->mouseMoveEvent(&event); +} + +void EventSender::leapForward(int ms) +{ + m_timeLeap += ms; + qDebug() << "EventSender::leapForward" << ms; +} + +void EventSender::keyDown(const QString &string, const QStringList &modifiers) +{ + qDebug() << "EventSender::keyDown" << string << modifiers; +} + +QWebFrame *EventSender::frameUnderMouse() const +{ + QWebFrame *frame = m_page->mainFrame(); + +redo: + QList children = frame->childFrames(); + for (int i = 0; i < children.size(); ++i) { + if (children.at(i)->geometry().contains(m_mousePos)) { + frame = children.at(i); + goto redo; + } + } + if (frame->geometry().contains(m_mousePos)) + return frame; + return 0; +}