From e44b509bad1f06d7e257bf09e80dfb5440cdbf9e Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 29 Apr 2019 15:28:53 +0200 Subject: Handle corner case of assigning an implicit page to a new view MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pass the ownership on to the the new view, so it is still handled like an implicit page. Change-Id: I76ad3cb349a492e60e3ad2bdd4aebaabed07bd4f Reviewed-by: Jüri Valdmann --- src/webenginewidgets/api/qwebenginepage.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'src/webenginewidgets/api') diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 85a162383..54006169e 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -746,17 +746,26 @@ void QWebEnginePagePrivate::bindPageAndView(QWebEnginePage *page, QWebEngineView 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) + 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) { oldPage->d_func()->view = nullptr; + deleteOldPage = view->d_func()->m_ownsPage; + } + view->d_func()->m_ownsPage = ownNewPage; view->d_func()->page = page; } @@ -775,14 +784,9 @@ void QWebEnginePagePrivate::bindPageAndView(QWebEnginePage *page, QWebEngineView view->d_func()->pageChanged(oldPage, page); if (oldWidget != widget) view->d_func()->widgetChanged(oldWidget, widget); - - // At this point m_ownsPage should still refer to oldPage, - // it is only set for the new page after binding. - if (view->d_func()->m_ownsPage) { - delete oldPage; - view->d_func()->m_ownsPage = false; - } } + if (deleteOldPage) + delete oldPage; } void QWebEnginePagePrivate::bindPageAndWidget(QWebEnginePage *page, RenderWidgetHostViewQtDelegateWidget *widget) -- cgit v1.2.3 From fc077552673e25c580592047369acbe47f4be46d Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Fri, 3 May 2019 10:45:54 +0200 Subject: Do not crash on QWebEnginePagePrivate::releaseProfile() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Deregistering the widget or deleting the view should be able to handle a now missing d_ptr in the old page. Change-Id: Ic843f7bde12776b6aad4fad865ccf14a25695154 Fixes: QTBUG-75547 Reviewed-by: Jüri Valdmann --- src/webenginewidgets/api/qwebenginepage.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src/webenginewidgets/api') diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index 54006169e..c33034015 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -762,7 +762,8 @@ void QWebEnginePagePrivate::bindPageAndView(QWebEnginePage *page, QWebEngineView if (view && oldPage != page) { if (oldPage) { - oldPage->d_func()->view = nullptr; + if (oldPage->d_func()) + oldPage->d_func()->view = nullptr; deleteOldPage = view->d_func()->m_ownsPage; } view->d_func()->m_ownsPage = ownNewPage; @@ -772,7 +773,7 @@ void QWebEnginePagePrivate::bindPageAndView(QWebEnginePage *page, QWebEngineView // Then notify. auto widget = page ? page->d_func()->widget : nullptr; - auto oldWidget = oldPage ? oldPage->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); @@ -781,7 +782,10 @@ void QWebEnginePagePrivate::bindPageAndView(QWebEnginePage *page, QWebEngineView } if (view && oldPage != page) { - view->d_func()->pageChanged(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); } @@ -797,7 +801,7 @@ void QWebEnginePagePrivate::bindPageAndWidget(QWebEnginePage *page, RenderWidget // Change pointers first. if (widget && oldPage != page) { - if (oldPage) + if (oldPage && oldPage->d_func()) oldPage->d_func()->widget = nullptr; widget->m_page = page; } @@ -810,7 +814,7 @@ void QWebEnginePagePrivate::bindPageAndWidget(QWebEnginePage *page, RenderWidget // Then notify. - if (widget && oldPage != page && oldPage) { + if (widget && oldPage != page && oldPage && oldPage->d_func()) { if (auto oldView = oldPage->d_func()->view) oldView->d_func()->widgetChanged(widget, nullptr); } -- cgit v1.2.3 From efee223d7ff6e0e30fb9d9dff1536936922d4a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCri=20Valdmann?= Date: Mon, 29 Apr 2019 15:51:58 +0200 Subject: Q(Quick)WebEngineProfile: Update list of internal schemes Disallow installing handler for "about" and everything in kStandardURLSchemes of url/url_util.cc. Except for "gopher" which is used in tests. Suppress warning about custom schemes for "gopher" since it's not a custom scheme. Also lowercase the scheme in urlSchemeHandler() and removeUrlSchemeHandler(). Change-Id: I72b06d4fa6433882019405a0d600a593c8971bf1 Reviewed-by: Allan Sandfeld Jensen --- src/webenginewidgets/api/qwebengineprofile.cpp | 32 ++------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) (limited to 'src/webenginewidgets/api') diff --git a/src/webenginewidgets/api/qwebengineprofile.cpp b/src/webenginewidgets/api/qwebengineprofile.cpp index 929c2aaa1..c8aafa0e8 100644 --- a/src/webenginewidgets/api/qwebengineprofile.cpp +++ b/src/webenginewidgets/api/qwebengineprofile.cpp @@ -688,20 +688,7 @@ QWebEngineSettings *QWebEngineProfile::settings() const const QWebEngineUrlSchemeHandler *QWebEngineProfile::urlSchemeHandler(const QByteArray &scheme) const { const Q_D(QWebEngineProfile); - if (d->profileAdapter()->customUrlSchemeHandlers().contains(scheme)) - return d->profileAdapter()->customUrlSchemeHandlers().value(scheme); - return 0; -} - -static bool checkInternalScheme(const QByteArray &scheme) -{ - static QSet internalSchemes; - if (internalSchemes.isEmpty()) { - internalSchemes << QByteArrayLiteral("qrc") << QByteArrayLiteral("data") << QByteArrayLiteral("blob") - << QByteArrayLiteral("http") << QByteArrayLiteral("https") << QByteArrayLiteral("ftp") - << QByteArrayLiteral("javascript"); - } - return internalSchemes.contains(scheme); + return d->profileAdapter()->customUrlSchemeHandlers().value(scheme.toLower()); } /*! @@ -716,23 +703,8 @@ void QWebEngineProfile::installUrlSchemeHandler(const QByteArray &scheme, QWebEn { Q_D(QWebEngineProfile); Q_ASSERT(handler); - QByteArray canonicalScheme = scheme.toLower(); - if (checkInternalScheme(canonicalScheme)) { - qWarning("Cannot install a URL scheme handler overriding internal scheme: %s", scheme.constData()); - return; - } - - if (d->profileAdapter()->customUrlSchemeHandlers().contains(canonicalScheme)) { - if (d->profileAdapter()->customUrlSchemeHandlers().value(canonicalScheme) != handler) - qWarning("URL scheme handler already installed for the scheme: %s", scheme.constData()); + if (!d->profileAdapter()->addCustomUrlSchemeHandler(scheme, handler)) return; - } - - if (QWebEngineUrlScheme::schemeByName(canonicalScheme) == QWebEngineUrlScheme()) - qWarning("Please register the custom scheme '%s' via QWebEngineUrlScheme::registerScheme() " - "before installing the custom scheme handler.", scheme.constData()); - - d->profileAdapter()->addCustomUrlSchemeHandler(canonicalScheme, handler); connect(handler, SIGNAL(_q_destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*)), this, SLOT(destroyedUrlSchemeHandler(QWebEngineUrlSchemeHandler*))); } -- cgit v1.2.3