QPoint QWebFrame::pos() const
{
Q_ASSERT(d->frameView);
- return d->frameView->frameGeometry().topLeft();
+ return d->pos();
}
QRect QWebFrame::geometry() const
return rc;
}
-void QWebFrame::mouseMoveEvent(QMouseEvent *ev)
-{
- if (!d->frameView)
- return;
-
- d->eventHandler->handleMouseMoveEvent(PlatformMouseEvent(ev, 0));
- const int xOffset =
- d->horizontalScrollBar() ? d->horizontalScrollBar()->value() : 0;
- const int yOffset =
- d->verticalScrollBar() ? d->verticalScrollBar()->value() : 0;
- IntPoint pt(ev->x() + xOffset, ev->y() + yOffset);
- WebCore::HitTestResult result = d->eventHandler->hitTestResultAtPoint(pt, false);
- WebCore::Element *link = result.URLElement();
- if (link != d->lastHoverElement) {
- d->lastHoverElement = link;
- emit hoveringOverLink(result.absoluteLinkURL().prettyURL(), result.title());
- }
-}
-
-void QWebFrame::mousePressEvent(QMouseEvent *ev)
-{
- if (!d->eventHandler)
- return;
-
- if (ev->button() == Qt::RightButton)
- d->eventHandler->sendContextMenuEvent(PlatformMouseEvent(ev, 1));
- else
- d->eventHandler->handleMousePressEvent(PlatformMouseEvent(ev, 1));
-
- //FIXME need to keep track of subframe focus for key events!
- d->page->setFocus();
-}
-
-void QWebFrame::mouseDoubleClickEvent(QMouseEvent *ev)
-{
- if (!d->eventHandler)
- return;
-
- d->eventHandler->handleMousePressEvent(PlatformMouseEvent(ev, 2));
-
- //FIXME need to keep track of subframe focus for key events!
- d->page->setFocus();
-}
-
-void QWebFrame::mouseReleaseEvent(QMouseEvent *ev)
-{
- if (!d->frameView)
- return;
-
- d->eventHandler->handleMouseReleaseEvent(PlatformMouseEvent(ev, 0));
-
- //FIXME need to keep track of subframe focus for key events!
- d->page->setFocus();
-}
-
-void QWebFrame::wheelEvent(QWheelEvent *ev)
-{
- PlatformWheelEvent wkEvent(ev);
- bool accepted = false;
- if (d->eventHandler)
- accepted = d->eventHandler->handleWheelEvent(wkEvent);
-
- ev->setAccepted(accepted);
-
- //FIXME need to keep track of subframe focus for key events!
- d->page->setFocus();
-}
-
void titleChanged(const QString &title);
void hoveringOverLink(const QString &link, const QString &title);
-protected:
- //for dumprendertree
- virtual void mouseMoveEvent(QMouseEvent*);
- virtual void mousePressEvent(QMouseEvent*);
- virtual void mouseDoubleClickEvent(QMouseEvent*);
- virtual void mouseReleaseEvent(QMouseEvent*);
- virtual void wheelEvent(QWheelEvent*);
-
private:
friend class QWebPage;
friend class QWebPagePrivate;
WebCore::PlatformScrollbar *horizontalScrollBar() const;
WebCore::PlatformScrollbar *verticalScrollBar() const;
+ inline QPoint pos() const
+ { return frameView->frameGeometry().topLeft(); }
+
QWebFrame *q;
WebCore::FrameLoaderClientQt *frameLoaderClient;
WTF::RefPtr<WebCore::Frame> frame;
#include "Editor.h"
#include "PlatformScrollBar.h"
#include "PlatformKeyboardEvent.h"
+#include "PlatformWheelEvent.h"
#include "ProgressTracker.h"
+#include "HitTestResult.h"
#include <QDebug>
#include <QDragEnterEvent>
}
}
+QWebFrame *QWebPagePrivate::frameAt(const QPoint &pos) const
+{
+ QWebFrame *frame = mainFrame;
+
+redo:
+ QList<QWebFrame*> children = frame->childFrames();
+ for (int i = 0; i < children.size(); ++i) {
+ if (children.at(i)->geometry().contains(pos)) {
+ frame = children.at(i);
+ goto redo;
+ }
+ }
+ if (frame->geometry().contains(pos))
+ return frame;
+ return 0;
+}
QWebPage::QWebPage(QWidget *parent)
: QWidget(parent)
void QWebPage::mouseMoveEvent(QMouseEvent *ev)
{
- mainFrame()->mouseMoveEvent(ev);
+ QWebFramePrivate *frame = d->currentFrame(ev->pos())->d;
+ if (!frame->frameView)
+ return;
+
+ frame->eventHandler->handleMouseMoveEvent(PlatformMouseEvent(ev, 0));
+ const int xOffset =
+ frame->horizontalScrollBar() ? frame->horizontalScrollBar()->value() : 0;
+ const int yOffset =
+ frame->verticalScrollBar() ? frame->verticalScrollBar()->value() : 0;
+ IntPoint pt(ev->x() + xOffset, ev->y() + yOffset);
+ WebCore::HitTestResult result = frame->eventHandler->hitTestResultAtPoint(pt, false);
+ WebCore::Element *link = result.URLElement();
+ if (link != frame->lastHoverElement) {
+ frame->lastHoverElement = link;
+ emit hoveringOverLink(result.absoluteLinkURL().prettyURL(), result.title());
+ }
}
void QWebPage::mousePressEvent(QMouseEvent *ev)
{
- mainFrame()->mousePressEvent(ev);
+ d->frameUnderMouse = d->frameAt(ev->pos());
+ QWebFramePrivate *frame = d->frameUnderMouse->d;
+ if (!frame->eventHandler)
+ return;
+
+ if (ev->button() == Qt::RightButton)
+ frame->eventHandler->sendContextMenuEvent(PlatformMouseEvent(ev, 1));
+ else
+ frame->eventHandler->handleMousePressEvent(PlatformMouseEvent(ev, 1));
+
+ //FIXME need to keep track of subframe focus for key events!
+ frame->page->setFocus();
}
void QWebPage::mouseDoubleClickEvent(QMouseEvent *ev)
{
- mainFrame()->mouseDoubleClickEvent(ev);
+ QWebFramePrivate *frame = d->currentFrame(ev->pos())->d;
+ if (!frame->eventHandler)
+ return;
+
+ frame->eventHandler->handleMousePressEvent(PlatformMouseEvent(ev, 2));
+
+ //FIXME need to keep track of subframe focus for key events!
+ frame->page->setFocus();
}
void QWebPage::mouseReleaseEvent(QMouseEvent *ev)
{
- mainFrame()->mouseReleaseEvent(ev);
+ QWebFramePrivate *frame = d->currentFrame(ev->pos())->d;
+ if (frame->frameView) {
+ frame->eventHandler->handleMouseReleaseEvent(PlatformMouseEvent(ev, 0));
+
+ //FIXME need to keep track of subframe focus for key events!
+ frame->page->setFocus();
+ }
+ d->frameUnderMouse = 0;
}
void QWebPage::wheelEvent(QWheelEvent *ev)
{
- mainFrame()->wheelEvent(ev);
+ QWebFramePrivate *frame = d->currentFrame(ev->pos())->d;
+
+ bool accepted = false;
+ if (frame->eventHandler) {
+ WebCore::PlatformWheelEvent pev(ev);
+ accepted = frame->eventHandler->handleWheelEvent(pev);
+ }
+
+ ev->setAccepted(accepted);
+
+ //FIXME need to keep track of subframe focus for key events!
+ frame->page->setFocus();
+
if (!ev->isAccepted())
QWidget::wheelEvent(ev);
}
~QWebPagePrivate();
void createMainFrame();
+ QWebFrame *frameAt(const QPoint &pos) const;
+
WebCore::ChromeClientQt *chromeClient;
WebCore::ContextMenuClientQt *contextMenuClient;
WebCore::EditorClientQt *editorClient;
WebCore::Page *page;
QPointer<QWebFrame> mainFrame;
+ QPointer<QWebFrame> frameUnderMouse;
+
+ inline QWebFrame *currentFrame(const QPoint &pos) const
+ { return frameUnderMouse ? static_cast<QWebFrame *>(frameUnderMouse) : frameAt(pos); }
QWebPage *q;
QUndoStack *undoStack;
+2007-11-07 Simon Hausmann <hausmann@kde.org>
+
+ Reviewed by Lars Knoll <lars@trolltech.com>.
+
+ Moved all the event handlers from QWebFrame into QWebPage.
+
+ This cleans up the public API and allows us to remove the
+ HackWebFrame hack in DumpRenderTree.
+
+
+ * Api/qwebframe.cpp:
+ (QWebFrame::pos):
+ * Api/qwebframe.h:
+ * Api/qwebframe_p.h:
+ * Api/qwebpage.cpp:
+ (QWebPagePrivate::frameAt):
+ (QWebPage::mouseMoveEvent):
+ (QWebPage::mousePressEvent):
+ (QWebPage::mouseDoubleClickEvent):
+ (QWebPage::mouseReleaseEvent):
+ (QWebPage::wheelEvent):
+ * Api/qwebpage_p.h:
+
2007-11-07 Holger Freyther <holger.freyther@trolltech.com>
Reviewed by Lars Knoll <lars@trolltech.com>.
+2007-11-07 Simon Hausmann <hausmann@kde.org>
+
+ Reviewed by Lars Knoll <lars@trolltech.com>.
+
+ Moved all the event handlers from QWebFrame into QWebPage.
+
+ This cleans up the public API and allows us to remove the
+ HackWebFrame hack in DumpRenderTree.
+
+
+ * DumpRenderTree/qt/jsobjects.cpp:
+ (EventSender::mouseDown):
+ (EventSender::mouseUp):
+ (EventSender::mouseMoveTo):
+
2007-11-07 Simon Hausmann <hausmann@kde.org>
Reviewed by Mark.
#include "DumpRenderTree.h"
extern void qt_dump_editing_callbacks(bool b);
-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)
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<HackWebFrame *>(frame)->mousePressEvent(&event);
+ QMouseEvent event(QEvent::MouseButtonPress, m_mousePos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
+ QApplication::sendEvent(m_page, &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<HackWebFrame *>(frame)->mouseReleaseEvent(&event);
+ QMouseEvent event(QEvent::MouseButtonRelease, m_mousePos, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
+ QApplication::sendEvent(m_page, &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<HackWebFrame *>(frame)->mouseMoveEvent(&event);
+ QMouseEvent event(QEvent::MouseMove, m_mousePos, Qt::NoButton, Qt::NoButton, Qt::NoModifier);
+ QApplication::sendEvent(m_page, &event);
}
void EventSender::leapForward(int ms)