diff options
author | Kirill Burtsev <kirill.burtsev@qt.io> | 2018-08-22 09:53:21 +0200 |
---|---|---|
committer | Kirill Burtsev <kirill.burtsev@qt.io> | 2018-10-01 09:47:54 +0000 |
commit | 3257ab9ce01b01b667237fd6ad33512739db5b01 (patch) | |
tree | dc550c6276444f8077b69319987efd56c00001d4 /src/webenginewidgets/api/qwebengineview.cpp | |
parent | 774f8d3d8099286ee1202fb8b809b399b4632fb3 (diff) | |
download | qtwebengine-3257ab9ce01b01b667237fd6ad33512739db5b01.tar.gz |
Fix QWebEngineView changed properties emit on setPage
QWebEngineView now also emits url, title, icon and selection
changes on setPage in the save way when url changes. Before,
those updates were only forwarded from current page.
Fixes: QTBUG-69300
Change-Id: If827205094423bc00064a123ddb143b6002d2e7c
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Diffstat (limited to 'src/webenginewidgets/api/qwebengineview.cpp')
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 76 |
1 files changed, 60 insertions, 16 deletions
diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index aa51e5b0e..e6f9fcb49 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -55,33 +55,77 @@ QT_BEGIN_NAMESPACE -void QWebEngineViewPrivate::bind(QWebEngineView *view, QWebEnginePage *page, bool pageBeingDeleted) +void QWebEngineViewPrivate::notify(QWebEngineView *view, QWebEnginePage *oldPage, QWebEnginePage *newPage) +{ + Q_ASSERT(view); + + auto oldUrl = oldPage ? oldPage->url() : QUrl(); + auto newUrl = newPage ? newPage->url() : QUrl(); + if (oldUrl != newUrl) + Q_EMIT view->urlChanged(newUrl); + + auto oldTitle = oldPage ? oldPage->title() : QString(); + auto newTitle = newPage ? newPage->title() : QString(); + if (oldTitle != newTitle) + Q_EMIT view->titleChanged(newTitle); + + auto oldIcon = oldPage ? oldPage->iconUrl() : QUrl(); + auto newIcon = newPage ? newPage->iconUrl() : QUrl(); + if (oldIcon != newIcon) { + Q_EMIT view->iconUrlChanged(newIcon); + Q_EMIT view->iconChanged(newPage ? newPage->icon() : QIcon()); + } + + if ((oldPage && oldPage->hasSelection()) || (newPage && newPage->hasSelection())) + Q_EMIT view->selectionChanged(); +} + +QWebEnginePage* QWebEngineViewPrivate::removeViewFromPage(QWebEngineView *view) +{ + Q_ASSERT(view); + QWebEnginePage *oldPage = view->d_func()->page; + + if (oldPage) { + oldPage->disconnect(view); + oldPage->d_func()->view = nullptr; + if (oldPage->parent() != view) + oldPage->d_func()->adapter->reattachRWHV(); + } + return oldPage; +} + +void QWebEngineViewPrivate::removePageFromView(QWebEnginePage *page) +{ + Q_ASSERT(page); + if (QWebEngineView *oldView = page->d_func()->view) { + page->disconnect(oldView); + page->d_func()->view = nullptr; + oldView->d_func()->page = nullptr; + notify(oldView, page, nullptr); + } +} + +void QWebEngineViewPrivate::bind(QWebEngineView *view, QWebEnginePage *page) { if (view && page == view->d_func()->page) return; if (page) { // Un-bind page from its current view. - if (QWebEngineView *oldView = page->d_func()->view) { - page->disconnect(oldView); - oldView->d_func()->page = nullptr; - } + removePageFromView(page); page->d_func()->view = view; - if (!pageBeingDeleted) - page->d_func()->adapter->reattachRWHV(); + page->d_func()->adapter->reattachRWHV(); } if (view) { // Un-bind view from its current page. - if (QWebEnginePage *oldPage = view->d_func()->page) { - oldPage->disconnect(view); - oldPage->d_func()->view = nullptr; - if (oldPage->parent() == view) - delete oldPage; - else - oldPage->d_func()->adapter->reattachRWHV(); - } + QWebEnginePage *oldPage = removeViewFromPage(view); + view->d_func()->page = page; + notify(view, oldPage, page); + + if (oldPage && oldPage->parent() == view) + delete oldPage; } if (view && page) { @@ -149,7 +193,7 @@ QWebEngineView::QWebEngineView(QWidget *parent) QWebEngineView::~QWebEngineView() { - QWebEngineViewPrivate::bind(this, nullptr); + QWebEngineViewPrivate::removeViewFromPage(this); } QWebEnginePage* QWebEngineView::page() const |