diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-05-17 09:23:05 +0000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2019-05-17 09:23:05 +0000 |
commit | 0f081baa31facec779057de29eec14c6f458f6a6 (patch) | |
tree | 989110595da0d3ca42a78eaa73078ad24431a2d4 /src | |
parent | a4eeb9dbd995d598bd3a639dd450def7c242b383 (diff) | |
parent | 4561b5a83966792b7325e63c91d78a6f70e65961 (diff) |
Merge "Merge remote-tracking branch 'origin/5.13' into dev" into refs/staging/dev
Diffstat (limited to 'src')
m--------- | src/3rdparty | 0 | ||||
-rw-r--r-- | src/core/config/linux.pri | 1 | ||||
-rw-r--r-- | src/core/configure.json | 1 | ||||
-rw-r--r-- | src/core/profile_adapter.cpp | 42 | ||||
-rw-r--r-- | src/webengine/api/qquickwebengineview.cpp | 1 | ||||
-rw-r--r-- | src/webengine/render_widget_host_view_qt_delegate_quick.cpp | 8 | ||||
-rw-r--r-- | src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp | 42 | ||||
-rw-r--r-- | src/webengine/render_widget_host_view_qt_delegate_quickwindow.h | 7 | ||||
-rw-r--r-- | src/webenginewidgets/api/qwebenginepage.cpp | 36 | ||||
-rw-r--r-- | src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc | 9 | ||||
-rw-r--r-- | src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc | 18 |
11 files changed, 126 insertions, 39 deletions
diff --git a/src/3rdparty b/src/3rdparty -Subproject 0ac2b1fddcd3e1b1e18bf7c7c14a6466deb9ba8 +Subproject 82d848eb4fe3aae8c72a91b2d30c91b407ac559 diff --git a/src/core/config/linux.pri b/src/core/config/linux.pri index 95b7a4bda..fcce4c316 100644 --- a/src/core/config/linux.pri +++ b/src/core/config/linux.pri @@ -36,6 +36,7 @@ clang { gn_args += \ is_clang=true \ clang_use_chrome_plugins=false \ + clang_use_default_sample_profile=false \ clang_base_path=\"$${clang_prefix}\" linux-clang-libc++: gn_args += use_libcxx=true diff --git a/src/core/configure.json b/src/core/configure.json index 6bc6a213c..bb8ad7997 100644 --- a/src/core/configure.json +++ b/src/core/configure.json @@ -5,6 +5,7 @@ "gui-private", "printsupport" ], + "condition": "module.gui", "testDir": "../../config.tests", "commandline": { "options": { diff --git a/src/core/profile_adapter.cpp b/src/core/profile_adapter.cpp index a275952e7..ff0199833 100644 --- a/src/core/profile_adapter.cpp +++ b/src/core/profile_adapter.cpp @@ -443,18 +443,32 @@ void ProfileAdapter::setHttpCacheMaxSize(int maxSize) m_profile->m_profileIOData->updateHttpCache(); } -static bool isInternalScheme(const QByteArray &scheme) +enum class SchemeType { Protected, Overridable, Custom }; +static SchemeType schemeType(const QByteArray &canonicalScheme) { - static QSet<QByteArray> internalSchemes{ - QByteArrayLiteral("qrc"), - QByteArrayLiteral("data"), + static const QSet<QByteArray> blacklist{ + QByteArrayLiteral("about"), QByteArrayLiteral("blob"), - QByteArrayLiteral("http"), - QByteArrayLiteral("https"), - QByteArrayLiteral("ftp"), + QByteArrayLiteral("data"), QByteArrayLiteral("javascript"), + QByteArrayLiteral("qrc"), + // See also kStandardURLSchemes in url/url_util.cc (through url::IsStandard below) + }; + + static const QSet<QByteArray> whitelist{ + QByteArrayLiteral("gopher"), }; - return internalSchemes.contains(scheme); + + bool standardSyntax = url::IsStandard(canonicalScheme.data(), url::Component(0, canonicalScheme.size())); + bool customScheme = QWebEngineUrlScheme::schemeByName(canonicalScheme) != QWebEngineUrlScheme(); + bool blacklisted = blacklist.contains(canonicalScheme); + bool whitelisted = whitelist.contains(canonicalScheme); + + if (whitelisted) + return SchemeType::Overridable; + if (blacklisted || (standardSyntax && !customScheme)) + return SchemeType::Protected; + return SchemeType::Custom; } QWebEngineUrlSchemeHandler *ProfileAdapter::urlSchemeHandler(const QByteArray &scheme) @@ -480,7 +494,7 @@ void ProfileAdapter::removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *handler) auto it = m_customUrlSchemeHandlers.begin(); while (it != m_customUrlSchemeHandlers.end()) { if (it.value() == handler) { - if (isInternalScheme(it.key())) { + if (schemeType(it.key()) == SchemeType::Protected) { qWarning("Cannot remove the URL scheme handler for an internal scheme: %s", it.key().constData()); continue; } @@ -497,7 +511,7 @@ void ProfileAdapter::removeUrlSchemeHandler(QWebEngineUrlSchemeHandler *handler) void ProfileAdapter::removeUrlScheme(const QByteArray &scheme) { QByteArray canonicalScheme = scheme.toLower(); - if (isInternalScheme(canonicalScheme)) { + if (schemeType(canonicalScheme) == SchemeType::Protected) { qWarning("Cannot remove the URL scheme handler for an internal scheme: %s", scheme.constData()); return; } @@ -509,15 +523,19 @@ void ProfileAdapter::installUrlSchemeHandler(const QByteArray &scheme, QWebEngin { Q_ASSERT(handler); QByteArray canonicalScheme = scheme.toLower(); - if (isInternalScheme(canonicalScheme)) { + SchemeType type = schemeType(canonicalScheme); + + if (type == SchemeType::Protected) { qWarning("Cannot install a URL scheme handler overriding internal scheme: %s", scheme.constData()); return; } + if (m_customUrlSchemeHandlers.value(canonicalScheme, handler) != handler) { qWarning("URL scheme handler already installed for the scheme: %s", scheme.constData()); return; } - if (QWebEngineUrlScheme::schemeByName(canonicalScheme) == QWebEngineUrlScheme()) + + if (type == SchemeType::Custom) qWarning("Please register the custom scheme '%s' via QWebEngineUrlScheme::registerScheme() " "before installing the custom scheme handler.", scheme.constData()); diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp index 83b9f1825..02c9b4d00 100644 --- a/src/webengine/api/qquickwebengineview.cpp +++ b/src/webengine/api/qquickwebengineview.cpp @@ -219,6 +219,7 @@ RenderWidgetHostViewQtDelegate *QQuickWebEngineViewPrivate::CreateRenderWidgetHo RenderWidgetHostViewQtDelegateQuick *quickDelegate = new RenderWidgetHostViewQtDelegateQuick(client, /*isPopup = */ true); if (hasWindowCapability) { RenderWidgetHostViewQtDelegateQuickWindow *wrapperWindow = new RenderWidgetHostViewQtDelegateQuickWindow(quickDelegate); + wrapperWindow->setVirtualParent(q); quickDelegate->setParentItem(wrapperWindow->contentItem()); return wrapperWindow; } diff --git a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp index 4d3a71a79..b636448b3 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quick.cpp +++ b/src/webengine/render_widget_host_view_qt_delegate_quick.cpp @@ -101,7 +101,13 @@ void RenderWidgetHostViewQtDelegateQuick::initAsPopup(const QRect &r) QRectF RenderWidgetHostViewQtDelegateQuick::viewGeometry() const { - return QRectF(mapToGlobal(QPointF(0, 0)), size()); + // Transform the entire rect to find the correct top left corner. + const QPointF p1 = mapToGlobal(mapFromScene(QPointF(0, 0))); + const QPointF p2 = mapToGlobal(mapFromScene(QPointF(width(), height()))); + QRectF geometry = QRectF(p1, p2).normalized(); + // But keep the size untransformed to behave like other QQuickItems. + geometry.setSize(size()); + return geometry; } QRect RenderWidgetHostViewQtDelegateQuick::windowGeometry() const diff --git a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp index 91ef84960..c085aacd7 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp +++ b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp @@ -44,8 +44,9 @@ namespace QtWebEngineCore { -RenderWidgetHostViewQtDelegateQuickWindow::RenderWidgetHostViewQtDelegateQuickWindow(RenderWidgetHostViewQtDelegate *realDelegate) +RenderWidgetHostViewQtDelegateQuickWindow::RenderWidgetHostViewQtDelegateQuickWindow(RenderWidgetHostViewQtDelegateQuick *realDelegate) : m_realDelegate(realDelegate) + , m_virtualParent(nullptr) { setFlags(Qt::ToolTip | Qt::FramelessWindowHint | Qt::WindowDoesNotAcceptFocus); } @@ -54,17 +55,43 @@ RenderWidgetHostViewQtDelegateQuickWindow::~RenderWidgetHostViewQtDelegateQuickW { } +void RenderWidgetHostViewQtDelegateQuickWindow::setVirtualParent(QQuickItem *virtualParent) +{ + Q_ASSERT(virtualParent); + m_virtualParent = virtualParent; +} + +static inline QRectF mapRectToGlobal(const QQuickItem *item, const QRectF &rect) +{ + const QPointF p1 = item->mapToGlobal(rect.topLeft()); + const QPointF p2 = item->mapToGlobal(rect.bottomRight()); + return QRectF(p1, p2).normalized(); +} + +static inline QRectF mapRectFromGlobal(const QQuickItem *item, const QRectF &rect) +{ + const QPointF p1 = item->mapFromGlobal(rect.topLeft()); + const QPointF p2 = item->mapFromGlobal(rect.bottomRight()); + return QRectF(p1, p2).normalized(); +} + void RenderWidgetHostViewQtDelegateQuickWindow::initAsPopup(const QRect &screenRect) { - m_realDelegate->initAsPopup(QRect(QPoint(0, 0), screenRect.size())); - setGeometry(screenRect); + QRectF popupRect(screenRect); + popupRect = mapRectFromGlobal(m_virtualParent, popupRect); + popupRect = m_virtualParent->mapRectToScene(popupRect); + popupRect = mapRectToGlobal(m_virtualParent, popupRect); + + m_realDelegate->initAsPopup(QRect(QPoint(0, 0), popupRect.size().toSize())); + popupRect.setSize(screenRect.size()); + setGeometry(popupRect.toAlignedRect()); raise(); show(); } QRectF RenderWidgetHostViewQtDelegateQuickWindow::viewGeometry() const { - return m_realDelegate->viewGeometry(); + return geometry(); } QRect RenderWidgetHostViewQtDelegateQuickWindow::windowGeometry() const @@ -138,7 +165,12 @@ void RenderWidgetHostViewQtDelegateQuickWindow::resize(int width, int height) void RenderWidgetHostViewQtDelegateQuickWindow::move(const QPoint &screenPos) { - QQuickWindow::setPosition(screenPos); + QRectF popupRect(screenPos, size()); + popupRect = mapRectFromGlobal(m_virtualParent, popupRect); + popupRect = m_virtualParent->mapRectToScene(popupRect); + popupRect = mapRectToGlobal(m_virtualParent, popupRect); + + QQuickWindow::setPosition(popupRect.topLeft().toPoint()); } } // namespace QtWebEngineCore diff --git a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.h b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.h index 35a30d976..ab583bd63 100644 --- a/src/webengine/render_widget_host_view_qt_delegate_quickwindow.h +++ b/src/webengine/render_widget_host_view_qt_delegate_quickwindow.h @@ -52,7 +52,7 @@ namespace QtWebEngineCore { class RenderWidgetHostViewQtDelegateQuickWindow : public QQuickWindow , public RenderWidgetHostViewQtDelegate { public: - RenderWidgetHostViewQtDelegateQuickWindow(RenderWidgetHostViewQtDelegate *realDelegate); + RenderWidgetHostViewQtDelegateQuickWindow(RenderWidgetHostViewQtDelegateQuick *realDelegate); ~RenderWidgetHostViewQtDelegateQuickWindow(); void initAsPopup(const QRect&) override; @@ -80,8 +80,11 @@ public: void setClearColor(const QColor &) override { } bool copySurface(const QRect &, const QSize &, QImage &) override { return false; } + void setVirtualParent(QQuickItem *virtualParent); + private: - QScopedPointer<RenderWidgetHostViewQtDelegate> m_realDelegate; + QScopedPointer<RenderWidgetHostViewQtDelegateQuick> m_realDelegate; + QQuickItem *m_virtualParent; }; } // namespace QtWebEngineCore diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp index e1b9a8fe3..86736d42b 100644 --- a/src/webenginewidgets/api/qwebenginepage.cpp +++ b/src/webenginewidgets/api/qwebenginepage.cpp @@ -686,24 +686,34 @@ 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) - oldPage->d_func()->view = nullptr; + 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()->widget : nullptr; + auto oldWidget = (oldPage && oldPage->d_func()) ? oldPage->d_func()->widget : nullptr; if (page && oldView != view && oldView) { oldView->d_func()->pageChanged(page, nullptr); @@ -712,17 +722,15 @@ 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); - - // 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) @@ -733,7 +741,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; } @@ -746,7 +754,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); } diff --git a/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc b/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc index e3fdc4ff1..9e8cc463c 100644 --- a/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc +++ b/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the documentation of the Qt Toolkit. @@ -266,7 +266,6 @@ page.runJavaScript("document.documentElement.contentEditable = true"); \endcode - \section1 Unavailable Qt WebKit API The Qt \WebKit classes and methods in this list will not be available in \QWE. @@ -310,5 +309,11 @@ engine process them by overloading the QWebEnginePage::acceptNavigationRequest() function. This is necessary when an HTML document is used as part of the user interface, and not to display external data, for example, when displaying a list of results. + + \note \l{QWebEnginePage::}{acceptNavigationRequest()} starts the + loading process and emits the \l{QWebEnginePage::}{loadStarted()} + signal \e before the request is accepted or rejected. Therefore, a + \l{QWebEnginePage::}{loadFinished()} signal that returns \c false + is to be expected even after delegating the request. \endtable */ diff --git a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc index c6a97debb..354019a8d 100644 --- a/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc +++ b/src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc @@ -1,5 +1,5 @@ /* - Copyright (C) 2015 The Qt Company Ltd. + Copyright (C) 2019 The Qt Company Ltd. Copyright (C) 2008, 2009, 2012 Nokia Corporation and/or its subsidiary(-ies) Copyright (C) 2007 Staikos Computing Services Inc. Copyright (C) 2007 Apple Inc. @@ -384,6 +384,11 @@ used as part of the user interface, and not to display external data, for example, when displaying a list of results. + \note The loading process is started and the loadStarted() signal is emitted + \e before the request is accepted or rejected. Therefore, a loadFinished() + signal that returns \c false is to be expected even after delegating the + request. + The \l{QWebEngineUrlRequestInterceptor} class offers further options for intercepting and manipulating requests. */ @@ -531,7 +536,7 @@ This signal is emitted when a page starts loading content. - \sa loadFinished() + \sa loadFinished(), acceptNavigationRequest() */ /*! @@ -551,7 +556,14 @@ is independent of script execution or page rendering. \a ok will indicate whether the load was successful or any error occurred. - \sa loadStarted() + \note Navigation requests can be delegated to the Qt application instead + of having the HTML handler engine process them by overloading the + acceptNavigationRequest() function. Because the loading process is started + and the loadStarted() signal is emitted \e before the request is accepted + or rejected, a \c loadFinished() signal that returns \c false is to be + expected even after delegating the request. + + \sa loadStarted(), acceptNavigationRequest() */ /*! |