summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-05-16 13:07:12 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-05-16 13:07:12 +0200
commit4561b5a83966792b7325e63c91d78a6f70e65961 (patch)
tree8cab52ca2dbaf1acee2292eede72d23c4d63f3b7 /src
parent0c2beb49b858f49489fa4f1ecee6bfdd6ce57e68 (diff)
parentea1395e48205dd45f2485a40e8a3f23273cc4ad3 (diff)
Merge remote-tracking branch 'origin/5.13' into dev
Diffstat (limited to 'src')
m---------src/3rdparty0
-rw-r--r--src/core/config/linux.pri1
-rw-r--r--src/core/configure.json1
-rw-r--r--src/core/profile_adapter.cpp42
-rw-r--r--src/webengine/api/qquickwebengineview.cpp1
-rw-r--r--src/webengine/render_widget_host_view_qt_delegate_quick.cpp8
-rw-r--r--src/webengine/render_widget_host_view_qt_delegate_quickwindow.cpp42
-rw-r--r--src/webengine/render_widget_host_view_qt_delegate_quickwindow.h7
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp36
-rw-r--r--src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc9
-rw-r--r--src/webenginewidgets/doc/src/qwebenginepage_lgpl.qdoc18
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()
*/
/*!