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 | |
parent | 774f8d3d8099286ee1202fb8b809b399b4632fb3 (diff) |
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')
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 2 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview.cpp | 76 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebengineview_p.h | 5 |
3 files changed, 65 insertions, 18 deletions
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 187565a76..fbb7c1f9e 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -902,7 +902,7 @@ QWebEnginePage::~QWebEnginePage() Q_D(QWebEnginePage); setDevToolsPage(nullptr); d->adapter->stopFinding(); - QWebEngineViewPrivate::bind(nullptr, this, true); + QWebEngineViewPrivate::removePageFromView(this); } QWebEngineHistory *QWebEnginePage::history() const 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 diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index bfb44bec5..1845bfb60 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -65,7 +65,10 @@ public: Q_DECLARE_PUBLIC(QWebEngineView) QWebEngineView *q_ptr; - static void bind(QWebEngineView *view, QWebEnginePage *page, bool pageBeingDeleted = false); + static void notify(QWebEngineView *view, QWebEnginePage *oldPage, QWebEnginePage *newPage); + static QWebEnginePage* removeViewFromPage(QWebEngineView *view); + static void removePageFromView(QWebEnginePage *page); + static void bind(QWebEngineView *view, QWebEnginePage *page); QWebEngineViewPrivate(); |