diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-11-05 17:09:46 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-11-05 17:09:46 +0100 |
commit | 79f5361400fa91b30cc4a1b34335b49284ba3e07 (patch) | |
tree | 3c5f79b230ff4c83b441cba5df7da357bc9c4f2e /src/webengine/api | |
parent | bc1529f56b8c86259c7f952b0ea9b439f5cc8d53 (diff) | |
parent | 34b714122051eae86ac49fd95c7015fb081f79eb (diff) |
Merge remote-tracking branch 'origin/5.12' into dev
Conflicts:
src/core/render_widget_host_view_qt.cpp
src/core/web_contents_adapter_client.h
src/webenginewidgets/api/qwebenginepage_p.h
Change-Id: Ibd011c40839c09469218ac4c71a13d0a0b1c9778
Diffstat (limited to 'src/webengine/api')
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 81 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview_p_p.h | 10 |
2 files changed, 81 insertions, 10 deletions
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index 116f49c3c..3bc0be196 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -166,6 +166,9 @@ QQuickWebEngineViewPrivate::~QQuickWebEngineViewPrivate() adapter->stopFinding(); if (faviconProvider) faviconProvider->detach(q_ptr); + // q_ptr->d_ptr might be null due to destroy() + if (q_ptr->d_ptr) + bindViewAndWidget(q_ptr, nullptr); } void QQuickWebEngineViewPrivate::initializeProfile() @@ -188,10 +191,11 @@ bool QQuickWebEngineViewPrivate::profileInitialized() const void QQuickWebEngineViewPrivate::destroy() { - // the profile for this web contens is about to be - // garbage collected, delete WebContent first and - // let the QQuickWebEngineView be collected later by gc. - delete q_ptr->d_ptr.take(); + // The profile for this web contents is about to be + // garbage collected, delete WebContents first and + // let the QQuickWebEngineView be collected later by gc. + bindViewAndWidget(q_ptr, nullptr); + delete q_ptr->d_ptr.take(); } UIDelegatesManager *QQuickWebEngineViewPrivate::ui() @@ -669,6 +673,12 @@ void QQuickWebEngineViewPrivate::printRequested() }); } +void QQuickWebEngineViewPrivate::widgetChanged(RenderWidgetHostViewQtDelegate *newWidgetBase) +{ + Q_Q(QQuickWebEngineView); + bindViewAndWidget(q, static_cast<RenderWidgetHostViewQtDelegateQuick *>(newWidgetBase)); +} + WebEngineSettings *QQuickWebEngineViewPrivate::webEngineSettings() const { return m_settings->d_ptr.data(); @@ -846,6 +856,52 @@ void QQuickWebEngineViewPrivate::setFullScreenMode(bool fullscreen) } } +void QQuickWebEngineViewPrivate::bindViewAndWidget(QQuickWebEngineView *view, + RenderWidgetHostViewQtDelegateQuick *widget) +{ + auto oldWidget = view ? view->d_func()->widget : nullptr; + auto oldView = widget ? widget->m_view : nullptr; + + // Change pointers first. + + if (widget && oldView != view) { + if (oldView) + oldView->d_func()->widget = nullptr; + widget->m_view = view; + } + + if (view && oldWidget != widget) { + if (oldWidget) + oldWidget->m_view = nullptr; + view->d_func()->widget = widget; + } + + // Then notify. + + if (widget && oldView != view && oldView) + oldView->d_func()->widgetChanged(widget, nullptr); + + if (view && oldWidget != widget) + view->d_func()->widgetChanged(oldWidget, widget); +} + +void QQuickWebEngineViewPrivate::widgetChanged(RenderWidgetHostViewQtDelegateQuick *oldWidget, + RenderWidgetHostViewQtDelegateQuick *newWidget) +{ + Q_Q(QQuickWebEngineView); + + if (oldWidget) + oldWidget->setParentItem(nullptr); + + if (newWidget) { + newWidget->setParentItem(q); + newWidget->setSize(q->boundingRect().size()); + // Focus on creation if the view accepts it + if (q->activeFocusOnPress()) + newWidget->setFocus(true); + } +} + void QQuickWebEngineViewPrivate::updateAction(QQuickWebEngineView::WebAction action) const { QQuickWebEngineAction *a = actions[action]; @@ -878,6 +934,15 @@ void QQuickWebEngineViewPrivate::updateAction(QQuickWebEngineView::WebAction act a->d_ptr->setEnabled(enabled); } +void QQuickWebEngineViewPrivate::updateNavigationActions() +{ + updateAction(QQuickWebEngineView::Back); + updateAction(QQuickWebEngineView::Forward); + updateAction(QQuickWebEngineView::Stop); + updateAction(QQuickWebEngineView::Reload); + updateAction(QQuickWebEngineView::ReloadAndBypassCache); + updateAction(QQuickWebEngineView::ViewSource); +} QUrl QQuickWebEngineView::url() const { @@ -1485,11 +1550,9 @@ void QQuickWebEngineView::fullScreenCancelled() void QQuickWebEngineView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { QQuickItem::geometryChanged(newGeometry, oldGeometry); - const QList<QQuickItem *> children = childItems(); - for (QQuickItem *child : children) { - if (qobject_cast<RenderWidgetHostViewQtDelegateQuick *>(child)) - child->setSize(newGeometry.size()); - } + Q_D(QQuickWebEngineView); + if (d->widget) + d->widget->setSize(newGeometry.size()); } void QQuickWebEngineView::itemChange(ItemChange change, const ItemChangeData &value) diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h index ee38ece6b..cbba9b568 100644 --- a/src/webengine/api/qquickwebengineview_p_p.h +++ b/src/webengine/api/qquickwebengineview_p_p.h @@ -63,8 +63,9 @@ #include <QtGui/qaccessibleobject.h> namespace QtWebEngineCore { -class WebContentsAdapter; +class RenderWidgetHostViewQtDelegateQuick; class UIDelegatesManager; +class WebContentsAdapter; } QT_BEGIN_NAMESPACE @@ -145,6 +146,7 @@ public: void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) override; void updateScrollPosition(const QPointF &position) override; void updateContentsSize(const QSizeF &size) override; + void updateNavigationActions() override; void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions, const QPixmap &pixmap, const QPoint &offset) override; bool supportsDragging() const override; @@ -156,6 +158,7 @@ public: QtWebEngineCore::ProfileAdapter *profileAdapter() override; QtWebEngineCore::WebContentsAdapter *webContentsAdapter() override; void printRequested() override; + void widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegate *newWidgetBase) override; void updateAction(QQuickWebEngineView::WebAction) const; void adoptWebContents(QtWebEngineCore::WebContentsAdapter *webContents); @@ -164,6 +167,10 @@ public: void ensureContentsAdapter(); void setFullScreenMode(bool); + static void bindViewAndWidget(QQuickWebEngineView *view, QtWebEngineCore::RenderWidgetHostViewQtDelegateQuick *widget); + void widgetChanged(QtWebEngineCore::RenderWidgetHostViewQtDelegateQuick *oldWidget, + QtWebEngineCore::RenderWidgetHostViewQtDelegateQuick *newWidget); + // QQmlListPropertyHelpers static void userScripts_append(QQmlListProperty<QQuickWebEngineScript> *p, QQuickWebEngineScript *script); static int userScripts_count(QQmlListProperty<QQuickWebEngineScript> *p); @@ -197,6 +204,7 @@ public: uint m_webChannelWorld; bool m_isBeingAdopted; mutable QQuickWebEngineAction *actions[QQuickWebEngineView::WebActionCount]; + QtWebEngineCore::RenderWidgetHostViewQtDelegateQuick *widget = nullptr; bool profileInitialized() const; |