diff options
-rw-r--r-- | Source/WebCore/platform/qt/QWebPageClient.h | 1 | ||||
-rw-r--r-- | Source/WebCore/plugins/win/PluginViewWin.cpp | 27 | ||||
-rw-r--r-- | Source/WebKit/qt/WidgetSupport/PageClientQt.cpp | 54 | ||||
-rw-r--r-- | Source/WebKit/qt/WidgetSupport/PageClientQt.h | 4 |
4 files changed, 62 insertions, 24 deletions
diff --git a/Source/WebCore/platform/qt/QWebPageClient.h b/Source/WebCore/platform/qt/QWebPageClient.h index 1526e9d20..da9ef05de 100644 --- a/Source/WebCore/platform/qt/QWebPageClient.h +++ b/Source/WebCore/platform/qt/QWebPageClient.h @@ -86,6 +86,7 @@ public: virtual int screenNumber() const = 0; virtual QObject* ownerWidget() const = 0; virtual QRect geometryRelativeToOwnerWidget() const = 0; + virtual QPoint mapToOwnerWindow(const QPoint&) const = 0; virtual QObject* pluginParent() const = 0; diff --git a/Source/WebCore/plugins/win/PluginViewWin.cpp b/Source/WebCore/plugins/win/PluginViewWin.cpp index bd14cd948..7160d8a99 100644 --- a/Source/WebCore/plugins/win/PluginViewWin.cpp +++ b/Source/WebCore/plugins/win/PluginViewWin.cpp @@ -357,6 +357,29 @@ static bool isWindowsMessageUserGesture(UINT message) } } +static inline IntPoint contentsToNativeWindow(FrameView* view, const IntPoint& point) +{ +#if PLATFORM(QT) + // Our web view's QWidget isn't necessarily a native window itself. Map the position + // all the way up to the QWidget associated with the HWND returned as NPNVnetscapeWindow. + PlatformPageClient client = view->hostWindow()->platformPageClient(); + return client->mapToOwnerWindow(view->contentsToWindow(point)); +#else + return view->contentsToWindow(point); +#endif +} + +static inline IntRect contentsToNativeWindow(FrameView* view, const IntRect& rect) +{ +#if PLATFORM(QT) + // This only handles translation of the rect. + ASSERT(view->contentsToWindow(rect).size() == rect.size()); + return IntRect(contentsToNativeWindow(view, rect.location()), rect.size()); +#else + return view->contentsToWindow(rect); +#endif +} + LRESULT PluginView::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { @@ -553,7 +576,7 @@ void PluginView::paintIntoTransformedContext(HDC hdc) WINDOWPOS windowpos = { 0, 0, 0, 0, 0, 0, 0 }; - IntRect r = static_cast<FrameView*>(parent())->contentsToWindow(frameRect()); + IntRect r = contentsToNativeWindow(static_cast<FrameView*>(parent()), frameRect()); windowpos.x = r.x(); windowpos.y = r.y(); @@ -702,7 +725,7 @@ void PluginView::handleMouseEvent(MouseEvent* event) NPEvent npEvent; - IntPoint p = static_cast<FrameView*>(parent())->contentsToWindow(IntPoint(event->pageX(), event->pageY())); + IntPoint p = contentsToNativeWindow(static_cast<FrameView*>(parent()), IntPoint(event->pageX(), event->pageY())); npEvent.lParam = MAKELPARAM(p.x(), p.y()); npEvent.wParam = 0; diff --git a/Source/WebKit/qt/WidgetSupport/PageClientQt.cpp b/Source/WebKit/qt/WidgetSupport/PageClientQt.cpp index 095f9e582..8f486d594 100644 --- a/Source/WebKit/qt/WidgetSupport/PageClientQt.cpp +++ b/Source/WebKit/qt/WidgetSupport/PageClientQt.cpp @@ -120,6 +120,16 @@ QRect PageClientQWidget::geometryRelativeToOwnerWidget() const return view->geometry(); } +QPoint PageClientQWidget::mapToOwnerWindow(const QPoint& point) const +{ + QWidget* widget = qobject_cast<QWidget*>(ownerWidget()); + // Can be false both if ownerWidget() is native or if it doesn't have any native parent. + if (const QWidget *nativeParent = widget->nativeParentWidget()) + return widget->mapTo(nativeParent, point); + + return point; +} + QObject* PageClientQWidget::pluginParent() const { return view; @@ -170,7 +180,7 @@ void PageClientQGraphicsWidget::repaintViewport() bool PageClientQGraphicsWidget::makeOpenGLContextCurrentIfAvailable() { #if USE(ACCELERATED_COMPOSITING) && USE(TEXTURE_MAPPER_GL) && defined(QT_OPENGL_LIB) - QGraphicsView* graphicsView = view->scene()->views()[0]; + QGraphicsView* graphicsView = firstGraphicsView(); if (graphicsView && graphicsView->viewport()) { QGLWidget* glWidget = qobject_cast<QGLWidget*>(graphicsView->viewport()); if (glWidget) { @@ -218,14 +228,9 @@ QPalette PageClientQGraphicsWidget::palette() const int PageClientQGraphicsWidget::screenNumber() const { #if defined(Q_WS_X11) - if (QGraphicsScene* scene = view->scene()) { - const QList<QGraphicsView*> views = scene->views(); - - if (!views.isEmpty()) - return views.at(0)->x11Info().screen(); - } + if (QGraphicsView* graphicsView = firstGraphicsView()) + return graphicsView->x11Info().screen(); #endif - return 0; } @@ -240,28 +245,26 @@ QObject* PageClientQGraphicsWidget::ownerWidget() const QRect PageClientQGraphicsWidget::geometryRelativeToOwnerWidget() const { - if (!view->scene()) - return QRect(); - - QList<QGraphicsView*> views = view->scene()->views(); - if (views.isEmpty()) - return QRect(); + if (QGraphicsView* graphicsView = firstGraphicsView()) + return graphicsView->mapFromScene(view->boundingRect()).boundingRect(); + return QRect(); +} - QGraphicsView* graphicsView = views.at(0); - return graphicsView->mapFromScene(view->boundingRect()).boundingRect(); +QPoint PageClientQGraphicsWidget::mapToOwnerWindow(const QPoint& point) const +{ + if (const QGraphicsView* graphicsView = firstGraphicsView()) + if (const QWidget *nativeParent = graphicsView->nativeParentWidget()) + return graphicsView->mapTo(nativeParent, graphicsView->mapFromScene(view->mapToScene(point))); + return point; } #if USE(TILED_BACKING_STORE) QRectF PageClientQGraphicsWidget::graphicsItemVisibleRect() const { - if (!view->scene()) + QGraphicsView* graphicsView = firstGraphicsView(); + if (!graphicsView) return QRectF(); - QList<QGraphicsView*> views = view->scene()->views(); - if (views.isEmpty()) - return QRectF(); - - QGraphicsView* graphicsView = views.at(0); int xOffset = graphicsView->horizontalScrollBar()->value(); int yOffset = graphicsView->verticalScrollBar()->value(); return view->mapRectFromScene(QRectF(QPointF(xOffset, yOffset), graphicsView->viewport()->size())); @@ -291,6 +294,13 @@ QRectF PageClientQGraphicsWidget::windowRect() const // The sceneRect is a good approximation of the size of the application, independent of the view. return view->scene()->sceneRect(); } + +QGraphicsView* PageClientQGraphicsWidget::firstGraphicsView() const +{ + if (view->scene() && !view->scene()->views().isEmpty()) + return view->scene()->views().first(); + return 0; +} #endif // QT_NO_GRAPHICSVIEW } // namespace WebCore diff --git a/Source/WebKit/qt/WidgetSupport/PageClientQt.h b/Source/WebKit/qt/WidgetSupport/PageClientQt.h index 63a80ad03..e9da360bc 100644 --- a/Source/WebKit/qt/WidgetSupport/PageClientQt.h +++ b/Source/WebKit/qt/WidgetSupport/PageClientQt.h @@ -72,6 +72,7 @@ public: virtual int screenNumber() const; virtual QObject* ownerWidget() const; virtual QRect geometryRelativeToOwnerWidget() const; + virtual QPoint mapToOwnerWindow(const QPoint&) const; virtual QObject* pluginParent() const; @@ -158,6 +159,7 @@ public: virtual int screenNumber() const; virtual QObject* ownerWidget() const; virtual QRect geometryRelativeToOwnerWidget() const; + virtual QPoint mapToOwnerWindow(const QPoint&) const; virtual QObject* pluginParent() const; @@ -175,6 +177,8 @@ public: virtual QRectF windowRect() const; + QGraphicsView* firstGraphicsView() const; + QGraphicsWebView* view; QWebPage* page; bool viewResizesToContents; |