diff options
author | Steve Block <steveblock@google.com> | 2010-02-15 12:23:52 +0000 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2010-02-16 11:48:32 +0000 |
commit | 8a0914b749bbe7da7768e07a7db5c6d4bb09472b (patch) | |
tree | 73f9065f370435d6fde32ae129d458a8c77c8dff /WebKit/qt/Api/qwebview.cpp | |
parent | bf14be70295513b8076f3fa47a268a7e42b2c478 (diff) | |
download | external_webkit-8a0914b749bbe7da7768e07a7db5c6d4bb09472b.zip external_webkit-8a0914b749bbe7da7768e07a7db5c6d4bb09472b.tar.gz external_webkit-8a0914b749bbe7da7768e07a7db5c6d4bb09472b.tar.bz2 |
Merge webkit.org at r54731 : Initial merge by git
Change-Id: Ia79977b6cf3b0b00c06ef39419989b28e57e4f4a
Diffstat (limited to 'WebKit/qt/Api/qwebview.cpp')
-rw-r--r-- | WebKit/qt/Api/qwebview.cpp | 141 |
1 files changed, 93 insertions, 48 deletions
diff --git a/WebKit/qt/Api/qwebview.cpp b/WebKit/qt/Api/qwebview.cpp index b5a5a90..79c16c7 100644 --- a/WebKit/qt/Api/qwebview.cpp +++ b/WebKit/qt/Api/qwebview.cpp @@ -60,96 +60,141 @@ void QWebViewPrivate::_q_pageDestroyed() #ifdef Q_WS_MAEMO_5 #include "qabstractkineticscroller.h" +#include "qapplication.h" -class QWebViewKineticScroller : public QAbstractKineticScroller { +// QCoreApplication::sendSpontaneousEvent() is private, hence this friend wrapper +bool qt_sendSpontaneousEvent(QObject* receiver, QEvent* ev) +{ + return QCoreApplication::sendSpontaneousEvent(receiver, ev); +} + +class QWebViewKineticScroller : public QObject, public QAbstractKineticScroller { public: - QWebViewKineticScroller() : QAbstractKineticScroller() {} - // remember the frame where the button was pressed + QWebViewKineticScroller() + : QObject() + , QAbstractKineticScroller() + , m_view(0) + , m_ignoreEvents(false) + { + } + + void setWidget(QWebView* widget) + { + if (m_view) { + m_view->removeEventFilter(this); + QWebFrame* frame = m_view->page()->mainFrame(); + frame->setScrollBarPolicy(Qt::Vertical, m_oldVerticalScrollBarPolicy); + frame->setScrollBarPolicy(Qt::Horizontal, m_oldHorizontalScrollBarPolicy); + } + + m_view = widget; + setParent(m_view); + if (m_view) { + QWebFrame* frame = m_view->page()->mainFrame(); + m_oldHorizontalScrollBarPolicy = frame->scrollBarPolicy(Qt::Horizontal); + m_oldVerticalScrollBarPolicy = frame->scrollBarPolicy(Qt::Vertical); + frame->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); + frame->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); + m_view->installEventFilter(this); + } + } + +protected: bool eventFilter(QObject* o, QEvent* ev) { + if (!o || m_view != o || m_ignoreEvents || !m_view->isEnabled()) + return QObject::eventFilter(o, ev); + + bool res = false; + switch (ev->type()) { case QEvent::MouseButtonPress: { + // remember the frame where the button was pressed QWebFrame* hitFrame = scrollingFrameAt(static_cast<QMouseEvent*>(ev)->pos()); if (hitFrame) m_frame = hitFrame; - break; + // fall through } + case QEvent::MouseMove: + case QEvent::MouseButtonRelease: + case QEvent::MouseButtonDblClick: + res = handleMouseEvent(static_cast<QMouseEvent*>(ev)); + break; default: break; } - return QAbstractKineticScroller::eventFilter(o, ev); + return res ? true : QObject::eventFilter(o, ev); } -protected: - QWebFrame* currentFrame() const + void cancelLeftMouseButtonPress(const QPoint& /* globalPressPos */) { - if (!m_frame.isNull()) - return m_frame.data(); - - QWebView* view = static_cast<QWebView*>(widget()); - QWebFrame* frame = view->page()->mainFrame(); - return frame; + QMouseEvent cmem(QEvent::MouseMove, QPoint(-INT_MAX, -INT_MAX), Qt::LeftButton, QApplication::mouseButtons() | Qt::LeftButton, QApplication::keyboardModifiers()); + sendEvent(m_view, &cmem); + QMouseEvent cmer(QEvent::MouseButtonRelease, QPoint(-INT_MAX, -INT_MAX), Qt::LeftButton, QApplication::mouseButtons() & ~Qt::LeftButton, QApplication::keyboardModifiers()); + sendEvent(m_view, &cmer); } - // Returns the innermost frame at the given position that can scroll. - QWebFrame* scrollingFrameAt(const QPoint& pos) const + QWebFrame* currentFrame() const { - QWebView* view = static_cast<QWebView*>(widget()); - QWebFrame* mainFrame = view->page()->mainFrame(); - QWebFrame* hitFrame = mainFrame->hitTestContent(pos).frame(); - QSize range = hitFrame->contentsSize() - hitFrame->geometry().size(); + if (m_frame) + return m_frame; - while (hitFrame && range.width() <= 1 && range.height() <= 1) - hitFrame = hitFrame->parentFrame(); + if (m_view) + return m_view->page()->mainFrame(); - return hitFrame; + return 0; } - void attachToWidget() + // Returns the innermost frame at the given position that can scroll. + QWebFrame* scrollingFrameAt(const QPoint& pos) const { - QWebView* view = static_cast<QWebView*>(widget()); - QWebFrame* mainFrame = view->page()->mainFrame(); - m_oldHorizontalScrollBarPolicy = mainFrame->scrollBarPolicy(Qt::Horizontal); - m_oldVerticalScrollBarPolicy = mainFrame->scrollBarPolicy(Qt::Vertical); - mainFrame->setScrollBarPolicy(Qt::Vertical, Qt::ScrollBarAlwaysOff); - mainFrame->setScrollBarPolicy(Qt::Horizontal, Qt::ScrollBarAlwaysOff); - view->installEventFilter(this); - } + QWebFrame* hitFrame = 0; + if (m_view) { + QWebFrame* frame = m_view->page()->mainFrame(); + hitFrame = frame->hitTestContent(pos).frame(); + QSize range = hitFrame->contentsSize() - hitFrame->geometry().size(); - void removeFromWidget() - { - QWebView* view = static_cast<QWebView*>(widget()); - view->removeEventFilter(this); - QWebFrame* mainFrame = view->page()->mainFrame(); - mainFrame->setScrollBarPolicy(Qt::Vertical, m_oldVerticalScrollBarPolicy); - mainFrame->setScrollBarPolicy(Qt::Horizontal, m_oldHorizontalScrollBarPolicy); + while (hitFrame && range.width() <= 1 && range.height() <= 1) + hitFrame = hitFrame->parentFrame(); + + return hitFrame; + } } - QRect positionRange() const + QPoint maximumScrollPosition() const { - QRect r; QWebFrame* frame = currentFrame(); - r.setSize(frame->contentsSize() - frame->geometry().size()); - return r; + QSize s = frame ? frame->contentsSize() - frame->geometry().size() : QSize(0, 0); + return QPoint(qMax(0, s.width()), qMax(0, s.height())); } - QPoint position() const + QPoint scrollPosition() const { QWebFrame* frame = currentFrame(); - return frame->scrollPosition(); + return frame ? frame->scrollPosition() : QPoint(); } QSize viewportSize() const { - return static_cast<QWebView*>(widget())->page()->viewportSize(); + return m_view ? m_view->page()->viewportSize() : QSize(); } - void setPosition(const QPoint& point, const QPoint& /* overShootDelta */) + void setScrollPosition(const QPoint& point, const QPoint& /* overShootDelta */) { QWebFrame* frame = currentFrame(); - frame->setScrollPosition(point); + if (frame) + frame->setScrollPosition(point); + } + + void sendEvent(QWidget* w, QEvent* ev) + { + m_ignoreEvents = true; + qt_sendSpontaneousEvent(w, ev); + m_ignoreEvents = false; } + QWebView* m_view; + bool m_ignoreEvents; QPointer<QWebFrame> m_frame; Qt::ScrollBarPolicy m_oldVerticalScrollBarPolicy; Qt::ScrollBarPolicy m_oldHorizontalScrollBarPolicy; @@ -259,7 +304,7 @@ QWebView::QWebView(QWidget *parent) #endif #if defined(Q_WS_MAEMO_5) QAbstractKineticScroller* scroller = new QWebViewKineticScroller(); - scroller->setWidget(this); + static_cast<QWebViewKineticScroller*>(scroller)->setWidget(this); setProperty("kineticScroller", QVariant::fromValue(scroller)); #endif setAcceptDrops(true); |