diff options
author | Michal Klocek <michal.klocek@qt.io> | 2020-10-20 09:17:47 +0200 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2020-11-20 15:52:58 +0100 |
commit | af5db38a7e43226b5f6fc4624ab8edd4d23a8137 (patch) | |
tree | 26bf4d855bb3e58c6c76d25dfc13940afa3aeb3a /src/webenginewidgets/api/qwebengineview.cpp | |
parent | e3381218acdbec1e9c207ef3eb35371e22941257 (diff) |
Move page's view and widget bindings to view
Change-Id: Ia60a1b864bb173bfd12a94ac4791477a88ea0842
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/webenginewidgets/api/qwebengineview.cpp')
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 91 |
1 files changed, 89 insertions, 2 deletions
diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index b646cee49..f0f8b586e 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -320,6 +320,91 @@ QWebEngineViewPrivate::QWebEngineViewPrivate() #endif // QT_NO_ACCESSIBILITY } +void QWebEngineViewPrivate::bindPageAndView(QWebEnginePage *page, QWebEngineView *view) +{ + auto oldView = page ? page->d_func()->view : nullptr; + auto oldPage = view ? view->d_func()->page : nullptr; + + bool ownNewPage = false; + bool deleteOldPage = false; + + // Change pointers first. + + if (page && oldView != view) { + if (oldView) { + ownNewPage = oldView->d_func()->m_ownsPage; + oldView->d_func()->page = nullptr; + oldView->d_func()->m_ownsPage = false; + } + page->d_func()->view = view; + } + + if (view && oldPage != page) { + if (oldPage) { + if (oldPage->d_func()) + oldPage->d_func()->view = nullptr; + deleteOldPage = view->d_func()->m_ownsPage; + } + view->d_func()->m_ownsPage = ownNewPage; + view->d_func()->page = page; + } + + // Then notify. + + auto widget = page ? page->d_func()->widget : nullptr; + auto oldWidget = (oldPage && oldPage->d_func()) ? oldPage->d_func()->widget : nullptr; + + if (page && oldView != view && oldView) { + oldView->d_func()->pageChanged(page, nullptr); + if (widget) + oldView->d_func()->widgetChanged(widget, nullptr); + } + + if (view && oldPage != page) { + if (oldPage && oldPage->d_func()) + view->d_func()->pageChanged(oldPage, page); + else + view->d_func()->pageChanged(nullptr, page); + if (oldWidget != widget) + view->d_func()->widgetChanged(oldWidget, widget); + } + if (deleteOldPage) + delete oldPage; +} + +void QWebEngineViewPrivate::bindPageAndWidget( + QWebEnginePage *page, QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget *widget) +{ + auto oldPage = widget ? widget->m_page : nullptr; + auto oldWidget = page ? page->d_func()->widget : nullptr; + + // Change pointers first. + + if (widget && oldPage != page) { + if (oldPage && oldPage->d_func()) + oldPage->d_func()->widget = nullptr; + widget->m_page = page; + } + + if (page && oldWidget != widget) { + if (oldWidget) + oldWidget->m_page = nullptr; + page->d_func()->widget = widget; + } + + // Then notify. + + if (widget && oldPage != page && oldPage && oldPage->d_func()) { + if (auto oldView = oldPage->d_func()->view) + oldView->d_func()->widgetChanged(widget, nullptr); + } + + if (page && oldWidget != widget) { + if (auto view = page->d_func()->view) + view->d_func()->widgetChanged(oldWidget, widget); + } +} + /*! \fn QWebEngineView::renderProcessTerminated(QWebEnginePage::RenderProcessTerminationStatus terminationStatus, int exitCode) \since 5.6 @@ -355,7 +440,7 @@ QWebEngineView::QWebEngineView(QWidget *parent) QWebEngineView::~QWebEngineView() { blockSignals(true); - QWebEnginePagePrivate::bindPageAndView(nullptr, this); + QWebEngineViewPrivate::bindPageAndView(nullptr, this); } QWebEnginePage* QWebEngineView::page() const @@ -371,7 +456,9 @@ QWebEnginePage* QWebEngineView::page() const void QWebEngineView::setPage(QWebEnginePage *newPage) { - QWebEnginePagePrivate::bindPageAndView(newPage, this); + QWebEngineViewPrivate::bindPageAndView(newPage, this); + connect(newPage, &QWebEnginePage::_q_aboutToDelete, this, + [newPage]() { QWebEngineViewPrivate::bindPageAndView(newPage, nullptr); }); } void QWebEngineView::load(const QUrl& url) |