From 9c198939be1ef064d1a2430a4b9991f2fe16f359 Mon Sep 17 00:00:00 2001 From: Pierre Rossi Date: Thu, 30 Jan 2014 18:26:21 +0100 Subject: [Widgets] RenderWidgetHostViewQtDelegate refactoring Break up the delegate implementation into two distinct subclasses. The first one offers a way for the WebPage to tap into the RenderWidgetHostView directly, while a different implementation that is backed by a top-level widget can be used to show WebUI popups on screen. This has the benefit of not having a child widget in the webview among other things. It also fixes our popups and allows them to fall outside the window frame. Change-Id: I80dc1e4f21bb91ff47c75a626d330f88eacce8c6 Reviewed-by: Jocelyn Turcotte --- src/webenginewidgets/api/qwebengineview.cpp | 33 ++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) (limited to 'src/webenginewidgets/api/qwebengineview.cpp') diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index fc72d1241..eee68d65d 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -48,7 +48,6 @@ #include #include #include -#include QT_BEGIN_NAMESPACE @@ -64,7 +63,6 @@ void QWebEngineViewPrivate::bind(QWebEngineView *view, QWebEnginePage *page) oldView->d_func()->page = 0; } page->d_func()->view = view; - page->d_func()->adapter->reattachRWHV(); } if (view) { @@ -94,8 +92,10 @@ QWebEngineViewPrivate::QWebEngineViewPrivate() QWebEngineView::QWebEngineView(QWidget *parent) : QWidget(*(new QWebEngineViewPrivate), parent, 0) { - // This causes the child RenderWidgetHostViewQtDelegateWidgets to fill this widget. - setLayout(new QStackedLayout); + setFocusPolicy(Qt::ClickFocus); + setMouseTracking(true); + setAttribute(Qt::WA_AcceptTouchEvents); + setAttribute(Qt::WA_OpaquePaintEvent); } QWebEngineView::~QWebEngineView() @@ -205,15 +205,38 @@ void QWebEngineView::setZoomFactor(qreal factor) bool QWebEngineView::event(QEvent *ev) { + Q_D(QWebEngineView); // We swallow spontaneous contextMenu events and synthethize those back later on when we get the // HandleContextMenu callback from chromium if (ev->type() == QEvent::ContextMenu) { ev->accept(); return true; - } + } else if (ev->type() == QEvent::MetaCall) + // Meta calls are not safe to forward to the page, as they could be widget specific (e.g. QWidgetPrivate::_q_showIfNotHidden) + return QWidget::event(ev); + if (d->page && d->page->event(ev)) + return true; + return QWidget::event(ev); } +void QWebEngineView::paintEvent(QPaintEvent *ev) +{ + Q_D(QWebEngineView); + if (!d->page) + return; + QPainter painter(this); + d->page->render(&painter, QRegion(ev->rect())); +} + +void QWebEngineView::resizeEvent(QResizeEvent *ev) +{ + Q_D(QWebEngineView); + if (!d->page) + return; + d->page->setViewportSize(ev->size()); +} + void QWebEngineView::contextMenuEvent(QContextMenuEvent *event) { QMenu *menu = page()->createStandardContextMenu(); -- cgit v1.2.3