diff options
Diffstat (limited to 'src')
160 files changed, 967 insertions, 536 deletions
diff --git a/src/3rdparty b/src/3rdparty -Subproject 40948d1690e3a124e45ac562c58d3e6887a3f4f +Subproject e94c0f365f3fb987670f082365628000bf59eb4 diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 23dc00dfa..f5435509c 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -466,7 +466,7 @@ foreach(arch ${archs}) list(APPEND gnArgArg angle_enable_gl=true use_gtk=false # GTK toolkit bindings - use_qt=false # Qt5 toolkit bindings + use_qt5=false # Qt5 toolkit bindings use_gio=false use_bundled_fontconfig=false use_glib=false @@ -479,7 +479,7 @@ foreach(arch ${archs}) ozone_platform="qt" ozone_extra_path="${CMAKE_CURRENT_LIST_DIR}/ozone/ozone_extra.gni" ) - set(systemLibs libjpeg libpng freetype harfbuzz libevent libwebp libxml + set(systemLibs libjpeg libpng freetype harfbuzz libwebp libxml opus snappy icu ffmpeg re2 lcms2 libopenjpeg2 libvpx ) foreach(slib ${systemLibs}) @@ -535,6 +535,10 @@ foreach(arch ${archs}) CONDITION QT_FEATURE_webengine_system_gbm ) extend_gn_list(gnArgArg + ARGS rtc_system_openh264 + CONDITION QT_FEATURE_webengine_webrtc_system_openh264 + ) + extend_gn_list(gnArgArg ARGS use_vaapi CONDITION QT_FEATURE_webengine_vaapi ) diff --git a/src/core/api/configure.cmake b/src/core/api/configure.cmake index 4a556656e..79f44f9a2 100644 --- a/src/core/api/configure.cmake +++ b/src/core/api/configure.cmake @@ -84,6 +84,12 @@ qt_feature("webengine-system-gbm" PRIVATE AUTODETECT UNIX CONDITION GBM_FOUND ) +qt_feature("webengine-webrtc-system-openh264" PRIVATE + LABEL "Use system openh264 for webrtc" + CONDITION UNIX + AND QT_FEATURE_webengine_system_openh264 + AND QT_FEATURE_webengine_proprietary_codecs +) qt_feature("webengine-printing-and-pdf" PRIVATE LABEL "Printing and PDF" PURPOSE "Provides printing and output to PDF." @@ -224,6 +230,10 @@ qt_configure_add_summary_entry( ARGS "webengine-system-pulseaudio" CONDITION LINUX ) +qt_configure_add_summary_entry( + ARGS "webengine-webrtc-system-openh264" + CONDITION UNIX +) qt_configure_add_summary_entry(ARGS "webengine-v8-context-snapshot") qt_configure_add_summary_entry(ARGS "webenginedriver") qt_configure_end_summary_section() # end of "Qt WebEngineCore" section diff --git a/src/core/api/qt_cmdline.cmake b/src/core/api/qt_cmdline.cmake index fe7092b8c..3c5b779c3 100644 --- a/src/core/api/qt_cmdline.cmake +++ b/src/core/api/qt_cmdline.cmake @@ -27,7 +27,7 @@ function(qt_commandline_jumbo arg val nextok) endif() endfunction() -set(systemLibs alsa ffmpeg freetype harfbuzz icu lcms2 libevent libjpeg +set(systemLibs alsa ffmpeg freetype harfbuzz icu lcms2 libjpeg libpng libvpx libxml libwebp minizip opus pulseaudio re2 snappy zlib) foreach(slib ${systemLibs}) qt_commandline_option(webengine-${slib} TYPE enum NAME webengine-system-${slib} VALUES yes no system) diff --git a/src/core/api/qtwebenginecoreglobal.cpp b/src/core/api/qtwebenginecoreglobal.cpp index 931022931..18da6bd43 100644 --- a/src/core/api/qtwebenginecoreglobal.cpp +++ b/src/core/api/qtwebenginecoreglobal.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qtwebenginecoreglobal_p.h" diff --git a/src/core/api/qtwebenginecoreglobal.h b/src/core/api/qtwebenginecoreglobal.h index 0041a72be..8c271de11 100644 --- a/src/core/api/qtwebenginecoreglobal.h +++ b/src/core/api/qtwebenginecoreglobal.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QTWEBENGINECOREGLOBAL_H #define QTWEBENGINECOREGLOBAL_H diff --git a/src/core/api/qtwebenginecoreglobal_p.h b/src/core/api/qtwebenginecoreglobal_p.h index f434e7114..3571754f5 100644 --- a/src/core/api/qtwebenginecoreglobal_p.h +++ b/src/core/api/qtwebenginecoreglobal_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QTWEBENGINECOREGLOBAL_P_H #define QTWEBENGINECOREGLOBAL_P_H diff --git a/src/core/api/qwebenginecertificateerror.cpp b/src/core/api/qwebenginecertificateerror.cpp index 60ec3c95b..e5ea8190e 100644 --- a/src/core/api/qwebenginecertificateerror.cpp +++ b/src/core/api/qwebenginecertificateerror.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginecertificateerror.h" diff --git a/src/core/api/qwebenginecertificateerror.h b/src/core/api/qwebenginecertificateerror.h index 73a3ac090..0021f7506 100644 --- a/src/core/api/qwebenginecertificateerror.h +++ b/src/core/api/qwebenginecertificateerror.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINECERTIFICATEERROR_H #define QWEBENGINECERTIFICATEERROR_H diff --git a/src/core/api/qwebengineclientcertificateselection.cpp b/src/core/api/qwebengineclientcertificateselection.cpp index d6402353c..da46a67e8 100644 --- a/src/core/api/qwebengineclientcertificateselection.cpp +++ b/src/core/api/qwebengineclientcertificateselection.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineclientcertificateselection.h" #include "client_cert_select_controller.h" diff --git a/src/core/api/qwebengineclientcertificateselection.h b/src/core/api/qwebengineclientcertificateselection.h index 559d1753b..ccea66731 100644 --- a/src/core/api/qwebengineclientcertificateselection.h +++ b/src/core/api/qwebengineclientcertificateselection.h @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINECLIENTCERTSELECTION_H #define QWEBENGINECLIENTCERTSELECTION_H diff --git a/src/core/api/qwebengineclientcertificatestore.cpp b/src/core/api/qwebengineclientcertificatestore.cpp index 3d231c05f..38580768e 100644 --- a/src/core/api/qwebengineclientcertificatestore.cpp +++ b/src/core/api/qwebengineclientcertificatestore.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineclientcertificatestore.h" diff --git a/src/core/api/qwebengineclientcertificatestore.h b/src/core/api/qwebengineclientcertificatestore.h index fcebbe2b1..522d01eeb 100644 --- a/src/core/api/qwebengineclientcertificatestore.h +++ b/src/core/api/qwebengineclientcertificatestore.h @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINECLIENTCERTIFICATESTORE_H #define QWEBENGINECLIENTCERTIFICATESTORE_H diff --git a/src/core/api/qwebengineclienthints.cpp b/src/core/api/qwebengineclienthints.cpp index 2f930c181..9560bf835 100644 --- a/src/core/api/qwebengineclienthints.cpp +++ b/src/core/api/qwebengineclienthints.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineclienthints.h" diff --git a/src/core/api/qwebengineclienthints.h b/src/core/api/qwebengineclienthints.h index 8579b20a9..15be5acef 100644 --- a/src/core/api/qwebengineclienthints.h +++ b/src/core/api/qwebengineclienthints.h @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINECLIENTHINTS_H #define QWEBENGINECLIENTHINTS_H @@ -9,7 +10,6 @@ #include <QtCore/qobject.h> #include <QtCore/qpointer.h> #include <QtCore/qvariantmap.h> -#include <QtQml/qqmlregistration.h> namespace QtWebEngineCore { class ProfileAdapter; @@ -34,10 +34,6 @@ class Q_WEBENGINECORE_EXPORT QWebEngineClientHints : public QObject Q_PROPERTY(bool isAllClientHintsEnabled READ isAllClientHintsEnabled WRITE setAllClientHintsEnabled FINAL) public: - QML_NAMED_ELEMENT(WebEngineClientHints) - QML_UNCREATABLE("") - QML_ADDED_IN_VERSION(6, 8) - ~QWebEngineClientHints(); QString arch() const; diff --git a/src/core/api/qwebenginecontextmenurequest.cpp b/src/core/api/qwebenginecontextmenurequest.cpp index 25de1fe6b..00c3c32f1 100644 --- a/src/core/api/qwebenginecontextmenurequest.cpp +++ b/src/core/api/qwebenginecontextmenurequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginecontextmenurequest.h" #include "qwebenginecontextmenurequest_p.h" diff --git a/src/core/api/qwebenginecontextmenurequest.h b/src/core/api/qwebenginecontextmenurequest.h index 6e6f6338c..1d3a2932b 100644 --- a/src/core/api/qwebenginecontextmenurequest.h +++ b/src/core/api/qwebenginecontextmenurequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINECONTEXTMENUREQUEST_H #define QWEBENGINECONTEXTMENUREQUEST_H diff --git a/src/core/api/qwebenginecontextmenurequest_p.h b/src/core/api/qwebenginecontextmenurequest_p.h index 0e774f534..558cc13d5 100644 --- a/src/core/api/qwebenginecontextmenurequest_p.h +++ b/src/core/api/qwebenginecontextmenurequest_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINECONTEXTMENUREQUEST_P_H #define QWEBENGINECONTEXTMENUREQUEST_P_H diff --git a/src/core/api/qwebenginecookiestore.cpp b/src/core/api/qwebenginecookiestore.cpp index 6c4536a4a..49eb47205 100644 --- a/src/core/api/qwebenginecookiestore.cpp +++ b/src/core/api/qwebenginecookiestore.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginecookiestore.h" #include "qwebenginecookiestore_p.h" diff --git a/src/core/api/qwebenginecookiestore.h b/src/core/api/qwebenginecookiestore.h index 347d0c45c..ebc0be8e8 100644 --- a/src/core/api/qwebenginecookiestore.h +++ b/src/core/api/qwebenginecookiestore.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINECOOKIESTORE_H #define QWEBENGINECOOKIESTORE_H diff --git a/src/core/api/qwebenginecookiestore_p.h b/src/core/api/qwebenginecookiestore_p.h index 51200436d..1aba0bc52 100644 --- a/src/core/api/qwebenginecookiestore_p.h +++ b/src/core/api/qwebenginecookiestore_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINECOOKIESTORE_P_H #define QWEBENGINECOOKIESTORE_P_H diff --git a/src/core/api/qwebenginedesktopmediarequest.cpp b/src/core/api/qwebenginedesktopmediarequest.cpp index 1fdbfa655..d965522bc 100644 --- a/src/core/api/qwebenginedesktopmediarequest.cpp +++ b/src/core/api/qwebenginedesktopmediarequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "desktop_media_controller.h" #include "qwebenginedesktopmediarequest.h" diff --git a/src/core/api/qwebenginedesktopmediarequest.h b/src/core/api/qwebenginedesktopmediarequest.h index ebf66bce4..c8cc6d817 100644 --- a/src/core/api/qwebenginedesktopmediarequest.h +++ b/src/core/api/qwebenginedesktopmediarequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEDESKTOPMEDIAREQUEST_H #define QWEBENGINEDESKTOPMEDIAREQUEST_H diff --git a/src/core/api/qwebenginedesktopmediarequest_p.h b/src/core/api/qwebenginedesktopmediarequest_p.h index 3add71bc0..a1e6b8dae 100644 --- a/src/core/api/qwebenginedesktopmediarequest_p.h +++ b/src/core/api/qwebenginedesktopmediarequest_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/core/api/qwebenginedownloadrequest.cpp b/src/core/api/qwebenginedownloadrequest.cpp index 536d193b7..2c90d4c94 100644 --- a/src/core/api/qwebenginedownloadrequest.cpp +++ b/src/core/api/qwebenginedownloadrequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginedownloadrequest.h" #include "qwebenginedownloadrequest_p.h" diff --git a/src/core/api/qwebenginedownloadrequest.h b/src/core/api/qwebenginedownloadrequest.h index 36604188e..c64b5cfa4 100644 --- a/src/core/api/qwebenginedownloadrequest.h +++ b/src/core/api/qwebenginedownloadrequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEDOWNLOADREQUEST_H #define QWEBENGINEDOWNLOADREQUEST_H diff --git a/src/core/api/qwebenginedownloadrequest_p.h b/src/core/api/qwebenginedownloadrequest_p.h index e829f94b1..4e74894a7 100644 --- a/src/core/api/qwebenginedownloadrequest_p.h +++ b/src/core/api/qwebenginedownloadrequest_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEDOWNLOADREQUEST_P_H #define QWEBENGINEDOWNLOADREQUEST_P_H diff --git a/src/core/api/qwebengineextensioninfo.cpp b/src/core/api/qwebengineextensioninfo.cpp index 0a1525a07..2c4731e3a 100644 --- a/src/core/api/qwebengineextensioninfo.cpp +++ b/src/core/api/qwebengineextensioninfo.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineextensioninfo.h" #include "qwebengineextensioninfo_p.h" diff --git a/src/core/api/qwebengineextensioninfo.h b/src/core/api/qwebengineextensioninfo.h index 5ab02d60e..413f29477 100644 --- a/src/core/api/qwebengineextensioninfo.h +++ b/src/core/api/qwebengineextensioninfo.h @@ -1,5 +1,6 @@ // Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEEXTENSIONINFO_H_ #define QWEBENGINEEXTENSIONINFO_H_ @@ -35,9 +36,6 @@ class QWebEngineExtensionInfo Q_PROPERTY(bool isInstalled READ isInstalled FINAL) public: - QML_VALUE_TYPE(webEngineExtension) - QML_ADDED_IN_VERSION(6, 10) - Q_WEBENGINECORE_EXPORT QWebEngineExtensionInfo(); Q_WEBENGINECORE_EXPORT diff --git a/src/core/api/qwebengineextensioninfo_p.h b/src/core/api/qwebengineextensioninfo_p.h index 79f505cf8..385395054 100644 --- a/src/core/api/qwebengineextensioninfo_p.h +++ b/src/core/api/qwebengineextensioninfo_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEEXTENSION_P_H_ #define QWEBENGINEEXTENSION_P_H_ diff --git a/src/core/api/qwebengineextensionmanager.cpp b/src/core/api/qwebengineextensionmanager.cpp index ed83df5e8..71d3326c3 100644 --- a/src/core/api/qwebengineextensionmanager.cpp +++ b/src/core/api/qwebengineextensionmanager.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineextensionmanager.h" diff --git a/src/core/api/qwebengineextensionmanager.h b/src/core/api/qwebengineextensionmanager.h index a908be97b..0fc6d3e01 100644 --- a/src/core/api/qwebengineextensionmanager.h +++ b/src/core/api/qwebengineextensionmanager.h @@ -1,5 +1,6 @@ // Copyright (C) 2025 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEEXTENSIONMANAGER_H_ #define QWEBENGINEEXTENSIONMANAGER_H_ @@ -26,10 +27,6 @@ class Q_WEBENGINECORE_EXPORT QWebEngineExtensionManager : public QObject Q_PROPERTY(QString installPath READ installPath FINAL) Q_PROPERTY(QList<QWebEngineExtensionInfo> extensions READ extensions FINAL) public: - QML_NAMED_ELEMENT(WebEngineExtensionManager) - QML_UNCREATABLE("") - QML_ADDED_IN_VERSION(6, 10) - ~QWebEngineExtensionManager() override; Q_INVOKABLE void loadExtension(const QString &path); Q_INVOKABLE void installExtension(const QString &path); diff --git a/src/core/api/qwebenginefilesystemaccessrequest.cpp b/src/core/api/qwebenginefilesystemaccessrequest.cpp index 0834468f6..6ef500bfe 100644 --- a/src/core/api/qwebenginefilesystemaccessrequest.cpp +++ b/src/core/api/qwebenginefilesystemaccessrequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginefilesystemaccessrequest.h" diff --git a/src/core/api/qwebenginefilesystemaccessrequest.h b/src/core/api/qwebenginefilesystemaccessrequest.h index 7707c607c..b379edf40 100644 --- a/src/core/api/qwebenginefilesystemaccessrequest.h +++ b/src/core/api/qwebenginefilesystemaccessrequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEFILESYSTEMACCESSREQUEST_H #define QWEBENGINEFILESYSTEMACCESSREQUEST_H diff --git a/src/core/api/qwebenginefindtextresult.cpp b/src/core/api/qwebenginefindtextresult.cpp index ce953ddff..34096f3eb 100644 --- a/src/core/api/qwebenginefindtextresult.cpp +++ b/src/core/api/qwebenginefindtextresult.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginefindtextresult.h" diff --git a/src/core/api/qwebenginefindtextresult.h b/src/core/api/qwebenginefindtextresult.h index d506a50f5..789f11894 100644 --- a/src/core/api/qwebenginefindtextresult.h +++ b/src/core/api/qwebenginefindtextresult.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEFINDTEXTRESULT_H #define QWEBENGINEFINDTEXTRESULT_H diff --git a/src/core/api/qwebengineframe.cpp b/src/core/api/qwebengineframe.cpp index 6eb628ffa..fb69ac6b0 100644 --- a/src/core/api/qwebengineframe.cpp +++ b/src/core/api/qwebengineframe.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineframe.h" diff --git a/src/core/api/qwebengineframe.h b/src/core/api/qwebengineframe.h index 02f442f4f..62de87fea 100644 --- a/src/core/api/qwebengineframe.h +++ b/src/core/api/qwebengineframe.h @@ -1,5 +1,6 @@ // Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEFRAME_H #define QWEBENGINEFRAME_H diff --git a/src/core/api/qwebenginefullscreenrequest.cpp b/src/core/api/qwebenginefullscreenrequest.cpp index ddfaae099..406e27684 100644 --- a/src/core/api/qwebenginefullscreenrequest.cpp +++ b/src/core/api/qwebenginefullscreenrequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginefullscreenrequest.h" diff --git a/src/core/api/qwebenginefullscreenrequest.h b/src/core/api/qwebenginefullscreenrequest.h index 07a2b8059..5632e2a7e 100644 --- a/src/core/api/qwebenginefullscreenrequest.h +++ b/src/core/api/qwebenginefullscreenrequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEFULLSCREENREQUEST_H #define QWEBENGINEFULLSCREENREQUEST_H diff --git a/src/core/api/qwebengineglobalsettings.cpp b/src/core/api/qwebengineglobalsettings.cpp index 6aadd5517..1fef72f15 100644 --- a/src/core/api/qwebengineglobalsettings.cpp +++ b/src/core/api/qwebengineglobalsettings.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #include "qwebengineglobalsettings.h" #include "qwebengineglobalsettings_p.h" diff --git a/src/core/api/qwebengineglobalsettings.h b/src/core/api/qwebengineglobalsettings.h index a9eff6d12..f13849a34 100644 --- a/src/core/api/qwebengineglobalsettings.h +++ b/src/core/api/qwebengineglobalsettings.h @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #ifndef QWEBENGINEGLOBALSETTINGS_H #define QWEBENGINEGLOBALSETTINGS_H diff --git a/src/core/api/qwebengineglobalsettings_p.h b/src/core/api/qwebengineglobalsettings_p.h index 8e35ad68c..28adba677 100644 --- a/src/core/api/qwebengineglobalsettings_p.h +++ b/src/core/api/qwebengineglobalsettings_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #ifndef QWEBENGINEGLOBALSETTINGS_P_H #define QWEBENGINEGLOBALSETTINGS_P_H diff --git a/src/core/api/qwebenginehistory.cpp b/src/core/api/qwebenginehistory.cpp index 5d2fc8e9e..a6b44ce61 100644 --- a/src/core/api/qwebenginehistory.cpp +++ b/src/core/api/qwebenginehistory.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginehistory.h" #include "qwebenginehistory_p.h" diff --git a/src/core/api/qwebenginehistory.h b/src/core/api/qwebenginehistory.h index fd54e62a5..796fb0b6b 100644 --- a/src/core/api/qwebenginehistory.h +++ b/src/core/api/qwebenginehistory.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEHISTORY_H #define QWEBENGINEHISTORY_H diff --git a/src/core/api/qwebenginehistory_p.h b/src/core/api/qwebenginehistory_p.h index fe28f4a0e..e4099081b 100644 --- a/src/core/api/qwebenginehistory_p.h +++ b/src/core/api/qwebenginehistory_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEHISTORY_P_H #define QWEBENGINEHISTORY_P_H diff --git a/src/core/api/qwebenginehttprequest.cpp b/src/core/api/qwebenginehttprequest.cpp index 0039533d6..8f6cd07d9 100644 --- a/src/core/api/qwebenginehttprequest.cpp +++ b/src/core/api/qwebenginehttprequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #include "qplatformdefs.h" #include <QtCore/qshareddata.h> diff --git a/src/core/api/qwebenginehttprequest.h b/src/core/api/qwebenginehttprequest.h index 6c0298f86..3147b8d05 100644 --- a/src/core/api/qwebenginehttprequest.h +++ b/src/core/api/qwebenginehttprequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #ifndef QWEBENGINEHTTPREQUEST_H #define QWEBENGINEHTTPREQUEST_H diff --git a/src/core/api/qwebengineloadinginfo.cpp b/src/core/api/qwebengineloadinginfo.cpp index e60c70edb..60e502616 100644 --- a/src/core/api/qwebengineloadinginfo.cpp +++ b/src/core/api/qwebengineloadinginfo.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include <qwebengineloadinginfo.h> diff --git a/src/core/api/qwebengineloadinginfo.h b/src/core/api/qwebengineloadinginfo.h index 098f8936a..8b14983ff 100644 --- a/src/core/api/qwebengineloadinginfo.h +++ b/src/core/api/qwebengineloadinginfo.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINELOADINGINFO_H #define QWEBENGINELOADINGINFO_H diff --git a/src/core/api/qwebenginemessagepumpscheduler.cpp b/src/core/api/qwebenginemessagepumpscheduler.cpp index 860696c37..1b37b3ac7 100644 --- a/src/core/api/qwebenginemessagepumpscheduler.cpp +++ b/src/core/api/qwebenginemessagepumpscheduler.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2019 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginemessagepumpscheduler_p.h" diff --git a/src/core/api/qwebenginemessagepumpscheduler_p.h b/src/core/api/qwebenginemessagepumpscheduler_p.h index b2c51415a..84f21e3aa 100644 --- a/src/core/api/qwebenginemessagepumpscheduler_p.h +++ b/src/core/api/qwebenginemessagepumpscheduler_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2019 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEMESSAGEPUMPSCHEDULER_P_H #define QWEBENGINEMESSAGEPUMPSCHEDULER_P_H diff --git a/src/core/api/qwebenginenavigationrequest.cpp b/src/core/api/qwebenginenavigationrequest.cpp index a83a9289d..4fa00f956 100644 --- a/src/core/api/qwebenginenavigationrequest.cpp +++ b/src/core/api/qwebenginenavigationrequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginenavigationrequest.h" diff --git a/src/core/api/qwebenginenavigationrequest.h b/src/core/api/qwebenginenavigationrequest.h index a810a59fe..b4d75e71e 100644 --- a/src/core/api/qwebenginenavigationrequest.h +++ b/src/core/api/qwebenginenavigationrequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINENAVIGATIONREQUEST_H #define QWEBENGINENAVIGATIONREQUEST_H diff --git a/src/core/api/qwebenginenewwindowrequest.cpp b/src/core/api/qwebenginenewwindowrequest.cpp index 500f3ac2b..7f8e62f69 100644 --- a/src/core/api/qwebenginenewwindowrequest.cpp +++ b/src/core/api/qwebenginenewwindowrequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginenewwindowrequest.h" #include "qwebenginenewwindowrequest_p.h" diff --git a/src/core/api/qwebenginenewwindowrequest.h b/src/core/api/qwebenginenewwindowrequest.h index 86d182581..c5b821df0 100644 --- a/src/core/api/qwebenginenewwindowrequest.h +++ b/src/core/api/qwebenginenewwindowrequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINENEWWINDOWREQUEST_H #define QWEBENGINENEWWINDOWREQUEST_H diff --git a/src/core/api/qwebenginenewwindowrequest_p.h b/src/core/api/qwebenginenewwindowrequest_p.h index 979d3fe2d..8e3a45860 100644 --- a/src/core/api/qwebenginenewwindowrequest_p.h +++ b/src/core/api/qwebenginenewwindowrequest_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINENEWWINDOWREQUEST_P_H #define QWEBENGINENEWWINDOWREQUEST_P_H diff --git a/src/core/api/qwebenginenotification.cpp b/src/core/api/qwebenginenotification.cpp index 0c72848c6..7f705dfba 100644 --- a/src/core/api/qwebenginenotification.cpp +++ b/src/core/api/qwebenginenotification.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginenotification.h" diff --git a/src/core/api/qwebenginenotification.h b/src/core/api/qwebenginenotification.h index 646413d39..99442f0cd 100644 --- a/src/core/api/qwebenginenotification.h +++ b/src/core/api/qwebenginenotification.h @@ -1,5 +1,6 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINENOTIFICATION_H #define QWEBENGINENOTIFICATION_H diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index cfc549ecc..8d73723f6 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginepage.h" #include "authenticator_request_dialog_controller.h" @@ -589,49 +590,6 @@ void QWebEnginePagePrivate::showColorDialog(QSharedPointer<ColorChooserControlle view->showColorDialog(controller); } -void QWebEnginePagePrivate::runMediaAccessPermissionRequest(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags requestFlags) -{ - Q_Q(QWebEnginePage); - QWebEnginePermission::PermissionType permissionType; - - if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) - && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - permissionType = QWebEnginePermission::PermissionType::MediaAudioVideoCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) - permissionType = QWebEnginePermission::PermissionType::MediaAudioCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - permissionType = QWebEnginePermission::PermissionType::MediaVideoCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) - && requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - permissionType = QWebEnginePermission::PermissionType::DesktopAudioVideoCapture; - else // if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - permissionType = QWebEnginePermission::PermissionType::DesktopVideoCapture; - - Q_EMIT q->permissionRequested(createFeaturePermissionObject(securityOrigin, permissionType)); - -#if QT_DEPRECATED_SINCE(6, 8) - QT_WARNING_PUSH - QT_WARNING_DISABLE_DEPRECATED - QWebEnginePage::Feature deprecatedFeature; - - if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) - && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - deprecatedFeature = QWebEnginePage::MediaAudioVideoCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) - deprecatedFeature = QWebEnginePage::MediaAudioCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - deprecatedFeature = QWebEnginePage::MediaVideoCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) - && requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - deprecatedFeature = QWebEnginePage::DesktopAudioVideoCapture; - else // if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - deprecatedFeature = QWebEnginePage::DesktopVideoCapture; - - Q_EMIT q->featurePermissionRequested(securityOrigin, deprecatedFeature); - QT_WARNING_POP -#endif // QT_DEPRECATED_SINCE(6, 8) -} - #if QT_DEPRECATED_SINCE(6, 8) QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED @@ -667,33 +625,19 @@ static QWebEnginePage::Feature toDeprecatedFeature(QWebEnginePermission::Permiss QT_WARNING_POP #endif // QT_DEPRECATED_SINCE(6, 8) -void QWebEnginePagePrivate::runFeaturePermissionRequest(QWebEnginePermission::PermissionType permissionType, const QUrl &securityOrigin) +void QWebEnginePagePrivate::runFeaturePermissionRequest( + QWebEnginePermission::PermissionType permissionType, + const QUrl &securityOrigin, + int childId, const std::string &serializedToken) { Q_Q(QWebEnginePage); - if (QWebEnginePermission::isPersistent(permissionType)) { - Q_EMIT q->permissionRequested(createFeaturePermissionObject(securityOrigin, permissionType)); -#if QT_DEPRECATED_SINCE(6, 8) - QT_WARNING_PUSH - QT_WARNING_DISABLE_DEPRECATED - Q_EMIT q->featurePermissionRequested(securityOrigin, toDeprecatedFeature(permissionType)); - QT_WARNING_POP -#endif // QT_DEPRECATED_SINCE(6, 8) - return; - } - - Q_UNREACHABLE(); -} - -void QWebEnginePagePrivate::runMouseLockPermissionRequest(const QUrl &securityOrigin) -{ - Q_Q(QWebEnginePage); - Q_EMIT q->permissionRequested(createFeaturePermissionObject(securityOrigin, QWebEnginePermission::PermissionType::MouseLock)); - + Q_EMIT q->permissionRequested(QWebEnginePermission( + new QWebEnginePermissionPrivate(securityOrigin, permissionType, profileAdapter(), childId, serializedToken))); #if QT_DEPRECATED_SINCE(6, 8) QT_WARNING_PUSH QT_WARNING_DISABLE_DEPRECATED - Q_EMIT q->featurePermissionRequested(securityOrigin, QWebEnginePage::MouseLock); + Q_EMIT q->featurePermissionRequested(securityOrigin, toDeprecatedFeature(permissionType)); QT_WARNING_POP #endif // QT_DEPRECATED_SINCE(6, 8) } @@ -884,12 +828,6 @@ void QWebEnginePagePrivate::showWebAuthDialog(QWebEngineWebAuthUxRequest *reques Q_EMIT q->webAuthUxRequested(request); } -QWebEnginePermission QWebEnginePagePrivate::createFeaturePermissionObject(const QUrl &securityOrigin, QWebEnginePermission::PermissionType feature) -{ - auto *returnPrivate = new QWebEnginePermissionPrivate(securityOrigin, feature, adapter, profileAdapter()); - return QWebEnginePermission(returnPrivate); -} - QWebEnginePage::QWebEnginePage(QObject* parent) : QObject(parent) , d_ptr(new QWebEnginePagePrivate()) @@ -1917,7 +1855,7 @@ void QWebEnginePage::setFeaturePermission(const QUrl &securityOrigin, QWebEngine Q_UNREACHABLE(); } - d->adapter->setPermission(securityOrigin, f, s); + d->adapter->setPermission(securityOrigin, f, s, {}); } QT_WARNING_POP #endif // QT_DEPRECATED_SINCE(6, 8) diff --git a/src/core/api/qwebenginepage.h b/src/core/api/qwebenginepage.h index ada0af9da..9bee1f98e 100644 --- a/src/core/api/qwebenginepage.h +++ b/src/core/api/qwebenginepage.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEPAGE_H #define QWEBENGINEPAGE_H diff --git a/src/core/api/qwebenginepage_p.h b/src/core/api/qwebenginepage_p.h index 5e81a0cf9..ba1fbc6d5 100644 --- a/src/core/api/qwebenginepage_p.h +++ b/src/core/api/qwebenginepage_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEPAGE_P_H #define QWEBENGINEPAGE_P_H @@ -147,9 +148,8 @@ public: void authenticationRequired( QSharedPointer<QtWebEngineCore::AuthenticationDialogController>) override; void releaseProfile() override; - void runMediaAccessPermissionRequest(const QUrl &securityOrigin, MediaRequestFlags requestFlags) override; - void runFeaturePermissionRequest(QWebEnginePermission::PermissionType permissionType, const QUrl &securityOrigin) override; - void runMouseLockPermissionRequest(const QUrl &securityOrigin) override; + void runFeaturePermissionRequest(QWebEnginePermission::PermissionType permissionType, const QUrl &securityOrigin, + int childId, const std::string &serializedToken) override; void runRegisterProtocolHandlerRequest(QWebEngineRegisterProtocolHandlerRequest) override; void runFileSystemAccessRequest(QWebEngineFileSystemAccessRequest) override; QObject *accessibilityParentObject() override; @@ -180,7 +180,6 @@ public: const QRect &bounds, bool autoselectFirstSuggestion) override; void hideAutofillPopup() override; void showWebAuthDialog(QWebEngineWebAuthUxRequest *controller) override; - QWebEnginePermission createFeaturePermissionObject(const QUrl &securityOrigin, QWebEnginePermission::PermissionType permissionType) override; QtWebEngineCore::ProfileAdapter *profileAdapter() override; QtWebEngineCore::WebContentsAdapter *webContentsAdapter() override; diff --git a/src/core/api/qwebenginepermission.cpp b/src/core/api/qwebenginepermission.cpp index 5fa1ed484..1d1b12b7e 100644 --- a/src/core/api/qwebenginepermission.cpp +++ b/src/core/api/qwebenginepermission.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginepermission.h" #include "qwebenginepermission_p.h" @@ -19,11 +20,12 @@ QWebEnginePermissionPrivate::QWebEnginePermissionPrivate() /*! \internal */ QWebEnginePermissionPrivate::QWebEnginePermissionPrivate(const QUrl &origin_, QWebEnginePermission::PermissionType permissionType_, - QSharedPointer<QtWebEngineCore::WebContentsAdapter> webContentsAdapter_, QtWebEngineCore::ProfileAdapter *profileAdapter_) + QtWebEngineCore::ProfileAdapter *profileAdapter_, int childId_, const std::string &serializedToken_) : QSharedData() , origin(origin_) , permissionType(permissionType_) - , webContentsAdapter(webContentsAdapter_) + , childId(childId_) + , serializedToken(serializedToken_) , profileAdapter(profileAdapter_) { } @@ -113,15 +115,12 @@ bool QWebEnginePermission::equals(const QWebEnginePermission &other) const return false; if (!isPersistent(d_ptr->permissionType)) { - if (d_ptr->webContentsAdapter != other.d_ptr->webContentsAdapter) + if (d_ptr->childId != other.d_ptr->childId + && d_ptr->serializedToken != other.d_ptr->serializedToken) return false; } else { - QtWebEngineCore::ProfileAdapter *thisProfile = d_ptr->webContentsAdapter - ? d_ptr->webContentsAdapter.toStrongRef()->profileAdapter() - : d_ptr->profileAdapter.get(); - QtWebEngineCore::ProfileAdapter *otherProfile = d_ptr->webContentsAdapter - ? other.d_ptr->webContentsAdapter.toStrongRef()->profileAdapter() - : other.d_ptr->profileAdapter.get(); + QtWebEngineCore::ProfileAdapter *thisProfile = d_ptr->profileAdapter.get(); + QtWebEngineCore::ProfileAdapter *otherProfile = other.d_ptr->profileAdapter.get(); if (thisProfile != otherProfile) return false; @@ -200,11 +199,7 @@ QWebEnginePermission::State QWebEnginePermission::state() const { if (!isValid()) return State::Invalid; - if (d_ptr->webContentsAdapter) - return d_ptr->webContentsAdapter.toStrongRef()->getPermissionState(origin(), permissionType()); - if (d_ptr->profileAdapter) - return d_ptr->profileAdapter->getPermissionState(origin(), permissionType()); - Q_UNREACHABLE_RETURN(State::Ask); + return d_ptr->profileAdapter->getPermissionState(origin(), permissionType(), d_ptr->childId, d_ptr->serializedToken); } /*! @@ -226,7 +221,7 @@ bool QWebEnginePermission::isValid() const return false; if (permissionType() == PermissionType::Unsupported) return false; - if (!d_ptr->profileAdapter && !d_ptr->webContentsAdapter) + if (!d_ptr->profileAdapter) return false; if (!d_ptr->origin.isValid()) return false; @@ -242,10 +237,7 @@ void QWebEnginePermission::grant() const { if (!isValid()) return; - if (d_ptr->webContentsAdapter) - d_ptr->webContentsAdapter.toStrongRef()->setPermission(origin(), permissionType(), State::Granted); - else if (d_ptr->profileAdapter) - d_ptr->profileAdapter->setPermission(origin(), permissionType(), State::Granted); + d_ptr->profileAdapter->setPermission(origin(), permissionType(), State::Granted, d_ptr->childId, d_ptr->serializedToken); } /*! @@ -257,10 +249,7 @@ void QWebEnginePermission::deny() const { if (!isValid()) return; - if (d_ptr->webContentsAdapter) - d_ptr->webContentsAdapter.toStrongRef()->setPermission(origin(), permissionType(), State::Denied); - else if (d_ptr->profileAdapter) - d_ptr->profileAdapter->setPermission(origin(), permissionType(), State::Denied); + d_ptr->profileAdapter->setPermission(origin(), permissionType(), State::Denied, d_ptr->childId, d_ptr->serializedToken); } /*! @@ -278,10 +267,7 @@ void QWebEnginePermission::reset() const { if (!isValid()) return; - if (d_ptr->webContentsAdapter) - d_ptr->webContentsAdapter.toStrongRef()->setPermission(origin(), permissionType(), State::Ask); - else if (d_ptr->profileAdapter) - d_ptr->profileAdapter->setPermission(origin(), permissionType(), State::Ask); + d_ptr->profileAdapter->setPermission(origin(), permissionType(), State::Ask, d_ptr->childId, d_ptr->serializedToken); } /*! diff --git a/src/core/api/qwebenginepermission.h b/src/core/api/qwebenginepermission.h index 476c8bdd4..9a62320bf 100644 --- a/src/core/api/qwebenginepermission.h +++ b/src/core/api/qwebenginepermission.h @@ -1,5 +1,6 @@ // Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEPERMISSION_H #define QWEBENGINEPERMISSION_H diff --git a/src/core/api/qwebenginepermission_p.h b/src/core/api/qwebenginepermission_p.h index fe4dc62f8..aabb5c4b9 100644 --- a/src/core/api/qwebenginepermission_p.h +++ b/src/core/api/qwebenginepermission_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEPERMISSION_P_H #define QWEBENGINEPERMISSION_P_H @@ -32,12 +33,14 @@ struct QWebEnginePermissionPrivate : public QSharedData { Q_WEBENGINECORE_EXPORT QWebEnginePermissionPrivate(); Q_WEBENGINECORE_EXPORT QWebEnginePermissionPrivate(const QUrl &, QWebEnginePermission::PermissionType, - QSharedPointer<QtWebEngineCore::WebContentsAdapter>, QtWebEngineCore::ProfileAdapter *); + QtWebEngineCore::ProfileAdapter *, int = -1, const std::string & = std::string()); QUrl origin; QWebEnginePermission::PermissionType permissionType; - QWeakPointer<QtWebEngineCore::WebContentsAdapter> webContentsAdapter; + int childId = -1; + std::string serializedToken; + QPointer<QtWebEngineCore::ProfileAdapter> profileAdapter; }; diff --git a/src/core/api/qwebengineprofile.cpp b/src/core/api/qwebengineprofile.cpp index 5b523dd87..f7f6ab551 100644 --- a/src/core/api/qwebengineprofile.cpp +++ b/src/core/api/qwebengineprofile.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #include "qwebengineprofile.h" #include "qwebengineprofile_p.h" @@ -103,6 +104,9 @@ using QtWebEngineCore::ProfileAdapter; \value AllowPersistentCookies Cookies marked persistent are saved to and restored from disk, whereas session cookies are only stored to disk for crash recovery. This is the default setting. + \value OnlyPersistentCookies + Cookies marked persistent are saved to and restored from disk, whereas session cookies + are not stored to disk, even for crash recovery. \value ForcePersistentCookies Both session and persistent cookies are saved to and restored from disk. */ @@ -1014,7 +1018,7 @@ QWebEnginePermission QWebEngineProfile::queryPermission(const QUrl &securityOrig return QWebEnginePermission(new QWebEnginePermissionPrivate()); } - auto *pvt = new QWebEnginePermissionPrivate(securityOrigin, permissionType, nullptr, d->profileAdapter()); + auto *pvt = new QWebEnginePermissionPrivate(securityOrigin, permissionType, d->profileAdapter()); return QWebEnginePermission(pvt); } diff --git a/src/core/api/qwebengineprofile.h b/src/core/api/qwebengineprofile.h index fe00e6f5d..f30c9fc82 100644 --- a/src/core/api/qwebengineprofile.h +++ b/src/core/api/qwebengineprofile.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #ifndef QWEBENGINEPROFILE_H #define QWEBENGINEPROFILE_H @@ -48,7 +49,8 @@ public: enum PersistentCookiesPolicy { NoPersistentCookies, AllowPersistentCookies, - ForcePersistentCookies + ForcePersistentCookies, + OnlyPersistentCookies, }; Q_ENUM(PersistentCookiesPolicy) diff --git a/src/core/api/qwebengineprofile_p.h b/src/core/api/qwebengineprofile_p.h index d4b3513cd..c814c79aa 100644 --- a/src/core/api/qwebengineprofile_p.h +++ b/src/core/api/qwebengineprofile_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #ifndef QWEBENGINEPROFILE_P_H #define QWEBENGINEPROFILE_P_H diff --git a/src/core/api/qwebengineprofilebuilder.cpp b/src/core/api/qwebengineprofilebuilder.cpp index 9adc12dac..f8a6cae7c 100644 --- a/src/core/api/qwebengineprofilebuilder.cpp +++ b/src/core/api/qwebengineprofilebuilder.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qwebengineprofilebuilder.h" #include "qwebengineprofile_p.h" diff --git a/src/core/api/qwebengineprofilebuilder.h b/src/core/api/qwebengineprofilebuilder.h index 1a03d3aa1..bbbb46b65 100644 --- a/src/core/api/qwebengineprofilebuilder.h +++ b/src/core/api/qwebengineprofilebuilder.h @@ -1,5 +1,6 @@ // Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #ifndef QWEBENGINEPROFILEBUILDER_H #define QWEBENGINEPROFILEBUILDER_H diff --git a/src/core/api/qwebengineprofilebuilder_p.h b/src/core/api/qwebengineprofilebuilder_p.h index a0750d47a..a9b6793b2 100644 --- a/src/core/api/qwebengineprofilebuilder_p.h +++ b/src/core/api/qwebengineprofilebuilder_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2024 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #ifndef QWEBENGINEPROFILEBUILDER_P_H #define QWEBENGINEPROFILEBUILDER_P_H diff --git a/src/core/api/qwebenginequotarequest.cpp b/src/core/api/qwebenginequotarequest.cpp index 3c312216d..ea3a0c6f4 100644 --- a/src/core/api/qwebenginequotarequest.cpp +++ b/src/core/api/qwebenginequotarequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginequotarequest.h" diff --git a/src/core/api/qwebenginequotarequest.h b/src/core/api/qwebenginequotarequest.h index f542f5576..15f1dc06a 100644 --- a/src/core/api/qwebenginequotarequest.h +++ b/src/core/api/qwebenginequotarequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEQUOTAREQUEST_H #define QWEBENGINEQUOTAREQUEST_H diff --git a/src/core/api/qwebengineregisterprotocolhandlerrequest.cpp b/src/core/api/qwebengineregisterprotocolhandlerrequest.cpp index 3e52302e4..733f90349 100644 --- a/src/core/api/qwebengineregisterprotocolhandlerrequest.cpp +++ b/src/core/api/qwebengineregisterprotocolhandlerrequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineregisterprotocolhandlerrequest.h" diff --git a/src/core/api/qwebengineregisterprotocolhandlerrequest.h b/src/core/api/qwebengineregisterprotocolhandlerrequest.h index d6e51695e..71137a6fd 100644 --- a/src/core/api/qwebengineregisterprotocolhandlerrequest.h +++ b/src/core/api/qwebengineregisterprotocolhandlerrequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEREGISTERPROTOCOLHANDLERREQUEST_H #define QWEBENGINEREGISTERPROTOCOLHANDLERREQUEST_H diff --git a/src/core/api/qwebenginescript.cpp b/src/core/api/qwebenginescript.cpp index 83a790b65..919556fd9 100644 --- a/src/core/api/qwebenginescript.cpp +++ b/src/core/api/qwebenginescript.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginescript.h" diff --git a/src/core/api/qwebenginescript.h b/src/core/api/qwebenginescript.h index 9827c4879..daaffdb11 100644 --- a/src/core/api/qwebenginescript.h +++ b/src/core/api/qwebenginescript.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINESCRIPT_H #define QWEBENGINESCRIPT_H diff --git a/src/core/api/qwebenginescriptcollection.cpp b/src/core/api/qwebenginescriptcollection.cpp index 7867192b6..17760a84e 100644 --- a/src/core/api/qwebenginescriptcollection.cpp +++ b/src/core/api/qwebenginescriptcollection.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginescriptcollection.h" #include "qwebenginescriptcollection_p.h" diff --git a/src/core/api/qwebenginescriptcollection.h b/src/core/api/qwebenginescriptcollection.h index a3b3c1c08..a2733f99a 100644 --- a/src/core/api/qwebenginescriptcollection.h +++ b/src/core/api/qwebenginescriptcollection.h @@ -1,5 +1,6 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINESCRIPTCOLLECTION_H #define QWEBENGINESCRIPTCOLLECTION_H diff --git a/src/core/api/qwebenginescriptcollection_p.h b/src/core/api/qwebenginescriptcollection_p.h index 67b3aa4a7..87d25b7a8 100644 --- a/src/core/api/qwebenginescriptcollection_p.h +++ b/src/core/api/qwebenginescriptcollection_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINESCRIPTCOLLECTION_P_H #define QWEBENGINESCRIPTCOLLECTION_P_H diff --git a/src/core/api/qwebenginesettings.cpp b/src/core/api/qwebenginesettings.cpp index a7ae80cd1..98d379069 100644 --- a/src/core/api/qwebenginesettings.cpp +++ b/src/core/api/qwebenginesettings.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2020 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginesettings.h" #include "web_engine_settings.h" diff --git a/src/core/api/qwebenginesettings.h b/src/core/api/qwebenginesettings.h index 415d4176a..de85fbfbc 100644 --- a/src/core/api/qwebenginesettings.h +++ b/src/core/api/qwebenginesettings.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINESETTINGS_H #define QWEBENGINESETTINGS_H diff --git a/src/core/api/qwebengineurlrequestinfo.cpp b/src/core/api/qwebengineurlrequestinfo.cpp index 85362c500..6b6732583 100644 --- a/src/core/api/qwebengineurlrequestinfo.cpp +++ b/src/core/api/qwebengineurlrequestinfo.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2019 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #include "qwebengineurlrequestinfo.h" #include "qwebengineurlrequestinfo_p.h" diff --git a/src/core/api/qwebengineurlrequestinfo.h b/src/core/api/qwebengineurlrequestinfo.h index 7f73cc0a1..6e4d279b5 100644 --- a/src/core/api/qwebengineurlrequestinfo.h +++ b/src/core/api/qwebengineurlrequestinfo.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #ifndef QWEBENGINEURLREQUESTINFO_H #define QWEBENGINEURLREQUESTINFO_H diff --git a/src/core/api/qwebengineurlrequestinfo_p.h b/src/core/api/qwebengineurlrequestinfo_p.h index b6d56e99c..ef98c91d9 100644 --- a/src/core/api/qwebengineurlrequestinfo_p.h +++ b/src/core/api/qwebengineurlrequestinfo_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #ifndef QWEBENGINEURLREQUESTINFO_P_H #define QWEBENGINEURLREQUESTINFO_P_H diff --git a/src/core/api/qwebengineurlrequestinterceptor.cpp b/src/core/api/qwebengineurlrequestinterceptor.cpp index c3cd49a5b..3a34b3e88 100644 --- a/src/core/api/qwebengineurlrequestinterceptor.cpp +++ b/src/core/api/qwebengineurlrequestinterceptor.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineurlrequestinterceptor.h" diff --git a/src/core/api/qwebengineurlrequestinterceptor.h b/src/core/api/qwebengineurlrequestinterceptor.h index 2ca8ee914..49bac4244 100644 --- a/src/core/api/qwebengineurlrequestinterceptor.h +++ b/src/core/api/qwebengineurlrequestinterceptor.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENINGEURLREQUESTINTERCEPTOR_H #define QWEBENINGEURLREQUESTINTERCEPTOR_H diff --git a/src/core/api/qwebengineurlrequestjob.cpp b/src/core/api/qwebengineurlrequestjob.cpp index 6ef94e41d..7e0ec9c97 100644 --- a/src/core/api/qwebengineurlrequestjob.cpp +++ b/src/core/api/qwebengineurlrequestjob.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineurlrequestjob.h" diff --git a/src/core/api/qwebengineurlrequestjob.h b/src/core/api/qwebengineurlrequestjob.h index 8448efdef..b836c877b 100644 --- a/src/core/api/qwebengineurlrequestjob.h +++ b/src/core/api/qwebengineurlrequestjob.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEURLREQUESTJOB_H #define QWEBENGINEURLREQUESTJOB_H diff --git a/src/core/api/qwebengineurlscheme.cpp b/src/core/api/qwebengineurlscheme.cpp index d2ca56f62..36fd3a286 100644 --- a/src/core/api/qwebengineurlscheme.cpp +++ b/src/core/api/qwebengineurlscheme.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qwebengineurlscheme.h" diff --git a/src/core/api/qwebengineurlscheme.h b/src/core/api/qwebengineurlscheme.h index 35498a68e..9e33eeceb 100644 --- a/src/core/api/qwebengineurlscheme.h +++ b/src/core/api/qwebengineurlscheme.h @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:network-protocol #ifndef QWEBENGINEURLSCHEME_H #define QWEBENGINEURLSCHEME_H diff --git a/src/core/api/qwebengineurlschemehandler.cpp b/src/core/api/qwebengineurlschemehandler.cpp index 7aeaec850..27b5c46cc 100644 --- a/src/core/api/qwebengineurlschemehandler.cpp +++ b/src/core/api/qwebengineurlschemehandler.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineurlschemehandler.h" diff --git a/src/core/api/qwebengineurlschemehandler.h b/src/core/api/qwebengineurlschemehandler.h index 848904719..4ce2acd7c 100644 --- a/src/core/api/qwebengineurlschemehandler.h +++ b/src/core/api/qwebengineurlschemehandler.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEURLSCHEMEHANDLER_H #define QWEBENGINEURLSCHEMEHANDLER_H diff --git a/src/core/api/qwebenginewebauthuxrequest.cpp b/src/core/api/qwebenginewebauthuxrequest.cpp index b22e37942..a7aae9188 100644 --- a/src/core/api/qwebenginewebauthuxrequest.cpp +++ b/src/core/api/qwebenginewebauthuxrequest.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginewebauthuxrequest.h" #include "qwebenginewebauthuxrequest_p.h" diff --git a/src/core/api/qwebenginewebauthuxrequest.h b/src/core/api/qwebenginewebauthuxrequest.h index 111f52847..ff7d8bf7b 100644 --- a/src/core/api/qwebenginewebauthuxrequest.h +++ b/src/core/api/qwebenginewebauthuxrequest.h @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEWEBAUTHUXREQUEST_H #define QWEBENGINEWEBAUTHUXREQUEST_H diff --git a/src/core/api/qwebenginewebauthuxrequest_p.h b/src/core/api/qwebenginewebauthuxrequest_p.h index 4c685bac7..829ba5465 100644 --- a/src/core/api/qwebenginewebauthuxrequest_p.h +++ b/src/core/api/qwebenginewebauthuxrequest_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEWEBAUTHUXREQUEST_P_H #define QWEBENGINEWEBAUTHUXREQUEST_P_H diff --git a/src/core/compositor/compositor.h b/src/core/compositor/compositor.h index aebd8f4c5..b160ca03c 100644 --- a/src/core/compositor/compositor.h +++ b/src/core/compositor/compositor.h @@ -131,6 +131,9 @@ public: // Is the texture produced upside down? virtual bool textureIsFlipped(); + // Are there resources to be released? + virtual bool hasResources() { return false; } + // Release resources created in texture() virtual void releaseResources(); diff --git a/src/core/compositor/native_skia_output_device.cpp b/src/core/compositor/native_skia_output_device.cpp index b91512a40..8b79d574c 100644 --- a/src/core/compositor/native_skia_output_device.cpp +++ b/src/core/compositor/native_skia_output_device.cpp @@ -180,6 +180,11 @@ void NativeSkiaOutputDevice::releaseTexture() } } +bool NativeSkiaOutputDevice::hasResources() +{ + return m_frontBuffer && m_frontBuffer->textureCleanupCallback; +} + void NativeSkiaOutputDevice::releaseResources() { if (m_frontBuffer) @@ -225,7 +230,10 @@ NativeSkiaOutputDevice::Buffer::Buffer(NativeSkiaOutputDevice *parent) NativeSkiaOutputDevice::Buffer::~Buffer() { - DCHECK(!textureCleanupCallback); + // FIXME: Can't be called in case of threaded rendering with unexposed window. + //DCHECK(!textureCleanupCallback); + if (textureCleanupCallback) + qWarning("NativeSkiaOutputDevice: Leaking graphics resources."); if (m_scopedSkiaWriteAccess) endWriteSkia(false); diff --git a/src/core/compositor/native_skia_output_device.h b/src/core/compositor/native_skia_output_device.h index 9a573055d..a405f6684 100644 --- a/src/core/compositor/native_skia_output_device.h +++ b/src/core/compositor/native_skia_output_device.h @@ -74,6 +74,7 @@ public: void swapFrame() override; void waitForTexture() override; void releaseTexture() override; + bool hasResources() override; void releaseResources() override; bool textureIsFlipped() override; QSize size() override; diff --git a/src/core/compositor/native_skia_output_device_opengl.cpp b/src/core/compositor/native_skia_output_device_opengl.cpp index c43311d80..49bacd5fc 100644 --- a/src/core/compositor/native_skia_output_device_opengl.cpp +++ b/src/core/compositor/native_skia_output_device_opengl.cpp @@ -51,6 +51,56 @@ namespace QtWebEngineCore { +class ScopedGLContextForCleanup +{ +public: + ScopedGLContextForCleanup(QOpenGLContext *createContext, QSurface *createSurface) + : m_createContext(createContext), m_currentContext(QOpenGLContext::currentContext()) + { + if (m_createContext == m_currentContext) + return; + + if (!m_createContext->isValid()) { + skipCleanup = true; + return; + } + + if (m_currentContext) + m_currentSurface = m_currentContext->surface(); + + if (!createContext->makeCurrent(createSurface)) { + skipCleanup = true; + qWarning("Failed to make OpenGL context current for clean-up, OpenGL resources will " + "not be destroyed."); + } + } + + ~ScopedGLContextForCleanup() + { + if (!m_currentContext || m_createContext == m_currentContext || skipCleanup) + return; + + if (!m_currentContext->makeCurrent(m_currentSurface)) + qFatal("Failed to restore OpenGL context after clean-up."); + } + + void deleteTexture(GLuint glTexture) + { + if (skipCleanup) + return; + + auto *glFun = m_createContext->functions(); + Q_ASSERT(glFun->glGetError() == GL_NO_ERROR); + glFun->glDeleteTextures(1, &glTexture); + } + +private: + QOpenGLContext *m_createContext; + QOpenGLContext *m_currentContext; + QSurface *m_currentSurface = nullptr; + bool skipCleanup = false; +}; + NativeSkiaOutputDeviceOpenGL::NativeSkiaOutputDeviceOpenGL( scoped_refptr<gpu::SharedContextState> contextState, bool requiresAlpha, gpu::MemoryTracker *memoryTracker, viz::SkiaOutputSurfaceDependency *dependency, @@ -221,10 +271,12 @@ QSGTexture *NativeSkiaOutputDeviceOpenGL::texture(QQuickWindow *win, uint32_t te glxFun->glXBindTexImageEXT(display, glxPixmap, GLX_FRONT_LEFT_EXT, nullptr); glFun->glBindTexture(GL_TEXTURE_2D, 0); - m_frontBuffer->textureCleanupCallback = [glFun, glxFun, display, glxPixmap, glTexture, - glxHelper, pixmapId]() { + QSurface *createSurface = glContext->surface(); + m_frontBuffer->textureCleanupCallback = [glContext, createSurface, glxFun, display, + glxPixmap, glTexture, glxHelper, pixmapId]() { + ScopedGLContextForCleanup cleanupContext(glContext, createSurface); glxFun->glXReleaseTexImageEXT(display, glxPixmap, GLX_FRONT_LEFT_EXT); - glFun->glDeleteTextures(1, &glTexture); + cleanupContext.deleteTexture(glTexture); glXDestroyGLXPixmap(display, glxPixmap); glxHelper->freePixmap(pixmapId); }; @@ -273,9 +325,11 @@ QSGTexture *NativeSkiaOutputDeviceOpenGL::texture(QQuickWindow *win, uint32_t te glExtFun->glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, eglImage); glFun->glBindTexture(GL_TEXTURE_2D, 0); - m_frontBuffer->textureCleanupCallback = [glFun, eglFun, glTexture, eglDisplay, - eglImage]() { - glFun->glDeleteTextures(1, &glTexture); + QSurface *createSurface = glContext->surface(); + m_frontBuffer->textureCleanupCallback = [glContext, createSurface, eglFun, glTexture, + eglDisplay, eglImage]() { + ScopedGLContextForCleanup cleanupContext(glContext, createSurface); + cleanupContext.deleteTexture(glTexture); eglFun->eglDestroyImage(eglDisplay, eglImage); }; } @@ -328,11 +382,12 @@ QSGTexture *NativeSkiaOutputDeviceOpenGL::texture(QQuickWindow *win, uint32_t te glMemoryObject, 0); glFun->glBindTexture(GL_TEXTURE_2D, 0); - m_frontBuffer->textureCleanupCallback = [glFun, glExtFun, glTexture, glMemoryObject]() { - Q_ASSERT(glFun->glGetError() == GL_NO_ERROR); - + QSurface *createSurface = glContext->surface(); + m_frontBuffer->textureCleanupCallback = [glContext, createSurface, glExtFun, glTexture, + glMemoryObject]() { + ScopedGLContextForCleanup cleanupContext(glContext, createSurface); glExtFun->glDeleteMemoryObjectsEXT(1, &glMemoryObject); - glFun->glDeleteTextures(1, &glTexture); + cleanupContext.deleteTexture(glTexture); }; #else Q_UNREACHABLE(); @@ -384,12 +439,11 @@ QSGTexture *NativeSkiaOutputDeviceOpenGL::texture(QQuickWindow *win, uint32_t te uint32_t glTexture = makeCGLTexture(win, ioSurface.get(), size()); texture = QNativeInterface::QSGOpenGLTexture::fromNative(glTexture, win, size(), texOpts); - m_frontBuffer->textureCleanupCallback = [glTexture]() { - auto *glContext = QOpenGLContext::currentContext(); - if (!glContext) - return; - auto glFun = glContext->functions(); - glFun->glDeleteTextures(1, &glTexture); + QOpenGLContext *glContext = QOpenGLContext::currentContext(); + QSurface *createSurface = glContext->surface(); + m_frontBuffer->textureCleanupCallback = [glContext, createSurface, glTexture]() { + ScopedGLContextForCleanup cleanupContext(glContext, createSurface); + cleanupContext.deleteTexture(glTexture); }; #endif // BUILDFLAG(IS_OZONE) diff --git a/src/core/compositor/wgl_helper.cpp b/src/core/compositor/wgl_helper.cpp index 85e6bb915..3c3a096b9 100644 --- a/src/core/compositor/wgl_helper.cpp +++ b/src/core/compositor/wgl_helper.cpp @@ -124,9 +124,10 @@ D3DSharedTexture::D3DSharedTexture(WGLHelper::WGLFunctions *wglFun, ID3D11Device // for an already shared texture. immediateContext->CopyResource(m_d3dTexture.Get(), srcTexture.Get()); - auto *glContext = QOpenGLContext::currentContext(); - Q_ASSERT(glContext); - auto *glFun = glContext->functions(); + m_createContext = QOpenGLContext::currentContext(); + m_createSurface = m_createContext->surface(); + Q_ASSERT(m_createContext); + auto *glFun = m_createContext->functions(); glFun->glGenTextures(1, &m_glTexture); @@ -148,10 +149,31 @@ D3DSharedTexture::~D3DSharedTexture() m_wglFun->wglDXUnregisterObjectNV(m_interopDevice, m_glTextureHandle); } - auto *glContext = QOpenGLContext::currentContext(); - if (m_glTexture && glContext) { - auto *glFun = glContext->functions(); + if (m_glTexture) { + QOpenGLContext *currentContext = QOpenGLContext::currentContext(); + QSurface *currentSurface = nullptr; + + if (m_createContext != currentContext) { + if (currentContext) + currentSurface = currentContext->surface(); + + if (!m_createContext->makeCurrent(m_createSurface)) { + qWarning("Failed to make OpenGL context current for clean-up, OpenGL resources " + "will not be destroyed."); + return; + } + } + + if (!m_createContext->isValid()) + return; + + auto *glFun = m_createContext->functions(); glFun->glDeleteTextures(1, &m_glTexture); + + if (currentSurface) { + if (!currentContext->makeCurrent(currentSurface)) + qFatal("Failed to restore OpenGL context after clean-up."); + } } } diff --git a/src/core/compositor/wgl_helper.h b/src/core/compositor/wgl_helper.h index c726c234c..1f94e0706 100644 --- a/src/core/compositor/wgl_helper.h +++ b/src/core/compositor/wgl_helper.h @@ -20,6 +20,9 @@ QT_BEGIN_NAMESPACE +class QOpenGLContext; +class QSurface; + class WGLHelper { public: @@ -88,6 +91,8 @@ private: HANDLE m_interopDevice; Microsoft::WRL::ComPtr<ID3D11Texture2D> m_d3dTexture; + QOpenGLContext *m_createContext = nullptr; + QSurface *m_createSurface = nullptr; GLuint m_glTexture = 0; HANDLE m_glTextureHandle = INVALID_HANDLE_VALUE; diff --git a/src/core/custom_handlers/protocol_handler_registry_delegate_qt.cpp b/src/core/custom_handlers/protocol_handler_registry_delegate_qt.cpp index a5074fb88..70264ccf4 100644 --- a/src/core/custom_handlers/protocol_handler_registry_delegate_qt.cpp +++ b/src/core/custom_handlers/protocol_handler_registry_delegate_qt.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // based on chrome/browser/custom_handlers/chrome_protocol_handler_registry_delegate.cc: // Copyright 2021 The Chromium Authors. All rights reserved. diff --git a/src/core/custom_handlers/protocol_handler_registry_delegate_qt.h b/src/core/custom_handlers/protocol_handler_registry_delegate_qt.h index 6a0753d22..11ecd4102 100644 --- a/src/core/custom_handlers/protocol_handler_registry_delegate_qt.h +++ b/src/core/custom_handlers/protocol_handler_registry_delegate_qt.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // based on chrome/browser/custom_handlers/chrome_protocol_handler_registry_delegate.h: // Copyright 2021 The Chromium Authors. All rights reserved. diff --git a/src/core/custom_handlers/protocol_handler_registry_factory.cpp b/src/core/custom_handlers/protocol_handler_registry_factory.cpp index efd5cb406..7caf78e3b 100644 --- a/src/core/custom_handlers/protocol_handler_registry_factory.cpp +++ b/src/core/custom_handlers/protocol_handler_registry_factory.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // based on chrome/browser/custom_handlers/protocol_handler_registry_factory.cc // Copyright (c) 2012 The Chromium Authors. All rights reserved. diff --git a/src/core/custom_handlers/protocol_handler_registry_factory.h b/src/core/custom_handlers/protocol_handler_registry_factory.h index aa9bea3a6..71c3dd772 100644 --- a/src/core/custom_handlers/protocol_handler_registry_factory.h +++ b/src/core/custom_handlers/protocol_handler_registry_factory.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // based on chrome/browser/custom_handlers/protocol_handler_registry_factory.h: // Copyright (c) 2012 The Chromium Authors. All rights reserved. diff --git a/src/core/custom_handlers/register_protocol_handler_request_controller.h b/src/core/custom_handlers/register_protocol_handler_request_controller.h index 6305ce5b7..d28f46ed3 100644 --- a/src/core/custom_handlers/register_protocol_handler_request_controller.h +++ b/src/core/custom_handlers/register_protocol_handler_request_controller.h @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef REGISTER_PROTOCOL_HANDLER_REQUEST_CONTROLLER_H #define REGISTER_PROTOCOL_HANDLER_REQUEST_CONTROLLER_H diff --git a/src/core/custom_handlers/register_protocol_handler_request_controller_impl.cpp b/src/core/custom_handlers/register_protocol_handler_request_controller_impl.cpp index efaf54cd2..33bb2e586 100644 --- a/src/core/custom_handlers/register_protocol_handler_request_controller_impl.cpp +++ b/src/core/custom_handlers/register_protocol_handler_request_controller_impl.cpp @@ -1,5 +1,7 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default + #include "custom_handlers/register_protocol_handler_request_controller_impl.h" #include "components/custom_handlers/protocol_handler_registry.h" diff --git a/src/core/custom_handlers/register_protocol_handler_request_controller_impl.h b/src/core/custom_handlers/register_protocol_handler_request_controller_impl.h index 073ca9bf8..526e5e5e6 100644 --- a/src/core/custom_handlers/register_protocol_handler_request_controller_impl.h +++ b/src/core/custom_handlers/register_protocol_handler_request_controller_impl.h @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef REGISTER_PROTOCOL_HANDLER_REQUEST_CONTROLLER_IMPL_H #define REGISTER_PROTOCOL_HANDLER_REQUEST_CONTROLLER_IMPL_H diff --git a/src/core/doc/src/qtwebengine-overview.qdoc b/src/core/doc/src/qtwebengine-overview.qdoc index 3a5d30338..3d7ebf6ad 100644 --- a/src/core/doc/src/qtwebengine-overview.qdoc +++ b/src/core/doc/src/qtwebengine-overview.qdoc @@ -249,28 +249,8 @@ \section1 High DPI Support - To support High DPI devices, it is recommended that the application attribute - Qt::AA_EnableHighDpiScaling is set to enable automatic scaling based on the - pixel density of the monitor. In \QWE applications, the scaling - affects the default zooming factor and scrollbar size. - - For example: - - \code - int main(int argc, char *argv[]) - { - QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); - QApplication app(argc, argv); - // ... - } - \endcode - - \QWE bundles images for normal and high-dpi resolutions into - \e qtwebengine_resources_100p.pak and \e qtwebengine_resources_200p.pak - files. Depending on the target resolutions, one or both of these files need - to be deployed. - - For more information, see \l{High DPI}. + High DPI support is always enabled in Qt 6, and this also applies to \QWE. For more information, + see \l{High DPI}. \section1 Using WebEngine Core diff --git a/src/core/media_capture_devices_dispatcher.cpp b/src/core/media_capture_devices_dispatcher.cpp index 848a92986..d691c65ea 100644 --- a/src/core/media_capture_devices_dispatcher.cpp +++ b/src/core/media_capture_devices_dispatcher.cpp @@ -11,6 +11,8 @@ #include "web_contents_delegate_qt.h" #include "web_contents_view_qt.h" #include "web_engine_settings.h" +#include "permission_manager_qt.h" +#include "type_conversion.h" #include "base/strings/strcat.h" #include "blink/public/common/page/page_zoom.h" @@ -21,6 +23,8 @@ #include "content/public/browser/desktop_streams_registry.h" #include "content/public/browser/host_zoom_map.h" #include "content/public/browser/media_capture_devices.h" +#include "content/public/browser/permission_controller_delegate.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "media/audio/audio_device_description.h" #include "media/audio/audio_manager_base.h" @@ -493,8 +497,17 @@ void MediaCaptureDevicesDispatcher::processMediaAccessRequest( } enqueueMediaAccessRequest(webContents, request, std::move(callback), id); - // We might not require this approval for pepper requests. - adapterClient->runMediaAccessPermissionRequest(toQt(request.security_origin), flags); + + PermissionManagerQt *permissionManager = static_cast<PermissionManagerQt *>( + webContents->GetBrowserContext()->GetPermissionControllerDelegate()); + permissionManager->requestMediaPermissions( + content::RenderFrameHost::FromID(request.render_process_id, request.render_frame_id), + flags, + base::BindOnce( + &MediaCaptureDevicesDispatcher::handleMediaAccessPermissionResponse, + base::Unretained(this), + webContents, + toQt(request.url_origin))); } void MediaCaptureDevicesDispatcher::processDesktopCaptureAccessRequest(content::WebContents *webContents, const content::MediaStreamRequest &request, content::MediaResponseCallback callback) @@ -558,9 +571,18 @@ void MediaCaptureDevicesDispatcher::ProcessQueuedAccessRequest(content::WebConte RequestsQueue &queue(it->second); content::MediaStreamRequest &request = queue.front()->request; + WebContentsAdapterClient::MediaRequestFlags flags = mediaRequestFlagsForRequest(request); - WebContentsAdapterClient *adapterClient = WebContentsViewQt::from(static_cast<content::WebContentsImpl *>(webContents)->GetView())->client(); - adapterClient->runMediaAccessPermissionRequest(toQt(request.security_origin), mediaRequestFlagsForRequest(request)); + PermissionManagerQt *permissionManager = static_cast<PermissionManagerQt *>( + webContents->GetBrowserContext()->GetPermissionControllerDelegate()); + permissionManager->requestMediaPermissions( + content::RenderFrameHost::FromID(request.render_process_id, request.render_frame_id), + flags, + base::BindOnce( + &MediaCaptureDevicesDispatcher::handleMediaAccessPermissionResponse, + base::Unretained(this), + webContents, + toQt(request.url_origin))); } void MediaCaptureDevicesDispatcher::getDefaultDevices(const std::string &audioDeviceId, const std::string &videoDeviceId, diff --git a/src/core/permission_manager_qt.cpp b/src/core/permission_manager_qt.cpp index 5258f15cf..eae98b350 100644 --- a/src/core/permission_manager_qt.cpp +++ b/src/core/permission_manager_qt.cpp @@ -40,7 +40,7 @@ static QWebEnginePermission::PermissionType toQt(blink::PermissionType type) case blink::PermissionType::VIDEO_CAPTURE: return QWebEnginePermission::PermissionType::MediaVideoCapture; case blink::PermissionType::DISPLAY_CAPTURE: - return QWebEnginePermission::PermissionType::DesktopAudioVideoCapture; + return QWebEnginePermission::PermissionType::DesktopVideoCapture; // We treat these both as read/write since we do not currently have a // ClipboardSanitizedWrite permission type. case blink::PermissionType::CLIPBOARD_READ_WRITE: @@ -56,6 +56,8 @@ static QWebEnginePermission::PermissionType toQt(blink::PermissionType type) case blink::PermissionType::WINDOW_MANAGEMENT: case blink::PermissionType::BACKGROUND_SYNC: case blink::PermissionType::NUM: + case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS: + case blink::PermissionType::SPEAKER_SELECTION: return QWebEnginePermission::PermissionType::Unsupported; case blink::PermissionType::MIDI_SYSEX: case blink::PermissionType::PROTECTED_MEDIA_IDENTIFIER: @@ -72,16 +74,13 @@ static QWebEnginePermission::PermissionType toQt(blink::PermissionType type) case blink::PermissionType::AR: case blink::PermissionType::VR: case blink::PermissionType::STORAGE_ACCESS_GRANT: - case blink::PermissionType::TOP_LEVEL_STORAGE_ACCESS: case blink::PermissionType::CAPTURED_SURFACE_CONTROL: case blink::PermissionType::SMART_CARD: case blink::PermissionType::WEB_PRINTING: - case blink::PermissionType::SPEAKER_SELECTION: case blink::PermissionType::KEYBOARD_LOCK: case blink::PermissionType::AUTOMATIC_FULLSCREEN: case blink::PermissionType::HAND_TRACKING: case blink::PermissionType::WEB_APP_INSTALLATION: - LOG(INFO) << "Unexpected unsupported Blink permission type: " << static_cast<int>(type); break; } return QWebEnginePermission::PermissionType::Unsupported; @@ -107,16 +106,50 @@ static blink::PermissionType toBlink(QWebEnginePermission::PermissionType permis return blink::PermissionType::LOCAL_FONTS; case QWebEnginePermission::PermissionType::MouseLock: return blink::PermissionType::POINTER_LOCK; - case QWebEnginePermission::PermissionType::MediaAudioVideoCapture: - LOG(INFO) << "Unexpected unsupported WebEngine permission type: " << static_cast<int>(permissionType); - Q_FALLTHROUGH(); case QWebEnginePermission::PermissionType::Unsupported: return blink::PermissionType::NUM; + case QWebEnginePermission::PermissionType::MediaAudioVideoCapture: + break; } Q_UNREACHABLE_RETURN(blink::PermissionType::NUM); } +static std::vector<QWebEnginePermission::PermissionType> toQt( + const std::vector<blink::PermissionType> &blinkPermissions) +{ + // This function handles the edge case differences between our permission types and Blink's; + // namely, MediaAudioVideoCapture and DesktopAudioVideoCapture + std::vector<QWebEnginePermission::PermissionType> permissions; + for (auto &p : blinkPermissions) { + permissions.push_back(toQt(p)); + } + + for (auto i1 = permissions.begin(); i1 != permissions.end(); ++i1) { + if (*i1 == QWebEnginePermission::PermissionType::MediaAudioCapture) { + for (auto i2 = permissions.begin(); i2 != permissions.end(); ++i2) { + if (*i2 == QWebEnginePermission::PermissionType::MediaVideoCapture) { + // Merge MediaAudioCapture and MediaVideoCapture into MediaAudioVideoCapture + *i1 = QWebEnginePermission::PermissionType::MediaAudioVideoCapture; + permissions.erase(i2); + break; + } + } + } else if (*i1 == QWebEnginePermission::PermissionType::DesktopVideoCapture) { + for (auto i2 = i1 + 1; i2 != permissions.end(); ++i2) { + if (*i2 == QWebEnginePermission::PermissionType::DesktopVideoCapture) { + // Double DesktopVideoCapture means we actually need DesktopAudioVideoCapture + *i2 = QWebEnginePermission::PermissionType::DesktopAudioVideoCapture; + i1 = permissions.erase(i1); + break; + } + } + } + } + + return permissions; +} + static QWebEnginePermission::State toQt(blink::mojom::PermissionStatus state) { switch (state) { @@ -154,6 +187,8 @@ std::string permissionTypeString(QWebEnginePermission::PermissionType permission return "MediaVideoCapture"; case QWebEnginePermission::PermissionType::DesktopAudioVideoCapture: return "DesktopAudioVideoCapture"; + case QWebEnginePermission::PermissionType::DesktopVideoCapture: + return "DesktopVideoCapture"; case QWebEnginePermission::PermissionType::MouseLock: return "MouseLock"; case QWebEnginePermission::PermissionType::Notifications: @@ -213,6 +248,8 @@ PermissionManagerQt::PermissionManagerQt(ProfileAdapter *profileAdapter) m_permissionTypes.push_back(QWebEnginePermission::PermissionType::MediaAudioCapture); m_permissionTypes.push_back(QWebEnginePermission::PermissionType::MediaVideoCapture); + m_permissionTypes.push_back(QWebEnginePermission::PermissionType::DesktopAudioVideoCapture); + m_permissionTypes.push_back(QWebEnginePermission::PermissionType::DesktopVideoCapture); m_permissionTypes.push_back(QWebEnginePermission::PermissionType::MouseLock); m_permissionTypes.push_back(QWebEnginePermission::PermissionType::Notifications); m_permissionTypes.push_back(QWebEnginePermission::PermissionType::Geolocation); @@ -239,38 +276,83 @@ PermissionManagerQt::~PermissionManagerQt() commit(); } +// static +content::GlobalRenderFrameHostToken PermissionManagerQt::deserializeToken(int childId, const std::string &serializedToken) +{ + auto maybeToken = base::UnguessableToken::DeserializeFromString(serializedToken); + if (maybeToken) + return content::GlobalRenderFrameHostToken(childId, blink::LocalFrameToken(maybeToken.value())); + + return content::GlobalRenderFrameHostToken(); +} + void PermissionManagerQt::setPermission( const QUrl &url, - QWebEnginePermission::PermissionType permissionType, - QWebEnginePermission::State state, - content::RenderFrameHost *rfh) + const QWebEnginePermission::PermissionType permissionType, + const QWebEnginePermission::State state, + const content::GlobalRenderFrameHostToken &token) +{ + if (permissionType == QWebEnginePermission::PermissionType::MediaAudioVideoCapture) { + setPermissionImpl(url, QWebEnginePermission::PermissionType::MediaAudioCapture, state, token); + setPermissionImpl(url, QWebEnginePermission::PermissionType::MediaVideoCapture, state, token); + return; + } + + setPermissionImpl(url, permissionType, state, token); +} + +void PermissionManagerQt::setPermission( + const QUrl &url, + const QWebEnginePermission::PermissionType permissionType, + const QWebEnginePermission::State state, + int childId, const std::string &serializedToken) +{ + content::GlobalRenderFrameHostToken token; + auto maybeToken = base::UnguessableToken::DeserializeFromString(serializedToken); + if (maybeToken) + token = content::GlobalRenderFrameHostToken(childId, blink::LocalFrameToken(maybeToken.value())); + + setPermission(url, permissionType, state, token); +} + +void PermissionManagerQt::setPermissionImpl( + const QUrl &url, + const QWebEnginePermission::PermissionType permissionTypeQt, + const QWebEnginePermission::State permissionStateQt, + const content::GlobalRenderFrameHostToken &frameToken) { + const blink::PermissionType permissionTypeBlink = toBlink(permissionTypeQt); + const blink::mojom::PermissionStatus permissionStateBlink = toBlink(permissionStateQt); + // Normalize the QUrl to Chromium origin form. const GURL gorigin = toGurl(url).DeprecatedGetOriginAsURL(); const QUrl origin = gorigin.is_empty() ? url : toQt(gorigin); if (origin.isEmpty()) return; - // Send eligible permissions with an associated rfh to the transient store. When pre-granting + // Send eligible permissions with an associated frameToken to the transient store. When pre-granting // a non-persistent permission (or pre-granting any permission in AskEveryTime mode), it is allowed // to pass through the persistent store. It will be moved to the transient store and associated - // with a rfh the next time its status is requested. - bool inTransientStore = rfh && (!QWebEnginePermission::isPersistent(permissionType) || !m_persistence); + // with a frameToken the next time its status is requested. + bool inTransientStore = frameToken.child_id != content::kInvalidChildProcessUniqueId + && (!QWebEnginePermission::isPersistent(permissionTypeQt) || !m_persistence); - blink::mojom::PermissionStatus blinkStatus = toBlink(state); - if (state == QWebEnginePermission::State::Ask) { + blink::mojom::PermissionStatus blinkStatus = permissionStateBlink; + if (permissionStateQt == QWebEnginePermission::State::Ask) { if (inTransientStore) - resetTransientPermission(toBlink(permissionType), gorigin, rfh->GetGlobalFrameToken()); + resetTransientPermission(permissionTypeBlink, gorigin, frameToken); else - ResetPermission(toBlink(permissionType), gorigin, gorigin); + ResetPermission(permissionTypeBlink, gorigin, gorigin); } else { if (inTransientStore) - setTransientPermission(toBlink(permissionType), gorigin, state == QWebEnginePermission::State::Granted, rfh->GetGlobalFrameToken()); + setTransientPermission(permissionTypeBlink, gorigin, + permissionStateQt == QWebEnginePermission::State::Granted, frameToken); else - setPersistentPermission(toBlink(permissionType), gorigin, state == QWebEnginePermission::State::Granted); + setPersistentPermission(permissionTypeBlink, + gorigin, permissionStateQt == QWebEnginePermission::State::Granted); auto it = m_requests.begin(); while (it != m_requests.end()) { - if (it->origin == origin && it->type == permissionType) { + if (it->origin == origin && it->type == permissionTypeQt) { std::move(it->callback).Run(blinkStatus); it = m_requests.erase(it); } else @@ -292,10 +374,10 @@ void PermissionManagerQt::setPermission( if (subscription->embedding_origin != gorigin) continue; - if (subscription->permission != toBlink(permissionType)) + if (subscription->permission != permissionTypeBlink) continue; - if ((!QWebEnginePermission::isPersistent(permissionType) || !m_persistence) - && targetRfh && targetRfh != rfh) + if ((!QWebEnginePermission::isPersistent(permissionTypeQt) || !m_persistence) + && targetRfh && targetRfh != content::RenderFrameHost::FromFrameToken(frameToken)) continue; // Behavior in callbacks may differ depending on the denial reason. Until we have @@ -312,7 +394,7 @@ void PermissionManagerQt::setPermission( std::move(callback).Run(); } - if (state == QWebEnginePermission::State::Ask) + if (permissionStateQt == QWebEnginePermission::State::Ask) return; auto it = m_multiRequests.begin(); @@ -321,32 +403,37 @@ void PermissionManagerQt::setPermission( bool answerable = true; std::vector<blink::mojom::PermissionStatus> result; result.reserve(it->types.size()); - for (blink::PermissionType permission : it->types) { - if (toQt(permission) == QWebEnginePermission::PermissionType::Unsupported) { + for (blink::PermissionType currentPermissionType : it->types) { + if (toQt(currentPermissionType) == QWebEnginePermission::PermissionType::Unsupported) { result.push_back(blink::mojom::PermissionStatus::DENIED); continue; } blink::mojom::PermissionStatus permissionStatus; if (inTransientStore) - permissionStatus = toBlink(getPermissionState(url, permissionType, rfh)); + permissionStatus = toBlink(getPermissionState(url, toQt(currentPermissionType), frameToken)); else - permissionStatus = GetPermissionStatus(permission, gorigin, GURL()); + permissionStatus = GetPermissionStatus(currentPermissionType, gorigin, GURL()); - if (permissionStatus == toBlink(state)) { + if (permissionStatus == permissionStateBlink) { if (permissionStatus == blink::mojom::PermissionStatus::ASK) { answerable = false; break; } result.push_back(permissionStatus); - } else { + } else if (!m_persistence) { // Reached when the PersistentPermissionsPolicy is set to AskEveryTime - result.push_back(toBlink(state)); + result.push_back(permissionStateBlink); + } else { + // Not all of the permissions in this request have been set yet, bail and wait for the next setPermission() call + answerable = false; + break; } } if (answerable) { - std::move(it->callback).Run(result); + if (!it->callback.is_null()) + std::move(it->callback).Run(result); it = m_multiRequests.erase(it); continue; } @@ -355,23 +442,44 @@ void PermissionManagerQt::setPermission( } } -QWebEnginePermission::State PermissionManagerQt::getPermissionState(const QUrl &origin, QWebEnginePermission::PermissionType permissionType, - content::RenderFrameHost *rfh) +QWebEnginePermission::State PermissionManagerQt::getPermissionState( + const QUrl &origin, + const QWebEnginePermission::PermissionType permissionType, + const content::GlobalRenderFrameHostToken &frameToken) { - if (rfh) { - // Ignore the origin parameter - return toQt(GetPermissionStatusForCurrentDocument(toBlink(permissionType), rfh, false)); + std::vector<QWebEnginePermission::PermissionType> types; + if (permissionType == QWebEnginePermission::PermissionType::MediaAudioVideoCapture) { + types.push_back(QWebEnginePermission::PermissionType::MediaAudioCapture); + types.push_back(QWebEnginePermission::PermissionType::MediaVideoCapture); + } else { + types.push_back(permissionType); + } + + auto *rfh = content::RenderFrameHost::FromFrameToken(frameToken); + QWebEnginePermission::State returnState = QWebEnginePermission::State::Invalid; + for (auto type : types) { + QWebEnginePermission::State state = rfh + ? toQt(GetPermissionStatusForCurrentDocument(toBlink(type), rfh, false)) + : toQt(GetPermissionStatus(toBlink(type), toGurl(origin), GURL())); + + if (returnState == QWebEnginePermission::State::Invalid) + returnState = state; + else if (returnState != state) + returnState = QWebEnginePermission::State::Ask; } - return toQt(GetPermissionStatus(toBlink(permissionType), toGurl(origin), GURL())); + return returnState; } -QList<QWebEnginePermission> PermissionManagerQt::listPermissions(const QUrl &origin, QWebEnginePermission::PermissionType permissionType) +QList<QWebEnginePermission> PermissionManagerQt::listPermissions( + const QUrl &origin, + const QWebEnginePermission::PermissionType permissionType) { Q_ASSERT(origin.isEmpty() || permissionType == QWebEnginePermission::PermissionType::Unsupported); + QList<QWebEnginePermission> returnList; - GURL gorigin = toGurl(origin).DeprecatedGetOriginAsURL(); - std::string originSpec = gorigin.spec(); + const GURL gorigin = toGurl(origin).DeprecatedGetOriginAsURL(); + const std::string originSpec = gorigin.spec(); if (!origin.isEmpty() && !gorigin.is_valid()) return returnList; @@ -382,7 +490,7 @@ QList<QWebEnginePermission> PermissionManagerQt::listPermissions(const QUrl &ori else types.push_back(permissionType); - for (auto &type : types) { + for (const auto &type : types) { // Transient types may end up in the permission store as an implementation detail, // but we do not want to expose them to callers. if (!QWebEnginePermission::isPersistent(type)) @@ -399,7 +507,8 @@ QList<QWebEnginePermission> PermissionManagerQt::listPermissions(const QUrl &ori if (!originSpec.empty() && entry.first != originSpec) continue; - auto *pvt = new QWebEnginePermissionPrivate(toQt(GURL(std::string_view(entry.first))), type, nullptr, m_profileAdapter.get()); + auto *pvt = new QWebEnginePermissionPrivate( + toQt(GURL(std::string_view(entry.first))), type, m_profileAdapter.get()); returnList.push_back(QWebEnginePermission(pvt)); } } @@ -407,6 +516,78 @@ QList<QWebEnginePermission> PermissionManagerQt::listPermissions(const QUrl &ori return returnList; } +void PermissionManagerQt::requestMediaPermissions( + content::RenderFrameHost *render_frame_host, + const WebContentsAdapterClient::MediaRequestFlags flags, + base::OnceCallback<void(WebContentsAdapterClient::MediaRequestFlags authorizationFlags)> callback) +{ + std::vector<blink::PermissionType> permissionTypesBlink; + if (flags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) + permissionTypesBlink.push_back(blink::PermissionType::AUDIO_CAPTURE); + if (flags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) + permissionTypesBlink.push_back(blink::PermissionType::VIDEO_CAPTURE); + if (flags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) + || flags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) { + permissionTypesBlink.push_back(blink::PermissionType::DISPLAY_CAPTURE); + if (flags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture)) { + // Inject a second copy of the permission type into the request, + // so we can distinguish between DesktopVideoCapture and DesktopAudioVideoCapture. + permissionTypesBlink.push_back(blink::PermissionType::DISPLAY_CAPTURE); + } + } + + content::PermissionRequestDescription description(permissionTypesBlink, false, render_frame_host->GetLastCommittedOrigin().GetURL()); + + RequestPermissions(render_frame_host, description, base::BindOnce([]( + std::vector<blink::PermissionType> permissionTypesBlink, + base::OnceCallback<void(WebContentsAdapterClient::MediaRequestFlags authorizationFlags)> callback, + const std::vector<blink::mojom::PermissionStatus> &statuses) + { + // This callback converts the Blink permission types to MediaRequestFlags, + // and then runs the callback initially passed to requestMediaPermissions(). + DCHECK(permissionTypesBlink.size() == statuses.size()); + WebContentsAdapterClient::MediaRequestFlags flags = WebContentsAdapterClient::MediaRequestFlag::MediaNone; + for (uint i = 0; i < statuses.size(); ++i) { + if (statuses[i] == blink::mojom::PermissionStatus::GRANTED) { + switch (permissionTypesBlink[i]) { + case blink::PermissionType::AUDIO_CAPTURE: + flags.setFlag(WebContentsAdapterClient::MediaRequestFlag::MediaAudioCapture); + break; + case blink::PermissionType::VIDEO_CAPTURE: + flags.setFlag(WebContentsAdapterClient::MediaRequestFlag::MediaVideoCapture); + break; + case blink::PermissionType::DISPLAY_CAPTURE: + flags.setFlag(WebContentsAdapterClient::MediaRequestFlag::MediaDesktopAudioCapture); + flags.setFlag(WebContentsAdapterClient::MediaRequestFlag::MediaDesktopVideoCapture); + break; + default: + Q_UNREACHABLE(); + break; + } + } + } + std::move(callback).Run(flags); + }, permissionTypesBlink, std::move(callback))); +} + +// Needed for the rare cases where a RenderFrameHost remains the same even after +// a cross-origin navigation (e.g. inside an iframe). Needs to be called every +// time transient permissions are accessed. +void PermissionManagerQt::onCrossOriginNavigation(content::RenderFrameHost *render_frame_host) +{ + if (!render_frame_host) + return; + + auto frameToken = render_frame_host->GetGlobalFrameToken(); + auto &permissionsForToken = m_transientPermissions[frameToken]; + if (!permissionsForToken.size()) + return; + + GURL savedOrigin = get<0>(permissionsForToken[0]); + if (render_frame_host->GetLastCommittedOrigin().GetURL() != savedOrigin) + m_transientPermissions.erase(frameToken); +} + void PermissionManagerQt::commit() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); @@ -414,15 +595,18 @@ void PermissionManagerQt::commit() m_prefService->CommitPendingWrite(); } -void PermissionManagerQt::RequestPermissions(content::RenderFrameHost *frameHost, - const content::PermissionRequestDescription &requestDescription, - base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)> callback) +void PermissionManagerQt::RequestPermissions( + content::RenderFrameHost *frameHost, + const content::PermissionRequestDescription &requestDescription, + base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)> callback) { if (requestDescription.requesting_origin.is_empty()) { - std::move(callback).Run(std::vector<content::PermissionStatus>(requestDescription.permissions.size(), blink::mojom::PermissionStatus::DENIED)); + std::move(callback).Run(std::vector<content::PermissionStatus>(requestDescription.permissions.size(), + blink::mojom::PermissionStatus::DENIED)); return; } + const auto frameToken = frameHost->GetGlobalFrameToken(); WebContentsDelegateQt *contentsDelegate = static_cast<WebContentsDelegateQt *>( content::WebContents::FromRenderFrameHost(frameHost)->GetDelegate()); Q_ASSERT(contentsDelegate); @@ -430,53 +614,54 @@ void PermissionManagerQt::RequestPermissions(content::RenderFrameHost *frameHost bool answerable = true; std::vector<content::PermissionStatus> result; result.reserve(requestDescription.permissions.size()); - for (blink::PermissionType permission : requestDescription.permissions) { - const QWebEnginePermission::PermissionType permissionType = toQt(permission); - if (permissionType == QWebEnginePermission::PermissionType::Unsupported) { + for (const blink::PermissionType permissionTypeBlink : requestDescription.permissions) { + const QWebEnginePermission::PermissionType permissionTypeQt = toQt(permissionTypeBlink); + if (permissionTypeQt == QWebEnginePermission::PermissionType::Unsupported) { result.push_back(blink::mojom::PermissionStatus::DENIED); continue; } - blink::mojom::PermissionStatus permissionStatus = getStatusFromSettings(permission, contentsDelegate->webEngineSettings()); - if (permissionStatus == blink::mojom::PermissionStatus::ASK) { + blink::mojom::PermissionStatus permissionStatusBlink = getStatusFromSettings( + permissionTypeBlink, contentsDelegate->webEngineSettings()); + if (permissionStatusBlink == blink::mojom::PermissionStatus::ASK) { const GURL &rorigin = requestDescription.requesting_origin; + bool maybePreGranted = false; if (!m_persistence) { - answerable = false; - break; + maybePreGranted = true; } - bool inTransientStore = !QWebEnginePermission::isPersistent(toQt(permission)); + bool inTransientStore = !QWebEnginePermission::isPersistent(permissionTypeQt) || maybePreGranted; if (inTransientStore) { - permissionStatus = getTransientPermissionStatus(permission, rorigin, frameHost->GetGlobalFrameToken()); + permissionStatusBlink = getTransientPermissionStatus(permissionTypeBlink, rorigin, frameToken); - if (permissionStatus != blink::mojom::PermissionStatus::ASK) { - result.push_back(permissionStatus); + if (permissionStatusBlink != blink::mojom::PermissionStatus::ASK) { + result.push_back(permissionStatusBlink); continue; } // Fall through to check if permission was pre-granted (and thus landed in the permanent store) } - permissionStatus = GetPermissionStatus(permission, rorigin, rorigin); + permissionStatusBlink = GetPermissionStatus(permissionTypeBlink, rorigin, rorigin); - if (inTransientStore && permissionStatus != blink::mojom::PermissionStatus::ASK) { - // Move the pre-granted permission to the transient store and associate it with the rfh - ResetPermission(permission, rorigin, rorigin); - setTransientPermission(permission, rorigin, permissionStatus == blink::mojom::PermissionStatus::GRANTED, - frameHost->GetGlobalFrameToken()); + if (inTransientStore && permissionStatusBlink != blink::mojom::PermissionStatus::ASK) { + // Move the pre-granted permission to the transient store and associate it with a frame token + ResetPermission(permissionTypeBlink, rorigin, rorigin); + setTransientPermission(permissionTypeBlink, rorigin, + permissionStatusBlink == blink::mojom::PermissionStatus::GRANTED, frameToken); } - if (permissionStatus != blink::mojom::PermissionStatus::ASK) { + if (permissionStatusBlink != blink::mojom::PermissionStatus::ASK) { // Automatically grant/deny without prompt if already asked once - result.push_back(permissionStatus); + result.push_back(permissionStatusBlink); } else { answerable = false; break; } } else { // Reached when clipboard settings have been set - result.push_back(permissionStatus); + result.push_back(permissionStatusBlink); } } @@ -486,80 +671,75 @@ void PermissionManagerQt::RequestPermissions(content::RenderFrameHost *frameHost } int request_id = ++m_requestIdCount; - auto requestOrigin = toQt(requestDescription.requesting_origin); + const auto requestOrigin = toQt(requestDescription.requesting_origin); m_multiRequests.push_back({ request_id, requestDescription.permissions, requestOrigin, std::move(callback) }); - for (blink::PermissionType permission : requestDescription.permissions) { - const QWebEnginePermission::PermissionType permissionType = toQt(permission); - if (QWebEnginePermission::isPersistent(permissionType)) - contentsDelegate->requestFeaturePermission(permissionType, requestOrigin); + auto qtPermissions = toQt(requestDescription.permissions); + for (const QWebEnginePermission::PermissionType permissionTypeQt : qtPermissions) { + contentsDelegate->requestFeaturePermission(permissionTypeQt, requestOrigin, frameToken); } } -void PermissionManagerQt::RequestPermissionsFromCurrentDocument(content::RenderFrameHost *frameHost, - const content::PermissionRequestDescription &requestDescription, - base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)> callback) +void PermissionManagerQt::RequestPermissionsFromCurrentDocument( + content::RenderFrameHost *frameHost, + const content::PermissionRequestDescription &requestDescription, + base::OnceCallback<void(const std::vector<blink::mojom::PermissionStatus>&)> callback) { RequestPermissions(frameHost, requestDescription, std::move(callback)); } blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatus( - blink::PermissionType permission, + blink::PermissionType permissionTypeBlink, const GURL& requesting_origin, const GURL& /*embedding_origin*/) { - const QWebEnginePermission::PermissionType permissionType = toQt(permission); - if (permissionType == QWebEnginePermission::PermissionType::Unsupported) + const QWebEnginePermission::PermissionType permissionTypeQt = toQt(permissionTypeBlink); + if (permissionTypeQt == QWebEnginePermission::PermissionType::Unsupported) return blink::mojom::PermissionStatus::DENIED; - permission = toBlink(toQt(permission)); // Filter out merged/unsupported permissions (e.g. clipboard) - auto *pref = m_prefService->FindPreference(permissionTypeString(toQt(permission))); + permissionTypeBlink = toBlink(toQt(permissionTypeBlink)); // Filter out merged/unsupported permissions (e.g. clipboard) + auto *pref = m_prefService->FindPreference(permissionTypeString(permissionTypeQt)); if (!pref) return blink::mojom::PermissionStatus::ASK; // Permission type not in database - const auto *permissions = pref->GetValue()->GetIfDict(); - Q_ASSERT(permissions); + const auto *permissionsDict = pref->GetValue()->GetIfDict(); + Q_ASSERT(permissionsDict); - auto requestedPermission = permissions->FindBool(requesting_origin.DeprecatedGetOriginAsURL().spec()); + const auto requestedPermission = permissionsDict->FindBool(requesting_origin.DeprecatedGetOriginAsURL().spec()); if (!requestedPermission) return blink::mojom::PermissionStatus::ASK; // Origin is not in the current permission type's database - // Workaround: local fonts are entirely managed by Chromium, which only calls RequestPermission() _after_ - // it's checked whether the permission has been granted. By always returning ASK, we force the request to - // come through every time. - if (permission == blink::PermissionType::LOCAL_FONTS && !m_persistence) - return blink::mojom::PermissionStatus::ASK; - if (requestedPermission.value()) return blink::mojom::PermissionStatus::GRANTED; return blink::mojom::PermissionStatus::DENIED; } blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatusForCurrentDocument( - blink::PermissionType permission, + blink::PermissionType permissionTypeBlink, content::RenderFrameHost *render_frame_host, bool) { Q_ASSERT(render_frame_host); - if (permission == blink::PermissionType::CLIPBOARD_READ_WRITE || - permission == blink::PermissionType::CLIPBOARD_SANITIZED_WRITE) { + if (permissionTypeBlink == blink::PermissionType::CLIPBOARD_READ_WRITE || + permissionTypeBlink == blink::PermissionType::CLIPBOARD_SANITIZED_WRITE) { WebContentsDelegateQt *delegate = static_cast<WebContentsDelegateQt *>( content::WebContents::FromRenderFrameHost(render_frame_host)->GetDelegate()); Q_ASSERT(delegate); - auto status = getStatusFromSettings(permission, delegate->webEngineSettings()); + auto status = getStatusFromSettings(permissionTypeBlink, delegate->webEngineSettings()); if (status != blink::mojom::PermissionStatus::ASK) return status; } - permission = toBlink(toQt(permission)); // Filter out merged/unsupported permissions (e.g. clipboard) - if (toQt(permission) == QWebEnginePermission::PermissionType::Unsupported) + permissionTypeBlink = toBlink(toQt(permissionTypeBlink)); // Filter out merged/unsupported permissions (e.g. clipboard) + QWebEnginePermission::PermissionType permissionTypeQt = toQt(permissionTypeBlink); + if (permissionTypeQt == QWebEnginePermission::PermissionType::Unsupported) return blink::mojom::PermissionStatus::DENIED; GURL origin = render_frame_host->GetLastCommittedOrigin().GetURL(); auto status = blink::mojom::PermissionStatus::ASK; - bool inTransientStore = !QWebEnginePermission::isPersistent(toQt(permission)) || !m_persistence; + const bool inTransientStore = !QWebEnginePermission::isPersistent(permissionTypeQt) || !m_persistence; if (inTransientStore) { - status = getTransientPermissionStatus(permission, origin, render_frame_host->GetGlobalFrameToken()); + status = getTransientPermissionStatus(permissionTypeBlink, origin, render_frame_host->GetGlobalFrameToken()); if (status != blink::mojom::PermissionStatus::ASK) { return status; @@ -568,12 +748,12 @@ blink::mojom::PermissionStatus PermissionManagerQt::GetPermissionStatusForCurren // Fall through to check if permission was pre-granted (and thus landed in the permanent store) } - status = GetPermissionStatus(permission, origin, origin); + status = GetPermissionStatus(permissionTypeBlink, origin, origin); if (inTransientStore && status != blink::mojom::PermissionStatus::ASK) { // Move the pre-granted permission to the transient store and associate it with the rfh - ResetPermission(permission, origin, origin); - setTransientPermission(permission, origin, status == blink::mojom::PermissionStatus::GRANTED, + ResetPermission(permissionTypeBlink, origin, origin); + setTransientPermission(permissionTypeBlink, origin, status == blink::mojom::PermissionStatus::GRANTED, render_frame_host->GetGlobalFrameToken()); } @@ -610,9 +790,9 @@ content::PermissionResult PermissionManagerQt::GetPermissionResultForOriginWitho } void PermissionManagerQt::ResetPermission( - blink::PermissionType permission, - const GURL& requesting_origin, - const GURL& /*embedding_origin*/) + blink::PermissionType permission, + const GURL& requesting_origin, + const GURL& /*embedding_origin*/) { const QWebEnginePermission::PermissionType permissionType = toQt(permission); if (permissionType == QWebEnginePermission::PermissionType::Unsupported) @@ -622,12 +802,12 @@ void PermissionManagerQt::ResetPermission( updater.Get().Remove(requesting_origin.spec()); } -blink::mojom::PermissionStatus PermissionManagerQt::getTransientPermissionStatus(blink::PermissionType permission, +blink::mojom::PermissionStatus PermissionManagerQt::getTransientPermissionStatus( + blink::PermissionType permissionTypeBlink, const GURL& requesting_origin, content::GlobalRenderFrameHostToken token) { - const QWebEnginePermission::PermissionType permissionType = toQt(permission); - if (permissionType == QWebEnginePermission::PermissionType::Unsupported) + if (toQt(permissionTypeBlink) == QWebEnginePermission::PermissionType::Unsupported) return blink::mojom::PermissionStatus::DENIED; if (!m_transientPermissions.contains(token)) @@ -635,8 +815,10 @@ blink::mojom::PermissionStatus PermissionManagerQt::getTransientPermissionStatus auto &permissionsForToken = m_transientPermissions[token]; for (auto p = permissionsForToken.begin(); p != permissionsForToken.end(); ++p) { - if (get<0>(*p) == requesting_origin && get<1>(*p) == permission) { - return get<2>(*p) ? blink::mojom::PermissionStatus::GRANTED : blink::mojom::PermissionStatus::DENIED; + if (get<0>(*p) == requesting_origin && get<1>(*p) == permissionTypeBlink) { + return get<2>(*p) + ? blink::mojom::PermissionStatus::GRANTED + : blink::mojom::PermissionStatus::DENIED; } } @@ -644,47 +826,49 @@ blink::mojom::PermissionStatus PermissionManagerQt::getTransientPermissionStatus } void PermissionManagerQt::setPersistentPermission( - blink::PermissionType permission, - const GURL& requesting_origin, - bool granted) + blink::PermissionType permissionTypeBlink, + const GURL& requesting_origin, + bool granted) { - const QWebEnginePermission::PermissionType permissionType = toQt(permission); - if (permissionType == QWebEnginePermission::PermissionType::Unsupported) + const QWebEnginePermission::PermissionType permissionTypeQt = toQt(permissionTypeBlink); + if (permissionTypeQt == QWebEnginePermission::PermissionType::Unsupported) return; - if (!m_prefService->FindPreference(permissionTypeString(permissionType))) + if (!m_prefService->FindPreference(permissionTypeString(permissionTypeQt))) return; - ScopedDictPrefUpdate updater(m_prefService.get(), permissionTypeString(permissionType)); + ScopedDictPrefUpdate updater(m_prefService.get(), permissionTypeString(permissionTypeQt)); updater.Get().Set(requesting_origin.spec(), granted); m_prefService->SchedulePendingLossyWrites(); } -void PermissionManagerQt::setTransientPermission(blink::PermissionType permission, +void PermissionManagerQt::setTransientPermission( + blink::PermissionType permissionTypeBlink, const GURL& requesting_origin, bool granted, content::GlobalRenderFrameHostToken token) { - const QWebEnginePermission::PermissionType permissionType = toQt(permission); - if (permissionType == QWebEnginePermission::PermissionType::Unsupported) + const QWebEnginePermission::PermissionType permissionTypeQt = toQt(permissionTypeBlink); + if (permissionTypeQt == QWebEnginePermission::PermissionType::Unsupported) return; auto &permissionsForToken = m_transientPermissions[token]; for (auto &p : permissionsForToken) { - if (get<0>(p) == requesting_origin && get<1>(p) == permission) { + if (get<0>(p) == requesting_origin && get<1>(p) == permissionTypeBlink) { get<2>(p) = granted; return; } } - permissionsForToken.push_back({requesting_origin, permission, granted}); + permissionsForToken.push_back({requesting_origin, permissionTypeBlink, granted}); // Render frame hosts get discarded often, so the map will eventualy fill up with junk unless // periodically cleaned. The number 25 was chosen arbitrarily. if (++m_transientWriteCount > 25) { content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, - base::BindOnce([](PermissionManagerQt *p){ + base::BindOnce([](PermissionManagerQt *p) + { for (auto i = p->m_transientPermissions.begin(); i != p->m_transientPermissions.end(); ++i) { if (content::RenderFrameHost::FromFrameToken(i->first) == nullptr) { i = p->m_transientPermissions.erase(i); @@ -695,17 +879,18 @@ void PermissionManagerQt::setTransientPermission(blink::PermissionType permissio } } -void PermissionManagerQt::resetTransientPermission(blink::PermissionType permission, +void PermissionManagerQt::resetTransientPermission( + blink::PermissionType permissionTypeBlink, const GURL& requesting_origin, content::GlobalRenderFrameHostToken token) { - const QWebEnginePermission::PermissionType permissionType = toQt(permission); - if (permissionType == QWebEnginePermission::PermissionType::Unsupported) + const QWebEnginePermission::PermissionType permissionTypeQt = toQt(permissionTypeBlink); + if (permissionTypeQt == QWebEnginePermission::PermissionType::Unsupported) return; auto &permissionsForToken = m_transientPermissions[token]; for (auto i = permissionsForToken.begin(); i != permissionsForToken.end(); ++i) { - if (get<0>(*i) == requesting_origin && get<1>(*i) == permission) { + if (get<0>(*i) == requesting_origin && get<1>(*i) == permissionTypeBlink) { permissionsForToken.erase(i); return; } diff --git a/src/core/permission_manager_qt.h b/src/core/permission_manager_qt.h index 7468e9861..d8474d1e1 100644 --- a/src/core/permission_manager_qt.h +++ b/src/core/permission_manager_qt.h @@ -6,11 +6,13 @@ #include "base/functional/callback.h" #include "content/public/browser/global_routing_id.h" +#include "content/public/browser/media_stream_request.h" #include "content/public/browser/permission_controller_delegate.h" #include "content/public/browser/render_frame_host.h" #include <QtWebEngineCore/qwebenginepermission.h> #include "profile_adapter.h" +#include "web_contents_adapter_client.h" #include <map> #include <tuple> @@ -25,14 +27,30 @@ public: PermissionManagerQt(ProfileAdapter *adapter); ~PermissionManagerQt(); + static content::GlobalRenderFrameHostToken deserializeToken(int childId, const std::string &serializedToken); + + void setPermission( + const QUrl &origin, + const QWebEnginePermission::PermissionType permissionType, + const QWebEnginePermission::State state, + const content::GlobalRenderFrameHostToken &frameToken); + void setPermission( const QUrl &origin, - QWebEnginePermission::PermissionType permissionType, - QWebEnginePermission::State state, - content::RenderFrameHost *rfh = nullptr); - QWebEnginePermission::State getPermissionState(const QUrl &origin, QWebEnginePermission::PermissionType permissionType, - content::RenderFrameHost *rfh = nullptr); - QList<QWebEnginePermission> listPermissions(const QUrl &origin, QWebEnginePermission::PermissionType permissionType); + const QWebEnginePermission::PermissionType permissionType, + const QWebEnginePermission::State state, + int childId, const std::string &serializedToken); + + QWebEnginePermission::State getPermissionState(const QUrl &origin, const QWebEnginePermission::PermissionType permissionType, + const content::GlobalRenderFrameHostToken &frameToken); + QList<QWebEnginePermission> listPermissions(const QUrl &origin, const QWebEnginePermission::PermissionType permissionType); + + void requestMediaPermissions( + content::RenderFrameHost *render_frame_host, + const WebContentsAdapterClient::MediaRequestFlags flags, + base::OnceCallback<void(WebContentsAdapterClient::MediaRequestFlags authorizationFlags)> callback); + + void onCrossOriginNavigation(content::RenderFrameHost *render_frame_host); void commit(); @@ -42,7 +60,6 @@ public: const GURL& requesting_origin, const GURL& embedding_origin) override; - content::PermissionStatus GetPermissionStatusForCurrentDocument(blink::PermissionType, content::RenderFrameHost*, bool) override; blink::mojom::PermissionStatus GetPermissionStatusForWorker(blink::PermissionType, content::RenderProcessHost *, const GURL &) override; @@ -85,6 +102,12 @@ private: base::RepeatingCallback<void(blink::mojom::PermissionStatus)> callback; }; + void setPermissionImpl( + const QUrl &origin, + const QWebEnginePermission::PermissionType permissionType, + const QWebEnginePermission::State state, + const content::GlobalRenderFrameHostToken &frameToken); + blink::mojom::PermissionStatus getTransientPermissionStatus(blink::PermissionType permission, const GURL& requesting_origin, content::GlobalRenderFrameHostToken token); diff --git a/src/core/printing/pdf_document_helper_client_qt.cpp b/src/core/printing/pdf_document_helper_client_qt.cpp index acf2ef7e0..a82c68e54 100644 --- a/src/core/printing/pdf_document_helper_client_qt.cpp +++ b/src/core/printing/pdf_document_helper_client_qt.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // based on chrome/browser/ui/pdf/chrome_pdf_document_helper_client.cc: diff --git a/src/core/printing/pdf_document_helper_client_qt.h b/src/core/printing/pdf_document_helper_client_qt.h index 3c848dfe3..1bfdc1db0 100644 --- a/src/core/printing/pdf_document_helper_client_qt.h +++ b/src/core/printing/pdf_document_helper_client_qt.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef PDF_DOCUMENT_HELPER_CLIENT_QT_H #define PDF_DOCUMENT_HELPER_CLIENT_QT_H diff --git a/src/core/printing/pdf_stream_delegate_qt.cpp b/src/core/printing/pdf_stream_delegate_qt.cpp index bb82c3302..352a7bdd4 100644 --- a/src/core/printing/pdf_stream_delegate_qt.cpp +++ b/src/core/printing/pdf_stream_delegate_qt.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // based on chrome/browser/pdf/chrome_pdf_stream_delegate.cc: diff --git a/src/core/printing/pdf_stream_delegate_qt.h b/src/core/printing/pdf_stream_delegate_qt.h index 61ceed777..42271aba3 100644 --- a/src/core/printing/pdf_stream_delegate_qt.h +++ b/src/core/printing/pdf_stream_delegate_qt.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef PDF_STREAM_DELEGATE_QT_H #define PDF_STREAM_DELEGATE_QT_H diff --git a/src/core/printing/pdfium_document_wrapper_qt.cpp b/src/core/printing/pdfium_document_wrapper_qt.cpp index 56588620d..a9a79140f 100644 --- a/src/core/printing/pdfium_document_wrapper_qt.cpp +++ b/src/core/printing/pdfium_document_wrapper_qt.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "pdfium_document_wrapper_qt.h" #include <QtCore/qhash.h> diff --git a/src/core/printing/pdfium_document_wrapper_qt.h b/src/core/printing/pdfium_document_wrapper_qt.h index feb34e36a..e390acc48 100644 --- a/src/core/printing/pdfium_document_wrapper_qt.h +++ b/src/core/printing/pdfium_document_wrapper_qt.h @@ -1,5 +1,6 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/core/printing/print_view_manager_base_qt.cpp b/src/core/printing/print_view_manager_base_qt.cpp index f36767aac..54ca48d70 100644 --- a/src/core/printing/print_view_manager_base_qt.cpp +++ b/src/core/printing/print_view_manager_base_qt.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // This is based on chrome/browser/printing/print_view_manager_base.cc: // Copyright 2013 The Chromium Authors. All rights reserved. diff --git a/src/core/printing/print_view_manager_base_qt.h b/src/core/printing/print_view_manager_base_qt.h index f2d4149ab..57cb24bf1 100644 --- a/src/core/printing/print_view_manager_base_qt.h +++ b/src/core/printing/print_view_manager_base_qt.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be diff --git a/src/core/printing/print_view_manager_qt.cpp b/src/core/printing/print_view_manager_qt.cpp index 364253887..fd6539d95 100644 --- a/src/core/printing/print_view_manager_qt.cpp +++ b/src/core/printing/print_view_manager_qt.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // Loosely based on print_view_manager.cc and print_preview_message_handler.cc // Copyright 2013 The Chromium Authors. All rights reserved. diff --git a/src/core/printing/print_view_manager_qt.h b/src/core/printing/print_view_manager_qt.h index 6d90e1061..1e4a65790 100644 --- a/src/core/printing/print_view_manager_qt.h +++ b/src/core/printing/print_view_manager_qt.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be diff --git a/src/core/printing/printer_worker.cpp b/src/core/printing/printer_worker.cpp index 64c30ac2d..3d1c1f4ec 100644 --- a/src/core/printing/printer_worker.cpp +++ b/src/core/printing/printer_worker.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2018 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "printer_worker.h" diff --git a/src/core/printing/printer_worker.h b/src/core/printing/printer_worker.h index 0d2454fa0..e4d4ead99 100644 --- a/src/core/printing/printer_worker.h +++ b/src/core/printing/printer_worker.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default // // W A R N I N G diff --git a/src/core/profile_adapter.cpp b/src/core/profile_adapter.cpp index f0cabc088..1e07f95f3 100644 --- a/src/core/profile_adapter.cpp +++ b/src/core/profile_adapter.cpp @@ -33,7 +33,9 @@ #include "renderer_host/user_resource_controller_host.h" #include "type_conversion.h" #include "visited_links_manager_qt.h" +#include "web_contents_adapter.h" #include "web_contents_adapter_client.h" +#include "web_contents_delegate_qt.h" #include "web_engine_context.h" #include <QCoreApplication> @@ -627,15 +629,29 @@ UserResourceControllerHost *ProfileAdapter::userResourceController() } void ProfileAdapter::setPermission(const QUrl &origin, QWebEnginePermission::PermissionType permissionType, - QWebEnginePermission::State state, content::RenderFrameHost *rfh) + QWebEnginePermission::State state, int childId, const std::string &serializedToken) { - static_cast<PermissionManagerQt*>(profile()->GetPermissionControllerDelegate())->setPermission(origin, permissionType, state, rfh); + auto token = PermissionManagerQt::deserializeToken(childId, serializedToken); + + // Check if the frame token is valid, and defer to WebContentsAdapter if so + auto *rfh = content::RenderFrameHost::FromFrameToken(token); + if (rfh) { + static_cast<WebContentsDelegateQt *>(content::WebContents::FromRenderFrameHost(rfh)->GetDelegate()) + ->webContentsAdapter() + ->setPermission(origin, permissionType, state, childId, serializedToken); + return; + } + + // Otherwise, set the permission directly + static_cast<PermissionManagerQt *>(profile()->GetPermissionControllerDelegate()) + ->setPermission(origin, permissionType, state, token); } QWebEnginePermission::State ProfileAdapter::getPermissionState(const QUrl &origin, QWebEnginePermission::PermissionType permissionType, - content::RenderFrameHost *rfh) + int childId, const std::string &serializedToken) { - return static_cast<PermissionManagerQt*>(profile()->GetPermissionControllerDelegate())->getPermissionState(origin, permissionType, rfh); + return static_cast<PermissionManagerQt*>(profile()->GetPermissionControllerDelegate()) + ->getPermissionState(origin, permissionType, PermissionManagerQt::deserializeToken(childId, serializedToken)); } QList<QWebEnginePermission> ProfileAdapter::listPermissions(const QUrl &origin, QWebEnginePermission::PermissionType permissionType) diff --git a/src/core/profile_adapter.h b/src/core/profile_adapter.h index b6357ce1c..22dd65973 100644 --- a/src/core/profile_adapter.h +++ b/src/core/profile_adapter.h @@ -16,6 +16,7 @@ #define PROFILE_ADAPTER_H #include <QtWebEngineCore/private/qtwebenginecoreglobal_p.h> +#include <QtWebEngineCore/private/qwebenginepermission_p.h> #include <QHash> #include <QList> @@ -61,7 +62,8 @@ public: enum PersistentCookiesPolicy { NoPersistentCookies = 0, AllowPersistentCookies, - ForcePersistentCookies + ForcePersistentCookies, + OnlyPersistentCookies, }; enum VisitedLinksPolicy { @@ -186,9 +188,9 @@ public: UserResourceControllerHost *userResourceController(); void setPermission(const QUrl &origin, QWebEnginePermission::PermissionType permissionType, - QWebEnginePermission::State state, content::RenderFrameHost *rfh = nullptr); + QWebEnginePermission::State state, int childId = -1, const std::string &serializedToken = std::string()); QWebEnginePermission::State getPermissionState(const QUrl &origin, QWebEnginePermission::PermissionType permissionType, - content::RenderFrameHost *rfh = nullptr); + int childId = -1, const std::string &serializedToken = std::string()); QList<QWebEnginePermission> listPermissions(const QUrl &origin = QUrl(), QWebEnginePermission::PermissionType permissionType = QWebEnginePermission::PermissionType::Unsupported); diff --git a/src/core/profile_io_data_qt.cpp b/src/core/profile_io_data_qt.cpp index 567403a7c..85b533b93 100644 --- a/src/core/profile_io_data_qt.cpp +++ b/src/core/profile_io_data_qt.cpp @@ -224,7 +224,8 @@ void ProfileIODataQt::ConfigureNetworkContextParams(bool in_memory, if (m_persistentCookiesPolicy != ProfileAdapter::NoPersistentCookies) { network_context_params->file_paths->cookie_database_name = base::FilePath::FromASCII("Cookies"); network_context_params->restore_old_session_cookies = m_persistentCookiesPolicy == ProfileAdapter::ForcePersistentCookies; - network_context_params->persist_session_cookies = m_persistentCookiesPolicy != ProfileAdapter::NoPersistentCookies; + network_context_params->persist_session_cookies = + m_persistentCookiesPolicy != ProfileAdapter::OnlyPersistentCookies; } } diff --git a/src/core/render_widget_host_view_qt_delegate_item.cpp b/src/core/render_widget_host_view_qt_delegate_item.cpp index 77adb843c..dc8eac4de 100644 --- a/src/core/render_widget_host_view_qt_delegate_item.cpp +++ b/src/core/render_widget_host_view_qt_delegate_item.cpp @@ -5,10 +5,13 @@ #include "render_widget_host_view_qt_delegate_client.h" +#include <QtCore/qrunnable.h> +#include <QtCore/qthread.h> #include <QtGui/qevent.h> #include <QtGui/qguiapplication.h> #include <QtGui/qwindow.h> #include <QtQuick/qsgimagenode.h> +#include <rhi/qrhi.h> #if QT_CONFIG(accessibility) #include <QtGui/qaccessible.h> @@ -37,7 +40,9 @@ RenderWidgetHostViewQtDelegateItem::RenderWidgetHostViewQtDelegateItem(RenderWid RenderWidgetHostViewQtDelegateItem::~RenderWidgetHostViewQtDelegateItem() { - releaseTextureResources(); + if (QQuickItem::window()) + releaseResources(); + unbind(); // Compositor::Observer if (m_widgetDelegate) { m_widgetDelegate->Unbind(); @@ -326,12 +331,6 @@ void RenderWidgetHostViewQtDelegateItem::itemChange(ItemChange change, const Ite for (const QMetaObject::Connection &c : std::as_const(m_windowConnections)) disconnect(c); m_windowConnections.clear(); - - auto comp = compositor(); - if (comp && comp->type() == Compositor::Type::Native) { - comp->releaseTexture(); - comp->releaseResources(); - } } if (value.window) { @@ -343,10 +342,12 @@ void RenderWidgetHostViewQtDelegateItem::itemChange(ItemChange change, const Ite m_windowConnections.append(connect(value.window, SIGNAL(xChanged(int)), SLOT(onWindowPosChanged()))); m_windowConnections.append( connect(value.window, SIGNAL(yChanged(int)), SLOT(onWindowPosChanged()))); - m_windowConnections.append( - connect(value.window, &QQuickWindow::sceneGraphAboutToStop, this, - &RenderWidgetHostViewQtDelegateItem::releaseTextureResources, - Qt::DirectConnection)); + m_windowConnections.append(connect( + value.window, &QQuickWindow::sceneGraphAboutToStop, this, + &RenderWidgetHostViewQtDelegateItem::releaseResources, Qt::DirectConnection)); + m_windowConnections.append(connect( + value.window, &QQuickWindow::sceneGraphInvalidated, this, + &RenderWidgetHostViewQtDelegateItem::releaseResources, Qt::DirectConnection)); if (!m_isPopup) m_windowConnections.append(connect(value.window, SIGNAL(closing(QQuickCloseEvent*)), SLOT(onHide()))); } @@ -366,6 +367,61 @@ void RenderWidgetHostViewQtDelegateItem::itemChange(ItemChange change, const Ite } } +class CleanupJob : public QRunnable +{ +public: + CleanupJob(Compositor::Handle<Compositor> compositor) : m_compositor(std::move(compositor)) { } + + ~CleanupJob() + { + if (m_compositor->hasResources()) { + qWarning("Failed to release graphics resources because the clean-up render job was " + "deleted."); + } + } + + void run() override { m_compositor->releaseResources(); } + +private: + Compositor::Handle<Compositor> m_compositor; +}; + +void RenderWidgetHostViewQtDelegateItem::releaseResources() +{ + auto comp = compositor(); + if (!comp || comp->type() != Compositor::Type::Native || !comp->hasResources()) + return; + + comp->releaseTexture(); + + QQuickWindow *win = QQuickItem::window(); + if (!win) { + qWarning("Failed to release graphics resources because QQuickWindow is not available."); + return; + } + + QRhi *rhi = win->rhi(); + if (!rhi) { + qWarning("Failed to release graphics resources because RHI is not available."); + return; + } + + // Do not schedule clean-up if the resources were created on the current thread. + if (QThread::currentThread() == rhi->thread()) { + comp->releaseResources(); + return; + } + + if (win->isExposed()) + win->scheduleRenderJob(new CleanupJob(std::move(comp)), QQuickWindow::NoStage); + else { + // TODO: Try to find a proper way to schedule job on the render thread if the window is + // not exposed. + // This is reproducible with ./tst_qquickwebengineviewgraphics simpleGraphics simpleGraphics + qWarning("Failed to release graphics resources because QQuickWindow is not exposed."); + } +} + QSGNode *RenderWidgetHostViewQtDelegateItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) { auto comp = compositor(); @@ -447,15 +503,6 @@ void RenderWidgetHostViewQtDelegateItem::onHide() m_client->forwardEvent(&event); } -void RenderWidgetHostViewQtDelegateItem::releaseTextureResources() -{ - auto comp = compositor(); - if (!comp || comp->type() != Compositor::Type::Native) - return; - - comp->releaseResources(); -} - void RenderWidgetHostViewQtDelegateItem::adapterClientChanged(WebContentsAdapterClient *client) { m_adapterClient = client; diff --git a/src/core/render_widget_host_view_qt_delegate_item.h b/src/core/render_widget_host_view_qt_delegate_item.h index 65fbeeb17..f0351aa9f 100644 --- a/src/core/render_widget_host_view_qt_delegate_item.h +++ b/src/core/render_widget_host_view_qt_delegate_item.h @@ -95,6 +95,7 @@ protected: void inputMethodEvent(QInputMethodEvent *event) override; void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override; void itemChange(ItemChange change, const ItemChangeData &value) override; + void releaseResources() override; QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *) override; void adapterClientChanged(WebContentsAdapterClient *client) override; @@ -104,7 +105,6 @@ private Q_SLOTS: void onBeforeRendering(); void onAfterFrameEnd(); void onWindowPosChanged(); - void releaseTextureResources(); void onHide(); private: diff --git a/src/core/tools/qwebengine_convert_dict/main.cpp b/src/core/tools/qwebengine_convert_dict/main.cpp index 3264e4c13..5978b0a11 100644 --- a/src/core/tools/qwebengine_convert_dict/main.cpp +++ b/src/core/tools/qwebengine_convert_dict/main.cpp @@ -8,6 +8,7 @@ ** Copyright (C) 2016 The Qt Company Ltd. ** ** SPDX-License-Identifier: BSD-3-Clause +** Qt-Security score:critical reason:data-parser ** ** This tool converts Hunspell .aff/.dic pairs to a combined binary dictionary ** format (.bdic). This format is more compact, and can be more efficiently diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp index 8c4d01e58..685b2acfe 100644 --- a/src/core/web_contents_adapter.cpp +++ b/src/core/web_contents_adapter.cpp @@ -16,6 +16,7 @@ #include "find_text_helper.h" #include "media_capture_devices_dispatcher.h" #include "pdf_util_qt.h" +#include "permission_manager_qt.h" #include "profile_adapter.h" #include "profile_qt.h" #include "qwebengineloadinginfo.h" @@ -1417,17 +1418,18 @@ QSizeF WebContentsAdapter::lastContentsSize() const return QSizeF(); } -void WebContentsAdapter::setPermission(const QUrl &origin, QWebEnginePermission::PermissionType permissionType, QWebEnginePermission::State state) +void WebContentsAdapter::setPermission( + const QUrl &origin, + QWebEnginePermission::PermissionType permissionType, + QWebEnginePermission::State state, + int childId, const std::string &serializedToken) { + auto *manager = static_cast<PermissionManagerQt*>(m_profileAdapter->profile()->GetPermissionControllerDelegate()); + if (QWebEnginePermission::isPersistent(permissionType)) { // Do not check for initialization in this path so permissions can be set before first navigation Q_ASSERT(m_profileAdapter); - if (!isInitialized()) { - m_profileAdapter->setPermission(origin, permissionType, state); - } else { - m_profileAdapter->setPermission(origin, permissionType, state, m_webContents.get()->GetPrimaryMainFrame()); - } - + manager->setPermission(origin, permissionType, state, childId, serializedToken); return; } @@ -1440,115 +1442,87 @@ void WebContentsAdapter::setPermission(const QUrl &origin, QWebEnginePermission: // Do nothing break; case QWebEnginePermission::State::Denied: - grantMouseLockPermission(origin, false); + grantMouseLockPermission(origin, childId, serializedToken, false); break; case QWebEnginePermission::State::Granted: - grantMouseLockPermission(origin, true); + grantMouseLockPermission(origin, childId, serializedToken, true); break; } return; } - const WebContentsAdapterClient::MediaRequestFlags audioVideoCaptureFlags( - WebContentsAdapterClient::MediaVideoCapture | - WebContentsAdapterClient::MediaAudioCapture); - const WebContentsAdapterClient::MediaRequestFlags desktopAudioVideoCaptureFlags( - WebContentsAdapterClient::MediaDesktopVideoCapture | - WebContentsAdapterClient::MediaDesktopAudioCapture); - - switch (state) { - case QWebEnginePermission::State::Invalid: - case QWebEnginePermission::State::Ask: - // Do nothing - return; - case QWebEnginePermission::State::Denied: - // Deny all media access - grantMediaAccessPermission(origin, WebContentsAdapterClient::MediaNone); - return; - case QWebEnginePermission::State::Granted: - // Enable only the requested capture type - break; - } + // If we reach this, we must be handling media access permissions + manager->setPermission(origin, permissionType, state, childId, serializedToken); - switch (permissionType) { - case QWebEnginePermission::PermissionType::MediaAudioVideoCapture: - grantMediaAccessPermission(origin, audioVideoCaptureFlags); - break; - case QWebEnginePermission::PermissionType::MediaAudioCapture: - grantMediaAccessPermission(origin, WebContentsAdapterClient::MediaAudioCapture); - break; - case QWebEnginePermission::PermissionType::MediaVideoCapture: - grantMediaAccessPermission(origin, WebContentsAdapterClient::MediaVideoCapture); - break; - case QWebEnginePermission::PermissionType::DesktopAudioVideoCapture: - grantMediaAccessPermission(origin, desktopAudioVideoCaptureFlags); - break; - case QWebEnginePermission::PermissionType::DesktopVideoCapture: - grantMediaAccessPermission(origin, WebContentsAdapterClient::MediaDesktopVideoCapture); - break; - default: - Q_UNREACHABLE(); - break; + WebContentsAdapterClient::MediaRequestFlags flags = WebContentsAdapterClient::MediaNone; + if (state == QWebEnginePermission::State::Granted) { + switch (permissionType) { + case QWebEnginePermission::PermissionType::MediaAudioCapture: + flags.setFlag(WebContentsAdapterClient::MediaAudioCapture); + break; + case QWebEnginePermission::PermissionType::MediaVideoCapture: + flags.setFlag(WebContentsAdapterClient::MediaVideoCapture); + break; + case QWebEnginePermission::PermissionType::MediaAudioVideoCapture: + flags.setFlag(WebContentsAdapterClient::MediaAudioCapture); + flags.setFlag(WebContentsAdapterClient::MediaVideoCapture); + break; + case QWebEnginePermission::PermissionType::DesktopVideoCapture: + flags.setFlag(WebContentsAdapterClient::MediaDesktopVideoCapture); + break; + case QWebEnginePermission::PermissionType::DesktopAudioVideoCapture: + flags.setFlag(WebContentsAdapterClient::MediaDesktopAudioCapture); + flags.setFlag(WebContentsAdapterClient::MediaDesktopVideoCapture); + break; + default: + break; + } } -} -QWebEnginePermission::State WebContentsAdapter::getPermissionState(const QUrl &origin, QWebEnginePermission::PermissionType permissionType) -{ - return m_profileAdapter->getPermissionState(origin, permissionType, m_webContents.get()->GetPrimaryMainFrame()); -} - -void WebContentsAdapter::grantMediaAccessPermission(const QUrl &origin, WebContentsAdapterClient::MediaRequestFlags flags) -{ - CHECK_INITIALIZED(); - // Let the permission manager remember the reply. - if (flags & WebContentsAdapterClient::MediaAudioCapture) - m_profileAdapter->setPermission(origin, - QWebEnginePermission::PermissionType::MediaAudioCapture, - QWebEnginePermission::State::Granted, - m_webContents.get()->GetPrimaryMainFrame()); - if (flags & WebContentsAdapterClient::MediaVideoCapture) - m_profileAdapter->setPermission(origin, - QWebEnginePermission::PermissionType::MediaVideoCapture, - QWebEnginePermission::State::Granted, - m_webContents.get()->GetPrimaryMainFrame()); MediaCaptureDevicesDispatcher::GetInstance()->handleMediaAccessPermissionResponse(m_webContents.get(), origin, flags); } -void WebContentsAdapter::grantMouseLockPermission(const QUrl &securityOrigin, bool granted) +void WebContentsAdapter::grantMouseLockPermission(const QUrl &securityOrigin, int childId, + const std::string &serializedToken, bool granted) { CHECK_INITIALIZED(); - if (securityOrigin != toQt(m_webContents->GetLastCommittedURL().DeprecatedGetOriginAsURL())) - return; - if (granted) { - if (RenderWidgetHostViewQt *rwhv = static_cast<RenderWidgetHostViewQt *>(m_webContents->GetRenderWidgetHostView())) { - rwhv->Focus(); - if (!rwhv->HasFocus()) { - // We tried to activate our RWHVQtDelegate, but we failed. This probably means that - // the permission was granted from a modal dialog and the windowing system is not ready - // to set focus on the originating view. Since pointer lock strongly requires it, we just - // wait until the next FocusIn event. - m_pendingMouseLockPermissions.insert(securityOrigin, granted); - return; - } - } else - granted = false; + bool focused = false; + if (RenderWidgetHostViewQt *rwhv = static_cast<RenderWidgetHostViewQt *>(m_webContents->GetRenderWidgetHostView())) { + rwhv->Focus(); + if (rwhv->HasFocus()) { + focused = true; + } + } else { + granted = false; } - m_webContents->GotResponseToPointerLockRequest(granted ? blink::mojom::PointerLockResult::kSuccess - : blink::mojom::PointerLockResult::kPermissionDenied); + m_pendingMouseLockPermissions.enqueue({ securityOrigin, granted, childId, serializedToken }); + + if (focused) { + handlePendingMouseLockPermission(); + } } void WebContentsAdapter::handlePendingMouseLockPermission() { CHECK_INITIALIZED(); - auto it = m_pendingMouseLockPermissions.find(toQt(m_webContents->GetLastCommittedURL().DeprecatedGetOriginAsURL())); - if (it != m_pendingMouseLockPermissions.end()) { - m_webContents->GotResponseToPointerLockRequest(it.value() ? blink::mojom::PointerLockResult::kSuccess - : blink::mojom::PointerLockResult::kPermissionDenied); - m_pendingMouseLockPermissions.erase(it); - } + if (!m_pendingMouseLockPermissions.size()) + return; + + auto pending = m_pendingMouseLockPermissions.dequeue(); + + // Simply set the permission in the manager. The callback from WebContentsDelegateQt::RequestPointerLock() + // will ensure WebContents receives the response + auto *manager = static_cast<PermissionManagerQt*>(m_profileAdapter->profile()->GetPermissionControllerDelegate()); + manager->setPermission( + get<0>(pending), // origin + QWebEnginePermission::PermissionType::MouseLock, + get<1>(pending) // granted + ? QWebEnginePermission::State::Granted : QWebEnginePermission::State::Denied, + get<2>(pending), // childId + get<3>(pending)); // serializedToken } void WebContentsAdapter::setBackgroundColor(const QColor &color) diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h index 3bb639b1b..212411109 100644 --- a/src/core/web_contents_adapter.h +++ b/src/core/web_contents_adapter.h @@ -21,6 +21,7 @@ #include <QtCore/QUrl> #include <QtCore/QVariant> #include <QtCore/QPointer> +#include <QtCore/QQueue> #include <QtGui/qtgui-config.h> #include <QtWebEngineCore/private/qtwebenginecoreglobal_p.h> #include <QtWebEngineCore/qwebenginecontextmenurequest.h> @@ -48,6 +49,7 @@ namespace content { class WebContents; class SiteInstance; class RenderFrameHost; +struct GlobalRenderFrameHostToken; } QT_BEGIN_NAMESPACE @@ -179,11 +181,9 @@ public: void devToolsFrontendDestroyed(DevToolsFrontendQt *frontend); QString devToolsId(); - void setPermission(const QUrl &origin, QWebEnginePermission::PermissionType permissionType, QWebEnginePermission::State state); - QWebEnginePermission::State getPermissionState(const QUrl &origin, QWebEnginePermission::PermissionType permissionType); - - void grantMediaAccessPermission(const QUrl &origin, WebContentsAdapterClient::MediaRequestFlags flags); - void grantMouseLockPermission(const QUrl &origin, bool granted); + void setPermission(const QUrl &origin, QWebEnginePermission::PermissionType permissionType, + QWebEnginePermission::State state, int childId = -1, const std::string &serializedToken = std::string()); + void grantMouseLockPermission(const QUrl &origin, int childId, const std::string &serializedToken, bool granted); void handlePendingMouseLockPermission(); void setBackgroundColor(const QColor &color); @@ -272,7 +272,7 @@ private: #endif WebContentsAdapterClient *m_adapterClient; quint64 m_nextRequestId; - QMap<QUrl, bool> m_pendingMouseLockPermissions; + QQueue<std::tuple<QUrl, bool, int, std::string>> m_pendingMouseLockPermissions; QMap<quint64, std::function<void(const QVariant &)>> m_javaScriptCallbacks; std::map<quint64, std::function<void(QSharedPointer<QByteArray>)>> m_printCallbacks; std::unique_ptr<content::DropData> m_currentDropData; diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h index 9ce5bebfc..2f93d4783 100644 --- a/src/core/web_contents_adapter_client.h +++ b/src/core/web_contents_adapter_client.h @@ -16,6 +16,7 @@ #define WEB_CONTENTS_ADAPTER_CLIENT_H #include <QtWebEngineCore/private/qtwebenginecoreglobal_p.h> +#include <QtWebEngineCore/private/qwebenginepermission_p.h> #include <QtWebEngineCore/qwebenginepermission.h> #include "profile_adapter.h" @@ -195,9 +196,8 @@ public: virtual QObject *accessibilityParentObject() = 0; virtual void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) = 0; virtual void authenticationRequired(QSharedPointer<AuthenticationDialogController>) = 0; - virtual void runFeaturePermissionRequest(QWebEnginePermission::PermissionType, const QUrl &securityOrigin) = 0; - virtual void runMediaAccessPermissionRequest(const QUrl &securityOrigin, MediaRequestFlags requestFlags) = 0; - virtual void runMouseLockPermissionRequest(const QUrl &securityOrigin) = 0; + virtual void runFeaturePermissionRequest(QWebEnginePermission::PermissionType, const QUrl &securityOrigin, + int childId, const std::string &serializedToken) = 0; virtual void runRegisterProtocolHandlerRequest(QWebEngineRegisterProtocolHandlerRequest) = 0; virtual void runFileSystemAccessRequest(QWebEngineFileSystemAccessRequest) = 0; virtual QWebEngineSettings *webEngineSettings() const = 0; @@ -229,7 +229,6 @@ public: virtual WebContentsAdapter* webContentsAdapter() = 0; virtual void releaseProfile() = 0; virtual void showWebAuthDialog(QWebEngineWebAuthUxRequest *request) = 0; - virtual QWebEnginePermission createFeaturePermissionObject(const QUrl &securityOrigin, QWebEnginePermission::PermissionType permissionType) = 0; }; } // namespace QtWebEngineCore diff --git a/src/core/web_contents_delegate_qt.cpp b/src/core/web_contents_delegate_qt.cpp index 89a0a6582..77ba5ec91 100644 --- a/src/core/web_contents_delegate_qt.cpp +++ b/src/core/web_contents_delegate_qt.cpp @@ -19,6 +19,7 @@ #include "javascript_dialog_manager_qt.h" #include "media_capture_devices_dispatcher.h" #include "native_web_keyboard_event_qt.h" +#include "permission_manager_qt.h" #include "profile_adapter.h" #include "profile_qt.h" #include "qwebengineloadinginfo.h" @@ -418,6 +419,12 @@ void WebContentsDelegateQt::emitLoadCommitted() void WebContentsDelegateQt::DidFinishNavigation(content::NavigationHandle *navigation_handle) { + if (navigation_handle->HasCommitted() && !navigation_handle->IsSameOrigin()) { + PermissionManagerQt *permissionManager = static_cast<PermissionManagerQt *>( + navigation_handle->GetWebContents()->GetBrowserContext()->GetPermissionControllerDelegate()); + permissionManager->onCrossOriginNavigation(navigation_handle->GetRenderFrameHost()); + } + if (!navigation_handle->IsInMainFrame()) return; @@ -731,14 +738,32 @@ void WebContentsDelegateQt::ActivateContents(content::WebContents* contents) void WebContentsDelegateQt::RequestPointerLock(content::WebContents *web_contents, bool user_gesture, bool last_unlocked_by_target) { - Q_UNUSED(user_gesture); - if (last_unlocked_by_target) web_contents->GotResponseToPointerLockRequest(blink::mojom::PointerLockResult::kSuccess); - else - m_viewClient->runMouseLockPermissionRequest(toQt(web_contents->GetLastCommittedURL().DeprecatedGetOriginAsURL())); + else { + PermissionManagerQt *permissionManager = static_cast<PermissionManagerQt *>( + web_contents->GetBrowserContext()->GetPermissionControllerDelegate()); + + auto *rfh = web_contents->GetFocusedFrame(); + if (!rfh) + rfh = web_contents->GetPrimaryMainFrame(); + + permissionManager->RequestPermissions( + rfh, + content::PermissionRequestDescription(blink::PermissionType::POINTER_LOCK, user_gesture, rfh->GetLastCommittedOrigin().GetURL()), + base::BindOnce([](content::WebContents *web_contents, PermissionManagerQt *manager, const std::vector<blink::mojom::PermissionStatus> &status) + { + Q_ASSERT(status.size() == 1); + + web_contents->GotResponseToPointerLockRequest(status[0] == blink::mojom::PermissionStatus::GRANTED + ? blink::mojom::PointerLockResult::kSuccess + : blink::mojom::PointerLockResult::kPermissionDenied); + }, web_contents, permissionManager) + ); + } } + void WebContentsDelegateQt::overrideWebPreferences(content::WebContents *webContents, blink::web_pref::WebPreferences *webPreferences) { WebEngineSettings::get(m_viewClient->webEngineSettings())->overrideWebPreferences(webContents, webPreferences); @@ -773,9 +798,12 @@ void WebContentsDelegateQt::selectClientCert(const QSharedPointer<ClientCertSele m_viewClient->selectClientCert(selectController); } -void WebContentsDelegateQt::requestFeaturePermission(QWebEnginePermission::PermissionType permissionType, const QUrl &requestingOrigin) +void WebContentsDelegateQt::requestFeaturePermission( + QWebEnginePermission::PermissionType permissionType, + const QUrl &requestingOrigin, + const content::GlobalRenderFrameHostToken &frameToken) { - m_viewClient->runFeaturePermissionRequest(permissionType, requestingOrigin); + m_viewClient->runFeaturePermissionRequest(permissionType, requestingOrigin, frameToken.child_id, frameToken.frame_token.ToString()); } extern WebContentsAdapterClient::NavigationType pageTransitionToNavigationType(ui::PageTransition transition); @@ -834,18 +862,22 @@ bool WebContentsDelegateQt::CheckMediaAccessPermission(content::RenderFrameHost blink::mojom::MediaStreamType type) { Q_ASSERT(rfh); + + auto token = rfh->GetGlobalFrameToken(); + std::string serializedToken = token.frame_token.ToString(); + switch (type) { case blink::mojom::MediaStreamType::DEVICE_AUDIO_CAPTURE: return m_viewClient->profileAdapter()->getPermissionState( toQt(security_origin), QWebEnginePermission::PermissionType::MediaAudioCapture, - rfh) + token.child_id, serializedToken) == QWebEnginePermission::State::Granted; case blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE: return m_viewClient->profileAdapter()->getPermissionState( toQt(security_origin), QWebEnginePermission::PermissionType::MediaVideoCapture, - rfh) + token.child_id, serializedToken) == QWebEnginePermission::State::Granted; default: LOG(INFO) << "WebContentsDelegateQt::CheckMediaAccessPermission: " diff --git a/src/core/web_contents_delegate_qt.h b/src/core/web_contents_delegate_qt.h index 099d8280b..383803c4d 100644 --- a/src/core/web_contents_delegate_qt.h +++ b/src/core/web_contents_delegate_qt.h @@ -25,6 +25,7 @@ class ColorChooser; class JavaScriptDialogManager; class WebContents; struct MediaStreamRequest; +struct GlobalRenderFrameHostToken; } namespace QtWebEngineCore { @@ -144,7 +145,7 @@ public: void overrideWebPreferences(content::WebContents *, blink::web_pref::WebPreferences*); void allowCertificateError(const QSharedPointer<CertificateErrorController> &); void selectClientCert(const QSharedPointer<ClientCertSelectController> &); - void requestFeaturePermission(QWebEnginePermission::PermissionType permissionType, const QUrl &requestingOrigin); + void requestFeaturePermission(QWebEnginePermission::PermissionType permissionType, const QUrl &requestingOrigin, const content::GlobalRenderFrameHostToken &frameToken); void launchExternalURL(const QUrl &url, ui::PageTransition page_transition, bool is_main_frame, bool has_user_gesture); FindTextHelper *findTextHelper(); diff --git a/src/core/web_engine_context.cpp b/src/core/web_engine_context.cpp index 72fd4c3a8..0b16c8760 100644 --- a/src/core/web_engine_context.cpp +++ b/src/core/web_engine_context.cpp @@ -1242,7 +1242,7 @@ const char *qWebEngineChromiumVersion() noexcept const char *qWebEngineChromiumSecurityPatchVersion() noexcept { - return "134.0.6998.208"; // FIXME: Remember to update + return "139.0.7258.67"; // FIXME: Remember to update } QT_END_NAMESPACE diff --git a/src/webenginequick/api/qquickwebengineforeigntypes_p.h b/src/webenginequick/api/qquickwebengineforeigntypes_p.h index 58e9a5561..c2892d33c 100644 --- a/src/webenginequick/api/qquickwebengineforeigntypes_p.h +++ b/src/webenginequick/api/qquickwebengineforeigntypes_p.h @@ -33,6 +33,13 @@ #include <QtWebEngineCore/qwebenginefilesystemaccessrequest.h> #include <QtWebEngineCore/qwebenginewebauthuxrequest.h> #include <QtWebEngineCore/qwebenginepermission.h> +#include <QtWebEngineCore/qwebenginedesktopmediarequest.h> +#include <QtWebEngineCore/qwebengineclienthints.h> + +#if QT_CONFIG(webengine_extensions) +#include <QtWebEngineCore/qwebengineextensioninfo.h> +#include <QtWebEngineCore/qwebengineextensionmanager.h> +#endif QT_BEGIN_NAMESPACE @@ -265,6 +272,42 @@ struct ForeignWebEnginePermission QML_UNCREATABLE("") }; +struct ForeignWebEngineDesktopMediaRequest +{ + Q_GADGET + QML_FOREIGN(QWebEngineDesktopMediaRequest) + QML_ANONYMOUS + QML_ADDED_IN_VERSION(6, 10) +}; + +struct ForeignWebEngineClientHints : public QObject +{ + Q_OBJECT + QML_FOREIGN(QWebEngineClientHints) + QML_NAMED_ELEMENT(WebEngineClientHints) + QML_ADDED_IN_VERSION(6, 8) + QML_UNCREATABLE("") +}; + +#if QT_CONFIG(webengine_extensions) +struct ForeignWebEngineExtensionInfo +{ + Q_GADGET + QML_VALUE_TYPE(webEngineExtension) + QML_FOREIGN(QWebEngineExtensionInfo) + QML_ADDED_IN_VERSION(6, 10) +}; + +struct ForeignWebEngineExtensionManager +{ + Q_GADGET + QML_NAMED_ELEMENT(WebEngineExtensionManager) + QML_FOREIGN(QWebEngineExtensionManager) + QML_ADDED_IN_VERSION(6, 10) + QML_UNCREATABLE("") +}; +#endif + QT_END_NAMESPACE #endif // QQUICKWEBENGINEFOREIGNTYPES_H diff --git a/src/webenginequick/api/qquickwebengineprofile.cpp b/src/webenginequick/api/qquickwebengineprofile.cpp index 6aebc18a1..80e4ec5ac 100644 --- a/src/webenginequick/api/qquickwebengineprofile.cpp +++ b/src/webenginequick/api/qquickwebengineprofile.cpp @@ -96,6 +96,9 @@ QT_BEGIN_NAMESPACE \value AllowPersistentCookies Cookies marked persistent are saved to and restored from disk, whereas session cookies are only stored to disk for crash recovery. This is the default setting. + \value OnlyPersistentCookies + Cookies marked persistent are saved to and restored from disk, whereas session cookies + are never stored to disk, even for crash recovery. \value ForcePersistentCookies Both session and persistent cookies are saved to and restored from disk. */ @@ -726,6 +729,9 @@ void QQuickWebEngineProfile::setHttpCacheType(QQuickWebEngineProfile::HttpCacheT Cookies marked persistent are saved to and restored from disk, whereas session cookies are only stored to disk for crash recovery. This is the default value for non off-the-record profile with storageName. + \value WebEngineProfile.OnlyPersistentCookies + Cookies marked persistent are saved to and restored from disk, whereas session cookies + are never stored to disk, even for crash recovery. \value WebEngineProfile.ForcePersistentCookies Both session and persistent cookies are saved to and restored from disk. */ @@ -1223,7 +1229,7 @@ QWebEnginePermission QQuickWebEngineProfile::queryPermission(const QUrl &securit return QWebEnginePermission(new QWebEnginePermissionPrivate()); } - auto *pvt = new QWebEnginePermissionPrivate(securityOrigin, permissionType, nullptr, d->profileAdapter()); + auto *pvt = new QWebEnginePermissionPrivate(securityOrigin, permissionType, d->profileAdapter()); return QWebEnginePermission(pvt); } diff --git a/src/webenginequick/api/qquickwebengineprofile.h b/src/webenginequick/api/qquickwebengineprofile.h index 9a21852ba..0995538be 100644 --- a/src/webenginequick/api/qquickwebengineprofile.h +++ b/src/webenginequick/api/qquickwebengineprofile.h @@ -44,7 +44,7 @@ class Q_WEBENGINEQUICK_EXPORT QQuickWebEngineProfile : public QObject { Q_PROPERTY(bool isPushServiceEnabled READ isPushServiceEnabled WRITE setPushServiceEnabled NOTIFY pushServiceEnabledChanged FINAL REVISION(6,5)) Q_PROPERTY(QWebEngineClientHints *clientHints READ clientHints FINAL REVISION(6,8)) #if QT_CONFIG(webengine_extensions) - Q_PROPERTY(QWebEngineExtensionManager *extensionManager READ extensionManager REVISION(6, 10)) + Q_PROPERTY(QWebEngineExtensionManager *extensionManager READ extensionManager CONSTANT REVISION(6, 10)) #endif QML_NAMED_ELEMENT(WebEngineProfile) QML_ADDED_IN_VERSION(1, 1) @@ -65,7 +65,8 @@ public: enum PersistentCookiesPolicy { NoPersistentCookies, AllowPersistentCookies, - ForcePersistentCookies + ForcePersistentCookies, + OnlyPersistentCookies, }; Q_ENUM(PersistentCookiesPolicy) diff --git a/src/webenginequick/api/qquickwebengineprofileprototype.cpp b/src/webenginequick/api/qquickwebengineprofileprototype.cpp index e6c4b8e99..d32d63ce7 100644 --- a/src/webenginequick/api/qquickwebengineprofileprototype.cpp +++ b/src/webenginequick/api/qquickwebengineprofileprototype.cpp @@ -161,6 +161,9 @@ void QQuickWebEngineProfilePrototype::setHttpCacheType( Cookies marked persistent are saved to and restored from disk, whereas session cookies are only stored to disk for crash recovery. This is the default value for non off-the-record profile with storageName. + \value WebEngineProfile.OnlyPersistentCookies + Cookies marked persistent are saved to and restored from disk, whereas session cookies + are never stored to the disk, even for crash recovery. \value WebEngineProfile.ForcePersistentCookies Both session and persistent cookies are saved to and restored from disk. */ diff --git a/src/webenginequick/api/qquickwebenginescriptcollection.cpp b/src/webenginequick/api/qquickwebenginescriptcollection.cpp index 7a3e894a6..546633fb1 100644 --- a/src/webenginequick/api/qquickwebenginescriptcollection.cpp +++ b/src/webenginequick/api/qquickwebenginescriptcollection.cpp @@ -3,12 +3,10 @@ #include "qquickwebenginescriptcollection_p.h" #include "qquickwebenginescriptcollection_p_p.h" -#include "qwebenginescriptcollection.h" +#include <QtWebEngineCore/qwebenginescriptcollection.h> #include <QtWebEngineCore/private/qwebenginescriptcollection_p.h> #include <QtQml/qqmlinfo.h> -#include <QtQml/private/qqmlengine_p.h> -#include <QtQml/private/qv4scopedvalue_p.h> -#include <QtQml/private/qv4arrayobject_p.h> +#include <QtQml/qqmlengine.h> /*! \qmltype WebEngineScriptCollection @@ -61,7 +59,7 @@ webEngineView.userScripts.insert(list) \endcode \endlist - \sa WebEngineScript WebEngineScriptCollection + \sa webEngineScript WebEngineScriptCollection */ @@ -117,7 +115,7 @@ QQuickWebEngineScriptCollection::QQuickWebEngineScriptCollection(QQuickWebEngine QQuickWebEngineScriptCollection::~QQuickWebEngineScriptCollection() { } /*! - \qmlmethod bool WebEngineScriptCollection::contains(WebEngineScript script) + \qmlmethod bool WebEngineScriptCollection::contains(webEngineScript script) \since QtWebEngine 6.2 Returns \c true if the specified \a script is in the collection, \c false otherwise. @@ -130,7 +128,7 @@ bool QQuickWebEngineScriptCollection::contains(const QWebEngineScript &value) co } /*! - \qmlmethod list<WebEngineScript> WebEngineScriptCollection::find(string name) + \qmlmethod list<webEngineScript> WebEngineScriptCollection::find(string name) \since QtWebEngine 6.2 Returns a list of all user script objects with the given \a name. \sa contains() @@ -141,7 +139,7 @@ QList<QWebEngineScript> QQuickWebEngineScriptCollection::find(const QString &nam } /*! - \qmlmethod void WebEngineScriptCollection::insert(WebEngineScript script) + \qmlmethod void WebEngineScriptCollection::insert(webEngineScript script) \since QtWebEngine 6.2 Inserts a single \a script into the collection. \sa remove() @@ -152,9 +150,9 @@ void QQuickWebEngineScriptCollection::insert(const QWebEngineScript &s) } /*! - \qmlmethod void WebEngineScriptCollection::insert(list<WebEngineScript> list) + \qmlmethod void WebEngineScriptCollection::insert(list<webEngineScript> list) \since QtWebEngine 6.2 - Inserts a \a list of WebEngineScript values into the user script collection. + Inserts a \a list of webEngineScript values into the user script collection. \sa remove() */ void QQuickWebEngineScriptCollection::insert(const QList<QWebEngineScript> &list) @@ -163,7 +161,7 @@ void QQuickWebEngineScriptCollection::insert(const QList<QWebEngineScript> &list } /*! - \qmlmethod bool WebEngineScriptCollection::remove(WebEngineScript script) + \qmlmethod bool WebEngineScriptCollection::remove(webEngineScript script) \since QtWebEngine 6.2 Returns \c true if a given \a script is removed from the collection. \sa insert() @@ -184,11 +182,11 @@ void QQuickWebEngineScriptCollection::clear() } /*! - \qmlproperty list<WebEngineScript> WebEngineScriptCollection::collection + \qmlproperty list<webEngineScript> WebEngineScriptCollection::collection \since QtWebEngine 6.2 This property holds a JavaScript array of user script objects. The array can - take WebEngineScript basic type or a JavaScript dictionary as values. + take webEngineScript basic type or a JavaScript dictionary as values. */ QJSValue QQuickWebEngineScriptCollection::collection() const { @@ -198,15 +196,11 @@ QJSValue QQuickWebEngineScriptCollection::collection() const } const QList<QWebEngineScript> &list = d->toList(); - QV4::ExecutionEngine *v4 = d->m_qmlEngine->handle(); - QV4::Scope scope(v4); - QV4::Scoped<QV4::ArrayObject> scriptArray(scope, v4->newArrayObject(list.size())); - int i = 0; - for (const auto &val : list) { - QV4::ScopedValue sv(scope, v4->fromVariant(QVariant::fromValue(val))); - scriptArray->put(i++, sv); - } - return QJSValuePrivate::fromReturnedValue(scriptArray.asReturnedValue()); + QJSValue scriptArray = d->m_qmlEngine->newArray(list.size()); + uint32_t i = 0; + for (const auto &val : list) + scriptArray.setProperty(i++, d->m_qmlEngine->toScriptValue(val)); + return scriptArray; } void QQuickWebEngineScriptCollection::setCollection(const QJSValue &scripts) diff --git a/src/webenginequick/api/qquickwebengineview.cpp b/src/webenginequick/api/qquickwebengineview.cpp index ade8b451c..619cbaef6 100644 --- a/src/webenginequick/api/qquickwebengineview.cpp +++ b/src/webenginequick/api/qquickwebengineview.cpp @@ -521,22 +521,30 @@ static QQuickWebEngineView::Feature toDeprecatedFeature(QWebEnginePermission::Pe QT_WARNING_POP #endif // QT_DEPRECATED_SINCE(6, 8) -void QQuickWebEngineViewPrivate::runFeaturePermissionRequest(QWebEnginePermission::PermissionType permissionType, const QUrl &securityOrigin) +void QQuickWebEngineViewPrivate::runFeaturePermissionRequest( + QWebEnginePermission::PermissionType permissionType, + const QUrl &securityOrigin, + int childId, const std::string &serializedToken) { Q_Q(QQuickWebEngineView); - if (QWebEnginePermission::isPersistent(permissionType)) { - Q_EMIT q->permissionRequested(createFeaturePermissionObject(securityOrigin, permissionType)); -#if QT_DEPRECATED_SINCE(6, 8) - QT_WARNING_PUSH - QT_WARNING_DISABLE_DEPRECATED - Q_EMIT q->featurePermissionRequested(securityOrigin, toDeprecatedFeature(permissionType)); - QT_WARNING_POP -#endif // QT_DEPRECATED_SINCE(6, 8) + if (permissionType == QWebEnginePermission::PermissionType::MouseLock) { + // Not supported in Qt Quick + auto permission = QWebEnginePermission( + new QWebEnginePermissionPrivate(securityOrigin, permissionType, profileAdapter(), childId, serializedToken)); + permission.deny(); return; } - Q_UNREACHABLE(); + Q_EMIT q->permissionRequested(QWebEnginePermission( + new QWebEnginePermissionPrivate(securityOrigin, permissionType, profileAdapter(), childId, serializedToken))); +#if QT_DEPRECATED_SINCE(6, 8) + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED + Q_EMIT q->featurePermissionRequested(securityOrigin, toDeprecatedFeature(permissionType)); + QT_WARNING_POP +#endif // QT_DEPRECATED_SINCE(6, 8) + return; } void QQuickWebEngineViewPrivate::showColorDialog(QSharedPointer<ColorChooserController> controller) @@ -809,54 +817,6 @@ void QQuickWebEngineViewPrivate::authenticationRequired(QSharedPointer<Authentic ui()->showDialog(controller); } -void QQuickWebEngineViewPrivate::runMediaAccessPermissionRequest(const QUrl &securityOrigin, WebContentsAdapterClient::MediaRequestFlags requestFlags) -{ - Q_Q(QQuickWebEngineView); - if (!requestFlags) - return; - QWebEnginePermission::PermissionType permissionType; - if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - permissionType = QWebEnginePermission::PermissionType::MediaAudioVideoCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) - permissionType = QWebEnginePermission::PermissionType::MediaAudioCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - permissionType = QWebEnginePermission::PermissionType::MediaVideoCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) && - requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - permissionType = QWebEnginePermission::PermissionType::DesktopAudioVideoCapture; - else // if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - permissionType = QWebEnginePermission::PermissionType::DesktopVideoCapture; - Q_EMIT q->permissionRequested(createFeaturePermissionObject(securityOrigin, permissionType)); - -#if QT_DEPRECATED_SINCE(6, 8) - QT_WARNING_PUSH - QT_WARNING_DISABLE_DEPRECATED - QQuickWebEngineView::Feature deprecatedFeature; - - if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture) - && requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - deprecatedFeature = QQuickWebEngineView::MediaAudioVideoCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaAudioCapture)) - deprecatedFeature = QQuickWebEngineView::MediaAudioCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaVideoCapture)) - deprecatedFeature = QQuickWebEngineView::MediaVideoCapture; - else if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopAudioCapture) - && requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - deprecatedFeature = QQuickWebEngineView::DesktopAudioVideoCapture; - else // if (requestFlags.testFlag(WebContentsAdapterClient::MediaDesktopVideoCapture)) - deprecatedFeature = QQuickWebEngineView::DesktopVideoCapture; - - Q_EMIT q->featurePermissionRequested(securityOrigin, deprecatedFeature); - QT_WARNING_POP -#endif // QT_DEPRECATED_SINCE(6, 8) -} - -void QQuickWebEngineViewPrivate::runMouseLockPermissionRequest(const QUrl &securityOrigin) -{ - // TODO: Add mouse lock support - adapter->grantMouseLockPermission(securityOrigin, false); -} - void QQuickWebEngineViewPrivate::runRegisterProtocolHandlerRequest(QWebEngineRegisterProtocolHandlerRequest request) { Q_Q(QQuickWebEngineView); @@ -1523,12 +1483,6 @@ void QQuickWebEngineViewPrivate::showWebAuthDialog(QWebEngineWebAuthUxRequest *r Q_EMIT q->webAuthUxRequested(request); } -QWebEnginePermission QQuickWebEngineViewPrivate::createFeaturePermissionObject(const QUrl &securityOrigin, QWebEnginePermission::PermissionType permissionType) -{ - auto *returnPrivate = new QWebEnginePermissionPrivate(securityOrigin, permissionType, adapter, profileAdapter()); - return QWebEnginePermission(returnPrivate); -} - bool QQuickWebEngineView::isLoading() const { Q_D(const QQuickWebEngineView); diff --git a/src/webenginequick/api/qquickwebengineview_p_p.h b/src/webenginequick/api/qquickwebengineview_p_p.h index d78157597..8fe98145b 100644 --- a/src/webenginequick/api/qquickwebengineview_p_p.h +++ b/src/webenginequick/api/qquickwebengineview_p_p.h @@ -105,8 +105,6 @@ public: bool passOnFocus(bool reverse) override; void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID) override; void authenticationRequired(QSharedPointer<QtWebEngineCore::AuthenticationDialogController>) override; - void runMediaAccessPermissionRequest(const QUrl &securityOrigin, MediaRequestFlags requestFlags) override; - void runMouseLockPermissionRequest(const QUrl &securityOrigin) override; void runRegisterProtocolHandlerRequest(QWebEngineRegisterProtocolHandlerRequest) override; void runFileSystemAccessRequest(QWebEngineFileSystemAccessRequest) override; QObject *accessibilityParentObject() override; @@ -114,7 +112,8 @@ public: void allowCertificateError(const QWebEngineCertificateError &error) override; void selectClientCert(const QSharedPointer<QtWebEngineCore::ClientCertSelectController> &selectController) override; - void runFeaturePermissionRequest(QWebEnginePermission::PermissionType permissionType, const QUrl &securityOrigin) override; + void runFeaturePermissionRequest(QWebEnginePermission::PermissionType permissionType, const QUrl &securityOrigin, + int childId, const std::string &serializedToken) override; void renderProcessTerminated(RenderProcessTerminationStatus terminationStatus, int exitCode) override; void requestGeometryChange(const QRect &geometry, const QRect &frameGeometry) override; void updateScrollPosition(const QPointF &position) override; @@ -139,7 +138,6 @@ public: const QRect &bounds, bool autoselectFirstSuggestion) override; void hideAutofillPopup() override; void showWebAuthDialog(QWebEngineWebAuthUxRequest *request) override; - QWebEnginePermission createFeaturePermissionObject(const QUrl &securityOrigin, QWebEnginePermission::PermissionType permissionType) override; void updateAction(QQuickWebEngineView::WebAction) const; bool adoptWebContents(QtWebEngineCore::WebContentsAdapter *webContents); diff --git a/src/webenginewidgets/api/qtwebenginewidgetsglobal.h b/src/webenginewidgets/api/qtwebenginewidgetsglobal.h index 58b9c7a2b..edf6632ac 100644 --- a/src/webenginewidgets/api/qtwebenginewidgetsglobal.h +++ b/src/webenginewidgets/api/qtwebenginewidgetsglobal.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QTWEBENGINEWIDGETSGLOBAL_H #define QTWEBENGINEWIDGETSGLOBAL_H diff --git a/src/webenginewidgets/api/qwebenginenotificationpresenter.cpp b/src/webenginewidgets/api/qwebenginenotificationpresenter.cpp index 83814fe4a..2adcbf912 100644 --- a/src/webenginewidgets/api/qwebenginenotificationpresenter.cpp +++ b/src/webenginewidgets/api/qwebenginenotificationpresenter.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebenginenotificationpresenter_p.h" diff --git a/src/webenginewidgets/api/qwebenginenotificationpresenter_p.h b/src/webenginewidgets/api/qwebenginenotificationpresenter_p.h index 61e7f9e45..c42c6cc84 100644 --- a/src/webenginewidgets/api/qwebenginenotificationpresenter_p.h +++ b/src/webenginewidgets/api/qwebenginenotificationpresenter_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2017 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINENOTIFICATIONPRESENTER_P_H #define QWEBENGINENOTIFICATIONPRESENTER_P_H diff --git a/src/webenginewidgets/api/qwebengineview.cpp b/src/webenginewidgets/api/qwebengineview.cpp index 53fcc4628..9745654ac 100644 --- a/src/webenginewidgets/api/qwebengineview.cpp +++ b/src/webenginewidgets/api/qwebengineview.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #include "qapplication.h" #include "qwebenginenotificationpresenter_p.h" diff --git a/src/webenginewidgets/api/qwebengineview.h b/src/webenginewidgets/api/qwebengineview.h index 008aaa032..48d82acb1 100644 --- a/src/webenginewidgets/api/qwebengineview.h +++ b/src/webenginewidgets/api/qwebengineview.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #ifndef QWEBENGINEVIEW_H #define QWEBENGINEVIEW_H diff --git a/src/webenginewidgets/api/qwebengineview_p.h b/src/webenginewidgets/api/qwebengineview_p.h index 389bc4a66..27ad6db71 100644 --- a/src/webenginewidgets/api/qwebengineview_p.h +++ b/src/webenginewidgets/api/qwebengineview_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:critical reason:data-parser #ifndef QWEBENGINEVIEW_P_H #define QWEBENGINEVIEW_P_H diff --git a/src/webenginewidgets/plugins/qwebengineview/qwebengineview_plugin.cpp b/src/webenginewidgets/plugins/qwebengineview/qwebengineview_plugin.cpp index 6ba64a178..f018b6d19 100644 --- a/src/webenginewidgets/plugins/qwebengineview/qwebengineview_plugin.cpp +++ b/src/webenginewidgets/plugins/qwebengineview/qwebengineview_plugin.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengineview_plugin.h" diff --git a/src/webenginewidgets/plugins/qwebengineview/qwebengineview_plugin.h b/src/webenginewidgets/plugins/qwebengineview/qwebengineview_plugin.h index a7150151d..6706ab34e 100644 --- a/src/webenginewidgets/plugins/qwebengineview/qwebengineview_plugin.h +++ b/src/webenginewidgets/plugins/qwebengineview/qwebengineview_plugin.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINEVIEW_PLUGIN_H #define QWEBENGINEVIEW_PLUGIN_H diff --git a/src/webenginewidgets/qwebengine_accessible.cpp b/src/webenginewidgets/qwebengine_accessible.cpp index cbdd90104..402a8cf0f 100644 --- a/src/webenginewidgets/qwebengine_accessible.cpp +++ b/src/webenginewidgets/qwebengine_accessible.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "qwebengine_accessible_p.h" diff --git a/src/webenginewidgets/qwebengine_accessible_p.h b/src/webenginewidgets/qwebengine_accessible_p.h index 99604d90d..c95514737 100644 --- a/src/webenginewidgets/qwebengine_accessible_p.h +++ b/src/webenginewidgets/qwebengine_accessible_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef QWEBENGINE_ACCESSIBLE_H #define QWEBENGINE_ACCESSIBLE_H diff --git a/src/webenginewidgets/ui/autofillpopupwidget.cpp b/src/webenginewidgets/ui/autofillpopupwidget.cpp index a4dc31beb..4e463361a 100644 --- a/src/webenginewidgets/ui/autofillpopupwidget.cpp +++ b/src/webenginewidgets/ui/autofillpopupwidget.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "autofillpopupwidget_p.h" #include "qwebengineview.h" diff --git a/src/webenginewidgets/ui/autofillpopupwidget_p.h b/src/webenginewidgets/ui/autofillpopupwidget_p.h index 79decc6ab..d84b34bef 100644 --- a/src/webenginewidgets/ui/autofillpopupwidget_p.h +++ b/src/webenginewidgets/ui/autofillpopupwidget_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef AUTOFILLPOPUPWIDGET_P_H #define AUTOFILLPOPUPWIDGET_P_H diff --git a/src/webenginewidgets/ui/touchhandlewidget.cpp b/src/webenginewidgets/ui/touchhandlewidget.cpp index 88af0ff36..b855e425c 100644 --- a/src/webenginewidgets/ui/touchhandlewidget.cpp +++ b/src/webenginewidgets/ui/touchhandlewidget.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "touchhandlewidget_p.h" #include "qwebengineview.h" diff --git a/src/webenginewidgets/ui/touchhandlewidget_p.h b/src/webenginewidgets/ui/touchhandlewidget_p.h index 9f181c935..9ab8fc9d6 100644 --- a/src/webenginewidgets/ui/touchhandlewidget_p.h +++ b/src/webenginewidgets/ui/touchhandlewidget_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef TOUCHHANDLEWIDGET_P_H #define TOUCHHANDLEWIDGET_P_H diff --git a/src/webenginewidgets/ui/touchselectionmenuwidget.cpp b/src/webenginewidgets/ui/touchselectionmenuwidget.cpp index ff69fe84b..dee65ae0e 100644 --- a/src/webenginewidgets/ui/touchselectionmenuwidget.cpp +++ b/src/webenginewidgets/ui/touchselectionmenuwidget.cpp @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #include "touchselectionmenuwidget_p.h" #include "qwebengineview.h" diff --git a/src/webenginewidgets/ui/touchselectionmenuwidget_p.h b/src/webenginewidgets/ui/touchselectionmenuwidget_p.h index 1f822023b..89216a510 100644 --- a/src/webenginewidgets/ui/touchselectionmenuwidget_p.h +++ b/src/webenginewidgets/ui/touchselectionmenuwidget_p.h @@ -1,5 +1,6 @@ // Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only +// Qt-Security score:significant reason:default #ifndef TOUCHSELECTIONMENUWIDGET_P_H #define TOUCHSELECTIONMENUWIDGET_P_H |