summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.cmake.conf2
-rw-r--r--cmake/QtBuildHelpers.cmake1
-rw-r--r--cmake/QtInternalTargets.cmake5
-rw-r--r--cmake/QtTestHelpers.cmake2
-rw-r--r--cmake/QtToolchainHelpers.cmake4
-rw-r--r--coin/instructions/cmake_run_ctest.yaml11
-rw-r--r--coin/instructions/coin_module_axivion_template_v2.yaml7
-rw-r--r--doc/global/externalsites/external-resources.qdoc215
-rw-r--r--doc/global/externalsites/qt-webpages.qdoc61
-rw-r--r--doc/global/externalsites/rfc.qdoc33
-rw-r--r--src/corelib/Qt6CoreMacros.cmake15
-rw-r--r--src/corelib/animation/qabstractanimation.cpp1
-rw-r--r--src/corelib/configure.cmake1
-rw-r--r--src/corelib/doc/src/external-resources.qdoc5
-rw-r--r--src/corelib/io/qfsfileengine.cpp6
-rw-r--r--src/corelib/io/qwindowspipereader.cpp5
-rw-r--r--src/corelib/itemmodels/qrangemodel_impl.h18
-rw-r--r--src/corelib/itemmodels/qrangemodeladapter.h28
-rw-r--r--src/corelib/itemmodels/qrangemodeladapter.qdoc30
-rw-r--r--src/corelib/kernel/qeventdispatcher_cf.mm1
-rw-r--r--src/corelib/kernel/qpermissions.cpp2
-rw-r--r--src/corelib/kernel/qproperty.cpp20
-rw-r--r--src/corelib/kernel/qtranslator.cpp4
-rw-r--r--src/corelib/serialization/qcborvalue.cpp1
-rw-r--r--src/corelib/serialization/qdatastream.cpp1
-rw-r--r--src/corelib/serialization/qdatastream.h5
-rw-r--r--src/corelib/serialization/qxmlstream.cpp6
-rw-r--r--src/corelib/text/qlocale.cpp1
-rw-r--r--src/corelib/text/qstringconverter.cpp4
-rw-r--r--src/corelib/thread/qreadwritelock.cpp8
-rw-r--r--src/corelib/time/qdatetimeparser.cpp1
-rw-r--r--src/corelib/tools/qeasingcurve.cpp4
-rw-r--r--src/gui/doc/qtgui.qdocconf3
-rw-r--r--src/gui/doc/src/external-resources.qdoc1
-rw-r--r--src/gui/itemmodels/qfileinfogatherer.cpp6
-rw-r--r--src/gui/kernel/qguiapplication.cpp6
-rw-r--r--src/gui/kernel/qplatformintegrationfactory.cpp1
-rw-r--r--src/gui/kernel/qplatformthemefactory.cpp1
-rw-r--r--src/gui/opengl/qopenglfunctions.cpp6
-rw-r--r--src/gui/painting/qpaintengine_raster.cpp1
-rw-r--r--src/gui/painting/qpdf.cpp1
-rw-r--r--src/gui/painting/qstroker.cpp6
-rw-r--r--src/gui/platform/unix/dbusmenu/qdbusplatformmenu.cpp1
-rw-r--r--src/gui/text/qfontengine.cpp7
-rw-r--r--src/gui/text/qtextdocument.cpp5
-rw-r--r--src/gui/text/qtextdocument_p.cpp1
-rw-r--r--src/gui/text/qtexttable.cpp4
-rw-r--r--src/gui/util/qlayoutpolicy.cpp5
-rw-r--r--src/network/access/qbytedatabuffer_p.h2
-rw-r--r--src/network/access/qhttp2connection.cpp77
-rw-r--r--src/network/access/qhttp2connection_p.h24
-rw-r--r--src/plugins/sqldrivers/.cmake.conf2
-rw-r--r--src/plugins/styles/modernwindows/qwindows11style.cpp17
-rw-r--r--src/plugins/styles/modernwindows/qwindows11style_p.h3
-rw-r--r--src/testlib/doc/src/qt-webpages.qdoc4
-rw-r--r--src/tools/androidtestrunner/main.cpp59
-rw-r--r--src/tools/configure.cmake2
-rw-r--r--src/widgets/accessible/qaccessiblecolorwell.cpp5
-rw-r--r--src/widgets/doc/src/external-resources.qdoc6
-rw-r--r--src/widgets/kernel/qtooltip.cpp10
-rw-r--r--src/widgets/styles/qcommonstyle.cpp9
-rw-r--r--src/xml/doc/src/external-resources.qdoc11
-rw-r--r--tests/auto/CMakeLists.txt3
-rw-r--r--tests/auto/cmake/mockplugins/.cmake.conf2
-rw-r--r--tests/auto/cmake/test_generating_cpp_exports/.cmake.conf2
-rw-r--r--tests/auto/cmake/test_static_resources/.cmake.conf2
-rw-r--r--tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp8
-rw-r--r--tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp106
-rw-r--r--tests/auto/network/access/qhttp2connection/tst_qhttp2connection.cpp55
-rw-r--r--tests/auto/tools/rcc/data/legal/rcc_legal.cpp2
-rw-r--r--tests/auto/util/testrunner/CMakeLists.txt14
-rw-r--r--tests/auto/util/testrunner/qt_mock_test-log.xml (renamed from util/testrunner/tests/qt_mock_test-log.xml)0
-rwxr-xr-xtests/auto/util/testrunner/qt_mock_test.py (renamed from util/testrunner/tests/qt_mock_test.py)29
-rwxr-xr-xtests/auto/util/testrunner/tst_qt_testrunner.py (renamed from util/testrunner/tests/tst_testrunner.py)138
-rw-r--r--util/testrunner/README8
-rwxr-xr-xutil/testrunner/qt-testrunner.py34
76 files changed, 619 insertions, 578 deletions
diff --git a/.cmake.conf b/.cmake.conf
index e1e19d2ed2a..09e591bd25b 100644
--- a/.cmake.conf
+++ b/.cmake.conf
@@ -7,7 +7,7 @@ if (NOT DEFINED QT_SUPERBUILD OR DEFINED QT_REPO_MODULE_VERSION)
set(QT_EXTRA_INTERNAL_TARGET_DEFINES "QT_LEAN_HEADERS=1")
endif()
-set(QT_REPO_MODULE_VERSION "6.11.0")
+set(QT_REPO_MODULE_VERSION "6.12.0")
set(QT_REPO_MODULE_PRERELEASE_VERSION_SEGMENT "alpha1")
set(QT_COPYRIGHT "Copyright (C) The Qt Company Ltd. and other contributors.")
diff --git a/cmake/QtBuildHelpers.cmake b/cmake/QtBuildHelpers.cmake
index 91983636712..3ef292b27bc 100644
--- a/cmake/QtBuildHelpers.cmake
+++ b/cmake/QtBuildHelpers.cmake
@@ -6,6 +6,7 @@ function(qt_internal_validate_cmake_generator)
if(NOT warning_shown
AND NOT CMAKE_GENERATOR MATCHES "Ninja"
+ AND NOT (IOS AND QT_INTERNAL_IS_STANDALONE_TEST)
AND NOT QT_SILENCE_CMAKE_GENERATOR_WARNING
AND NOT DEFINED ENV{QT_SILENCE_CMAKE_GENERATOR_WARNING})
set_property(GLOBAL PROPERTY _qt_validate_cmake_generator_warning_shown TRUE)
diff --git a/cmake/QtInternalTargets.cmake b/cmake/QtInternalTargets.cmake
index 45e75d4836f..f0d7d06fb84 100644
--- a/cmake/QtInternalTargets.cmake
+++ b/cmake/QtInternalTargets.cmake
@@ -385,7 +385,10 @@ if(QT_FEATURE_stdlib_libcpp)
target_compile_definitions(PlatformCommonInternal INTERFACE _LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
endif()
-if(QT_USE_CCACHE AND CLANG AND BUILD_WITH_PCH)
+if((QT_USE_CCACHE
+ OR (CMAKE_CXX_COMPILER_LAUNCHER MATCHES "^(.*[/\\])?sccache$"))
+ AND CLANG
+ AND BUILD_WITH_PCH)
# The ccache man page says we must compile with -fno-pch-timestamp when using clang and pch.
foreach(language IN ITEMS C CXX OBJC OBJCXX)
target_compile_options(PlatformCommonInternal INTERFACE
diff --git a/cmake/QtTestHelpers.cmake b/cmake/QtTestHelpers.cmake
index 06228ac41de..781bdf4143a 100644
--- a/cmake/QtTestHelpers.cmake
+++ b/cmake/QtTestHelpers.cmake
@@ -1240,7 +1240,7 @@ function(qt_internal_add_test_finalizers target)
# specific platforms.
# TODO: Remove once we confirm that the new way of running test finalizers for all platforms
# doesn't cause any issues.
- if(QT_INTERNAL_SKIP_TEST_FINALIZERS_V2)
+ if(NOT QT_INTERNAL_SKIP_TEST_FINALIZERS_V2)
return()
endif()
diff --git a/cmake/QtToolchainHelpers.cmake b/cmake/QtToolchainHelpers.cmake
index 348a3c25603..b2a5575f130 100644
--- a/cmake/QtToolchainHelpers.cmake
+++ b/cmake/QtToolchainHelpers.cmake
@@ -183,6 +183,7 @@ endif()")
list(LENGTH CMAKE_OSX_ARCHITECTURES _qt_osx_architectures_count)
if(cmake_sysroot_name AND (MACOS OR (UIKIT AND NOT _qt_osx_architectures_count GREATER 1)))
list(APPEND init_platform "
+set(__qt_initial_apple_sdk \"${QT_APPLE_SDK}\")
if(NOT DEFINED CMAKE_OSX_SYSROOT)
set(CMAKE_OSX_SYSROOT \"${cmake_sysroot_name}\" CACHE STRING \"\")
endif()")
@@ -254,7 +255,8 @@ endif()")
qt_internal_get_first_osx_arch(osx_first_arch)
list(APPEND init_platform
"if((NOT CMAKE_GENERATOR STREQUAL \"Xcode\" AND NOT __qt_toolchain_building_qt_repo)
- OR (CMAKE_GENERATOR STREQUAL \"Xcode\" AND __qt_apple_sdk AND NOT QT_NO_SET_OSX_ARCHITECTURES))")
+ OR (CMAKE_GENERATOR STREQUAL \"Xcode\" AND __qt_initial_apple_sdk
+ AND NOT QT_NO_SET_OSX_ARCHITECTURES))")
list(APPEND init_platform
" set(CMAKE_OSX_ARCHITECTURES \"${osx_first_arch}\" CACHE STRING \"\")")
list(APPEND init_platform "endif()")
diff --git a/coin/instructions/cmake_run_ctest.yaml b/coin/instructions/cmake_run_ctest.yaml
index 43963fc172b..03312101117 100644
--- a/coin/instructions/cmake_run_ctest.yaml
+++ b/coin/instructions/cmake_run_ctest.yaml
@@ -92,19 +92,10 @@ instructions:
variableName: CTEST_ARGS
variableValue: " --no-label-summary"
- # Enable CTest's JUnit XML summary
+ # Enable CTest's JUnit XML summary, supported in CMake >= v3.21
- type: AppendToEnvironmentVariable
variableName: CTEST_ARGS
variableValue: " --output-junit {{.Env.COIN_CTEST_RESULTSDIR}}{{.Env.CI_PATH_SEP}}test_summary.ctest_junit_xml"
- disable_if: # CMake < v3.21 does not support it
- condition: and
- conditions:
- - condition: runtime
- env_var: CMAKE_MIN_SUPPORTED_BIN_PATH
- not_equals_value: null
- - condition: runtime
- env_var: PATH
- contains_value: "{{.Env.CMAKE_MIN_SUPPORTED_BIN_PATH}}"
- !include "{{qt/qtbase}}/coin_module_test_android_start_emulator.yaml"
diff --git a/coin/instructions/coin_module_axivion_template_v2.yaml b/coin/instructions/coin_module_axivion_template_v2.yaml
index 90d57de281c..9840d1138b6 100644
--- a/coin/instructions/coin_module_axivion_template_v2.yaml
+++ b/coin/instructions/coin_module_axivion_template_v2.yaml
@@ -16,6 +16,13 @@ analysis_instructions_axivion: &analysis_instructions_axivion
condition: runtime
env_var: TESTED_MODULE_COIN
not_equals_value: "qtbase"
+ - type: EnvironmentVariable
+ variableName: TESTED_MODULE_BRANCH_COIN
+ variableValue: "unknown"
+ enable_if:
+ condition: runtime
+ env_var: TESTED_MODULE_BRANCH_COIN
+ equals_value: null
- type: Group
instructions:
- type: Rename
diff --git a/doc/global/externalsites/external-resources.qdoc b/doc/global/externalsites/external-resources.qdoc
index 7a04cca52ce..8670305b00c 100644
--- a/doc/global/externalsites/external-resources.qdoc
+++ b/doc/global/externalsites/external-resources.qdoc
@@ -58,68 +58,27 @@
*/
/*!
- \externalpage https://www.freedesktop.org/wiki/Standards/xembed-spec/
- \title XEmbed Specification
-*/
-
-/*!
- \externalpage https://www.freedesktop.org/wiki/Standards/icon-theme-spec/
- \title Icon Themes Specification
-*/
-
-/*!
\externalpage https://www.cups.org/
\title Common Unix Printing System (CUPS)
\keyword CUPS
*/
/*!
- \externalpage https://www.freedesktop.org/wiki/Specifications/desktop-entry-spec/
- \title Desktop Entry Specification
-*/
-
-/*!
- \externalpage https://kde.org/
- \title The K Desktop Environment
- \keyword KDE
-*/
-
-/*!
\externalpage https://cmake.org/cmake/help/latest/
\title CMake Documentation
*/
/*!
- \externalpage https://cmake.org/cmake/help/latest/command/find_package.html
- \title CMake find_package Documentation
-*/
-
-/*!
\externalpage https://cmake.org/cmake/help/latest/manual/cmake-qt.7.html#automoc
\title CMake AUTOMOC Documentation
*/
/*!
- \externalpage https://cmake.org/cmake/help/latest/manual/cmake-qt.7.html#autorcc
- \title CMake AUTORCC Documentation
-*/
-
-/*!
\externalpage https://cmake.org/cmake/help/latest/manual/cmake-qt.7.html#autouic
\title CMake AUTOUIC Documentation
*/
/*!
- \externalpage https://cmake.org/cmake/help/latest/prop_tgt/LOCATION.html
- \title CMake LOCATION Documentation
-*/
-
-/*!
- \externalpage https://cmake.org/cmake/help/latest/prop_tgt/POSITION_INDEPENDENT_CODE.html
- \title CMake POSITION_INDEPENDENT_CODE Documentation
-*/
-
-/*!
\externalpage https://cmake.org/cmake/help/latest/command/target_link_libraries.html
\title CMake target_link_libraries Documentation
*/
@@ -130,50 +89,11 @@
*/
/*!
- \externalpage https://conan.io/
- \title Conan
-*/
-
-/*!
\externalpage https://www.gnome.org/
\title GNOME
*/
/*!
- \externalpage https://www.gnu.org/software/emacs/
- \title GNU Emacs
-*/
-
-/*!
- \externalpage https://gnuwin32.sourceforge.net/packages.html
- \title GnuWin32 Project
-*/
-
-/*!
- \externalpage https://www.w3.org/Graphics/SVG/About.html
- \title About SVG
- \keyword Scalable Vector Graphics
-*/
-
-/*!
- \externalpage https://www.w3.org/TR/SVG/types.html#ColorKeywords
- \title SVG color keyword names
-*/
-
-/*!
- \externalpage https://www.w3.org/Graphics/SVG/
- \title SVG Working Group
-*/
-
-/*!
- \externalpage https://www.w3.org/TR/SVGMobile/
- \title Mobile SVG Profiles
- \omit
- Mobile SVG Profiles: SVG Tiny and SVG Basic
- \endomit
-*/
-
-/*!
\externalpage https://www.w3.org/TR/SVGMobile12/
\title SVG 1.2 Tiny
*/
@@ -186,36 +106,16 @@
/*!
- \externalpage https://jmeubank.github.io/tdm-gcc/
- \title TDM-GCC
-*/
-
-/*!
\externalpage https://www.dependencywalker.com/
\title Dependency Walker
*/
/*!
- \externalpage https://webkit.org/
- \title WebKit Open Source Project
-*/
-
-/*!
- \externalpage https://www.informit.com/store/c-plus-plus-gui-programming-with-qt4-9780132354165
- \title C++ GUI Programming with Qt 4, 2nd Edition
-*/
-
-/*!
\externalpage https://www.openssl.org/
\title OpenSSL Toolkit
*/
/*!
- \externalpage https://www.activestate.com/platform/supported-languages/perl/
- \title ActivePerl
-*/
-
-/*!
\externalpage https://chromium.googlesource.com/angle/angle/+/master/README.md
\title ANGLE
*/
@@ -226,16 +126,6 @@
*/
/*!
- \externalpage https://www.w3.org/TR/html401/
- \title HTML 4
-*/
-
-/*!
- \externalpage https://html.spec.whatwg.org/multipage/
- \title HTML 5
-*/
-
-/*!
\externalpage https://icu.unicode.org/
\title ICU
*/
@@ -251,41 +141,16 @@
*/
/*!
- \externalpage https://pyxml.sourceforge.net/topics/xbel/
- \title XML Bookmark Exchange Language Resource Page
-*/
-
-/*!
- \externalpage https://www.w3.org/TR/xquery/#errors
- \title error handling in the XQuery language
-*/
-
-/*!
\externalpage https://xaos-project.github.io/
\title XaoS
*/
/*!
- \externalpage https://www.unixodbc.org
- \title https://www.unixodbc.org
-*/
-
-/*!
\externalpage https://www.postgresql.org
\title https://www.postgresql.org
*/
/*!
- \externalpage https://www.postgresql.org/docs/current/installation-platform-notes.html
- \title PostgreSQL MinGW/Native Windows
-*/
-
-/*!
- \externalpage https://www.freetds.org
- \title https://www.freetds.org
-*/
-
-/*!
\externalpage https://www.sqlite.org
\title https://www.sqlite.org
*/
@@ -301,11 +166,6 @@
*/
/*!
- \externalpage https://tldp.org/HOWTO/Framebuffer-HOWTO.html
- \title Framebuffer HOWTO
-*/
-
-/*!
\externalpage https://www.w3.org/TR/scxml/
\title State Chart XML: State Machine Notation for Control Abstraction
*/
@@ -321,71 +181,21 @@
*/
/*!
- \externalpage https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
- \title GNU Lesser General Public License, version 2.1
-*/
-
-/*!
- \externalpage https://www.qtcentre.org
- \title Qt Centre
-*/
-
-/*!
\externalpage https://kde.org
\title KDE
*/
/*!
- \externalpage https://cplusplus.com/reference/cstring/memcpy/
- \title C++ Reference - memcpy
-*/
-
-/*!
\externalpage https://en.cppreference.com/w/cpp/symbol_index/chrono_literals.html
\title chrono_literals Symbol Index
*/
/*!
- \externalpage https://www.w3.org/TR/CSS2/selector.html
- \title Standard CSS2 selector
-*/
-
-/*!
- \externalpage https://www.w3.org/XML/Core/#Publications
- \title W3C XML specifications
-*/
-
-/*!
- \externalpage https://www.w3.org/XML/Schema
- \title XML Schema
-*/
-
-/*!
- \externalpage https://opensource.org/license/bsd-3-clause
- \title New and Modified BSD Licenses
-*/
-
-/*!
- \externalpage https://ecma-international.org/publications-and-standards/standards/ecma-262/
- \title ECMAScript Language Specification
-*/
-
-/*!
\externalpage https://developer.mozilla.org/en-US/docs/Web/JavaScript
\title JavaScript Resources
*/
/*!
- \externalpage https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
- \title JavaScript Guide
-*/
-
-/*!
- \externalpage https://developer.mozilla.org/en-US/docs/Web/JavaScript
- \title About JavaScript
-*/
-
-/*!
\externalpage https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#keywords
\title JavaScript Reserved Words
*/
@@ -406,41 +216,16 @@
*/
/*!
- \externalpage https://registry.khronos.org/OpenGL/index_gl.php
- \title OpenGL Registry
-*/
-
-/*!
- \externalpage https://registry.khronos.org/OpenGL/index_es.php
- \title Khronos OpenGL ES API Registry
-*/
-
-/*!
\externalpage https://www.khronos.org/opengl/wiki/Array_Texture
\title Array Texture
*/
/*!
- \externalpage https://github.com/iksaif/qsslkey-p11
- \title qsslkey example
-*/
-
-/*!
\externalpage https://www.w3.org/TR/2009/WD-webdatabase-20091029/
\title HTML5 Web Database API
*/
/*!
- \externalpage https://lldb.llvm.org/
- \title The LLDB Debugger
-*/
-
-/*!
- \externalpage https://account.qt.io/s/
- \title Qt Account Sign-up
-*/
-
-/*!
\externalpage https://facebook.github.io/zstd/
\title Zstandard Site
*/
diff --git a/doc/global/externalsites/qt-webpages.qdoc b/doc/global/externalsites/qt-webpages.qdoc
index 7b659fa5295..6cbf5f377b6 100644
--- a/doc/global/externalsites/qt-webpages.qdoc
+++ b/doc/global/externalsites/qt-webpages.qdoc
@@ -17,76 +17,15 @@
\title The Qt Company
*/
/*!
- \externalpage http://qt.io/licensing/
- \title Qt Licensing Overview
-*/
-/*!
- \externalpage http://doc.qt.io/archives/qq/
- \title Qt Quarterly
-*/
-/*!
- \externalpage http://doc.qt.io/archives/qq/qq19-plurals.html
- \title Qt Quarterly: Plural Form in Translation
-*/
-/*!
\externalpage https://code.qt.io/
\title Public Qt Repository
*/
/*!
- \externalpage https://code.qt.io/cgit/%7bnon-gerrit%7d/qt-labs/qtestlib-tools.git/
- \title qtestlib-tools
-*/
-
-/*!
- \externalpage http://wiki.qt.io/Qt_Coding_Style
- \title Qt Coding Style
-*/
-/*!
- \externalpage http://doc.qt.io/archives/qt-eclipse-1.6/index.html
- \title Eclipse Plugin
-*/
-/*!
- \externalpage http://doc.qt.io/archives/qq/qq11-events.html
- \title Qt Quarterly: Another Look at Events
-*/
-/*!
- \externalpage https://www.youtube.com/watch?v=P4kv-AoAJ-Q
- \title Livecoding video effects with Qt5
-*/
-/*!
- \externalpage http://blog.qt.io/2012/02/29/pimp-my-video-shader-effects-and-multimedia/
- \title Pimp my video
-*/
-/*!
- \externalpage http://wiki.qt.io/QtMediaHub
- \title QtMediaHub
-*/
-/*!
- \externalpage http://wiki.qt.io/Qt_RaspberryPi
- \title QtonPi
-*/
-
-/*!
- \externalpage http://wiki.qt.io/jom
- \title jom
-*/
-
-/*!
- \externalpage http://doc.qt.io/qt-4.8
- \title Qt 4.8 Reference Documentation
-*/
-
-/*!
\externalpage http://wiki.qt.io/Qt_Localization
\title external: Translating Qt Into Other Languages
*/
/*!
- \externalpage http://wiki.qt.io/Qt_Multimedia_Backends
- \title Qt Multimedia Backends
-*/
-
-/*!
\externalpage https://doc.qt.io/qt3dstudio/index.html
\title Qt 3D Studio Manual
*/
diff --git a/doc/global/externalsites/rfc.qdoc b/doc/global/externalsites/rfc.qdoc
index d0c127fb41e..071977b9a0e 100644
--- a/doc/global/externalsites/rfc.qdoc
+++ b/doc/global/externalsites/rfc.qdoc
@@ -12,12 +12,6 @@
*/
/*!
- \externalpage https://datatracker.ietf.org/doc/html/rfc1179
- \title RFC 1179
- \keyword lpr
-*/
-
-/*!
\externalpage https://datatracker.ietf.org/doc/html/rfc1738
\title RFC 1738
*/
@@ -28,43 +22,16 @@
*/
/*!
- \externalpage https://datatracker.ietf.org/doc/html/rfc1928
- \title RFC 1928
-*/
-
-/*!
- \externalpage https://datatracker.ietf.org/doc/html/rfc1929
- \title RFC 1929
-*/
-
-/*!
\externalpage https://datatracker.ietf.org/doc/html/rfc2045
\title RFC 2045
*/
/*!
- \externalpage https://datatracker.ietf.org/doc/html/rfc2109
- \title RFC 2109
- HTTP State Management Mechanism
-*/
-
-/*!
\externalpage https://datatracker.ietf.org/doc/html/rfc2822
\title RFC 2822
*/
/*!
- \externalpage https://datatracker.ietf.org/doc/html/rfc2965
- \title RFC 2965
- HTTP State Management Mechanism
-*/
-
-/*!
- \externalpage https://datatracker.ietf.org/doc/html/rfc3174
- \title RFC 3174
-*/
-
-/*!
\externalpage https://datatracker.ietf.org/doc/html/rfc3491
\title RFC 3491
*/
diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake
index b69d0285de2..c1f9aee0180 100644
--- a/src/corelib/Qt6CoreMacros.cmake
+++ b/src/corelib/Qt6CoreMacros.cmake
@@ -3677,21 +3677,6 @@ macro(qt6_standard_project_setup)
if(NOT DEFINED QT_I18N_SOURCE_LANGUAGE)
set(QT_I18N_SOURCE_LANGUAGE ${__qt_sps_arg_I18N_SOURCE_LANGUAGE})
endif()
-
- if(CMAKE_GENERATOR STREQUAL "Xcode")
- # Ensure we always use device SDK for Xcode for single-arch Qt builds
- set(qt_osx_arch_count 0)
- if(QT_OSX_ARCHITECTURES)
- list(LENGTH QT_OSX_ARCHITECTURES qt_osx_arch_count)
- endif()
- if(NOT qt_osx_arch_count GREATER 1 AND "${CMAKE_OSX_SYSROOT}" MATCHES "^[a-z]+simulator$")
- # Xcode expects the base SDK to be the device SDK
- set(simulator_sysroot "${CMAKE_OSX_SYSROOT}")
- string(REGEX REPLACE "simulator" "os" CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT}")
- set(CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT}" CACHE STRING "" FORCE)
- set(CMAKE_XCODE_ATTRIBUTE_SUPPORTED_PLATFORMS "${simulator_sysroot}")
- endif()
- endif()
endif()
endmacro()
diff --git a/src/corelib/animation/qabstractanimation.cpp b/src/corelib/animation/qabstractanimation.cpp
index c3e1ba4010f..8a343b15eeb 100644
--- a/src/corelib/animation/qabstractanimation.cpp
+++ b/src/corelib/animation/qabstractanimation.cpp
@@ -858,6 +858,7 @@ qint64 QAnimationDriver::elapsed() const
*/
/*!
+ \internal
The default animation driver just spins the timer...
*/
QDefaultAnimationDriver::QDefaultAnimationDriver(QUnifiedTimer *timer)
diff --git a/src/corelib/configure.cmake b/src/corelib/configure.cmake
index 4386b907c13..90a0e359c9f 100644
--- a/src/corelib/configure.cmake
+++ b/src/corelib/configure.cmake
@@ -1278,7 +1278,6 @@ qt_feature("permissions" PUBLIC
)
qt_feature("openssl-hash" PRIVATE
LABEL "OpenSSL based cryptographic hash"
- AUTODETECT OFF
CONDITION QT_FEATURE_openssl_linked AND QT_FEATURE_opensslv30
PURPOSE "Uses OpenSSL based implementation of cryptographic hash algorithms."
)
diff --git a/src/corelib/doc/src/external-resources.qdoc b/src/corelib/doc/src/external-resources.qdoc
index 2232b49bf23..5d357c65496 100644
--- a/src/corelib/doc/src/external-resources.qdoc
+++ b/src/corelib/doc/src/external-resources.qdoc
@@ -28,11 +28,6 @@
*/
/*!
- \externalpage https://marcmutz.wordpress.com/effective-qt/containers/#containers-qlist
- \title Pros and Cons of Using QList
-*/
-
-/*!
\externalpage https://marcmutz.wordpress.com/effective-qt/containers/
\title Understand the Qt Containers
*/
diff --git a/src/corelib/io/qfsfileengine.cpp b/src/corelib/io/qfsfileengine.cpp
index 0771c15584b..d3c398f0860 100644
--- a/src/corelib/io/qfsfileengine.cpp
+++ b/src/corelib/io/qfsfileengine.cpp
@@ -249,6 +249,12 @@ bool QFSFileEngine::open(QIODevice::OpenMode openMode, FILE *fh, QFile::FileHand
}
/*!
+ \class QFSFileEnginePrivate
+ \inmodule QtCore
+ \internal
+*/
+
+/*!
Opens the file handle \a fh using the open mode \a flags.
*/
bool QFSFileEnginePrivate::openFh(QIODevice::OpenMode openMode, FILE *fh)
diff --git a/src/corelib/io/qwindowspipereader.cpp b/src/corelib/io/qwindowspipereader.cpp
index 456a209af37..6edf4395887 100644
--- a/src/corelib/io/qwindowspipereader.cpp
+++ b/src/corelib/io/qwindowspipereader.cpp
@@ -14,6 +14,11 @@ using namespace Qt::StringLiterals;
static const DWORD minReadBufferSize = 4096;
+/*!
+ \class QWindowsPipeReader
+ \inmodule QtCore
+ \internal
+*/
QWindowsPipeReader::QWindowsPipeReader(QObject *parent)
: QObject(parent),
handle(INVALID_HANDLE_VALUE),
diff --git a/src/corelib/itemmodels/qrangemodel_impl.h b/src/corelib/itemmodels/qrangemodel_impl.h
index f6b08099fe7..7eca3094a66 100644
--- a/src/corelib/itemmodels/qrangemodel_impl.h
+++ b/src/corelib/itemmodels/qrangemodel_impl.h
@@ -239,17 +239,15 @@ namespace QRangeModelDetails
: std::true_type
{};
- // we use std::rotate in moveRows/Columns, which requires std::swap and the
- // iterators to be at least a forward iterator
- template <typename It, typename = void>
- struct test_rotate : std::false_type {};
-
+ // we use std::rotate in moveRows/Columns, which requires the values (which
+ // might be const if we only get a const iterator) to be swappable, and the
+ // iterator type to be at least a forward iterator
template <typename It>
- struct test_rotate<It, std::void_t<decltype(std::swap(*std::declval<It>(),
- *std::declval<It>()))>>
- : std::is_base_of<std::forward_iterator_tag,
- typename std::iterator_traits<It>::iterator_category>
- {};
+ using test_rotate = std::conjunction<
+ std::is_swappable<decltype(*std::declval<It>())>,
+ std::is_base_of<std::forward_iterator_tag,
+ typename std::iterator_traits<It>::iterator_category>
+ >;
template <typename C, typename = void>
struct test_splice : std::false_type {};
diff --git a/src/corelib/itemmodels/qrangemodeladapter.h b/src/corelib/itemmodels/qrangemodeladapter.h
index 2a23e01eba2..0234c402248 100644
--- a/src/corelib/itemmodels/qrangemodeladapter.h
+++ b/src/corelib/itemmodels/qrangemodeladapter.h
@@ -19,13 +19,11 @@ class QT_TECH_PREVIEW_API QRangeModelAdapter
#ifdef Q_QDOC
using range_type = Range;
- using const_row_reference = typename std::iterator_traits<Range>::const_reference;
- using row_reference = typename std::iterator_traits<Range>::reference;
#else
using range_type = QRangeModelDetails::wrapped_t<Range>;
+#endif
using const_row_reference = typename Impl::const_row_reference;
using row_reference = typename Impl::row_reference;
-#endif
using range_features = typename QRangeModelDetails::range_traits<range_type>;
using row_type = std::remove_reference_t<row_reference>;
using row_features = QRangeModelDetails::range_traits<typename Impl::wrapped_row_type>;
@@ -78,16 +76,22 @@ class QT_TECH_PREVIEW_API QRangeModelAdapter
template <typename C>
using if_compatible_row_range = std::enable_if_t<is_compatible_row_range<C>, bool>;
template <typename Data>
- static constexpr bool is_compatible_data = true;
- // std::is_convertible_v<Data, decltype(*std::begin(std::declval<const_row_reference>()))>;
+ static constexpr bool is_compatible_data = std::is_convertible_v<Data, data_type>;
template <typename Data>
using if_compatible_data = std::enable_if_t<is_compatible_data<Data>, bool>;
template <typename C>
static constexpr bool is_compatible_data_range = is_compatible_data<
+ typename QRangeModelDetails::data_type<
+ typename QRangeModelDetails::row_traits<
decltype(*std::begin(std::declval<C&>()))
- >;
+ >::item_type
+ >::type
+ >;
+ template <typename C>
+ using if_compatible_column_data = std::enable_if_t<is_compatible_data<C>
+ || is_compatible_data_range<C>, bool>;
template <typename C>
- using if_compatible_data_range = std::enable_if_t<is_compatible_data_range<C>, bool>;
+ using if_compatible_column_range = std::enable_if_t<is_compatible_data_range<C>, bool>;
template <typename R>
using if_assignable_range = std::enable_if_t<std::is_assignable_v<range_type, R>, bool>;
@@ -1262,12 +1266,12 @@ public:
decltype(auto) operator[](int row) const { return at(row); }
template <typename I = Impl, if_table<I> = true, if_writable<I> = true>
- decltype(auto) at(int row)
+ auto at(int row)
{
return RowReference{index(row, 0), this};
}
template <typename I = Impl, if_table<I> = true, if_writable<I> = true>
- decltype(auto) operator[](int row) { return at(row); }
+ auto operator[](int row) { return at(row); }
// at/operator[int, int] for table: returns value at row/column
template <typename I = Impl, unless_list<I> = true>
@@ -1445,15 +1449,15 @@ public:
return storage.m_model->insertColumn(before);
}
- template <typename D = row_type, typename I = Impl,
- if_canInsertColumns<I> = true, if_compatible_data<D> = true>
+ template <typename D, typename I = Impl,
+ if_canInsertColumns<I> = true, if_compatible_column_data<D> = true>
bool insertColumn(int before, D &&data)
{
return insertColumnImpl(before, storage.root(), std::forward<D>(data));
}
template <typename C, typename I = Impl,
- if_canInsertColumns<I> = true, if_compatible_data_range<C> = true>
+ if_canInsertColumns<I> = true, if_compatible_column_range<C> = true>
bool insertColumns(int before, C &&data)
{
return insertColumnsImpl(before, storage.root(), std::forward<C>(data));
diff --git a/src/corelib/itemmodels/qrangemodeladapter.qdoc b/src/corelib/itemmodels/qrangemodeladapter.qdoc
index ff595529d34..88872589299 100644
--- a/src/corelib/itemmodels/qrangemodeladapter.qdoc
+++ b/src/corelib/itemmodels/qrangemodeladapter.qdoc
@@ -277,14 +277,6 @@
*/
/*!
- \typedef QRangeModelAdapter::const_row_reference
-*/
-
-/*!
- \typedef QRangeModelAdapter::row_reference
-*/
-
-/*!
\typedef QRangeModelAdapter::range_type
*/
@@ -531,8 +523,8 @@
*/
/*!
- \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I>> QRangeModelAdapter<Range, Protocol, Model>::const_row_reference QRangeModelAdapter<Range, Protocol, Model>::at(int row) const
- \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I>> QRangeModelAdapter<Range, Protocol, Model>::const_row_reference QRangeModelAdapter<Range, Protocol, Model>::operator[](int row) const
+ \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I>> decltype(auto) QRangeModelAdapter<Range, Protocol, Model>::at(int row) const
+ \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::unless_list<I>> decltype(auto) QRangeModelAdapter<Range, Protocol, Model>::operator[](int row) const
\return a constant reference to the row at \a row, as stored in \c Range.
@@ -540,8 +532,8 @@
*/
/*!
- \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_table<I>, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I>> QRangeModelAdapter<Range, Protocol, Model>::row_reference QRangeModelAdapter<Range, Protocol, Model>::at(int row)
- \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_table<I>, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I>> QRangeModelAdapter<Range, Protocol, Model>::row_reference QRangeModelAdapter<Range, Protocol, Model>::operator[](int row)
+ \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_table<I>, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I>> auto QRangeModelAdapter<Range, Protocol, Model>::at(int row)
+ \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_table<I>, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I>> auto QRangeModelAdapter<Range, Protocol, Model>::operator[](int row)
\return a mutable reference to the row at \a row, as stored in \c Range.
@@ -597,6 +589,16 @@
*/
/*!
+ \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I>> decltype(auto) QRangeModelAdapter<Range, Protocol, Model>::at(QSpan<const int> path) const
+ \fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I>> decltype(auto) QRangeModelAdapter<Range, Protocol, Model>::operator[](QSpan<const int> path) const
+
+ \return a constant reference to the row specified by \a path, as stored in
+ \c Range.
+
+ \constraints \c Range is a tree.
+*/
+
+/*!
\fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I>, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I>> auto QRangeModelAdapter<Range, Protocol, Model>::at(QSpan<const int> path)
\fn template <typename Range, typename Protocol, typename Model> template <typename I, QRangeModelAdapter<Range, Protocol, Model>::if_tree<I>, QRangeModelAdapter<Range, Protocol, Model>::if_writable<I>> auto QRangeModelAdapter<Range, Protocol, Model>::operator[](QSpan<const int> path)
@@ -833,7 +835,7 @@
*/
/*!
- \fn template <typename Range, typename Protocol, typename Model> template <typename D, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertColumns<I>, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_data<D>> bool QRangeModelAdapter<Range, Protocol, Model>::insertColumn(int before, D &&data)
+ \fn template <typename Range, typename Protocol, typename Model> template <typename D, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertColumns<I>, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_column_data<D>> bool QRangeModelAdapter<Range, Protocol, Model>::insertColumn(int before, D &&data)
\overload
Inserts a single column constructed from \a data before the column specified
@@ -861,7 +863,7 @@
*/
/*!
- \fn template <typename Range, typename Protocol, typename Model> template <typename C, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertColumns<I>, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_data_range<C>> bool QRangeModelAdapter<Range, Protocol, Model>::insertColumns(int before, C &&data)
+ \fn template <typename Range, typename Protocol, typename Model> template <typename C, typename I, QRangeModelAdapter<Range, Protocol, Model>::if_canInsertColumns<I>, QRangeModelAdapter<Range, Protocol, Model>::if_compatible_column_range<C>> bool QRangeModelAdapter<Range, Protocol, Model>::insertColumns(int before, C &&data)
Inserts columns constructed from the elements in \a data before the column
specified by \a before into all rows, and returns whether the insertion was
diff --git a/src/corelib/kernel/qeventdispatcher_cf.mm b/src/corelib/kernel/qeventdispatcher_cf.mm
index 2dddf147f85..d57c057a21a 100644
--- a/src/corelib/kernel/qeventdispatcher_cf.mm
+++ b/src/corelib/kernel/qeventdispatcher_cf.mm
@@ -207,6 +207,7 @@ QEventLoop *QEventDispatcherCoreFoundation::currentEventLoop() const
}
/*!
+ \internal
Processes all pending events that match \a flags until there are no
more events to process. Returns \c true if pending events were handled;
otherwise returns \c false.
diff --git a/src/corelib/kernel/qpermissions.cpp b/src/corelib/kernel/qpermissions.cpp
index 6767917e176..69383dafdd9 100644
--- a/src/corelib/kernel/qpermissions.cpp
+++ b/src/corelib/kernel/qpermissions.cpp
@@ -119,7 +119,7 @@ Q_LOGGING_CATEGORY(lcPermissions, "qt.permissions", QtWarningMsg);
To ensure the relevant permission backend is included with your
application, please \l {QT_ANDROID_PACKAGE_SOURCE_DIR}
{point the build system to your custom \c AndroidManifest.xml}
- or use \l {qt_add_android_permission()}.
+ or use \l {qt_add_android_permission}().
The relevant permission names are described in the documentation
for each permission type.
diff --git a/src/corelib/kernel/qproperty.cpp b/src/corelib/kernel/qproperty.cpp
index d538ed7b4e9..9141a8f8bad 100644
--- a/src/corelib/kernel/qproperty.cpp
+++ b/src/corelib/kernel/qproperty.cpp
@@ -402,6 +402,16 @@ QPropertyBindingPrivate::NotificationState QPropertyBindingPrivate::notifyNonRec
}
/*!
+ \class QUntypedPropertyBinding
+ \inmodule QtCore
+ \since 6.0
+ \ingroup tools
+ \brief Represents a type-erased property binding.
+
+ \sa QUntypedBindable
+*/
+
+/*!
Constructs a null QUntypedPropertyBinding.
\sa isNull()
@@ -409,8 +419,8 @@ QPropertyBindingPrivate::NotificationState QPropertyBindingPrivate::notifyNonRec
QUntypedPropertyBinding::QUntypedPropertyBinding() = default;
/*!
- \fn template<typename Functor>
- QUntypedPropertyBinding(QMetaType metaType, Functor &&f, const QPropertyBindingSourceLocation &location)
+ \fn template<typename Functor> QUntypedPropertyBinding(
+ QMetaType metaType, Functor &&f, const QPropertyBindingSourceLocation &location)
\internal
*/
@@ -448,7 +458,6 @@ QUntypedPropertyBinding::QUntypedPropertyBinding(const QUntypedPropertyBinding &
: d(other.d)
{
}
-
/*!
Copy-assigns \a other to this QUntypedPropertyBinding.
*/
@@ -1183,7 +1192,7 @@ QString QPropertyBindingError::description() const
\return \c true when the binding was successfully set.
- //! \sa QUntypedPropertyBinding::valueMetaType()
+ \sa QUntypedPropertyBinding::valueMetaType()
*/
/*!
@@ -1199,8 +1208,7 @@ QString QPropertyBindingError::description() const
Returns the metatype of the property from which the QUntypedBindable was created.
If the bindable is invalid, an invalid metatype will be returned.
- \sa isValid()
- //! \sa QUntypedPropertyBinding::valueMetaType()
+ \sa isValid(), QUntypedPropertyBinding::valueMetaType()
*/
/*!
diff --git a/src/corelib/kernel/qtranslator.cpp b/src/corelib/kernel/qtranslator.cpp
index 9fdac89f775..6000edaa177 100644
--- a/src/corelib/kernel/qtranslator.cpp
+++ b/src/corelib/kernel/qtranslator.cpp
@@ -392,8 +392,8 @@ public:
translation files may contain misleading or malicious translations.
\sa QCoreApplication::installTranslator(), QCoreApplication::removeTranslator(),
- QObject::tr(), QCoreApplication::translate(), {I18N Example},
- {Hello tr() Example}, {Arrow Pad Example}, {Troll Print Example}
+ QObject::tr(), QCoreApplication::translate(),
+ {Localized Clock Example}, {Arrow Pad Example}, {Troll Print Example}
*/
/*!
diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp
index 13d74e591d5..0aeb2b07f47 100644
--- a/src/corelib/serialization/qcborvalue.cpp
+++ b/src/corelib/serialization/qcborvalue.cpp
@@ -975,6 +975,7 @@ QCborContainerPrivate *QCborContainerPrivate::detach(QCborContainerPrivate *d, q
}
/*!
+ \internal
Prepare for an insertion at position \a index
Detaches and ensures there are at least index entries in the array, padding
diff --git a/src/corelib/serialization/qdatastream.cpp b/src/corelib/serialization/qdatastream.cpp
index ae3bed5b751..fd2f7faeee5 100644
--- a/src/corelib/serialization/qdatastream.cpp
+++ b/src/corelib/serialization/qdatastream.cpp
@@ -552,6 +552,7 @@ void QDataStream::setByteOrder(ByteOrder bo)
\value Qt_6_9
\value Qt_6_10
\value Qt_6_11
+ \value Qt_6_12
\omitvalue Qt_DefaultCompiledVersion
\sa setVersion(), version()
diff --git a/src/corelib/serialization/qdatastream.h b/src/corelib/serialization/qdatastream.h
index 04373fe9c8a..d6fcf17efcd 100644
--- a/src/corelib/serialization/qdatastream.h
+++ b/src/corelib/serialization/qdatastream.h
@@ -96,8 +96,9 @@ public:
Qt_6_9 = Qt_6_7,
Qt_6_10 = 23,
Qt_6_11 = 24,
- Qt_DefaultCompiledVersion = Qt_6_11
-#if QT_VERSION >= QT_VERSION_CHECK(6, 12, 0)
+ Qt_6_12 = Qt_6_11,
+ Qt_DefaultCompiledVersion = Qt_6_12
+#if QT_VERSION >= QT_VERSION_CHECK(6, 13, 0)
#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
#endif
};
diff --git a/src/corelib/serialization/qxmlstream.cpp b/src/corelib/serialization/qxmlstream.cpp
index 9cd90fa9d65..ff70289013a 100644
--- a/src/corelib/serialization/qxmlstream.cpp
+++ b/src/corelib/serialization/qxmlstream.cpp
@@ -3678,7 +3678,7 @@ void QXmlStreamWriter::setStopWritingOnError(bool stop)
The error status is never reset. Writes happening after the error
occurred may be ignored, even if the error condition is cleared.
- \sa error(), errorString(), raiseError(const QString &message),
+ \sa error(), errorString(), raiseError()
*/
bool QXmlStreamWriter::hasError() const
{
@@ -3692,7 +3692,7 @@ bool QXmlStreamWriter::hasError() const
QXmlStreamWriter::Error::None.
\since 6.10
- \sa errorString(), raiseError(const QString &message), hasError()
+ \sa errorString(), raiseError(), hasError()
*/
QXmlStreamWriter::Error QXmlStreamWriter::error() const
{
@@ -3708,7 +3708,7 @@ QXmlStreamWriter::Error QXmlStreamWriter::error() const
a null string.
\since 6.10
- \sa error(), raiseError(const QString &message), hasError()
+ \sa error(), raiseError(), hasError()
*/
QString QXmlStreamWriter::errorString() const
{
diff --git a/src/corelib/text/qlocale.cpp b/src/corelib/text/qlocale.cpp
index fed09aee45e..18007cacae6 100644
--- a/src/corelib/text/qlocale.cpp
+++ b/src/corelib/text/qlocale.cpp
@@ -301,6 +301,7 @@ bool operator<(LikelyPair lhs, LikelyPair rhs)
} // anonymous namespace
/*!
+ \internal
Fill in blank fields of a locale ID.
An ID in which some fields are zero stands for any locale that agrees with
diff --git a/src/corelib/text/qstringconverter.cpp b/src/corelib/text/qstringconverter.cpp
index bf6e776ee0e..896142b4837 100644
--- a/src/corelib/text/qstringconverter.cpp
+++ b/src/corelib/text/qstringconverter.cpp
@@ -2739,7 +2739,7 @@ QStringList QStringConverter::availableCodecs()
May also provide data from residual content that was pending decoding.
When there is no residual data to account for, the return's \c error
- field will be set to \l {QCharConverter::FinalizeResult::Error::}
+ field will be set to \l {QStringConverter::FinalizeResultChar::error}
{NoError}.
If \a out is supplied and non-null, it must have space in which up to
@@ -2793,7 +2793,7 @@ auto QStringDecoder::finalize(char16_t *out, qsizetype maxlen) -> FinalizeResult
May also provide data from residual content that was pending decoding.
When there is no residual data to account for, the return's \c error
- field will be set to \l {QCharConverter::FinalizeResult::Error::}
+ field will be set to \l {QStringConverter::FinalizeResultChar::error}
{NoError}.
If \a out is supplied and non-null, it must have space in which up to
diff --git a/src/corelib/thread/qreadwritelock.cpp b/src/corelib/thread/qreadwritelock.cpp
index 96e35dcb965..2a1af2315ca 100644
--- a/src/corelib/thread/qreadwritelock.cpp
+++ b/src/corelib/thread/qreadwritelock.cpp
@@ -234,14 +234,14 @@ QBasicReadWriteLock::contendedTryLockForRead(QDeadlineTimer timeout, void *dd)
return d->recursiveLockForRead(timeout);
auto lock = qt_unique_lock(d->mutex);
- if (d != d_ptr.loadRelaxed()) {
+ if (QReadWriteLockPrivate *dd = d_ptr.loadAcquire(); d != dd) {
// d_ptr has changed: this QReadWriteLock was unlocked before we had
// time to lock d->mutex.
// We are holding a lock to a mutex within a QReadWriteLockPrivate
// that is already released (or even is already re-used). That's ok
// because the QFreeList never frees them.
// Just unlock d->mutex (at the end of the scope) and retry.
- d = d_ptr.loadAcquire();
+ d = dd;
continue;
}
return d->lockForRead(lock, timeout);
@@ -340,11 +340,11 @@ QBasicReadWriteLock::contendedTryLockForWrite(QDeadlineTimer timeout, void *dd)
return d->recursiveLockForWrite(timeout);
auto lock = qt_unique_lock(d->mutex);
- if (d != d_ptr.loadRelaxed()) {
+ if (QReadWriteLockPrivate *dd = d_ptr.loadAcquire(); d != dd) {
// The mutex was unlocked before we had time to lock the mutex.
// We are holding to a mutex within a QReadWriteLockPrivate that is already released
// (or even is already re-used) but that's ok because the QFreeList never frees them.
- d = d_ptr.loadAcquire();
+ d = dd;
continue;
}
return d->lockForWrite(lock, timeout);
diff --git a/src/corelib/time/qdatetimeparser.cpp b/src/corelib/time/qdatetimeparser.cpp
index 10882738a39..05ba3d2beae 100644
--- a/src/corelib/time/qdatetimeparser.cpp
+++ b/src/corelib/time/qdatetimeparser.cpp
@@ -2389,6 +2389,7 @@ bool operator==(QDateTimeParser::SectionNode s1, QDateTimeParser::SectionNode s2
}
/*!
+ \internal
Sets \a cal as the calendar to use. The default is Gregorian.
*/
diff --git a/src/corelib/tools/qeasingcurve.cpp b/src/corelib/tools/qeasingcurve.cpp
index de68a0042ac..ce35e8ccffe 100644
--- a/src/corelib/tools/qeasingcurve.cpp
+++ b/src/corelib/tools/qeasingcurve.cpp
@@ -332,8 +332,6 @@ struct TCBPoint
qreal _c;
qreal _b;
- TCBPoint() {}
- TCBPoint(QPointF point, qreal t, qreal c, qreal b) : _point(point), _t(t), _c(c), _b(b) {}
bool operator==(const TCBPoint &other) const
{
@@ -1381,7 +1379,7 @@ void QEasingCurve::addTCBSegment(const QPointF &nextPoint, qreal t, qreal c, qre
if (!d_ptr->config)
d_ptr->config = curveToFunctionObject(d_ptr->type);
- d_ptr->config->_tcbPoints.append(TCBPoint(nextPoint, t, c, b));
+ d_ptr->config->_tcbPoints.append(TCBPoint{nextPoint, t, c, b});
if (nextPoint == QPointF(1.0, 1.0)) {
d_ptr->config->_bezierCurves = tcbToBezier(d_ptr->config->_tcbPoints);
diff --git a/src/gui/doc/qtgui.qdocconf b/src/gui/doc/qtgui.qdocconf
index 24d9d522735..8b7569c1296 100644
--- a/src/gui/doc/qtgui.qdocconf
+++ b/src/gui/doc/qtgui.qdocconf
@@ -50,7 +50,8 @@ depends += \
qtshadertools \
qttestlib \
qtplatformintegration \
- qthelp
+ qthelp \
+ qtquickcontrols
headerdirs += ..
diff --git a/src/gui/doc/src/external-resources.qdoc b/src/gui/doc/src/external-resources.qdoc
index 0f356dd5046..14ed0817e62 100644
--- a/src/gui/doc/src/external-resources.qdoc
+++ b/src/gui/doc/src/external-resources.qdoc
@@ -36,6 +36,7 @@
\externalpage https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html
\title Freedesktop Icon Naming Specification
*/
+
/*!
\externalpage https://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html#directory_layout
\title Icon Theme Specification - Directory Layout
diff --git a/src/gui/itemmodels/qfileinfogatherer.cpp b/src/gui/itemmodels/qfileinfogatherer.cpp
index b7ab3dbbc46..ea19db0d20f 100644
--- a/src/gui/itemmodels/qfileinfogatherer.cpp
+++ b/src/gui/itemmodels/qfileinfogatherer.cpp
@@ -46,6 +46,12 @@ static QString translateDriveName(const QFileInfo &drive)
}
/*!
+ \class QFileInfoGatherer
+ \inmodule QtGui
+ \internal
+*/
+
+/*!
Creates thread
*/
QFileInfoGatherer::QFileInfoGatherer(QObject *parent)
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 741b089306e..e8df40f21b2 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -490,6 +490,12 @@ static QWindowGeometrySpecification windowGeometrySpecification = Q_WINDOW_GEOME
*/
/*!
+ \class QGuiApplicationPrivate
+ \inmodule QtGui
+ \internal
+*/
+
+/*!
Initializes the window system and constructs an application object with
\a argc command line arguments in \a argv.
diff --git a/src/gui/kernel/qplatformintegrationfactory.cpp b/src/gui/kernel/qplatformintegrationfactory.cpp
index d0a5e8871f8..d113e86090d 100644
--- a/src/gui/kernel/qplatformintegrationfactory.cpp
+++ b/src/gui/kernel/qplatformintegrationfactory.cpp
@@ -24,6 +24,7 @@ QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platfor
}
/*!
+ \internal
Returns the list of valid keys, i.e. the keys this factory can
create styles for.
diff --git a/src/gui/kernel/qplatformthemefactory.cpp b/src/gui/kernel/qplatformthemefactory.cpp
index beefa1c2942..3ac462598fd 100644
--- a/src/gui/kernel/qplatformthemefactory.cpp
+++ b/src/gui/kernel/qplatformthemefactory.cpp
@@ -31,6 +31,7 @@ QPlatformTheme *QPlatformThemeFactory::create(const QString& key, const QString
}
/*!
+ \internal
Returns the list of valid keys, i.e. the keys this factory can
create styles for.
diff --git a/src/gui/opengl/qopenglfunctions.cpp b/src/gui/opengl/qopenglfunctions.cpp
index 6b45d26fb4c..cb927d7c296 100644
--- a/src/gui/opengl/qopenglfunctions.cpp
+++ b/src/gui/opengl/qopenglfunctions.cpp
@@ -192,6 +192,12 @@ QOpenGLFunctions::QOpenGLFunctions(QOpenGLContext *context)
qWarning("QOpenGLFunctions created with non-current context");
}
+/*!
+ \class QOpenGLExtensions
+ \inmodule QtGui
+ \internal
+*/
+
QOpenGLExtensions::QOpenGLExtensions()
{
}
diff --git a/src/gui/painting/qpaintengine_raster.cpp b/src/gui/painting/qpaintengine_raster.cpp
index 047be5f1c3d..8e815394849 100644
--- a/src/gui/painting/qpaintengine_raster.cpp
+++ b/src/gui/painting/qpaintengine_raster.cpp
@@ -2881,6 +2881,7 @@ bool QRasterPaintEngine::drawCachedGlyphs(int numGlyphs, const glyph_t *glyphs,
/*!
+ * \internal
* Returns \c true if the rectangle is completely within the current clip
* state of the paint engine.
*/
diff --git a/src/gui/painting/qpdf.cpp b/src/gui/painting/qpdf.cpp
index 908051a477c..b1ea3f240f1 100644
--- a/src/gui/painting/qpdf.cpp
+++ b/src/gui/painting/qpdf.cpp
@@ -3192,6 +3192,7 @@ static inline bool is_monochrome(const QList<QRgb> &colorTable)
}
/*!
+ * \internal
* Adds an image to the pdf and return the pdf-object id. Returns -1 if adding the image failed.
*/
int QPdfEnginePrivate::addImage(const QImage &img, bool *bitmap, bool lossless, qint64 serial_no)
diff --git a/src/gui/painting/qstroker.cpp b/src/gui/painting/qstroker.cpp
index 0d435c95048..08128c30a70 100644
--- a/src/gui/painting/qstroker.cpp
+++ b/src/gui/painting/qstroker.cpp
@@ -145,6 +145,11 @@ static inline qreal adapted_angle_on_x(const QLineF &line)
return QLineF(0, 0, 1, 0).angleTo(line);
}
+/*!
+ \class QStrokerOps
+ \inmodule QtGui
+ \internal
+*/
QStrokerOps::QStrokerOps()
: m_elements(0)
, m_curveThreshold(qt_real_to_fixed(0.25))
@@ -373,6 +378,7 @@ QStroker::LineJoinMode QStroker::joinModeForJoin(Qt::PenJoinStyle joinStyle)
/*!
+ \internal
This function is called to stroke the currently built up
subpath. The subpath is cleared when the function completes.
*/
diff --git a/src/gui/platform/unix/dbusmenu/qdbusplatformmenu.cpp b/src/gui/platform/unix/dbusmenu/qdbusplatformmenu.cpp
index fe050461260..00c3192e00a 100644
--- a/src/gui/platform/unix/dbusmenu/qdbusplatformmenu.cpp
+++ b/src/gui/platform/unix/dbusmenu/qdbusplatformmenu.cpp
@@ -48,6 +48,7 @@ void QDBusPlatformMenuItem::setIcon(const QIcon &icon)
}
/*!
+ \internal
Set a submenu under this menu item.
*/
void QDBusPlatformMenuItem::setMenu(QPlatformMenu *menu)
diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp
index d41296291f6..4df55d5b89c 100644
--- a/src/gui/text/qfontengine.cpp
+++ b/src/gui/text/qfontengine.cpp
@@ -402,7 +402,7 @@ bool QFontEngine::processHheaTable() const
const qreal unitsPerEm = emSquareSize().toReal();
// Bail out if values are too large for QFixed
- const auto limitForQFixed = qreal(std::numeric_limits<int>::max() / 64) / fontDef.pixelSize;
+ const auto limitForQFixed = qreal(std::numeric_limits<int>::max() >> 6) / fontDef.pixelSize;
if (ascent > limitForQFixed || descent > limitForQFixed || leading > limitForQFixed)
return false;
m_ascent = QFixed::fromReal(ascent * fontDef.pixelSize / unitsPerEm);
@@ -470,7 +470,7 @@ bool QFontEngine::processOS2Table() const
if (typoAscent == 0 && typoDescent == 0)
return false;
// Bail out if values are too large for QFixed
- const auto limitForQFixed = qreal(std::numeric_limits<int>::max() / 64) / fontDef.pixelSize;
+ const auto limitForQFixed = qreal(std::numeric_limits<int>::max() >> 6) / fontDef.pixelSize;
if (typoAscent > limitForQFixed || typoDescent > limitForQFixed
|| typoLineGap > limitForQFixed)
return false;
@@ -481,7 +481,7 @@ bool QFontEngine::processOS2Table() const
// Some fonts may have invalid OS/2 data. We detect this and bail out.
if (winAscent == 0 && winDescent == 0)
return false;
- const auto limitForQFixed = qreal(std::numeric_limits<int>::max() / 64) / fontDef.pixelSize;
+ const auto limitForQFixed = qreal(std::numeric_limits<int>::max() >> 6) / fontDef.pixelSize;
if (winAscent > limitForQFixed || winDescent > limitForQFixed)
return false;
m_ascent = QFixed::fromReal(winAscent * fontDef.pixelSize / unitsPerEm);
@@ -1059,6 +1059,7 @@ void QFontEngine::getUnscaledGlyph(glyph_t glyph, QPainterPath *path, glyph_metr
}
/*!
+ \internal
Returns \c true if the font table idetified by \a tag exists in the font;
returns \c false otherwise.
diff --git a/src/gui/text/qtextdocument.cpp b/src/gui/text/qtextdocument.cpp
index 4f01d09fed1..d519cd5a5d3 100644
--- a/src/gui/text/qtextdocument.cpp
+++ b/src/gui/text/qtextdocument.cpp
@@ -2385,6 +2385,11 @@ static QString colorValue(QColor color)
return result;
}
+/*!
+ \class QTextHtmlExporter
+ \inmodule QtGui
+ \internal
+*/
QTextHtmlExporter::QTextHtmlExporter(const QTextDocument *_doc)
: doc(_doc), fragmentMarkers(false)
{
diff --git a/src/gui/text/qtextdocument_p.cpp b/src/gui/text/qtextdocument_p.cpp
index 227cbae2952..85a74d366ac 100644
--- a/src/gui/text/qtextdocument_p.cpp
+++ b/src/gui/text/qtextdocument_p.cpp
@@ -1006,6 +1006,7 @@ int QTextDocumentPrivate::undoRedo(bool undo)
}
/*!
+ \internal
Appends a custom undo \a item to the undo stack.
*/
void QTextDocumentPrivate::appendUndoItem(QAbstractUndoItem *item)
diff --git a/src/gui/text/qtexttable.cpp b/src/gui/text/qtexttable.cpp
index ff8644b5302..337228ff170 100644
--- a/src/gui/text/qtexttable.cpp
+++ b/src/gui/text/qtexttable.cpp
@@ -394,11 +394,9 @@ void QTextTablePrivate::fragmentRemoved(QChar type, uint fragment)
}
/*!
- /fn void QTextTablePrivate::update() const
-
+ \internal
This function is usually called when the table is "dirty".
It seems to update all kind of table information.
-
*/
void QTextTablePrivate::update() const
{
diff --git a/src/gui/util/qlayoutpolicy.cpp b/src/gui/util/qlayoutpolicy.cpp
index 4d81a426835..0c0651c1f39 100644
--- a/src/gui/util/qlayoutpolicy.cpp
+++ b/src/gui/util/qlayoutpolicy.cpp
@@ -8,6 +8,11 @@
QT_BEGIN_NAMESPACE
+/*!
+ \class QLayoutPolicy
+ \inmodule QtGui
+ \internal
+*/
void QLayoutPolicy::setControlType(ControlType type)
{
/*
diff --git a/src/network/access/qbytedatabuffer_p.h b/src/network/access/qbytedatabuffer_p.h
index a119093cf7e..036b562d06a 100644
--- a/src/network/access/qbytedatabuffer_p.h
+++ b/src/network/access/qbytedatabuffer_p.h
@@ -280,6 +280,8 @@ public:
}
return false;
}
+
+ const QByteArray &last() const { return buffers.last(); }
};
QT_END_NAMESPACE
diff --git a/src/network/access/qhttp2connection.cpp b/src/network/access/qhttp2connection.cpp
index 2895e8335d2..c0b07ddd652 100644
--- a/src/network/access/qhttp2connection.cpp
+++ b/src/network/access/qhttp2connection.cpp
@@ -34,8 +34,38 @@ using namespace Http2;
\sa QHttp2Connection
*/
-QHttp2Stream::QHttp2Stream(QHttp2Connection *connection, quint32 streamID) noexcept
- : QObject(connection), m_streamID(streamID)
+/*!
+ \struct QHttp2Stream::Configuration
+ \inmodule QtNetwork
+ \internal
+
+ \brief Configuration options for a QHttp2Stream.
+
+ The Configuration struct holds options that control stream behavior.
+
+ \sa QHttp2Connection::createStream()
+*/
+
+/*!
+ \variable QHttp2Stream::Configuration::useDownloadBuffer
+
+ Controls whether incoming DATA frames, from QHttp2Stream::dataReceived(),
+ are buffered. The default is \c true.
+
+ You may disable buffering for client-initiated streams when the
+ application processes DATA immediately.
+
+ Buffering must remain enabled for pushed streams. A pushed stream can
+ receive DATA before the application becomes aware of them and the buffered
+ DATA is required to deliver the pushed response.
+
+ \sa QHttp2Stream::downloadBuffer(), QHttp2Stream::takeDownloadBuffer(),
+ QHttp2Configuration::serverPushEnabled(), QHttp2Stream::dataReceived()
+*/
+
+QHttp2Stream::QHttp2Stream(QHttp2Connection *connection, quint32 streamID,
+ Configuration configuration) noexcept
+ : QObject(connection), m_streamID(streamID), m_configuration(configuration)
{
Q_ASSERT(connection);
Q_ASSERT(streamID); // stream id 0 is reserved for connection control messages
@@ -213,6 +243,12 @@ QHttp2Stream::~QHttp2Stream() noexcept {
Returns the buffer containing the data received from the remote peer.
*/
+/*!
+ \fn QHttp2Stream::Configuration QHttp2Stream::configuration() const
+
+ Returns the configuration of this stream.
+*/
+
void QHttp2Stream::finishWithError(Http2::Http2Error errorCode, const QString &message)
{
qCDebug(qHttp2ConnectionLog, "[%p] stream %u finished with error: %ls (error code: %u)",
@@ -697,8 +733,14 @@ void QHttp2Stream::handleDATA(const Frame &inboundFrame)
inboundFrame.dataSize());
if (endStream)
transitionState(StateTransition::CloseRemote);
- emit dataReceived(fragment, endStream);
- m_downloadBuffer.append(std::move(fragment));
+ const auto shouldBuffer = m_configuration.useDownloadBuffer && !fragment.isEmpty();
+ if (shouldBuffer) {
+ // Only non-empty fragments get appended!
+ m_downloadBuffer.append(std::move(fragment));
+ emit dataReceived(m_downloadBuffer.last(), endStream);
+ } else {
+ emit dataReceived(fragment, endStream);
+ }
}
if (!endStream && m_recvWindow < connection->streamInitialReceiveWindowSize / 2) {
@@ -885,23 +927,35 @@ QHttp2Connection *QHttp2Connection::createDirectServerConnection(QIODevice *sock
}
/*!
- Creates a stream on this connection.
+ \fn QH2Expected<QHttp2Stream *, QHttp2Connection::CreateStreamError> QHttp2Connection::createStream()
+ Creates a stream on this connection, using the default QHttp2Stream::Configuration.
+
+//! [createStream]
Automatically picks the next available stream ID and returns a pointer to
the new stream, if possible. Otherwise returns an error.
\sa QHttp2Connection::CreateStreamError, QHttp2Stream
+//! [createStream]
+ \sa createStream(QHttp2Stream::Configuration)
+*/
+
+/*!
+ Creates a stream with \a configuration on this connection.
+
+ \include qhttp2connection.cpp createStream
*/
-QH2Expected<QHttp2Stream *, QHttp2Connection::CreateStreamError> QHttp2Connection::createStream()
+QH2Expected<QHttp2Stream *, QHttp2Connection::CreateStreamError>
+QHttp2Connection::createStream(QHttp2Stream::Configuration configuration)
{
Q_ASSERT(m_connectionType == Type::Client); // This overload is just for clients
if (m_nextStreamID > lastValidStreamID)
return { QHttp2Connection::CreateStreamError::StreamIdsExhausted };
- return createLocalStreamInternal();
+ return createLocalStreamInternal(configuration);
}
QH2Expected<QHttp2Stream *, QHttp2Connection::CreateStreamError>
-QHttp2Connection::createLocalStreamInternal()
+QHttp2Connection::createLocalStreamInternal(QHttp2Stream::Configuration conf)
{
if (m_goingAway)
return { QHttp2Connection::CreateStreamError::ReceivedGOAWAY };
@@ -909,7 +963,7 @@ QHttp2Connection::createLocalStreamInternal()
if (size_t(m_peerMaxConcurrentStreams) <= size_t(numActiveLocalStreams()))
return { QHttp2Connection::CreateStreamError::MaxConcurrentStreamsReached };
- if (QHttp2Stream *ptr = createStreamInternal_impl(streamID)) {
+ if (QHttp2Stream *ptr = createStreamInternal_impl(streamID, conf)) {
m_nextStreamID += 2;
return {ptr};
}
@@ -917,7 +971,8 @@ QHttp2Connection::createLocalStreamInternal()
return { QHttp2Connection::CreateStreamError::UnknownError };
}
-QHttp2Stream *QHttp2Connection::createStreamInternal_impl(quint32 streamID)
+QHttp2Stream *QHttp2Connection::createStreamInternal_impl(quint32 streamID,
+ QHttp2Stream::Configuration conf)
{
Q_ASSERT(streamID > m_lastIncomingStreamID || streamID >= m_nextStreamID);
@@ -930,7 +985,7 @@ QHttp2Stream *QHttp2Connection::createStreamInternal_impl(quint32 streamID)
if (!result.inserted)
return nullptr;
QPointer<QHttp2Stream> &stream = result.iterator.value();
- stream = new QHttp2Stream(this, streamID);
+ stream = new QHttp2Stream(this, streamID, conf);
stream->m_recvWindow = streamInitialReceiveWindowSize;
stream->m_sendWindow = streamInitialSendWindowSize;
diff --git a/src/network/access/qhttp2connection_p.h b/src/network/access/qhttp2connection_p.h
index f3f14145278..e2af7d7ab33 100644
--- a/src/network/access/qhttp2connection_p.h
+++ b/src/network/access/qhttp2connection_p.h
@@ -101,6 +101,11 @@ public:
Q_ENUM(State)
constexpr static quint8 DefaultPriority = 127;
+ struct Configuration
+ {
+ bool useDownloadBuffer = true;
+ };
+
~QHttp2Stream() noexcept;
// HTTP2 things
@@ -124,6 +129,8 @@ public:
QByteDataBuffer takeDownloadBuffer() noexcept { return std::exchange(m_downloadBuffer, {}); }
void clearDownloadBuffer() { m_downloadBuffer.clear(); }
+ Configuration configuration() const { return m_configuration; }
+
Q_SIGNALS:
void headersReceived(const HPack::HttpHeader &headers, bool endStream);
void headersUpdated();
@@ -154,7 +161,8 @@ private Q_SLOTS:
private:
friend class QHttp2Connection;
- QHttp2Stream(QHttp2Connection *connection, quint32 streamID) noexcept;
+ QHttp2Stream(QHttp2Connection *connection, quint32 streamID,
+ Configuration configuration) noexcept;
[[nodiscard]] QHttp2Connection *getConnection() const
{
@@ -201,6 +209,8 @@ private:
bool m_isReserved = false;
bool m_owningByteDevice = false;
+ const Configuration m_configuration;
+
friend tst_QHttp2Connection;
};
@@ -235,7 +245,12 @@ public:
createDirectServerConnection(QIODevice *socket, const QHttp2Configuration &config);
~QHttp2Connection();
- [[nodiscard]] QH2Expected<QHttp2Stream *, CreateStreamError> createStream();
+ [[nodiscard]] QH2Expected<QHttp2Stream *, CreateStreamError> createStream()
+ {
+ return createStream(QHttp2Stream::Configuration{});
+ }
+ [[nodiscard]] QH2Expected<QHttp2Stream *, CreateStreamError>
+ createStream(QHttp2Stream::Configuration config);
QHttp2Stream *getStream(quint32 streamId) const;
QHttp2Stream *promisedStream(const QUrl &streamKey) const
@@ -278,8 +293,9 @@ private:
friend class QHttp2Stream;
[[nodiscard]] QIODevice *getSocket() const { return qobject_cast<QIODevice *>(parent()); }
- QH2Expected<QHttp2Stream *, QHttp2Connection::CreateStreamError> createLocalStreamInternal();
- QHttp2Stream *createStreamInternal_impl(quint32 streamID);
+ QH2Expected<QHttp2Stream *, QHttp2Connection::CreateStreamError>
+ createLocalStreamInternal(QHttp2Stream::Configuration = {});
+ QHttp2Stream *createStreamInternal_impl(quint32 streamID, QHttp2Stream::Configuration = {});
bool isInvalidStream(quint32 streamID) noexcept;
bool streamWasResetLocally(quint32 streamID) noexcept;
diff --git a/src/plugins/sqldrivers/.cmake.conf b/src/plugins/sqldrivers/.cmake.conf
index be788d10f8e..846c4f3b923 100644
--- a/src/plugins/sqldrivers/.cmake.conf
+++ b/src/plugins/sqldrivers/.cmake.conf
@@ -1 +1 @@
-set(QT_REPO_MODULE_VERSION "6.11.0")
+set(QT_REPO_MODULE_VERSION "6.12.0")
diff --git a/src/plugins/styles/modernwindows/qwindows11style.cpp b/src/plugins/styles/modernwindows/qwindows11style.cpp
index ff2d4bd845f..e9b90d787bc 100644
--- a/src/plugins/styles/modernwindows/qwindows11style.cpp
+++ b/src/plugins/styles/modernwindows/qwindows11style.cpp
@@ -596,7 +596,7 @@ void QWindows11Style::drawComplexControl(ComplexControl control, const QStyleOpt
if (sub & SC_ComboBoxArrow) {
QRectF rect = proxy()->subControlRect(CC_ComboBox, option, SC_ComboBoxArrow, widget);
painter->setFont(d->assetFont);
- painter->setPen(controlTextColor(option));
+ painter->setPen(controlTextColor(option, true));
painter->drawText(rect, Qt::AlignCenter, fluentIcon(Icon::ChevronDownMed));
}
if (state & State_KeyboardFocusChange && hasFocus) {
@@ -887,7 +887,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
if (isOn) {
painter->setFont(d->assetFont);
- painter->setPen(controlTextColor(option, QPalette::Window));
+ painter->setPen(controlTextColor(option));
qreal clipWidth = 1.0;
const QString str = fluentIcon(Icon::AcceptMedium);
QFontMetrics fm(d->assetFont);
@@ -907,7 +907,7 @@ void QWindows11Style::drawPrimitive(PrimitiveElement element, const QStyleOption
QFont f(d->assetFont);
f.setPointSize(6);
painter->setFont(f);
- painter->setPen(controlTextColor(option, QPalette::Window));
+ painter->setPen(controlTextColor(option));
painter->drawText(rect, Qt::AlignCenter, fluentIcon(Icon::Dash12));
}
}
@@ -1214,7 +1214,7 @@ void QWindows11Style::drawControl(ControlElement element, const QStyleOption *op
case QStyle::CE_ComboBoxLabel:
#if QT_CONFIG(combobox)
if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- painter->setPen(controlTextColor(option));
+ painter->setPen(controlTextColor(option, true));
QStyleOptionComboBox newOption = *cb;
newOption.rect.adjust(4,0,-4,0);
QCommonStyle::drawControl(element, &newOption, painter, widget);
@@ -2737,7 +2737,7 @@ QBrush QWindows11Style::inputFillBrush(const QStyleOption *option, const QWidget
return winUI3Color(fillControlDefault);
}
-QColor QWindows11Style::controlTextColor(const QStyleOption *option, QPalette::ColorRole role) const
+QColor QWindows11Style::controlTextColor(const QStyleOption *option, bool ignoreIsChecked) const
{
using namespace StyleOptionHelper;
static constexpr WINUI3Color colorEnums[2][4] = {
@@ -2750,12 +2750,9 @@ QColor QWindows11Style::controlTextColor(const QStyleOption *option, QPalette::C
if (option->palette.isBrushSet(QPalette::Current, QPalette::ButtonText))
return option->palette.buttonText().color();
- const int colorIndex = isChecked(option) ? 1 : 0;
+ const int colorIndex = !ignoreIsChecked && isChecked(option) ? 1 : 0;
const auto state = calcControlState(option);
- const auto alpha = winUI3Color(colorEnums[colorIndex][int(state)]);
- QColor col = option->palette.color(role);
- col.setAlpha(alpha.alpha());
- return col;
+ return winUI3Color(colorEnums[colorIndex][int(state)]);
}
void QWindows11Style::drawLineEditFrame(QPainter *p, const QRectF &rect, const QStyleOption *o, bool isEditable) const
diff --git a/src/plugins/styles/modernwindows/qwindows11style_p.h b/src/plugins/styles/modernwindows/qwindows11style_p.h
index 96c2c4136e0..9d0cdda3e33 100644
--- a/src/plugins/styles/modernwindows/qwindows11style_p.h
+++ b/src/plugins/styles/modernwindows/qwindows11style_p.h
@@ -104,8 +104,7 @@ private:
QBrush controlFillBrush(const QStyleOption *option, ControlType controlType) const;
QBrush inputFillBrush(const QStyleOption *option, const QWidget *widget) const;
// ControlType::ControlAlt can be mapped to QPalette directly
- QColor controlTextColor(const QStyleOption *option,
- QPalette::ColorRole role = QPalette::ButtonText) const;
+ QColor controlTextColor(const QStyleOption *option, bool ignoreIsChecked = false) const;
void drawLineEditFrame(QPainter *p, const QRectF &rect, const QStyleOption *o, bool isEditable = true) const;
inline QColor winUI3Color(enum WINUI3Color col) const;
diff --git a/src/testlib/doc/src/qt-webpages.qdoc b/src/testlib/doc/src/qt-webpages.qdoc
index 611f3795ba9..b32fd4f750f 100644
--- a/src/testlib/doc/src/qt-webpages.qdoc
+++ b/src/testlib/doc/src/qt-webpages.qdoc
@@ -15,7 +15,3 @@
\title Googletest Mocking (gMock) Framework
*/
-/*!
- \externalpage https://www.itk.org/Wiki/CMake_Testing_With_CTest
- \title CMake/Testing With CTest
-*/
diff --git a/src/tools/androidtestrunner/main.cpp b/src/tools/androidtestrunner/main.cpp
index b517d85c5fb..161d95db49c 100644
--- a/src/tools/androidtestrunner/main.cpp
+++ b/src/tools/androidtestrunner/main.cpp
@@ -28,7 +28,16 @@
using namespace Qt::StringLiterals;
-#define EXIT_ERROR -1
+
+// QTest-based test processes may exit with up to 127 for normal test failures
+static constexpr int HIGHEST_QTEST_EXITCODE = 127;
+// Something went wrong in androidtestrunner, in general
+static constexpr int EXIT_ERROR = 254;
+// More specific exit codes for failures in androidtestrunner:
+static constexpr int EXIT_NOEXITCODE = 253; // Failed to transfer exit code from device
+static constexpr int EXIT_ANR = 252; // Android ANR error (Application Not Responding)
+static constexpr int EXIT_NORESULTS = 251; // Failed to transfer result files from device
+
struct Options
{
@@ -71,6 +80,13 @@ struct TestInfo
static TestInfo g_testInfo;
+// QTest-based processes return 0 if all tests PASSed, or the number of FAILs up to 127.
+// Other exitcodes signify abnormal termination and are system-dependent.
+static bool isTestExitCodeNormal(const int ec)
+{
+ return (ec >= 0 && ec <= HIGHEST_QTEST_EXITCODE);
+}
+
static bool execCommand(const QString &program, const QStringList &args,
QByteArray *output = nullptr, bool verbose = false)
{
@@ -744,9 +760,9 @@ void printLogcatCrash(const QByteArray &logcat)
}
if (!crashLogcat.startsWith("********** Crash dump"))
- qDebug() << "********** Crash dump: **********";
+ qDebug() << "[androidtestrunner] ********** BEGIN crash dump **********";
qDebug().noquote() << crashLogcat.trimmed();
- qDebug() << "********** End crash dump **********";
+ qDebug() << "[androidtestrunner] ********** END crash dump **********";
}
void analyseLogcat(const QString &timeStamp, int *exitCode)
@@ -781,10 +797,13 @@ void analyseLogcat(const QString &timeStamp, int *exitCode)
// Check for ANRs
const bool anrOccurred = logcat.contains("ANR in %1"_L1.arg(g_options.package).toUtf8());
if (anrOccurred) {
- // Treat a found ANR as a test failure.
- *exitCode = *exitCode < 1 ? 1 : *exitCode;
- qCritical("An ANR has occurred while running the test %s. The logcat will include "
- "additional logs from the system_server process.",
+ // Rather improbable, but if the test managed to return a non-crash exitcode then overwrite
+ // it to signify that something blew up. Same if we didn't manage to collect an exit code.
+ // Preserve all other exitcodes, they might be useful crash information from the device.
+ if (isTestExitCodeNormal(*exitCode) || *exitCode == EXIT_NOEXITCODE)
+ *exitCode = EXIT_ANR;
+ qCritical("[androidtestrunner] An ANR has occurred while running the test '%s';"
+ " consult logcat for additional logs from the system_server process",
qPrintable(g_options.package));
}
@@ -818,13 +837,14 @@ void analyseLogcat(const QString &timeStamp, int *exitCode)
}
}
- // If we have a crash, attempt to print both logcat and the crash buffer which
- // includes the crash stacktrace that is not included in the default logcat.
- const bool testCrashed = *exitCode == EXIT_ERROR && !g_testInfo.isTestRunnerInterrupted.load();
+ // If we have an unpredictable exitcode, possibly a crash, attempt to print both logcat and the
+ // crash buffer which includes the crash stacktrace that is not included in the default logcat.
+ const bool testCrashed = ( !isTestExitCodeNormal(*exitCode)
+ && !g_testInfo.isTestRunnerInterrupted.load());
if (testCrashed) {
- qDebug() << "********** logcat dump **********";
+ qDebug() << "[androidtestrunner] ********** BEGIN logcat dump **********";
qDebug().noquote() << testLogcat.join(u'\n').trimmed();
- qDebug() << "********** End logcat dump **********";
+ qDebug() << "[androidtestrunner] ********** END logcat dump **********";
if (!crashLogcat.isEmpty())
printLogcatCrash(crashLogcat);
@@ -839,7 +859,7 @@ static QString getCurrentTimeString()
QStringList dateArgs = { "shell"_L1, "date"_L1, "+'%1'"_L1.arg(timeFormat) };
QByteArray output;
if (!execAdbCommand(dateArgs, &output, false)) {
- qWarning() << "Date/time adb command failed";
+ qWarning() << "[androidtestrunner] ERROR in command: adb shell date";
return {};
}
@@ -851,14 +871,15 @@ static int testExitCode()
QByteArray exitCodeOutput;
const QString exitCodeCmd = "cat files/qtest_last_exit_code 2> /dev/null"_L1;
if (!execAdbCommand({ "shell"_L1, runCommandAsUserArgs(exitCodeCmd) }, &exitCodeOutput, false)) {
- qCritical() << "Failed to retrieve the test exit code.";
- return EXIT_ERROR;
+ qCritical() << "[androidtestrunner] ERROR in command: adb shell cat files/qtest_last_exit_code";
+ return EXIT_NOEXITCODE;
}
+ qDebug() << "[androidtestrunner] Test exitcode: " << exitCodeOutput;
bool ok;
int exitCode = exitCodeOutput.toInt(&ok);
- return ok ? exitCode : EXIT_ERROR;
+ return ok ? exitCode : EXIT_NOEXITCODE;
}
static bool uninstallTestPackage()
@@ -899,7 +920,7 @@ void sigHandler(int signal)
// a main event loop. Since, there's no other alternative to do this,
// let's do the cleanup anyway.
if (!g_testInfo.isPackageInstalled.load())
- _exit(-1);
+ _exit(EXIT_ERROR);
g_testInfo.isTestRunnerInterrupted.store(true);
}
@@ -1031,7 +1052,9 @@ int main(int argc, char *argv[])
if (g_options.showLogcatOutput)
analyseLogcat(formattedStartTime, &exitCode);
- exitCode = pullResults() ? exitCode : EXIT_ERROR;
+ const bool pullRes = pullResults();
+ if (!pullRes && isTestExitCodeNormal(exitCode))
+ exitCode = EXIT_NORESULTS;
if (!uninstallTestPackage())
return EXIT_ERROR;
diff --git a/src/tools/configure.cmake b/src/tools/configure.cmake
index 27ea90b89ac..07e11dd935b 100644
--- a/src/tools/configure.cmake
+++ b/src/tools/configure.cmake
@@ -37,7 +37,7 @@ qt_feature("qmake" PRIVATE
QT_FEATURE_datestring AND QT_FEATURE_regularexpression AND QT_FEATURE_temporaryfile)
qt_feature("qtwaylandscanner" PRIVATE
- CONDITION TARGET Wayland::Scanner
+ CONDITION TARGET Wayland::Scanner AND NOT INTEGRITY AND NOT ANDROID AND NOT WASM AND NOT IOS AND NOT QNX AND NOT VXWORKS
)
qt_configure_add_summary_section(NAME "Core tools")
diff --git a/src/widgets/accessible/qaccessiblecolorwell.cpp b/src/widgets/accessible/qaccessiblecolorwell.cpp
index ca08e511e9a..64fcd2a7fd1 100644
--- a/src/widgets/accessible/qaccessiblecolorwell.cpp
+++ b/src/widgets/accessible/qaccessiblecolorwell.cpp
@@ -3,6 +3,8 @@
#include "private/qaccessiblecolorwell_p.h"
+#include <QtCore/qcoreapplication.h>
+
QT_REQUIRE_CONFIG(accessibility);
#if QT_CONFIG(colordialog)
@@ -14,6 +16,7 @@ class QAccessibleColorWellItem : public QAccessibleInterface
{
QAccessibleColorWell *m_parent;
+ Q_DECLARE_TR_FUNCTIONS(QAccessibleColorWellItem)
public:
QAccessibleColorWellItem(QAccessibleColorWell *parent);
@@ -79,7 +82,7 @@ QString QAccessibleColorWellItem::text(QAccessible::Text t) const
if (t == QAccessible::Name) {
QRgb color = m_parent->colorWell()->rgbValues()[m_parent->indexOfChild(this)];
//: Color specified via its 3 RGB components (red, green, blue)
- return QObject::tr("RGB %1, %2, %3")
+ return tr("RGB %1, %2, %3")
.arg(QString::number(qRed(color)), QString::number(qGreen(color)),
QString::number(qBlue(color)));
}
diff --git a/src/widgets/doc/src/external-resources.qdoc b/src/widgets/doc/src/external-resources.qdoc
index 96117546a29..0eccc3b19d4 100644
--- a/src/widgets/doc/src/external-resources.qdoc
+++ b/src/widgets/doc/src/external-resources.qdoc
@@ -1,12 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
-
-/*!
- \externalpage http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/index.html
- \title Apple Human Interface Guidelines
-*/
-
/*!
\externalpage https://rk.nvg.ntnu.no/sinclair/computers/zxspectrum/zxspectrum.htm
\title Sinclair Spectrum
diff --git a/src/widgets/kernel/qtooltip.cpp b/src/widgets/kernel/qtooltip.cpp
index 3417d93d587..97332cd7d5d 100644
--- a/src/widgets/kernel/qtooltip.cpp
+++ b/src/widgets/kernel/qtooltip.cpp
@@ -6,15 +6,12 @@
#include <qapplication.h>
#include <qevent.h>
-#include <qpointer.h>
#include <qstyle.h>
#include <qstyleoption.h>
#include <qstylepainter.h>
#if QT_CONFIG(effects)
#include <private/qeffects_p.h>
#endif
-#include <qtextdocument.h>
-#include <qdebug.h>
#include <qpa/qplatformscreen.h>
#include <qpa/qplatformcursor.h>
#if QT_CONFIG(style_stylesheet)
@@ -23,12 +20,9 @@
#include <qpa/qplatformwindow.h>
#include <qpa/qplatformwindow_p.h>
-#include <qlabel.h>
#include <QtWidgets/private/qlabel_p.h>
#include <QtGui/private/qhighdpiscaling_p.h>
#include <qtooltip.h>
-
-#include <QtCore/qbasictimer.h>
#include <QtWidgets/private/qtooltip_p.h>
QT_BEGIN_NAMESPACE
@@ -190,10 +184,10 @@ void QTipLabel::resizeEvent(QResizeEvent *e)
void QTipLabel::mouseMoveEvent(QMouseEvent *e)
{
if (!rect.isNull()) {
- QPoint pos = e->globalPosition().toPoint();
+ QPointF pos = e->globalPosition();
if (widget)
pos = widget->mapFromGlobal(pos);
- if (!rect.contains(pos))
+ if (!rect.contains(pos.toPoint()))
hideTip();
}
QLabel::mouseMoveEvent(e);
diff --git a/src/widgets/styles/qcommonstyle.cpp b/src/widgets/styles/qcommonstyle.cpp
index 90c1cfb4b86..592b70ef8ba 100644
--- a/src/widgets/styles/qcommonstyle.cpp
+++ b/src/widgets/styles/qcommonstyle.cpp
@@ -1994,12 +1994,9 @@ void QCommonStyle::drawControl(ControlElement element, const QStyleOption *opt,
tr = proxy()->subElementRect(SE_TabBarTabText, opt, widget);
if (!tab->icon.isNull()) {
- QPixmap tabIcon = tab->icon.pixmap(tab->iconSize, QStyleHelper::getDpr(p),
- (tab->state & State_Enabled) ? QIcon::Normal
- : QIcon::Disabled,
- (tab->state & State_Selected) ? QIcon::On
- : QIcon::Off);
- p->drawPixmap(iconRect.x(), iconRect.y(), tabIcon);
+ const auto mode = (tab->state & State_Enabled) ? QIcon::Normal : QIcon::Disabled;
+ const auto state = (tab->state & State_Selected) ? QIcon::On : QIcon::Off;
+ tab->icon.paint(p, iconRect, Qt::AlignCenter, mode, state);
}
proxy()->drawItemText(p, tr, alignment, tab->palette, tab->state & State_Enabled, tab->text,
diff --git a/src/xml/doc/src/external-resources.qdoc b/src/xml/doc/src/external-resources.qdoc
index 89c30a84c47..89552477ae8 100644
--- a/src/xml/doc/src/external-resources.qdoc
+++ b/src/xml/doc/src/external-resources.qdoc
@@ -1,17 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GFDL-1.3-no-invariants-only
-
-/*!
- \externalpage http://www.w3.org/2000/xmlns/
- \title http://www.w3.org/2000/xmlns/
-*/
-
-/*!
- \externalpage http://www.saxproject.org/
- \title SAX2 Java interface
-*/
-
/*!
\externalpage http://www.w3.org/TR/DOM-Level-2-Core/
\title W3C DOM Level 2
diff --git a/tests/auto/CMakeLists.txt b/tests/auto/CMakeLists.txt
index ac8aece707b..7dd9340f51b 100644
--- a/tests/auto/CMakeLists.txt
+++ b/tests/auto/CMakeLists.txt
@@ -4,6 +4,9 @@
# Order by dependency [*], then alphabetic. [*] If bugs in part A of
# our source would break tests of part B, then test A before B.
+
+add_subdirectory(util/testrunner)
+
set(run_dbus_tests OFF)
if (QT_FEATURE_dbus)
set(run_dbus_tests ON)
diff --git a/tests/auto/cmake/mockplugins/.cmake.conf b/tests/auto/cmake/mockplugins/.cmake.conf
index be788d10f8e..846c4f3b923 100644
--- a/tests/auto/cmake/mockplugins/.cmake.conf
+++ b/tests/auto/cmake/mockplugins/.cmake.conf
@@ -1 +1 @@
-set(QT_REPO_MODULE_VERSION "6.11.0")
+set(QT_REPO_MODULE_VERSION "6.12.0")
diff --git a/tests/auto/cmake/test_generating_cpp_exports/.cmake.conf b/tests/auto/cmake/test_generating_cpp_exports/.cmake.conf
index be788d10f8e..846c4f3b923 100644
--- a/tests/auto/cmake/test_generating_cpp_exports/.cmake.conf
+++ b/tests/auto/cmake/test_generating_cpp_exports/.cmake.conf
@@ -1 +1 @@
-set(QT_REPO_MODULE_VERSION "6.11.0")
+set(QT_REPO_MODULE_VERSION "6.12.0")
diff --git a/tests/auto/cmake/test_static_resources/.cmake.conf b/tests/auto/cmake/test_static_resources/.cmake.conf
index be788d10f8e..846c4f3b923 100644
--- a/tests/auto/cmake/test_static_resources/.cmake.conf
+++ b/tests/auto/cmake/test_static_resources/.cmake.conf
@@ -1 +1 @@
-set(QT_REPO_MODULE_VERSION "6.11.0")
+set(QT_REPO_MODULE_VERSION "6.12.0")
diff --git a/tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp b/tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp
index ef4a535dcac..29e26f99bdd 100644
--- a/tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp
+++ b/tests/auto/corelib/itemmodels/qrangemodeladapter/tst_qrangemodeladapter.cpp
@@ -220,8 +220,8 @@ API_TEST(moveRows, moveRows(0, 0, 0))
API_TEST(moveTreeRows, moveRows(QList<int>{0, 0}, 0, QList<int>{0, 0}))
API_TEST(insertColumn, insertColumn(0))
-API_TEST(insertColumnWithData, insertColumn(0, {}))
-API_TEST(insertColumns, insertColumns(0, std::declval<Range&>()))
+API_TEST(insertColumnWithData, insertColumn(0, QList<int>{0}))
+API_TEST(insertColumns, insertColumns(0, QList<int>{0}))
API_TEST(removeColumn, removeColumn(0))
API_TEST(removeColumns, removeColumns(0, 0))
API_TEST(moveColumn, moveColumn(0, 0))
@@ -849,7 +849,7 @@ void tst_QRangeModelAdapter::insertColumn_API()
static_assert(has_insertColumnWithData(d.tableOfNumbers));
static_assert(!has_insertColumnWithData(d.constTableOfNumbers));
- static_assert(has_insertColumnWithData(d.tableOfPointers));
+ static_assert(!has_insertColumnWithData(d.tableOfPointers));
}
void tst_QRangeModelAdapter::insertColumns_API()
@@ -863,7 +863,7 @@ void tst_QRangeModelAdapter::insertColumns_API()
static_assert(has_insertColumns(d.tableOfNumbers));
static_assert(!has_insertColumns(d.constTableOfNumbers));
- static_assert(has_insertColumns(d.tableOfPointers));
+ static_assert(!has_insertColumns(d.tableOfPointers));
static_assert(!has_insertColumns(d.tableOfRowPointers));
static_assert(!has_insertColumns(d.listOfNamedRoles));
static_assert(!has_insertColumns(d.m_tree));
diff --git a/tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp b/tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp
index 86dfa5faffc..4c089091f8d 100644
--- a/tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp
+++ b/tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp
@@ -57,6 +57,7 @@ private slots:
void multipleReadersLoop();
void multipleWritersLoop();
void multipleReadersWritersLoop();
+ void heavyLoadLocks();
void countingTest();
void limitedReaders();
void deleteOnUnlock();
@@ -603,6 +604,111 @@ public:
}
};
+class HeavyLoadLockThread : public QThread
+{
+public:
+ QReadWriteLock &testRwlock;
+ const qsizetype iterations;
+ const int numThreads;
+ inline HeavyLoadLockThread(QReadWriteLock &l, qsizetype iters, int numThreads, QVector<QAtomicInt *> &counters):
+ testRwlock(l),
+ iterations(iters),
+ numThreads(numThreads),
+ counters(counters)
+ { }
+
+private:
+ QVector<QAtomicInt *> &counters;
+ QAtomicInt *getCounter(qsizetype index)
+ {
+ QReadLocker locker(&testRwlock);
+ /*
+ The index is increased monotonically, so the index
+ being requested should be always within or at the end of the
+ counters vector.
+ */
+ Q_ASSERT(index <= counters.size());
+ if (counters.size() <= index || counters[index] == nullptr) {
+ locker.unlock();
+ QWriteLocker wlocker(&testRwlock);
+ if (counters.size() <= index)
+ counters.resize(index + 1, nullptr);
+ if (counters[index] == nullptr)
+ counters[index] = new QAtomicInt(0);
+ return counters[index];
+ }
+ return counters[index];
+ }
+ void releaseCounter(qsizetype index)
+ {
+ QWriteLocker locker(&testRwlock);
+ delete counters[index];
+ counters[index] = nullptr;
+ }
+
+public:
+ void run() override
+ {
+ for (qsizetype i = 0; i < iterations; ++i) {
+ QAtomicInt *counter = getCounter(i);
+ /*
+ Here each counter is accessed by each thread
+ and increaed only once. As a result, when the
+ counter reaches numThreads, i.e. the fetched
+ value before the increment is numThreads-1,
+ we know all threads have accessed this counter
+ and we can delete it safely.
+ */
+ int prev = counter->fetchAndAddRelaxed(1);
+ if (prev == numThreads - 1) {
+#ifdef QT_BUILDING_UNDER_TSAN
+ /*
+ Under TSAN, deleting and freeing an object
+ will trigger a write operation on the memory
+ of the object. Since we used fetchAndAddRelaxed
+ to update the counter, TSAN will report a data
+ race when deleting the counter here. To avoid
+ the false positive, we simply reset the counter
+ to 0 here, with ordered semantics to establish
+ the sequence to ensure the the free-ing option
+ happens after all fetchAndAddRelaxed operations
+ in other threads.
+
+ When not building under TSAN, deleting the counter
+ will not result in any data read or written to the
+ memory region of the counter, so no data race will
+ happen.
+ */
+ counter->fetchAndStoreOrdered(0);
+#endif
+ releaseCounter(i);
+ }
+ }
+ }
+};
+
+/*
+ Multiple threads racing acquiring and releasing
+ locks on the same indices.
+*/
+
+void tst_QReadWriteLock::heavyLoadLocks()
+{
+ constexpr qsizetype iterations = 65536 * 4;
+ constexpr int numThreads = 8;
+ QVector<QAtomicInt *> counters;
+ QReadWriteLock testLock;
+ std::array<std::unique_ptr<HeavyLoadLockThread>, numThreads> threads;
+ for (auto &thread : threads)
+ thread = std::make_unique<HeavyLoadLockThread>(testLock, iterations, numThreads, counters);
+ for (auto &thread : threads)
+ thread->start();
+ for (auto &thread : threads)
+ thread->wait();
+ QVERIFY(counters.size() == iterations);
+ for (qsizetype i = 0; i < iterations; ++i)
+ QVERIFY(counters[i] == nullptr);
+}
/*
A writer acquires a read-lock, a reader locks
diff --git a/tests/auto/network/access/qhttp2connection/tst_qhttp2connection.cpp b/tests/auto/network/access/qhttp2connection/tst_qhttp2connection.cpp
index 417655c31d9..22aa9d44262 100644
--- a/tests/auto/network/access/qhttp2connection/tst_qhttp2connection.cpp
+++ b/tests/auto/network/access/qhttp2connection/tst_qhttp2connection.cpp
@@ -21,6 +21,8 @@ class tst_QHttp2Connection : public QObject
private slots:
void construct();
void constructStream();
+ void streamConfiguration_data();
+ void streamConfiguration();
void testSETTINGSFrame();
void maxHeaderTableSize();
void testPING();
@@ -204,6 +206,59 @@ void tst_QHttp2Connection::constructStream()
QCOMPARE(stream->isUploadingDATA(), false);
}
+void tst_QHttp2Connection::streamConfiguration_data()
+{
+ QTest::addColumn<bool>("useDownloadBuffer");
+
+ QTest::addRow("useDownloadBuffer=true") << true;
+ QTest::addRow("useDownloadBuffer=false") << false;
+}
+
+void tst_QHttp2Connection::streamConfiguration()
+{
+ QFETCH(const bool, useDownloadBuffer);
+
+ auto [client, server] = makeFakeConnectedSockets();
+ auto *clientConnection = makeHttp2Connection(client.get(), {}, Client);
+ auto *serverConnection = makeHttp2Connection(server.get(), {}, Server);
+
+ QHttp2Stream::Configuration config;
+ config.useDownloadBuffer = useDownloadBuffer;
+
+ QHttp2Stream *clientStream = clientConnection->createStream(config).unwrap();
+ QVERIFY(clientStream);
+ QCOMPARE(clientStream->configuration().useDownloadBuffer, useDownloadBuffer);
+ QVERIFY(waitForSettingsExchange(clientConnection, serverConnection));
+
+ QSignalSpy newIncomingStreamSpy{ serverConnection, &QHttp2Connection::newIncomingStream };
+ QSignalSpy clientDataReceivedSpy{ clientStream, &QHttp2Stream::dataReceived };
+
+ HPack::HttpHeader headers = getRequiredHeaders();
+ clientStream->sendHEADERS(headers, false);
+
+ QVERIFY(newIncomingStreamSpy.wait());
+ auto *serverStream = newIncomingStreamSpy.front().front().value<QHttp2Stream *>();
+ QVERIFY(serverStream);
+
+ const HPack::HttpHeader responseHeaders{ { ":status", "200" } };
+ serverStream->sendHEADERS(responseHeaders, false);
+
+ const QByteArray testData = "Hello World"_ba.repeated(100);
+ serverStream->sendDATA(testData, true);
+
+ QVERIFY(clientDataReceivedSpy.wait());
+ QCOMPARE(clientDataReceivedSpy.count(), 1);
+
+ const QByteArray receivedData = clientDataReceivedSpy.front().front().value<QByteArray>();
+ QCOMPARE(receivedData, testData);
+
+ if (useDownloadBuffer) {
+ QCOMPARE(clientStream->downloadBuffer().byteAmount(), testData.size());
+ } else {
+ QVERIFY(clientStream->downloadBuffer().isEmpty());
+ }
+}
+
void tst_QHttp2Connection::testSETTINGSFrame()
{
constexpr qint32 PrefaceLength = 24;
diff --git a/tests/auto/tools/rcc/data/legal/rcc_legal.cpp b/tests/auto/tools/rcc/data/legal/rcc_legal.cpp
index 248ab2e3b48..96f87d192e7 100644
--- a/tests/auto/tools/rcc/data/legal/rcc_legal.cpp
+++ b/tests/auto/tools/rcc/data/legal/rcc_legal.cpp
@@ -3,7 +3,7 @@
** Copyright (C) 2024 Intel Corporation.
** SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
**
-** Created by: The Resource Compiler for Qt version 6.11.0
+** Created by: The Resource Compiler for Qt version 6.12.0
**
** WARNING! All changes made in this file will be lost!
*****************************************************************************/
diff --git a/tests/auto/util/testrunner/CMakeLists.txt b/tests/auto/util/testrunner/CMakeLists.txt
new file mode 100644
index 00000000000..5ca8406f854
--- /dev/null
+++ b/tests/auto/util/testrunner/CMakeLists.txt
@@ -0,0 +1,14 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+
+# Run the qt-testrunner test only inside the CI.
+if(DEFINED ENV{COIN_UNIQUE_JOB_ID} AND NOT IOS)
+ qt_internal_create_test_script(
+ NAME tst_qt_testrunner
+ COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/tst_qt_testrunner.py" ARGS -v
+ WORKING_DIRECTORY "${test_working_dir}"
+ OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/tst_qt_testrunner_Wrapper$<CONFIG>.cmake"
+ ENVIRONMENT "TESTRUNNER" ""
+ )
+endif()
diff --git a/util/testrunner/tests/qt_mock_test-log.xml b/tests/auto/util/testrunner/qt_mock_test-log.xml
index a164bec9f9c..a164bec9f9c 100644
--- a/util/testrunner/tests/qt_mock_test-log.xml
+++ b/tests/auto/util/testrunner/qt_mock_test-log.xml
diff --git a/util/testrunner/tests/qt_mock_test.py b/tests/auto/util/testrunner/qt_mock_test.py
index eb6e33727f8..af8fdf24509 100755
--- a/util/testrunner/tests/qt_mock_test.py
+++ b/tests/auto/util/testrunner/qt_mock_test.py
@@ -42,7 +42,7 @@
import sys
import os
import traceback
-from tst_testrunner import write_xml_log
+from tst_qt_testrunner import write_xml_log
MY_NAME = os.path.basename(sys.argv[0])
@@ -106,6 +106,15 @@ def log_test(testcase, result,
testsuite=MY_NAME.rpartition(".")[0]):
print("%-7s: %s::%s()" % (result, testsuite, testcase))
+def log_xml(fail_list):
+ if XML_OUTPUT_FILE and XML_TEMPLATE is not None:
+ if XML_TEMPLATE == "":
+ # If the template is an empty file, then write an empty output file
+ with open(XML_OUTPUT_FILE, "w"):
+ pass
+ else:
+ write_xml_log(XML_OUTPUT_FILE, failure=fail_list)
+
# Return the exit code
def run_test(testname):
if testname == "initTestCase":
@@ -159,13 +168,7 @@ def no_args_run():
fail_list.append(test)
total_result = total_result and (test_exit_code == 0)
- if XML_OUTPUT_FILE:
- if XML_TEMPLATE:
- write_xml_log(XML_OUTPUT_FILE, failure=fail_list)
- # If the template is an empty file, then write an empty output file
- elif XML_TEMPLATE == "":
- with open(XML_OUTPUT_FILE, "w"):
- pass
+ log_xml(fail_list)
if CRASH_CLEANLY:
# Crash despite all going well and writing all output files cleanly.
@@ -198,8 +201,14 @@ def main():
if len(args) == 0:
no_args_run()
assert False, "Unreachable!"
- else:
- sys.exit(run_test(args[0]))
+ else: # run single test function
+ exit_code = run_test(args[0])
+ # Write "fail" in the XML log only if the specific run has failed.
+ if exit_code != 0:
+ log_xml([args[0]])
+ else:
+ log_xml([])
+ sys.exit(exit_code)
# TODO write XPASS test that does exit(1)
diff --git a/util/testrunner/tests/tst_testrunner.py b/tests/auto/util/testrunner/tst_qt_testrunner.py
index 79aa0a824fc..1134fa0427f 100755
--- a/util/testrunner/tests/tst_testrunner.py
+++ b/tests/auto/util/testrunner/tst_qt_testrunner.py
@@ -14,7 +14,8 @@ from tempfile import TemporaryDirectory, mkstemp
MY_NAME = os.path.basename(__file__)
my_dir = os.path.dirname(__file__)
-testrunner = os.path.join(my_dir, "..", "qt-testrunner.py")
+testrunner = os.path.join(my_dir, "..", "..", "..", "..",
+ "util", "testrunner", "qt-testrunner.py")
mock_test = os.path.join(my_dir, "qt_mock_test.py")
xml_log_template = os.path.join(my_dir, "qt_mock_test-log.xml")
@@ -26,7 +27,7 @@ import unittest
def setUpModule():
global TEMPDIR
- TEMPDIR = TemporaryDirectory(prefix="tst_testrunner-")
+ TEMPDIR = TemporaryDirectory(prefix="tst_qt_testrunner-")
global EMPTY_FILE
EMPTY_FILE = os.path.join(TEMPDIR.name, "EMPTY")
@@ -40,6 +41,7 @@ def setUpModule():
os.environ["QT_MOCK_TEST_STATE_FILE"] = filename
os.environ["QT_MOCK_TEST_XML_TEMPLATE_FILE"] = xml_log_template
+ os.environ["QT_TESTRUNNER_TESTING"] = "1"
def tearDownModule():
print("\ntearDownModule(): Cleaning up temporary directory:",
@@ -49,22 +51,32 @@ def tearDownModule():
# Helper to run a command and always capture output
-def run(*args, **kwargs):
+def run(args : list, **kwargs):
+ if args[0].endswith(".py"):
+ # Make sure we run python executables with the same python version.
+ # It also helps on Windows, that .py files are not directly executable.
+ args = [ sys.executable, *args ]
if DEBUG:
print("Running: ", args, flush=True)
- proc = subprocess.run(*args, stdout=PIPE, stderr=STDOUT, **kwargs)
+ proc = subprocess.run(args, stdout=PIPE, stderr=STDOUT, **kwargs)
if DEBUG and proc.stdout:
print(proc.stdout.decode(), flush=True)
return proc
# Helper to run qt-testrunner.py with proper testing arguments.
-def run_testrunner(xml_filename=None, testrunner_args=None,
+# Always append --log-dir=TEMPDIR unless specifically told not to.
+def run_testrunner(xml_filename=None, log_dir=None,
+ testrunner_args=None,
wrapper_script=None, wrapper_args=None,
qttest_args=None, env=None):
args = [ testrunner ]
if xml_filename:
args += [ "--parse-xml-testlog", xml_filename ]
+ if log_dir == None:
+ args += [ "--log-dir", TEMPDIR.name ]
+ elif log_dir != "":
+ args += [ "--log-dir", log_dir ]
if testrunner_args:
args += testrunner_args
@@ -156,7 +168,7 @@ class Test_qt_mock_test(unittest.TestCase):
# Test it will write an empty XML file if template is empty
def test_empty_xml_file_is_written(self):
my_env = {
- "QT_MOCK_TEST_STATE_FILE": os.environ["QT_MOCK_TEST_STATE_FILE"],
+ **os.environ,
"QT_MOCK_TEST_XML_TEMPLATE_FILE": EMPTY_FILE
}
filename = os.path.join(TEMPDIR.name, "testlog.xml")
@@ -167,13 +179,26 @@ class Test_qt_mock_test(unittest.TestCase):
self.assertEqual(os.path.getsize(filename), 0)
os.remove(filename)
def test_crash_cleanly(self):
- proc = run(mock_test,
- env= os.environ | {"QT_MOCK_TEST_CRASH_CLEANLY":"1"} )
+ proc = run([mock_test],
+ env={ **os.environ, "QT_MOCK_TEST_CRASH_CLEANLY":"1" })
if DEBUG:
print("returncode:", proc.returncode)
self.assertProcessCrashed(proc)
+# Find in @path, files that start with @testname and end with @pattern,
+# where @pattern is a glob-like string.
+def find_test_logs(testname=None, path=None, pattern="-*[0-9].xml"):
+ if testname is None:
+ testname = os.path.basename(mock_test)
+ if path is None:
+ path = TEMPDIR.name
+ pattern = os.path.join(path, testname + pattern)
+ logfiles = glob.glob(pattern)
+ if DEBUG:
+ print(f"Test ({testname}) logfiles found: ", logfiles)
+ return logfiles
+
# Test regular invocations of qt-testrunner.
class Test_testrunner(unittest.TestCase):
def setUp(self):
@@ -181,14 +206,11 @@ class Test_testrunner(unittest.TestCase):
if os.path.exists(state_file):
os.remove(state_file)
# The mock_test honors only the XML output arguments, the rest are ignored.
- old_logfiles = glob.glob(os.path.basename(mock_test) + "*.xml",
- root_dir=TEMPDIR.name)
+ old_logfiles = find_test_logs(pattern="*.xml")
for fname in old_logfiles:
os.remove(os.path.join(TEMPDIR.name, fname))
- self.env = dict()
- self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"] = os.environ["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
- self.env["QT_MOCK_TEST_STATE_FILE"] = state_file
- self.testrunner_args = [ "--log-dir", TEMPDIR.name ]
+ self.env = dict(os.environ)
+ self.testrunner_args = []
def prepare_env(self, run_list=None):
if run_list is not None:
self.env['QT_MOCK_TEST_RUN_LIST'] = ",".join(run_list)
@@ -205,11 +227,7 @@ class Test_testrunner(unittest.TestCase):
self.assertEqual(proc.returncode, 0)
def test_output_files_are_generated(self):
proc = self.run2()
- xml_output_files = glob.glob(os.path.basename(mock_test) + "-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("Output files found: ",
- xml_output_files)
+ xml_output_files = find_test_logs()
self.assertEqual(len(xml_output_files), 1)
def test_always_fail(self):
self.prepare_env(run_list=["always_fail"])
@@ -242,9 +260,33 @@ class Test_testrunner(unittest.TestCase):
proc = self.run2()
self.assertEqual(proc.returncode, 3)
+ # By testing --no-extra-args, we ensure qt-testrunner works for
+ # tst_selftests and the other NON_XML_GENERATING_TESTS.
+ def test_no_extra_args_pass(self):
+ self.testrunner_args += ["--no-extra-args"]
+ proc = self.run2()
+ self.assertEqual(proc.returncode, 0)
+ def test_no_extra_args_fail(self):
+ self.prepare_env(run_list=["always_fail"])
+ self.testrunner_args += ["--no-extra-args"]
+ proc = self.run2()
+ self.assertEqual(proc.returncode, 3)
+ def test_no_extra_args_reruns_only_once_1(self):
+ self.prepare_env(run_list=["fail_then_pass:1"])
+ self.testrunner_args += ["--no-extra-args"]
+ proc = self.run2()
+ # The 1st rerun PASSed.
+ self.assertEqual(proc.returncode, 0)
+ def test_no_extra_args_reruns_only_once_2(self):
+ self.prepare_env(run_list=["fail_then_pass:2"])
+ self.testrunner_args += ["--no-extra-args"]
+ proc = self.run2()
+ # We never re-run more than once, so the exit code shows FAIL.
+ self.assertEqual(proc.returncode, 3)
+
# If no XML file is found by qt-testrunner, it is usually considered a
# CRASH and the whole test is re-run. Even when the return code is zero.
- # It is a PASS only if the test is not capable of XML output (see no_extra_args, TODO test it).
+ # It is a PASS only if the test is not capable of XML output (see no_extra_args above).
def test_no_xml_log_written_pass_crash(self):
del self.env["QT_MOCK_TEST_XML_TEMPLATE_FILE"]
self.prepare_env(run_list=["always_pass"])
@@ -379,10 +421,7 @@ class Test_testrunner(unittest.TestCase):
self.assertEqual(proc.returncode, 3)
# Verify that a full executable re-run happened that re-runs 2 times,
# instead of individual functions that re-run 5 times.
- xml_output_files = glob.glob(os.path.basename(mock_test) + "-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
+ xml_output_files = find_test_logs()
self.assertEqual(len(xml_output_files), 2)
# Test that qt-testrunner detects the correct executable name even if we
@@ -391,13 +430,9 @@ class Test_testrunner(unittest.TestCase):
def test_wrapper(self):
self.create_wrapper("coin_vxworks_qemu_runner.sh")
proc = run_testrunner(wrapper_script=self.wrapper_script,
- testrunner_args=["--log-dir",TEMPDIR.name],
env=self.env)
self.assertEqual(proc.returncode, 0)
- xml_output_files = glob.glob(os.path.basename(mock_test) + "-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
+ xml_output_files = find_test_logs()
self.assertEqual(len(xml_output_files), 1)
# The "androidtestrunner" wrapper is special. It expects the QTest arguments after "--".
@@ -421,45 +456,36 @@ class Test_testrunner(unittest.TestCase):
'--bundletool', '/opt/bundletool/bundletool', '--timeout', '1425'
]
# In COIN CI, TESTRUNNER="qt-testrunner.py --". That's why we append "--".
- proc = run_testrunner(testrunner_args=["--log-dir", TEMPDIR.name, "--"],
+ proc = run_testrunner(testrunner_args=["--"],
wrapper_script=self.wrapper_script,
wrapper_args=androidtestrunner_args,
env=self.env)
self.assertEqual(proc.returncode, 0)
- xml_output_files = glob.glob("tst_qquickpopup-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
+ xml_output_files = find_test_logs("tst_qquickpopup")
self.assertEqual(len(xml_output_files), 1)
# similar to above but with "--apk"
@unittest.skipUnless(os.name == "posix", "Wrapper script needs POSIX shell")
def test_androidtestrunner_with_apk(self):
self.create_mock_anroidtestrunner_wrapper()
androidtestrunner_args= ['--blah', '--apk', '/whatever/waza.apk', 'blue']
- proc = run_testrunner(testrunner_args=["--log-dir", TEMPDIR.name, "--"],
+ proc = run_testrunner(testrunner_args=["--"],
wrapper_script=self.wrapper_script,
wrapper_args=androidtestrunner_args,
env=self.env)
self.assertEqual(proc.returncode, 0)
- xml_output_files = glob.glob("waza-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
+ xml_output_files = find_test_logs("waza")
self.assertEqual(len(xml_output_files), 1)
# similar to above but with neither "--apk" nor "--aab". qt-testrunner throws error.
@unittest.skipUnless(os.name == "posix", "Wrapper script needs POSIX shell")
def test_androidtestrunner_fail_to_detect_filename(self):
self.create_mock_anroidtestrunner_wrapper()
androidtestrunner_args= ['--blah', '--argh', '/whatever/waza.apk', 'waza.aab']
- proc = run_testrunner(testrunner_args=["--log-dir", TEMPDIR.name, "--"],
+ proc = run_testrunner(testrunner_args=["--"],
wrapper_script=self.wrapper_script,
wrapper_args=androidtestrunner_args,
env=self.env)
self.assertEqual(proc.returncode, 1)
- xml_output_files = glob.glob("waza-*[0-9].xml",
- root_dir=TEMPDIR.name)
- if DEBUG:
- print("XML output files found: ", xml_output_files)
+ xml_output_files = find_test_logs("waza")
self.assertEqual(len(xml_output_files), 0)
@@ -483,28 +509,32 @@ class Test_testrunner_with_xml_logfile(unittest.TestCase):
(_handle, self.xml_file) = mkstemp(
suffix=".xml", prefix="qt_mock_test-log-",
dir=TEMPDIR.name)
+ os.close(_handle)
if os.path.exists(os.environ["QT_MOCK_TEST_STATE_FILE"]):
os.remove(os.environ["QT_MOCK_TEST_STATE_FILE"])
def tearDown(self):
os.remove(self.xml_file)
del self.xml_file
+ # Run testrunner specifically for the tests here, with --parse-xml-testlog.
+ def run3(self, testrunner_args=None):
+ return run_testrunner(self.xml_file,
+ testrunner_args=testrunner_args)
def test_no_failure(self):
write_xml_log(self.xml_file, failure=None)
- proc = run_testrunner(self.xml_file)
+ proc = self.run3()
self.assertEqual(proc.returncode, 0)
def test_always_pass_failed(self):
write_xml_log(self.xml_file, failure="always_pass")
- proc = run_testrunner(self.xml_file)
+ proc = self.run3()
self.assertEqual(proc.returncode, 0)
def test_always_pass_failed_max_repeats_0(self):
write_xml_log(self.xml_file, failure="always_pass")
- proc = run_testrunner(self.xml_file,
- testrunner_args=["--max-repeats", "0"])
+ proc = self.run3(testrunner_args=["--max-repeats", "0"])
self.assertEqual(proc.returncode, 2)
def test_always_fail_failed(self):
write_xml_log(self.xml_file, failure="always_fail")
- proc = run_testrunner(self.xml_file)
+ proc = self.run3()
self.assertEqual(proc.returncode, 2)
# Assert that one of the re-runs was in verbose mode
matches = re.findall("VERBOSE RUN",
@@ -514,20 +544,20 @@ class Test_testrunner_with_xml_logfile(unittest.TestCase):
self.assertIn("QT_LOGGING_RULES", proc.stdout.decode())
def test_always_crash_crashed(self):
write_xml_log(self.xml_file, failure="always_crash")
- proc = run_testrunner(self.xml_file)
+ proc = self.run3()
self.assertEqual(proc.returncode, 3)
def test_fail_then_pass_2_failed(self):
write_xml_log(self.xml_file, failure="fail_then_pass:2")
- proc = run_testrunner(self.xml_file)
+ proc = self.run3()
self.assertEqual(proc.returncode, 0)
def test_fail_then_pass_5_failed(self):
write_xml_log(self.xml_file, failure="fail_then_pass:5")
- proc = run_testrunner(self.xml_file)
+ proc = self.run3()
self.assertEqual(proc.returncode, 2)
def test_with_two_failures(self):
write_xml_log(self.xml_file,
failure=["always_pass", "fail_then_pass:2"])
- proc = run_testrunner(self.xml_file)
+ proc = self.run3()
self.assertEqual(proc.returncode, 0)
# Check that test output is properly interleaved with qt-testrunner's logging.
matches = re.findall(r"(PASS|FAIL!).*\n.*Test process exited with code",
@@ -535,7 +565,7 @@ class Test_testrunner_with_xml_logfile(unittest.TestCase):
self.assertEqual(len(matches), 4)
def test_initTestCase_fail_crash(self):
write_xml_log(self.xml_file, failure="initTestCase")
- proc = run_testrunner(self.xml_file)
+ proc = self.run3()
self.assertEqual(proc.returncode, 3)
diff --git a/util/testrunner/README b/util/testrunner/README
index 5758e325140..cb6722ac807 100644
--- a/util/testrunner/README
+++ b/util/testrunner/README
@@ -15,10 +15,4 @@ It offers the following functionality
The script itself has a testsuite that is simply run by invoking
-qtbase/util/testrunner/tests/tst_testrunner.py
-
-Please *run this manually* before submitting a change to qt-testrunner and
-make sure it's passing. The reason it does not run automatically during the
-usual qtbase test run, is because
-+ the test run should not depend on Python
-+ we don't want to wrap the testrunner tests with testrunner.
+qtbase/tests/auto/util/testrunner/tst_qt_testrunner.py
diff --git a/util/testrunner/qt-testrunner.py b/util/testrunner/qt-testrunner.py
index 6437c3fe7f1..1573534cee9 100755
--- a/util/testrunner/qt-testrunner.py
+++ b/util/testrunner/qt-testrunner.py
@@ -4,10 +4,9 @@
# !!!IMPORTANT!!! If you change anything to this script, run the testsuite
-# manually and make sure it still passes, as it doesn't run automatically.
-# Just execute the command line as such:
+# and make sure it still passes:
#
-# ./util/testrunner/tests/tst_testrunner.py -v [--debug]
+# qtbase/tests/auto/util/testrunner/tst_qt_testrunner.py -v [--debug]
#
# ======== qt-testrunner ========
#
@@ -92,6 +91,8 @@ class WhatFailed(NamedTuple):
class ReRunCrash(Exception):
pass
+class BadXMLCrash(Exception):
+ pass
# In the last test re-run, we add special verbosity arguments, in an attempt
@@ -255,7 +256,7 @@ def parse_log(results_file) -> WhatFailed:
root = tree.getroot()
if root.tag != "TestCase":
- raise AssertionError(
+ raise BadXMLCrash(
f"The XML test log must have <TestCase> as root tag, but has: <{root.tag}>")
failures = []
@@ -299,6 +300,12 @@ def parse_log(results_file) -> WhatFailed:
def run_test(arg_list: List[str], **kwargs):
+ if (os.environ.get("QT_TESTRUNNER_TESTING", "0") == "1"
+ and os.name == "nt"
+ and arg_list[0].endswith(".py")
+ ):
+ # For executing qt_mock_test.py under the same Python interpreter when testing.
+ arg_list = [ sys.executable ] + arg_list
L.debug("Running test command line: %s", arg_list)
proc = subprocess.run(arg_list, **kwargs)
L.info("Test process exited with code: %d", proc.returncode)
@@ -380,8 +387,19 @@ def rerun_failed_testcase(test_basename, testargs: List[str], output_dir: str,
proc = run_test(testargs + output_args + VERBOSE_ARGS + [failed_arg],
timeout=timeout,
env={**os.environ, **VERBOSE_ENV})
+ # There are platforms that run tests wrapped with some test-runner
+ # script, that can possibly fail to extract a process exit code.
+ # Because of these cases, we *also* parse the XML file and signify
+ # CRASH in case of QFATAL/empty/corrupt result.
+ what_failed = parse_log(f"{pathname_stem}.xml")
+ if what_failed.qfatal_message:
+ raise ReRunCrash(f"CRASH! returncode:{proc.returncode} "
+ f"QFATAL:'{what_failed.qfatal_message}'")
if proc.returncode < 0 or proc.returncode >= 128:
raise ReRunCrash(f"CRASH! returncode:{proc.returncode}")
+ if proc.returncode == 0 and len(what_failed.failed_tests) > 0:
+ raise ReRunCrash("CRASH! returncode:0 but failures were found: "
+ + what_failed.failed_tests)
if proc.returncode == 0:
n_passes += 1
if n_passes == passes_needed:
@@ -451,6 +469,8 @@ def main():
assert len(failed_functions) > 0 and retcode != 0
break # all is fine, goto re-running individual failed testcases
+ except AssertionError:
+ raise
except Exception as e:
L.error("exception:%s %s", type(e).__name__, e)
L.error("The test executable probably crashed, see above for details")
@@ -466,9 +486,11 @@ def main():
ret = rerun_failed_testcase(args.test_basename, args.testargs, args.log_dir,
test_result, args.max_repeats, args.passes_needed,
dryrun=args.dry_run, timeout=args.timeout)
- except ReRunCrash as e:
+ except AssertionError:
+ raise
+ except Exception as e:
L.error("exception:%s", e)
- L.error("The testcase re-run crashed, giving up")
+ L.error("The testcase re-run probably crashed, giving up")
sys.exit(3) # Test re-run CRASH
if not ret: