diff options
58 files changed, 900 insertions, 138 deletions
diff --git a/doc/global/externalsites/external-resources.qdoc b/doc/global/externalsites/external-resources.qdoc index cbb4345bcd..187c73da62 100644 --- a/doc/global/externalsites/external-resources.qdoc +++ b/doc/global/externalsites/external-resources.qdoc @@ -25,6 +25,22 @@ ** ****************************************************************************/ /*! + \externalpage https://source.android.com/setup/start/build-numbers + \title Android: Build Numbers +*/ +/*! + \externalpage https://developer.android.com/guide/topics/manifest/uses-feature-element + \title Android: <uses-feature> +*/ +/*! + \externalpage https://developer.android.com/guide/topics/manifest/uses-permission-element + \title Android: <uses-permission> +*/ +/*! + \externalpage https://developer.android.com/studio/publish/versioning#appversioning + \title Android: App Versioning +*/ +/*! \externalpage http://www.freedesktop.org/ \title freedesktop.org */ diff --git a/mkspecs/common/ghs-integrity-armv8.conf b/mkspecs/common/ghs-integrity-armv8.conf index e454cfd245..ac30b6c7af 100644 --- a/mkspecs/common/ghs-integrity-armv8.conf +++ b/mkspecs/common/ghs-integrity-armv8.conf @@ -17,8 +17,16 @@ os_directory = $$(INTEGRITY_DIR) isEmpty(os_directory): \ error("This qmakespec requires $INTEGRITY_DIR to be set") -QMAKE_CC = cxintarm64 -bsp $$bsp_name -os_dir $$os_directory -non_shared -QMAKE_CXX = cxintarm64 -bsp $$bsp_name -os_dir $$os_directory -non_shared +iy_build_target = $$(INTEGRITY_BUILD_TARGET) +isEmpty(iy_build_target): \ + message("This qmakespec requires $INTEGRITY_BUILD_TARGET to be set [dbg|rel|chk|cov] for Integrity versions 11.7.6 and higher") + +start_name = $$(INTEGRITY_DIR)/libs/$$(INTEGRITY_BSP)/$$(INTEGRITY_BUILD_TARGET) +rtos_name= libs/$$(INTEGRITY_BSP)/$$(INTEGRITY_BUILD_TARGET) + +QMAKE_CC = cxintarm64 -bsp $$bsp_name -os_dir $$os_directory -non_shared -startfile_dir=$$start_name --rtos_library_directory=$$rtos_name --rtos_library_directory=libs/arm64/$$iy_build_target +QMAKE_CXX = cxintarm64 -bsp $$bsp_name -os_dir $$os_directory -non_shared -startfile_dir=$$start_name --rtos_library_directory=$$rtos_name --rtos_library_directory=libs/arm64/$$iy_build_target + QMAKE_LINK = $$QMAKE_CXX QMAKE_AR = $$QMAKE_CXX -archive -o diff --git a/mkspecs/devices/integrity-armv8-SA8155P/qmake.conf b/mkspecs/devices/integrity-armv8-SA8155P/qmake.conf new file mode 100644 index 0000000000..892619cb37 --- /dev/null +++ b/mkspecs/devices/integrity-armv8-SA8155P/qmake.conf @@ -0,0 +1,43 @@ +# +# qmake configuration for INTEGRITY Qualcomm SA8155P ADP +# + +load(device_config) + +include(../../common/ghs-integrity-armv8.conf) + +QT_QPA_DEFAULT_PLATFORM = eglfs +EGLFS_DEVICE_INTEGRATION = eglfs_openwfd + +qc_multimedia_inc_directory = $$(QC_MULTIMEDIA_INC_DIR) +isEmpty(qc_multimedia_inc_directory): \ + error("This makespec requires the environment variable QC_MULTIMEDIA_INC_DIR to be set.") + +QMAKE_INCDIR += $$(QC_MULTIMEDIA_INC_DIR) + +QMAKE_LIBS_EGL += -lESXEGL_Adreno -lESXGLESv2_Adreno -ladreno_utils -lGSLUser -lOSUser -lpanel -livfs -lposix -lpmem -ltzbsp -lpaged_alloc -lglnext-llvm -lopenwfd -lplanedef -llogger -lnet -lsocket -lrfs_client -lshm_client -lmmosalrfs -lmmosalfile -lOSAbstraction + +QMAKE_LIBS_OPENGL_ES2 += $${QMAKE_LIBS_EGL} + +QMAKE_CFLAGS += -DINTEGRITY +QMAKE_CXXFLAGS += -DINTEGRITY + +QMAKE_CFLAGS += -bigswitch +QMAKE_CXXFLAGS += -bigswitch +QMAKE_LFLAGS += -bigswitch + +dirs = $$(GL_INC_DIR) +isEmpty(dirs): \ + error("This makespec requires the environment variable GL_INC_DIR to be set.") + +QMAKE_INCDIR_EGL = $$split(dirs, $$QMAKE_DIRLIST_SEP) +QMAKE_INCDIR_OPENGL_ES2 = $$QMAKE_INCDIR_EGL + +dirs = $$(GL_LIB_DIR) +isEmpty(dirs): \ + error("This makespec requires the environment variable GL_LIB_DIR to be set.") + +QMAKE_LIBDIR_EGL = $$split(dirs, $$QMAKE_DIRLIST_SEP) +QMAKE_LIBDIR_OPENGL_ES2 = $$QMAKE_LIBDIR_EGL + +load(qt_config) diff --git a/mkspecs/devices/integrity-armv8-SA8155P/qplatformdefs.h b/mkspecs/devices/integrity-armv8-SA8155P/qplatformdefs.h new file mode 100644 index 0000000000..d9f2508152 --- /dev/null +++ b/mkspecs/devices/integrity-armv8-SA8155P/qplatformdefs.h @@ -0,0 +1,45 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the qmake spec of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QPLATFORMDEFS_H +#define QPLATFORMDEFS_H + +#include "../../common/integrity/qplatformdefs.h" + +#endif // QPLATFORMDEFS_H diff --git a/mkspecs/features/qt_common.prf b/mkspecs/features/qt_common.prf index ac24b03b6b..8df94aa4ee 100644 --- a/mkspecs/features/qt_common.prf +++ b/mkspecs/features/qt_common.prf @@ -25,7 +25,8 @@ qtConfig(stack-protector-strong): CONFIG += stack_protector_strong contains(TEMPLATE, .*lib) { # module and plugins unix:qtConfig(reduce_relocations): CONFIG += bsymbolic_functions - +} +contains(TEMPLATE, .*lib)|contains(TEMPLATE, aux) { !isEmpty(_QMAKE_SUPER_CACHE_): \ rplbase = $$dirname(_QMAKE_SUPER_CACHE_)/[^/][^/]* else: \ diff --git a/mkspecs/features/resolve_target.prf b/mkspecs/features/resolve_target.prf index a9fe0d76d6..1ef1dcfd1c 100644 --- a/mkspecs/features/resolve_target.prf +++ b/mkspecs/features/resolve_target.prf @@ -36,7 +36,11 @@ win32 { plugin_target = $$QMAKE_PLUGIN_BUNDLE_NAME else: \ plugin_target = $$TARGET - QMAKE_RESOLVED_BUNDLE = $${QMAKE_RESOLVED_TARGET}$${plugin_target}.plugin + isEmpty(QMAKE_BUNDLE_EXTENSION): \ + plugin_ext = .plugin + else: \ + plugin_ext = $$QMAKE_BUNDLE_EXTENSION + QMAKE_RESOLVED_BUNDLE = $${QMAKE_RESOLVED_TARGET}$${plugin_target}$${plugin_ext} !shallow_bundle: \ QMAKE_RESOLVED_TARGET = $${QMAKE_RESOLVED_BUNDLE}/Contents/MacOS/$${TARGET} else: \ @@ -46,7 +50,11 @@ win32 { framework_target = $$QMAKE_FRAMEWORK_BUNDLE_NAME else: \ framework_target = $$TARGET - QMAKE_RESOLVED_BUNDLE = $${QMAKE_RESOLVED_TARGET}$${framework_target}.framework + isEmpty(QMAKE_BUNDLE_EXTENSION): \ + framework_ext = .framework + else: \ + framework_ext = $$QMAKE_BUNDLE_EXTENSION + QMAKE_RESOLVED_BUNDLE = $${QMAKE_RESOLVED_TARGET}$${framework_target}$${framework_ext} !shallow_bundle { TEMP_VERSION = $$section(VERSION, ., 0, 0) isEmpty(TEMP_VERSION):TEMP_VERSION = A diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc index c90092059f..574722d08a 100644 --- a/qmake/doc/src/qmake-manual.qdoc +++ b/qmake/doc/src/qmake-manual.qdoc @@ -905,6 +905,187 @@ to specify a list of libraries that each project needs to link against, and \c QMAKE_LIBS_X11 would be used to extend this list. + \target ANDROID_ABI + \section1 ANDROID_ABI + + \note This variable applies only to Android targets. + + Specifies the Android target ABI. Valid values are: armeabi-v7a, arm64-v8a, + x86, x86_64. + + \target ANDROID_ABIS + \section1 ANDROID_ABIS + + \note This variable applies only to Android targets. + + Specifies a list of Android target ABIs. Valid values are: armeabi-v7a, + arm64-v8a, x86, x86_64. + + \badcode + qmake ANDROID_ABIS="armeabi-v7a arm64-v8a" + \endcode + + \target ANDROID_API_VERSION + \section1 ANDROID_API_VERSION + + \note This variable applies only to Android targets. + + Specifies the Android API level number. For more information, see + \l{Android: Build Numbers}{Android Build Numbers}. + + \target ANDROID_BUNDLED_JAR_DEPENDENCIES + \section1 ANDROID_BUNDLED_JAR_DEPENDENCIES + + \note This variable applies only to Android modules. + + This is useful when writing a Qt module. It specifies a list of pre-bundled + dependencies used by the module in a \c .jar format, for example: + + \badcode + ANDROID_BUNDLED_JAR_DEPENDENCIES += jar/QtAndroid.jar + \endcode + + \target ANDROID_DEPLOYMENT_DEPENDENCIES + \section1 ANDROID_DEPLOYMENT_DEPENDENCIES + + \note This variable applies only to Android targets. + + By default, \l androiddeployqt will detect the dependencies of your + application. However, since run-time usage of plugins cannot be detected, + there could be false positives, as your application might depend on any + plugin that is a potential dependency. If you want to minimize the size of + your \c APK, it's possible to override the automatic detection using the + this variable. This should contain a list of all Qt files which need to be + included, with paths relative to the Qt install root. + + \note Only the Qt files specified with this variable are included. Failing + to include all the correct files can result in crashes. It's also important + to make sure the files are listed in the correct loading order. This variable + provides a way to override the automatic detection entirely, so if a library + is listed before its dependencies, it will fail to load on some devices. + + \target ANDROID_DEPLOYMENT_SETTINGS_FILE + \section1 ANDROID_DEPLOYMENT_SETTINGS_FILE + + \note This variable applies only to Android targets. + + Specifies the path to the \c {android-deployment-settings.json} file needed + by \l androiddeployqt and \c androidtestrunner. This overrides the path to + the settings file generated by qmake, thus you have to make sure to provide + a valid settings file. + + \target ANDROID_EXTRA_LIBS + \section1 ANDROID_EXTRA_LIBS + + \note This variable applies only to Android targets. + + A list of external libraries that will be copied into your application's + \c libs folder and loaded on start-up. This can be used, for instance, + to enable OpenSSL in your application. For more information, see + \l{Adding OpenSSL Support for Android}. + + \target ANDROID_EXTRA_PLUGINS + \section1 ANDROID_EXTRA_PLUGINS + + \note This variable applies only to Android targets. + + Specifies different resources that your application has to bundle but that + cannot be delivered through the assets system, such as QML plugins. With this + variable, \l androiddeployqt will make sure everything is packaged and + deployed properly. + + \target ANDROID_FEATURES + \section1 ANDROID_FEATURES + + \note This variable applies only to Android modules. + + Specifies a module's features list: + + \badcode + ANDROID_FEATURES += android.hardware.location.gps + \endcode + + For more information, see \l{Android: <uses-feature>}{Android <uses-feature> Docs}. + + \target ANDROID_LIB_DEPENDENCIES + \section1 ANDROID_LIB_DEPENDENCIES + + \note This variable applies only to Android modules. + + This is useful when writing a Qt module. It specifies a list of pre-built + dependencies used by the module, for example: + + \badcode + ANDROID_LIB_DEPENDENCIES += \ + plugins/libplugins_platforms_qtforandroid.so + \endcode + + \target ANDROID_MIN_SDK_VERSION + \section1 ANDROID_MIN_SDK_VERSION + + \note This variable applies only to Android targets. + + Specifies the minimum Android API level for the project. By default, this + variable is set to API level 21. + + \target ANDROID_PACKAGE_SOURCE_DIR + \section1 ANDROID_PACKAGE_SOURCE_DIR + + \note This variable applies only to Android targets. + + Specifies the path for a custom Android package template. The Android package + template contains: + \list + \li AndroidManifest.xml file + \li build.gradle file and other Gradle scripts + \li res/values/libs.xml file + \endlist + + The path specified by this variable can contain custom Java classes under + \c src directory. By default, the \l androiddeployqt tool copies the + application template from the Qt for Android installation path into your + project's build directory, then it copies the contents of the path specified + by this variable on top of that, overwriting any existing files. For + instance, you can make a custom \c {AndroidManifest.xml} for your application, + then place this directly into the directory specified by this variable. + + \target ANDROID_PERMISSIONS + \section1 ANDROID_PERMISSIONS + + \note This variable applies only to Android modules. + + Specifies a module's permissions list: + + \badcode + ANDROID_PERMISSIONS += android.permission.ACCESS_FINE_LOCATION + \endcode + + For more information, see \l{Android: <uses-permission>}{Android <uses-permission> Docs}. + + \target ANDROID_TARGET_SDK_VERSION + \section1 ANDROID_TARGET_SDK_VERSION + + \note This variable applies only to Android targets. + + Specifies the target Android API level for the project. By default, this + variable is set to API level 28. + + \target ANDROID_VERSION_CODE + \section1 ANDROID_VERSION_CODE + + \note This variable applies only to Android targets. + + Specifies the application's version number. For more information, see + \l{Android: App Versioning}{Android App Versioning}. + + \target ANDROID_VERSION_NAME + \section1 ANDROID_VERSION_NAME + + \note This variable applies only to Android targets. + + Specifies the application's version in as a human readable string. For more + information, see \l{Android: App Versioning}{Android App Versioning}. + \target CONFIG \section1 CONFIG @@ -1376,6 +1557,13 @@ This variable is also used to specify which additional files will be deployed to embedded devices. + \target JAVA_HOME + \section1 JAVA_HOME + + \note This variable is useful only to Android targets. + + Specifies the JDK/OpenJDK installation path used for building the project. + \target LEXIMPLS \section1 LEXIMPLS diff --git a/src/3rdparty/sqlite/patches/0002-sqlite-Fix-CVE-2020-11655.patch b/src/3rdparty/sqlite/patches/0002-sqlite-Fix-CVE-2020-11655.patch new file mode 100644 index 0000000000..c47e68c4a9 --- /dev/null +++ b/src/3rdparty/sqlite/patches/0002-sqlite-Fix-CVE-2020-11655.patch @@ -0,0 +1,30 @@ +From fa3ea2350c0367aa7cfd796b31214e2dcf574360 Mon Sep 17 00:00:00 2001 +From: Andy Shaw <andy.shaw@qt.io> +Date: Mon, 20 Apr 2020 10:43:29 +0200 +Subject: [PATCH] sqlite: Fix CVE-2020-11655 + +This was taken from 4a302b42c7bf5e11 in SQLite, ref: +https://www3.sqlite.org/cgi/src/info/4a302b42c7bf5e11 + +[ChangeLog][QtSQL][sqlite] Fixed CVE-2020-11655 + +Change-Id: I5ead78d9ee63aa0f12f1c1014c79373728569f30 +--- + src/3rdparty/sqlite/sqlite3.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c +index dfe5323a59..054be43d95 100644 +--- a/src/3rdparty/sqlite/sqlite3.c ++++ b/src/3rdparty/sqlite/sqlite3.c +@@ -133226,6 +133226,7 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ + struct AggInfo_func *pFunc; + int nReg = pAggInfo->nFunc + pAggInfo->nColumn; + if( nReg==0 ) return; ++ if( pParse->nErr ) return; + #ifdef SQLITE_DEBUG + /* Verify that all AggInfo registers are within the range specified by + ** AggInfo.mnReg..AggInfo.mxReg */ +-- +2.24.2 (Apple Git-127) + diff --git a/src/3rdparty/sqlite/patches/0003-sqlite-Fix-CVE-2020-11656.patch b/src/3rdparty/sqlite/patches/0003-sqlite-Fix-CVE-2020-11656.patch new file mode 100644 index 0000000000..c5ceb0a00c --- /dev/null +++ b/src/3rdparty/sqlite/patches/0003-sqlite-Fix-CVE-2020-11656.patch @@ -0,0 +1,63 @@ +From 99cdbed3bb5368ae2ec80d15635a2dd57961310c Mon Sep 17 00:00:00 2001 +From: Andy Shaw <andy.shaw@qt.io> +Date: Mon, 20 Apr 2020 10:49:57 +0200 +Subject: [PATCH] sqlite: Fix CVE-2020-11656 + +This was taken from d09f8c3621d5f7f8 and b64674919f673602 in SQLite, +ref: https://www3.sqlite.org/cgi/src/info/d09f8c3621d5f7f8 +https://www.sqlite.org/cgi/src/info/b64674919f673602 + +[ChangeLog][QtSQL][sqlite] Fixed CVE-2020-11656 + +Fixes: QTBUG-83652 +Change-Id: I99bd59dc10b753ff19822c902dff1fc339d330a8 +--- + src/3rdparty/sqlite/sqlite3.c | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) + +diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c +index 054be43d95..6ff9ba42aa 100644 +--- a/src/3rdparty/sqlite/sqlite3.c ++++ b/src/3rdparty/sqlite/sqlite3.c +@@ -97945,7 +97945,7 @@ static int resolveOrderByTermToExprList( + nc.nErr = 0; + db = pParse->db; + savedSuppErr = db->suppressErr; +- db->suppressErr = 1; ++ if( IN_RENAME_OBJECT==0 ) db->suppressErr = 1; + rc = sqlite3ResolveExprNames(&nc, pE); + db->suppressErr = savedSuppErr; + if( rc ) return 0; +@@ -105383,6 +105383,21 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ + } + } + ++/* ++** Unmap all tokens in the IdList object passed as the second argument. ++*/ ++static void unmapColumnIdlistNames( ++ Parse *pParse, ++ IdList *pIdList ++){ ++ if( pIdList ){ ++ int ii; ++ for(ii=0; ii<pIdList->nId; ii++){ ++ sqlite3RenameTokenRemap(pParse, 0, (void*)pIdList->a[ii].zName); ++ } ++ } ++} ++ + /* + ** Walker callback used by sqlite3RenameExprUnmap(). + */ +@@ -105404,6 +105419,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ + for(i=0; i<pSrc->nSrc; i++){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); + if( sqlite3WalkExpr(pWalker, pSrc->a[i].pOn) ) return WRC_Abort; ++ unmapColumnIdlistNames(pParse, pSrc->a[i].pUsing); + } + } + +-- +2.24.2 (Apple Git-127) + diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c index dfe5323a59..6ff9ba42aa 100644 --- a/src/3rdparty/sqlite/sqlite3.c +++ b/src/3rdparty/sqlite/sqlite3.c @@ -97945,7 +97945,7 @@ static int resolveOrderByTermToExprList( nc.nErr = 0; db = pParse->db; savedSuppErr = db->suppressErr; - db->suppressErr = 1; + if( IN_RENAME_OBJECT==0 ) db->suppressErr = 1; rc = sqlite3ResolveExprNames(&nc, pE); db->suppressErr = savedSuppErr; if( rc ) return 0; @@ -105384,6 +105384,21 @@ static void renameWalkWith(Walker *pWalker, Select *pSelect){ } /* +** Unmap all tokens in the IdList object passed as the second argument. +*/ +static void unmapColumnIdlistNames( + Parse *pParse, + IdList *pIdList +){ + if( pIdList ){ + int ii; + for(ii=0; ii<pIdList->nId; ii++){ + sqlite3RenameTokenRemap(pParse, 0, (void*)pIdList->a[ii].zName); + } + } +} + +/* ** Walker callback used by sqlite3RenameExprUnmap(). */ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ @@ -105404,6 +105419,7 @@ static int renameUnmapSelectCb(Walker *pWalker, Select *p){ for(i=0; i<pSrc->nSrc; i++){ sqlite3RenameTokenRemap(pParse, 0, (void*)pSrc->a[i].zName); if( sqlite3WalkExpr(pWalker, pSrc->a[i].pOn) ) return WRC_Abort; + unmapColumnIdlistNames(pParse, pSrc->a[i].pUsing); } } @@ -133226,6 +133242,7 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ struct AggInfo_func *pFunc; int nReg = pAggInfo->nFunc + pAggInfo->nColumn; if( nReg==0 ) return; + if( pParse->nErr ) return; #ifdef SQLITE_DEBUG /* Verify that all AggInfo registers are within the range specified by ** AggInfo.mnReg..AggInfo.mxReg */ diff --git a/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp b/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp index 43bcc22720..fddda64b19 100644 --- a/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp +++ b/src/corelib/doc/snippets/code/src_corelib_kernel_qobject.cpp @@ -403,20 +403,28 @@ public: //! [39] -class QLibrary : public QObject +class QItemSelectionModel : public QObject { Q_OBJECT public: ... - - enum LoadHint { - ResolveAllSymbolsHint = 0x01, - ExportExternalSymbolsHint = 0x02, - LoadArchiveMemberHint = 0x04 + enum SelectionFlag { + NoUpdate = 0x0000, + Clear = 0x0001, + Select = 0x0002, + Deselect = 0x0004, + Toggle = 0x0008, + Current = 0x0010, + Rows = 0x0020, + Columns = 0x0040, + SelectCurrent = Select | Current, + ToggleCurrent = Toggle | Current, + ClearAndSelect = Clear | Select }; - Q_DECLARE_FLAGS(LoadHints, LoadHint) - Q_FLAG(LoadHint) + + Q_DECLARE_FLAGS(SelectionFlags, SelectionFlag) + Q_FLAG(SelectionFlags) ... } //! [39] diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc index 3e22c9e661..2fe019f372 100644 --- a/src/corelib/global/qnamespace.qdoc +++ b/src/corelib/global/qnamespace.qdoc @@ -291,7 +291,7 @@ application on supported platforms, use of a session manager may be redundant for system services. This attribute must be set before QGuiApplication is constructed. - This value was added in 5.13 + This value was added in 5.14 \value AA_DisableNativeVirtualKeyboard When this attribute is set, the native on-screen virtual keyboard will not be shown automatically when a diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h index a020788b11..fe7d7d880b 100644 --- a/src/corelib/global/qsystemdetection.h +++ b/src/corelib/global/qsystemdetection.h @@ -76,6 +76,8 @@ The following operating systems have variants: LINUX - both Q_OS_LINUX and Q_OS_ANDROID are defined when building for Android - only Q_OS_LINUX is defined if building for other Linux systems + MACOS - both Q_OS_BSD4 and Q_OS_IOS are defined when building for iOS + - both Q_OS_BSD4 and Q_OS_MACOS are defined when building for macOS FREEBSD - Q_OS_FREEBSD is defined only when building for FreeBSD with a BSD userland - Q_OS_FREEBSD_KERNEL is always defined on FreeBSD, even if the userland is from GNU */ diff --git a/src/corelib/io/qfilesystemwatcher_inotify.cpp b/src/corelib/io/qfilesystemwatcher_inotify.cpp index 888af998a5..94d9d06bcb 100644 --- a/src/corelib/io/qfilesystemwatcher_inotify.cpp +++ b/src/corelib/io/qfilesystemwatcher_inotify.cpp @@ -253,7 +253,7 @@ QInotifyFileSystemWatcherEngine::QInotifyFileSystemWatcherEngine(int fd, QObject notifier(fd, QSocketNotifier::Read, this) { fcntl(inotifyFd, F_SETFD, FD_CLOEXEC); - connect(¬ifier, SIGNAL(activated(int)), SLOT(readFromInotify())); + connect(¬ifier, SIGNAL(activated(QSocketDescriptor)), SLOT(readFromInotify())); } QInotifyFileSystemWatcherEngine::~QInotifyFileSystemWatcherEngine() diff --git a/src/corelib/io/qfilesystemwatcher_kqueue.cpp b/src/corelib/io/qfilesystemwatcher_kqueue.cpp index c2028e3641..06383a103a 100644 --- a/src/corelib/io/qfilesystemwatcher_kqueue.cpp +++ b/src/corelib/io/qfilesystemwatcher_kqueue.cpp @@ -77,7 +77,7 @@ QKqueueFileSystemWatcherEngine::QKqueueFileSystemWatcherEngine(int kqfd, QObject kqfd(kqfd), notifier(kqfd, QSocketNotifier::Read, this) { - connect(¬ifier, SIGNAL(activated(int)), SLOT(readFromKqueue())); + connect(¬ifier, SIGNAL(activated(QSocketDescriptor)), SLOT(readFromKqueue())); fcntl(kqfd, F_SETFD, FD_CLOEXEC); } diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp index 930007ff04..e8efe6481f 100644 --- a/src/corelib/io/qprocess_unix.cpp +++ b/src/corelib/io/qprocess_unix.cpp @@ -251,7 +251,7 @@ bool QProcessPrivate::openChannel(Channel &channel) channel.notifier = new QSocketNotifier(channel.pipe[1], QSocketNotifier::Write, q); channel.notifier->setEnabled(false); - QObject::connect(channel.notifier, SIGNAL(activated(int)), + QObject::connect(channel.notifier, SIGNAL(activated(QSocketDescriptor)), q, SLOT(_q_canWrite())); } else { channel.notifier = new QSocketNotifier(channel.pipe[0], @@ -261,7 +261,7 @@ bool QProcessPrivate::openChannel(Channel &channel) receiver = SLOT(_q_canReadStandardOutput()); else receiver = SLOT(_q_canReadStandardError()); - QObject::connect(channel.notifier, SIGNAL(activated(int)), + QObject::connect(channel.notifier, SIGNAL(activated(QSocketDescriptor)), q, receiver); } } @@ -380,7 +380,7 @@ void QProcessPrivate::startProcess() if (threadData.loadRelaxed()->hasEventDispatcher()) { startupSocketNotifier = new QSocketNotifier(childStartedPipe[0], QSocketNotifier::Read, q); - QObject::connect(startupSocketNotifier, SIGNAL(activated(int)), + QObject::connect(startupSocketNotifier, SIGNAL(activated(QSocketDescriptor)), q, SLOT(_q_startupNotification())); } @@ -531,7 +531,7 @@ void QProcessPrivate::startProcess() if (threadData.loadRelaxed()->eventDispatcher.loadAcquire()) { deathNotifier = new QSocketNotifier(forkfd, QSocketNotifier::Read, q); - QObject::connect(deathNotifier, SIGNAL(activated(int)), + QObject::connect(deathNotifier, SIGNAL(activated(QSocketDescriptor)), q, SLOT(_q_processDied())); } } diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp index 35c97da532..4f5593e0a0 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp +++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp @@ -2937,7 +2937,7 @@ void QSortFilterProxyModel::setFilterRole(int role) /*! \since 5.15 - \fn void QSortFilterProxyModel::recursiveFilteringEnabledChanged(int recursiveFilteringEnabled) + \fn void QSortFilterProxyModel::recursiveFilteringEnabledChanged(bool recursiveFilteringEnabled) \brief This signal is emitted when the recursive filter setting is changed to \a recursiveFilteringEnabled. */ diff --git a/src/corelib/kernel/qobject.cpp b/src/corelib/kernel/qobject.cpp index 8be10ed601..23e4e1163c 100644 --- a/src/corelib/kernel/qobject.cpp +++ b/src/corelib/kernel/qobject.cpp @@ -4493,16 +4493,15 @@ QDebug operator<<(QDebug dbg, const QObject *o) that values of a given enum can be used as flags and combined using the bitwise OR operator. For namespaces use \l Q_FLAG_NS() instead. - The macro must be placed after the enum declaration. + The macro must be placed after the enum declaration. The declaration of + the flags type is done using the \l Q_DECLARE_FLAGS() macro. - For example, in QLibrary, the \l{QLibrary::LoadHints}{LoadHints} flag is + For example, in QItemSelectionModel, the + \l{QItemSelectionModel::SelectionFlags}{SelectionFlags} flag is declared in the following way: \snippet code/src_corelib_kernel_qobject.cpp 39 - The declaration of the flags themselves is performed in the public section - of the QLibrary class itself, using the \l Q_DECLARE_FLAGS() macro. - \note The Q_FLAG macro takes care of registering individual flag values with the meta-object system, so it is unnecessary to use Q_ENUM() in addition to this macro. diff --git a/src/corelib/kernel/qsocketnotifier.cpp b/src/corelib/kernel/qsocketnotifier.cpp index 78269ee605..6e1d2103bd 100644 --- a/src/corelib/kernel/qsocketnotifier.cpp +++ b/src/corelib/kernel/qsocketnotifier.cpp @@ -37,23 +37,32 @@ ** ****************************************************************************/ +#define BUILDING_QSOCKETNOTIFIER #include "qsocketnotifier.h" +#undef BUILDING_QSOCKETNOTIFIER #include "qplatformdefs.h" #include "qabstracteventdispatcher.h" #include "qcoreapplication.h" +#include "qmetatype.h" + #include "qobject_p.h" #include <private/qthread_p.h> +#include <QtCore/QLoggingCategory> + QT_BEGIN_NAMESPACE +Q_DECLARE_LOGGING_CATEGORY(lcSocketNotifierDeprecation) +Q_LOGGING_CATEGORY(lcSocketNotifierDeprecation, "qt.core.socketnotifier_deprecation"); + class QSocketNotifierPrivate : public QObjectPrivate { Q_DECLARE_PUBLIC(QSocketNotifier) public: - qintptr sockfd; + QSocketDescriptor sockfd; QSocketNotifier::Type sntype; bool snenabled; }; @@ -143,13 +152,17 @@ QSocketNotifier::QSocketNotifier(qintptr socket, Type type, QObject *parent) : QObject(*new QSocketNotifierPrivate, parent) { Q_D(QSocketNotifier); + + qRegisterMetaType<QSocketDescriptor>(); + qRegisterMetaType<QSocketNotifier::Type>(); + d->sockfd = socket; d->sntype = type; d->snenabled = true; auto thisThreadData = d->threadData.loadRelaxed(); - if (socket < 0) + if (!d->sockfd.isValid()) qWarning("QSocketNotifier: Invalid socket specified"); else if (!thisThreadData->hasEventDispatcher()) qWarning("QSocketNotifier: Can only be used with threads started with QThread"); @@ -169,6 +182,11 @@ QSocketNotifier::~QSocketNotifier() /*! \fn void QSocketNotifier::activated(int socket) + \obsolete To avoid unintended truncation of the descriptor, use + the QSocketDescriptor overload of this function. If you need + compatibility with versions older than 5.15 you need to change + the slot to accept qintptr if it currently accepts an int, and + then connect using Functor-Based Connection. This signal is emitted whenever the socket notifier is enabled and a socket event corresponding to its \l {Type}{type} occurs. @@ -178,6 +196,18 @@ QSocketNotifier::~QSocketNotifier() \sa type(), socket() */ +/*! + \fn void QSocketNotifier::activated(QSocketDescriptor socket, QSocketNotifier::Type type) + \since 5.15 + + This signal is emitted whenever the socket notifier is enabled and + a socket event corresponding to its \a type occurs. + + The socket identifier is passed in the \a socket parameter. + + \sa type(), socket() +*/ + /*! Returns the socket identifier specified to the constructor. @@ -187,7 +217,7 @@ QSocketNotifier::~QSocketNotifier() qintptr QSocketNotifier::socket() const { Q_D(const QSocketNotifier); - return d->sockfd; + return qintptr(d->sockfd); } /*! @@ -230,7 +260,7 @@ bool QSocketNotifier::isEnabled() const void QSocketNotifier::setEnabled(bool enable) { Q_D(QSocketNotifier); - if (d->sockfd < 0) + if (!d->sockfd.isValid()) return; if (d->snenabled == enable) // no change return; @@ -268,12 +298,61 @@ bool QSocketNotifier::event(QEvent *e) } QObject::event(e); // will activate filters if ((e->type() == QEvent::SockAct) || (e->type() == QEvent::SockClose)) { - emit activated(d->sockfd, QPrivateSignal()); + QPointer<QSocketNotifier> alive(this); + emit activated(d->sockfd, d->sntype, QPrivateSignal()); + // ### Qt7: Remove emission if the activated(int) signal is removed + if (alive) + emit activated(int(qintptr(d->sockfd)), QPrivateSignal()); + return true; } return false; } +/*! + \class QSocketDescriptor + \inmodule QtCore + \brief A class which holds a native socket descriptor. + \internal + + \ingroup network + \ingroup io + + \since 5.15 + + QSocketDescriptor makes it easier to handle native socket + descriptors in cross-platform code. + + On Windows it holds a \c {Qt::HANDLE} and on Unix it holds an \c int. + The class will implicitly convert between the class and the + native descriptor type. +*/ + +/*! + \fn QSocketDescriptor::QSocketDescriptor(DescriptorType descriptor) + \internal + + Construct a QSocketDescriptor from a native socket \a descriptor. +*/ + +/*! + \fn QSocketDescriptor::QSocketDescriptor(qintptr descriptor) + \internal + + Construct a QSocketDescriptor from a native socket \a descriptor. + + \note This constructor is only available on Windows. +*/ + +/*! + \fn Qt::HANDLE QSocketDescriptor::winHandle() const noexcept + \internal + + Returns the internal handle. + + \note This function is only available on Windows. +*/ + QT_END_NAMESPACE #include "moc_qsocketnotifier.cpp" diff --git a/src/corelib/kernel/qsocketnotifier.h b/src/corelib/kernel/qsocketnotifier.h index 38e5f27247..528f58a1e1 100644 --- a/src/corelib/kernel/qsocketnotifier.h +++ b/src/corelib/kernel/qsocketnotifier.h @@ -44,6 +44,7 @@ QT_BEGIN_NAMESPACE +class QSocketDescriptor; class QSocketNotifierPrivate; class Q_CORE_EXPORT QSocketNotifier : public QObject { @@ -65,7 +66,23 @@ public Q_SLOTS: void setEnabled(bool); Q_SIGNALS: +#if defined(Q_MOC_RUN) + // Add default arguments during Q_MOC_RUN which makes moc generate "signals" which takes less + // parameters, but we won't actually allow emitting without all 3. This lets users use the + // string-based connect without specifying QSocketNotifier::Type as one of the parameters. + void activated(QSocketDescriptor socket, QSocketNotifier::Type activationEvent = Read, + QPrivateSignal = {}); +#else + void activated(QSocketDescriptor socket, QSocketNotifier::Type activationEvent, QPrivateSignal); +#endif + + // ### Qt7: consider removing it. + // The old signal is compiled internally, but hidden outside of this class. + // This means the PMF-based connect(..) will automatically, on recompile, pick up the new + // version while the old-style connect(..) can query the metaobject system for this version. +#if defined(Q_MOC_RUN) || defined(BUILDING_QSOCKETNOTIFIER) || defined(Q_QDOC) void activated(int socket, QPrivateSignal); +#endif protected: bool event(QEvent *) override; @@ -74,6 +91,50 @@ private: Q_DISABLE_COPY(QSocketNotifier) }; +class QSocketDescriptor +{ +public: +#if defined(Q_OS_WIN) || defined(Q_QDOC) + using DescriptorType = Qt::HANDLE; +#define Q_DECL_CONSTEXPR_NOT_WIN +#else + using DescriptorType = int; +#define Q_DECL_CONSTEXPR_NOT_WIN Q_DECL_CONSTEXPR +#endif + + /* implicit */ Q_DECL_CONSTEXPR_NOT_WIN + QSocketDescriptor(DescriptorType descriptor = DescriptorType(-1)) noexcept : sockfd(descriptor) + { + } + +#if defined(Q_OS_WIN) || defined(Q_QDOC) + /* implicit */ QSocketDescriptor(qintptr desc) noexcept : sockfd(DescriptorType(desc)) {} + operator qintptr() const noexcept { return qintptr(sockfd); } + Q_DECL_CONSTEXPR Qt::HANDLE winHandle() const noexcept { return sockfd; } +#endif + Q_DECL_CONSTEXPR operator DescriptorType() const noexcept { return sockfd; } + + Q_DECL_CONSTEXPR_NOT_WIN bool isValid() const noexcept { return *this != QSocketDescriptor(); } + + friend Q_DECL_CONSTEXPR_NOT_WIN bool operator==(QSocketDescriptor lhs, + QSocketDescriptor rhs) noexcept + { + return lhs.sockfd == rhs.sockfd; + } + friend Q_DECL_CONSTEXPR_NOT_WIN bool operator!=(QSocketDescriptor lhs, + QSocketDescriptor rhs) noexcept + { + return lhs.sockfd != rhs.sockfd; + } + +#undef Q_DECL_CONSTEXPR_NOT_WIN + +private: + DescriptorType sockfd; +}; + QT_END_NAMESPACE +Q_DECLARE_METATYPE(QSocketNotifier::Type) +Q_DECLARE_METATYPE(QSocketDescriptor) #endif // QSOCKETNOTIFIER_H diff --git a/src/corelib/time/qtimezoneprivate_android.cpp b/src/corelib/time/qtimezoneprivate_android.cpp index fc3653752a..ba87cf79fe 100644 --- a/src/corelib/time/qtimezoneprivate_android.cpp +++ b/src/corelib/time/qtimezoneprivate_android.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Copyright (C) 2014 Drew Parsons <dparsons@emerall.com> ** Contact: https://www.qt.io/licensing/ ** @@ -78,6 +78,26 @@ QAndroidTimeZonePrivate::~QAndroidTimeZonePrivate() { } +static QJNIObjectPrivate getDisplayName(QJNIObjectPrivate zone, jint style, jboolean dst, + const QLocale &locale) +{ + QJNIObjectPrivate jlanguage + = QJNIObjectPrivate::fromString(QLocale::languageToString(locale.language())); + QJNIObjectPrivate jcountry + = QJNIObjectPrivate::fromString(QLocale::countryToString(locale.country())); + QJNIObjectPrivate + jvariant = QJNIObjectPrivate::fromString(QLocale::scriptToString(locale.script())); + QJNIObjectPrivate jlocale("java.util.Locale", + "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", + static_cast<jstring>(jlanguage.object()), + static_cast<jstring>(jcountry.object()), + static_cast<jstring>(jvariant.object())); + + return zone.callObjectMethod("getDisplayName", + "(ZILjava/util/Locale;)Ljava/lang/String;", + dst, style, jlocale.object()); +} + void QAndroidTimeZonePrivate::init(const QByteArray &ianaId) { const QString iana = QString::fromUtf8(ianaId); @@ -99,10 +119,13 @@ void QAndroidTimeZonePrivate::init(const QByteArray &ianaId) // the zone object we got and ignore the zone if not. // Try checking ianaId against getID(), getDisplayName(): m_id = match(androidTimeZone.callObjectMethod("getID", "()Ljava/lang/String;")); - for (int style = 1; m_id.isEmpty() && style-- > 0;) { - for (int dst = 1; m_id.isEmpty() && dst-- > 0;) { - m_id = match(androidTimeZone.callObjectMethod( - "getDisplayName", "(ZI)Ljava/lang/String;", bool(dst), style)); + for (int style = 1; m_id.isEmpty() && style >= 0; --style) { + for (int dst = 1; m_id.isEmpty() && dst >= 0; --dst) { + for (int pick = 2; m_id.isEmpty() && pick >= 0; --pick) { + QLocale locale = (pick == 0 ? QLocale::system() + : pick == 1 ? QLocale() : QLocale::c()); + m_id = match(getDisplayName(androidTimeZone, style, jboolean(dst), locale)); + } } } } @@ -124,14 +147,7 @@ QString QAndroidTimeZonePrivate::displayName(QTimeZone::TimeType timeType, QTime // treat all NameTypes as java TimeZone style LONG (value 1), except of course QTimeZone::ShortName which is style SHORT (value 0); jint style = (nameType == QTimeZone::ShortName ? 0 : 1); - QJNIObjectPrivate jlanguage = QJNIObjectPrivate::fromString(QLocale::languageToString(locale.language())); - QJNIObjectPrivate jcountry = QJNIObjectPrivate::fromString(QLocale::countryToString(locale.country())); - QJNIObjectPrivate jvariant = QJNIObjectPrivate::fromString(QLocale::scriptToString(locale.script())); - QJNIObjectPrivate jlocale("java.util.Locale", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", static_cast<jstring>(jlanguage.object()), static_cast<jstring>(jcountry.object()), static_cast<jstring>(jvariant.object())); - - QJNIObjectPrivate jname = androidTimeZone.callObjectMethod("getDisplayName", "(ZILjava/util/Locale;)Ljava/lang/String;", daylightTime, style, jlocale.object()); - - name = jname.toString(); + name = getDisplayName(androidTimeZone, style, daylightTime, locale).toString(); } return name; diff --git a/src/corelib/tools/qline.cpp b/src/corelib/tools/qline.cpp index 3afd23d76b..40a69173c4 100644 --- a/src/corelib/tools/qline.cpp +++ b/src/corelib/tools/qline.cpp @@ -370,11 +370,18 @@ QDataStream &operator>>(QDataStream &stream, QLine &line) /*! \enum QLineF::IntersectType - \obsolete Use QLineF::IntersectionType instead + \obsolete Use QLineF::IntersectionType instead. + + \value NoIntersection + Lines do not intersect. + \value UnboundedIntersection + Lines intersect, but not within the range defined by their lengths. + \value BoundedIntersection + Lnes intersect within the range defined by their lengths. */ /*! - \enum QLineF::IntersectionType + \typealias QLineF::IntersectionType Describes the intersection between two lines. diff --git a/src/dbus/qdbusconnection_p.h b/src/dbus/qdbusconnection_p.h index da67a6c5d4..9bedbcc3a5 100644 --- a/src/dbus/qdbusconnection_p.h +++ b/src/dbus/qdbusconnection_p.h @@ -173,7 +173,7 @@ public: public: // typedefs - typedef QMultiHash<int, Watcher> WatcherHash; + typedef QMultiHash<qintptr, Watcher> WatcherHash; typedef QHash<int, DBusTimeout *> TimeoutHash; typedef QVector<QDBusMessage> PendingMessageList; @@ -283,8 +283,8 @@ public slots: // public slots void setDispatchEnabled(bool enable); void doDispatch(); - void socketRead(int); - void socketWrite(int); + void socketRead(qintptr); + void socketWrite(qintptr); void objectDestroyed(QObject *o); void relaySignal(QObject *obj, const QMetaObject *, int signalId, const QVariantList &args); bool addSignalHook(const QString &key, const SignalHook &hook); diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp index 669b330f1d..b0a9342515 100644 --- a/src/dbus/qdbusintegrator.cpp +++ b/src/dbus/qdbusintegrator.cpp @@ -1205,7 +1205,7 @@ void QDBusConnectionPrivate::doDispatch() } } -void QDBusConnectionPrivate::socketRead(int fd) +void QDBusConnectionPrivate::socketRead(qintptr fd) { WatcherHash::ConstIterator it = watchers.constFind(fd); while (it != watchers.constEnd() && it.key() == fd) { @@ -1219,7 +1219,7 @@ void QDBusConnectionPrivate::socketRead(int fd) doDispatch(); } -void QDBusConnectionPrivate::socketWrite(int fd) +void QDBusConnectionPrivate::socketWrite(qintptr fd) { WatcherHash::ConstIterator it = watchers.constFind(fd); while (it != watchers.constEnd() && it.key() == fd) { diff --git a/src/gui/text/qtextmarkdownwriter.cpp b/src/gui/text/qtextmarkdownwriter.cpp index 7bd321becc..ae63fcb4dd 100644 --- a/src/gui/text/qtextmarkdownwriter.cpp +++ b/src/gui/text/qtextmarkdownwriter.cpp @@ -367,6 +367,14 @@ int QTextMarkdownWriter::writeBlock(const QTextBlock &block, bool wrap, bool ign const int ColumnLimit = 80; QTextBlockFormat blockFmt = block.blockFormat(); bool missedBlankCodeBlockLine = false; + const bool codeBlock = blockFmt.hasProperty(QTextFormat::BlockCodeFence) || + blockFmt.stringProperty(QTextFormat::BlockCodeLanguage).length() > 0; + if (m_fencedCodeBlock && !codeBlock) { + m_stream << m_linePrefix << QString(m_wrappedLineIndent, Space) + << m_codeBlockFence << Newline; + m_fencedCodeBlock = false; + m_codeBlockFence.clear(); + } if (block.textList()) { // it's a list-item auto fmt = block.textList()->format(); const int listLevel = fmt.indent(); @@ -427,7 +435,7 @@ int QTextMarkdownWriter::writeBlock(const QTextBlock &block, bool wrap, bool ign } else if (blockFmt.hasProperty(QTextFormat::BlockTrailingHorizontalRulerWidth)) { m_stream << "- - -\n"; // unambiguous horizontal rule, not an underline under a heading return 0; - } else if (blockFmt.hasProperty(QTextFormat::BlockCodeFence) || blockFmt.stringProperty(QTextFormat::BlockCodeLanguage).length() > 0) { + } else if (codeBlock) { // It's important to preserve blank lines in code blocks. But blank lines in code blocks // inside block quotes are getting preserved anyway (along with the "> " prefix). if (!blockFmt.hasProperty(QTextFormat::BlockQuoteLevel)) @@ -439,16 +447,11 @@ int QTextMarkdownWriter::writeBlock(const QTextBlock &block, bool wrap, bool ign m_codeBlockFence = QString(3, fenceChar.at(0)); // A block quote can contain an indented code block, but not vice-versa. m_stream << m_linePrefix << QString(m_wrappedLineIndent, Space) << m_codeBlockFence - << Space << blockFmt.stringProperty(QTextFormat::BlockCodeLanguage) << Newline; + << blockFmt.stringProperty(QTextFormat::BlockCodeLanguage) << Newline; m_fencedCodeBlock = true; } + wrap = false; } else if (!blockFmt.indent()) { - if (m_fencedCodeBlock) { - m_stream << m_linePrefix << QString(m_wrappedLineIndent, Space) - << m_codeBlockFence << Newline; - m_fencedCodeBlock = false; - m_codeBlockFence.clear(); - } m_wrappedLineIndent = 0; m_linePrefix.clear(); if (blockFmt.hasProperty(QTextFormat::BlockQuoteLevel)) { diff --git a/src/network/socket/qlocalserver_unix.cpp b/src/network/socket/qlocalserver_unix.cpp index 88367d680d..c4085b440e 100644 --- a/src/network/socket/qlocalserver_unix.cpp +++ b/src/network/socket/qlocalserver_unix.cpp @@ -185,7 +185,7 @@ bool QLocalServerPrivate::listen(const QString &requestedServerName) Q_ASSERT(!socketNotifier); socketNotifier = new QSocketNotifier(listenSocket, QSocketNotifier::Read, q); - q->connect(socketNotifier, SIGNAL(activated(int)), + q->connect(socketNotifier, SIGNAL(activated(QSocketDescriptor)), q, SLOT(_q_onNewConnection())); socketNotifier->setEnabled(maxPendingConnections > 0); return true; @@ -227,7 +227,7 @@ bool QLocalServerPrivate::listen(qintptr socketDescriptor) Q_ASSERT(!socketNotifier); socketNotifier = new QSocketNotifier(listenSocket, QSocketNotifier::Read, q); - q->connect(socketNotifier, SIGNAL(activated(int)), + q->connect(socketNotifier, SIGNAL(activated(QSocketDescriptor)), q, SLOT(_q_onNewConnection())); socketNotifier->setEnabled(maxPendingConnections > 0); return true; diff --git a/src/network/socket/qlocalsocket_unix.cpp b/src/network/socket/qlocalsocket_unix.cpp index d9b39a7752..52067a265c 100644 --- a/src/network/socket/qlocalsocket_unix.cpp +++ b/src/network/socket/qlocalsocket_unix.cpp @@ -308,7 +308,7 @@ void QLocalSocketPrivate::_q_connectToSocket() // Try again later, all of the sockets listening are full if (!delayConnect) { delayConnect = new QSocketNotifier(connectingSocket, QSocketNotifier::Write, q); - q->connect(delayConnect, SIGNAL(activated(int)), q, SLOT(_q_connectToSocket())); + q->connect(delayConnect, SIGNAL(activated(QSocketDescriptor)), q, SLOT(_q_connectToSocket())); } if (!connectTimer) { connectTimer = new QTimer(q); diff --git a/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp b/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp index 9cf5c9096e..118940c634 100644 --- a/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp +++ b/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp @@ -92,7 +92,7 @@ QDeviceDiscoveryUDev::QDeviceDiscoveryUDev(QDeviceTypes types, struct udev *udev m_udevMonitorFileDescriptor = udev_monitor_get_fd(m_udevMonitor); m_udevSocketNotifier = new QSocketNotifier(m_udevMonitorFileDescriptor, QSocketNotifier::Read, this); - connect(m_udevSocketNotifier, SIGNAL(activated(int)), this, SLOT(handleUDevNotification())); + connect(m_udevSocketNotifier, SIGNAL(activated(QSocketDescriptor)), this, SLOT(handleUDevNotification())); } QDeviceDiscoveryUDev::~QDeviceDiscoveryUDev() diff --git a/src/platformsupport/input/evdevmouse/qevdevmousehandler.cpp b/src/platformsupport/input/evdevmouse/qevdevmousehandler.cpp index a729eeb851..0b1c5548c7 100644 --- a/src/platformsupport/input/evdevmouse/qevdevmousehandler.cpp +++ b/src/platformsupport/input/evdevmouse/qevdevmousehandler.cpp @@ -113,6 +113,8 @@ QEvdevMouseHandler::QEvdevMouseHandler(const QString &device, int fd, bool abs, if (m_abs) m_abs = getHardwareMaximum(); + detectHiResWheelSupport(); + // socket notifier for events on the mouse device m_notify = new QSocketNotifier(m_fd, QSocketNotifier::Read, this); connect(m_notify, &QSocketNotifier::activated, @@ -125,6 +127,25 @@ QEvdevMouseHandler::~QEvdevMouseHandler() qt_safe_close(m_fd); } +void QEvdevMouseHandler::detectHiResWheelSupport() +{ +#if defined(REL_WHEEL_HI_RES) || defined(REL_HWHEEL_HI_RES) + // Check if we can expect hires events as we will get both + // legacy and hires event and needs to know if we should + // ignore the legacy events. + unsigned char relFeatures[(REL_MAX / 8) + 1]{}; + if (ioctl(m_fd, EVIOCGBIT(EV_REL, sizeof (relFeatures)), relFeatures) == -1) + return; + +#if defined(REL_WHEEL_HI_RES) + m_hiResWheel = TEST_BIT(relFeatures, REL_WHEEL_HI_RES); +#endif +#if defined(REL_HWHEEL_HI_RES) + m_hiResHWheel = TEST_BIT(relFeatures, REL_HWHEEL_HI_RES); +#endif +#endif +} + // Ask touch screen hardware for information on coordinate maximums // If any ioctls fail, revert to non abs mode bool QEvdevMouseHandler::getHardwareMaximum() @@ -243,14 +264,24 @@ void QEvdevMouseHandler::readMouseData() } else if (data->code == REL_Y) { m_y += data->value; posChanged = true; - } else if (data->code == ABS_WHEEL) { // vertical scroll + } else if (!m_hiResWheel && data->code == REL_WHEEL) { // data->value: positive == up, negative == down delta.setY(120 * data->value); emit handleWheelEvent(delta); - } else if (data->code == ABS_THROTTLE) { // horizontal scroll +#ifdef REL_WHEEL_HI_RES + } else if (data->code == REL_WHEEL_HI_RES) { + delta.setY(data->value); + emit handleWheelEvent(delta); +#endif + } else if (!m_hiResHWheel && data->code == REL_HWHEEL) { // data->value: positive == right, negative == left delta.setX(-120 * data->value); emit handleWheelEvent(delta); +#ifdef REL_HWHEEL_HI_RES + } else if (data->code == REL_HWHEEL_HI_RES) { + delta.setX(-data->value); + emit handleWheelEvent(delta); +#endif } } else if (data->type == EV_KEY && data->code == BTN_TOUCH) { // We care about touchpads only, not touchscreens -> don't map to button press. diff --git a/src/platformsupport/input/evdevmouse/qevdevmousehandler_p.h b/src/platformsupport/input/evdevmouse/qevdevmousehandler_p.h index 93314e885f..8fcf49200b 100644 --- a/src/platformsupport/input/evdevmouse/qevdevmousehandler_p.h +++ b/src/platformsupport/input/evdevmouse/qevdevmousehandler_p.h @@ -81,6 +81,7 @@ private: void sendMouseEvent(); bool getHardwareMaximum(); + void detectHiResWheelSupport(); QString m_device; int m_fd; @@ -89,6 +90,8 @@ private: int m_prevx = 0, m_prevy = 0; bool m_abs; bool m_compression; + bool m_hiResWheel = false; + bool m_hiResHWheel = false; Qt::MouseButtons m_buttons; Qt::MouseButton m_button; QEvent::Type m_eventType; diff --git a/src/plugins/platforms/openwfd/qopenwfddevice.cpp b/src/plugins/platforms/openwfd/qopenwfddevice.cpp index 7a9d22e74d..99896151b2 100644 --- a/src/plugins/platforms/openwfd/qopenwfddevice.cpp +++ b/src/plugins/platforms/openwfd/qopenwfddevice.cpp @@ -83,7 +83,7 @@ QOpenWFDDevice::QOpenWFDDevice(QOpenWFDIntegration *integration, WFDint device_e int fd = wfdDeviceEventGetFD(mDevice,mEvent); mEventSocketNotifier = new QSocketNotifier(fd,QSocketNotifier::Read,this); - connect(mEventSocketNotifier,SIGNAL(activated(int)),SLOT(readEvents())); + connect(mEventSocketNotifier,SIGNAL(activated(QSocketDescriptor)),SLOT(readEvents())); mCommitedDevice = true; commit(WFD_COMMIT_ENTIRE_DEVICE, handle()); diff --git a/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp b/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp index a6236f2376..f0c4c385ef 100644 --- a/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp +++ b/src/plugins/platforms/qnx/qqnxbuttoneventnotifier.cpp @@ -96,7 +96,7 @@ void QQnxButtonEventNotifier::start() } m_readNotifier = new QSocketNotifier(m_fd, QSocketNotifier::Read); - QObject::connect(m_readNotifier, SIGNAL(activated(int)), this, SLOT(updateButtonStates())); + QObject::connect(m_readNotifier, SIGNAL(activated(QSocketDescriptor)), this, SLOT(updateButtonStates())); qButtonDebug("successfully connected to Navigator. fd = %d", m_fd); } diff --git a/src/plugins/platforms/qnx/qqnxnavigatoreventnotifier.cpp b/src/plugins/platforms/qnx/qqnxnavigatoreventnotifier.cpp index 1f630863b7..f7e8e7966c 100644 --- a/src/plugins/platforms/qnx/qqnxnavigatoreventnotifier.cpp +++ b/src/plugins/platforms/qnx/qqnxnavigatoreventnotifier.cpp @@ -96,7 +96,7 @@ void QQnxNavigatorEventNotifier::start() } m_readNotifier = new QSocketNotifier(m_fd, QSocketNotifier::Read); - connect(m_readNotifier, SIGNAL(activated(int)), this, SLOT(readData())); + connect(m_readNotifier, SIGNAL(activated(QSocketDescriptor)), this, SLOT(readData())); } void QQnxNavigatorEventNotifier::parsePPS(const QByteArray &ppsData, QByteArray &msg, QByteArray &dat, QByteArray &id) diff --git a/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp index 025c03c058..6f496571fa 100644 --- a/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp +++ b/src/plugins/platforms/qnx/qqnxvirtualkeyboardpps.cpp @@ -143,7 +143,7 @@ bool QQnxVirtualKeyboardPps::connect() return false; m_readNotifier = new QSocketNotifier(m_fd, QSocketNotifier::Read); - QObject::connect(m_readNotifier, SIGNAL(activated(int)), this, SLOT(ppsDataReady())); + QObject::connect(m_readNotifier, SIGNAL(activated(QSocketDescriptor)), this, SLOT(ppsDataReady())); return true; } diff --git a/src/plugins/platforms/wasm/qwasmeventdispatcher.cpp b/src/plugins/platforms/wasm/qwasmeventdispatcher.cpp index 09acd37abc..2e1b083557 100644 --- a/src/plugins/platforms/wasm/qwasmeventdispatcher.cpp +++ b/src/plugins/platforms/wasm/qwasmeventdispatcher.cpp @@ -195,7 +195,7 @@ void QWasmEventDispatcher::wakeUp() #ifdef EMSCRIPTEN_HAS_ASYNC_RUN_IN_MAIN_RUNTIME_THREAD if (!emscripten_is_main_runtime_thread()) if (m_hasMainLoop) - emscripten_async_run_in_main_runtime_thread_(EM_FUNC_SIG_VI, (void*)(&QWasmEventDispatcher::mainThreadWakeUp), this); + emscripten_async_run_in_main_runtime_thread_(EM_FUNC_SIG_VI, (void*)(&QWasmEventDispatcher::mainThreadWakeUp), this); #endif QEventDispatcherUNIX::wakeUp(); } diff --git a/src/plugins/platforms/xcb/qxcbsessionmanager.cpp b/src/plugins/platforms/xcb/qxcbsessionmanager.cpp index 2eb32c069e..e9697f505b 100644 --- a/src/plugins/platforms/xcb/qxcbsessionmanager.cpp +++ b/src/plugins/platforms/xcb/qxcbsessionmanager.cpp @@ -61,11 +61,11 @@ public: QSmSocketReceiver(int socket) { QSocketNotifier* sn = new QSocketNotifier(socket, QSocketNotifier::Read, this); - connect(sn, SIGNAL(activated(int)), this, SLOT(socketActivated(int))); + connect(sn, SIGNAL(activated(QSocketDescriptor)), this, SLOT(socketActivated())); } public Q_SLOTS: - void socketActivated(int); + void socketActivated(); }; @@ -327,7 +327,7 @@ static void sm_saveYourselfPhase2Callback(SmcConn smcConn, SmPointer clientData) } -void QSmSocketReceiver::socketActivated(int) +void QSmSocketReceiver::socketActivated() { IceProcessMessages(SmcGetIceConnection(smcConnection), nullptr, nullptr); } diff --git a/src/plugins/sqldrivers/psql/qsql_psql.cpp b/src/plugins/sqldrivers/psql/qsql_psql.cpp index 38bf355856..c5895f281d 100644 --- a/src/plugins/sqldrivers/psql/qsql_psql.cpp +++ b/src/plugins/sqldrivers/psql/qsql_psql.cpp @@ -279,7 +279,7 @@ void QPSQLDriverPrivate::checkPendingNotifications() const Q_Q(const QPSQLDriver); if (seid.size() && !pendingNotifyCheck) { pendingNotifyCheck = true; - QMetaObject::invokeMethod(const_cast<QPSQLDriver*>(q), "_q_handleNotification", Qt::QueuedConnection, Q_ARG(int,0)); + QMetaObject::invokeMethod(const_cast<QPSQLDriver*>(q), "_q_handleNotification", Qt::QueuedConnection); } } @@ -1246,7 +1246,7 @@ void QPSQLDriver::close() d->seid.clear(); if (d->sn) { - disconnect(d->sn, SIGNAL(activated(int)), this, SLOT(_q_handleNotification(int))); + disconnect(d->sn, SIGNAL(activated(QSocketDescriptor)), this, SLOT(_q_handleNotification())); delete d->sn; d->sn = nullptr; } @@ -1603,7 +1603,7 @@ bool QPSQLDriver::subscribeToNotification(const QString &name) if (!d->sn) { d->sn = new QSocketNotifier(socket, QSocketNotifier::Read); - connect(d->sn, SIGNAL(activated(int)), this, SLOT(_q_handleNotification(int))); + connect(d->sn, SIGNAL(activated(QSocketDescriptor)), this, SLOT(_q_handleNotification())); } } else { qWarning("QPSQLDriver::subscribeToNotificationImplementation: PQsocket didn't return a valid socket to listen on"); @@ -1639,7 +1639,7 @@ bool QPSQLDriver::unsubscribeFromNotification(const QString &name) d->seid.removeAll(name); if (d->seid.isEmpty()) { - disconnect(d->sn, SIGNAL(activated(int)), this, SLOT(_q_handleNotification(int))); + disconnect(d->sn, SIGNAL(activated(QSocketDescriptor)), this, SLOT(_q_handleNotification())); delete d->sn; d->sn = nullptr; } @@ -1653,7 +1653,7 @@ QStringList QPSQLDriver::subscribedToNotifications() const return d->seid; } -void QPSQLDriver::_q_handleNotification(int) +void QPSQLDriver::_q_handleNotification() { Q_D(QPSQLDriver); d->pendingNotifyCheck = false; diff --git a/src/plugins/sqldrivers/psql/qsql_psql_p.h b/src/plugins/sqldrivers/psql/qsql_psql_p.h index 9ac1fb50d7..22c0761667 100644 --- a/src/plugins/sqldrivers/psql/qsql_psql_p.h +++ b/src/plugins/sqldrivers/psql/qsql_psql_p.h @@ -130,7 +130,7 @@ protected: bool rollbackTransaction() override; private Q_SLOTS: - void _q_handleNotification(int); + void _q_handleNotification(); }; QT_END_NAMESPACE diff --git a/src/tools/rcc/main.cpp b/src/tools/rcc/main.cpp index ac87e48e39..d8e243daea 100644 --- a/src/tools/rcc/main.cpp +++ b/src/tools/rcc/main.cpp @@ -435,11 +435,10 @@ int main(int argc, char *argv[]) { // rcc uses a QHash to store files in the resource system. // we must force a certain hash order when testing or tst_rcc will fail, see QTBUG-25078 - if (Q_UNLIKELY(!qEnvironmentVariableIsEmpty("QT_RCC_TEST"))) { - qSetGlobalQHashSeed(0); - if (qGlobalQHashSeed() != 0) - qFatal("Cannot force QHash seed for testing as requested"); - } + // similar requirements exist for reproducibly builds. + qSetGlobalQHashSeed(0); + if (qGlobalQHashSeed() != 0) + qWarning("Cannot force QHash seed"); return QT_PREPEND_NAMESPACE(runRcc)(argc, argv); } diff --git a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp index e3f45df27d..8ba3505d8b 100644 --- a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp +++ b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp @@ -53,6 +53,7 @@ # undef min #endif // Q_CC_MSVC + class tst_QSocketNotifier : public QObject { Q_OBJECT @@ -63,6 +64,9 @@ private slots: void posixSockets(); #endif void asyncMultipleDatagram(); + void activationReason_data(); + void activationReason(); + void legacyConnect(); protected slots: void async_readDatagramSlot(); @@ -97,10 +101,10 @@ public: { QSocketNotifier *notifier1 = new QSocketNotifier(readEnd1->socketDescriptor(), QSocketNotifier::Read, this); - connect(notifier1, SIGNAL(activated(int)), SLOT(handleActivated())); + connect(notifier1, SIGNAL(activated(QSocketDescriptor)), SLOT(handleActivated())); QSocketNotifier *notifier2 = new QSocketNotifier(readEnd2->socketDescriptor(), QSocketNotifier::Read, this); - connect(notifier2, SIGNAL(activated(int)), SLOT(handleActivated())); + connect(notifier2, SIGNAL(activated(QSocketDescriptor)), SLOT(handleActivated())); } public slots: @@ -284,12 +288,12 @@ void tst_QSocketNotifier::posixSockets() { QSocketNotifier rn(posixSocket, QSocketNotifier::Read); - connect(&rn, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); + connect(&rn, SIGNAL(activated(QSocketDescriptor)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy readSpy(&rn, &QSocketNotifier::activated); QVERIFY(readSpy.isValid()); // No write notifier, some systems trigger write notification on socket creation, but not all QSocketNotifier en(posixSocket, QSocketNotifier::Exception); - connect(&en, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); + connect(&en, SIGNAL(activated(QSocketDescriptor)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy errorSpy(&en, &QSocketNotifier::activated); QVERIFY(errorSpy.isValid()); @@ -306,7 +310,7 @@ void tst_QSocketNotifier::posixSockets() QCOMPARE(buffer, "hello"); QSocketNotifier wn(posixSocket, QSocketNotifier::Write); - connect(&wn, SIGNAL(activated(int)), &QTestEventLoop::instance(), SLOT(exitLoop())); + connect(&wn, SIGNAL(activated(QSocketDescriptor)), &QTestEventLoop::instance(), SLOT(exitLoop())); QSignalSpy writeSpy(&wn, &QSocketNotifier::activated); QVERIFY(writeSpy.isValid()); qt_safe_write(posixSocket, "goodbye", 8); @@ -385,5 +389,61 @@ void tst_QSocketNotifier::asyncMultipleDatagram() #endif // !Q_OS_WINRT } +void tst_QSocketNotifier::activationReason_data() +{ + QTest::addColumn<QSocketNotifier::Type>("type"); + QTest::addRow("read") << QSocketNotifier::Read; + QTest::addRow("write") << QSocketNotifier::Write; + QTest::addRow("exception") << QSocketNotifier::Exception; +} +void tst_QSocketNotifier::activationReason() +{ + QSocketDescriptor fd = 15; + + QFETCH(QSocketNotifier::Type, type); + + QSocketNotifier notifier(fd, type); + auto activation = new QEvent(QEvent::SockAct); + QCoreApplication::postEvent(¬ifier, activation); + + QSocketNotifier::Type notifierType; + connect(¬ifier, &QSocketNotifier::activated, this, + [¬ifierType, fd](QSocketDescriptor sockfd, QSocketNotifier::Type sntype) { + if (sockfd == fd) + notifierType = sntype; + else + qWarning() << "Got an unexpected socket file descriptor:" << qintptr(sockfd); + }); + + QCoreApplication::processEvents(); + QCOMPARE(notifierType, type); +} + +// This test ensures that we can connect QSocketNotifier::activated to a slot taking an integer +// or qintptr. +void tst_QSocketNotifier::legacyConnect() +{ + qintptr fd = 15; + QSocketNotifier notifier(fd, QSocketNotifier::Read); + auto activation = new QEvent(QEvent::SockAct); + QCoreApplication::postEvent(¬ifier, activation); + + bool receivedQIntPtr = false; + connect(¬ifier, &QSocketNotifier::activated, this, [&receivedQIntPtr, fd](qintptr q){ + if (q == fd) + receivedQIntPtr = true; + }); + bool receivedInt = false; + connect(¬ifier, &QSocketNotifier::activated, this, [&receivedInt, fd](int q){ + if (q == fd) + receivedInt = true; + }); + + QCoreApplication::processEvents(); + QVERIFY(receivedQIntPtr); + QVERIFY(receivedInt); +} + + QTEST_MAIN(tst_QSocketNotifier) #include <tst_qsocketnotifier.moc> diff --git a/tests/auto/gui/text/qtextmarkdownwriter/data/blockquotes.md b/tests/auto/gui/text/qtextmarkdownwriter/data/blockquotes.md index 6336d0219f..702ccef134 100644 --- a/tests/auto/gui/text/qtextmarkdownwriter/data/blockquotes.md +++ b/tests/auto/gui/text/qtextmarkdownwriter/data/blockquotes.md @@ -20,7 +20,7 @@ MacFarlane writes: > equivalent sample of Markdown. Here is a sample of AsciiDoc from the AsciiDoc > manual: -> ``` AsciiDoc +> ```AsciiDoc > 1. List item one. > + > List item one continued with a second paragraph followed by an @@ -50,7 +50,7 @@ Now let's have an indented code block: } and end with a fenced code block: -~~~ pseudocode +~~~pseudocode #include <something.h> #include <else.h> diff --git a/tests/auto/gui/text/qtextmarkdownwriter/data/listsAndCodeBlocks.md b/tests/auto/gui/text/qtextmarkdownwriter/data/listsAndCodeBlocks.md new file mode 100644 index 0000000000..54e3f25afa --- /dev/null +++ b/tests/auto/gui/text/qtextmarkdownwriter/data/listsAndCodeBlocks.md @@ -0,0 +1,24 @@ +- something happens in the debugger like this: + + ``` + 1 QQuickEventPoint::setGrabberItem qquickevents.cpp 869 0x7ffff7a963f2 + 2 QQuickItem::grabMouse qquickitem.cpp 7599 0x7ffff7abea29 + 3 QQuickWindowPrivate::deliverMatchingPointsToItem qquickwindow.cpp 2738 0x7ffff7aea34c + 4 QQuickWindowPrivate::deliverPressOrReleaseEvent qquickwindow.cpp 2692 0x7ffff7ae9e57 + 5 QQuickWindowPrivate::deliverMouseEvent qquickwindow.cpp 1911 0x7ffff7ae561b + 6 QQuickWindowPrivate::deliverPointerEvent qquickwindow.cpp 2454 0x7ffff7ae888c + 7 QQuickWindowPrivate::handleMouseEvent qquickwindow.cpp 2282 0x7ffff7ae7f1a + 8 QQuickWindow::mousePressEvent qquickwindow.cpp 2249 0x7ffff7ae7bf5 + 9 QQuickView::mousePressEvent qquickview.cpp 626 0x7ffff7bd6bad + 10 QWindow::event qwindow.cpp 2258 0x7ffff70b2c54 + ``` + and then I want to explain something about it. + +- something I tried to fix it: + + ```c++ + item->ungrab(); + ``` +- still didn't fix it, expecting a breakthrough any day now +- some sort of miracle +- profit! diff --git a/tests/auto/gui/text/qtextmarkdownwriter/tst_qtextmarkdownwriter.cpp b/tests/auto/gui/text/qtextmarkdownwriter/tst_qtextmarkdownwriter.cpp index 31592c7f0f..13449299cb 100644 --- a/tests/auto/gui/text/qtextmarkdownwriter/tst_qtextmarkdownwriter.cpp +++ b/tests/auto/gui/text/qtextmarkdownwriter/tst_qtextmarkdownwriter.cpp @@ -369,6 +369,7 @@ void tst_QTextMarkdownWriter::rewriteDocument_data() QTest::newRow("list items after headings") << "headingsAndLists.md"; QTest::newRow("word wrap") << "wordWrap.md"; QTest::newRow("links") << "links.md"; + QTest::newRow("lists and code blocks") << "listsAndCodeBlocks.md"; } void tst_QTextMarkdownWriter::rewriteDocument() @@ -431,7 +432,7 @@ void tst_QTextMarkdownWriter::fromHtml_data() "![foo](/url \"title\")\n\n"; QTest::newRow("code") << "<pre class=\"language-pseudocode\">\n#include \"foo.h\"\n\nblock {\n statement();\n}\n\n</pre>" << - "``` pseudocode\n#include \"foo.h\"\n\nblock {\n statement();\n}\n```\n\n"; + "```pseudocode\n#include \"foo.h\"\n\nblock {\n statement();\n}\n```\n\n"; // TODO // QTest::newRow("escaped number and paren after double newline") << // "<p>(The first sentence of this paragraph is a line, the next paragraph has a number</p>13) but that's not part of an ordered list" << diff --git a/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp b/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp index 5bd4bc5520..1fd3b9d5da 100644 --- a/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp +++ b/tests/benchmarks/corelib/io/qprocess/tst_bench_qprocess.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -28,6 +28,7 @@ #include <QtTest/QtTest> #include <QtCore/QProcess> +#include <QtCore/QElapsedTimer> class tst_QProcess : public QObject { @@ -50,7 +51,7 @@ void tst_QProcess::echoTest_performance() QVERIFY(process.waitForStarted()); - QTime stopWatch; + QElapsedTimer stopWatch; stopWatch.start(); qint64 totalBytes = 0; diff --git a/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp b/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp index c2ce15f720..fb5b2cdc91 100644 --- a/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp +++ b/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -29,6 +29,7 @@ #include <qtest.h> #include <QtCore/qmath.h> +#include <QtCore/QElapsedTimer> #include <QtWidgets/QWidget> #include "benchmarktests.h" @@ -44,7 +45,7 @@ public: qreal result() const { return m_result; } public: - QTime timer; + QElapsedTimer timer; Benchmark *m_benchmark; @@ -77,7 +78,7 @@ void BenchWidget::paintEvent(QPaintEvent *) ++m_iteration; - uint currentElapsed = timer.isNull() ? 0 : timer.elapsed(); + uint currentElapsed = timer.isValid() ? timer.elapsed() : 0; timer.restart(); m_total += currentElapsed; diff --git a/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/main.cpp b/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/main.cpp index 46bb1791b4..b6a83546a8 100644 --- a/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/main.cpp +++ b/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/main.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -32,6 +32,7 @@ #include <QtNetwork/qnetworkrequest.h> #include <QtNetwork/qnetworkaccessmanager.h> #include <QtCore/QTemporaryFile> +#include <QtCore/QElapsedTimer> #include <QtCore/QFile> class qfile_vs_qnetworkaccessmanager : public QObject @@ -88,7 +89,7 @@ void qfile_vs_qnetworkaccessmanager::qnamFileRead_iteration(QNetworkAccessManage void qfile_vs_qnetworkaccessmanager::qnamFileRead() { QNetworkAccessManager manager; - QTime t; + QElapsedTimer t; QNetworkRequest request(QUrl::fromLocalFile(testFile.fileName())); // do 3 dry runs for cache warmup @@ -121,7 +122,7 @@ void qfile_vs_qnetworkaccessmanager::qnamImmediateFileRead_iteration(QNetworkAcc void qfile_vs_qnetworkaccessmanager::qnamImmediateFileRead() { QNetworkAccessManager manager; - QTime t; + QElapsedTimer t; QNetworkRequest request(QUrl::fromLocalFile(testFile.fileName())); // do 3 dry runs for cache warmup @@ -151,7 +152,7 @@ void qfile_vs_qnetworkaccessmanager::qfileFileRead_iteration() void qfile_vs_qnetworkaccessmanager::qfileFileRead() { - QTime t; + QElapsedTimer t; // do 3 dry runs for cache warmup qfileFileRead_iteration(); diff --git a/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp index bcd354ebee..9b1f801044 100644 --- a/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp +++ b/tests/benchmarks/network/access/qnetworkreply/tst_qnetworkreply.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -31,6 +31,7 @@ #include <qtest.h> #include <QtTest/QtTest> #include <QtCore/qrandom.h> +#include <QtCore/QElapsedTimer> #include <QtNetwork/qnetworkreply.h> #include <QtNetwork/qnetworkrequest.h> #include <QtNetwork/qnetworkaccessmanager.h> @@ -93,7 +94,7 @@ protected: QEventLoop eventLoop; QTimer::singleShot(timeout, &eventLoop, SLOT(quit())); - QTime timer; + QElapsedTimer timer; timer.start(); eventLoop.exec(); disconnect(client, SIGNAL(bytesWritten(qint64)), this, 0); @@ -187,7 +188,7 @@ protected: DataReader reader(client, false); QObject::connect(client, SIGNAL(disconnected()), &eventLoop, SLOT(quit())); - QTime timer; + QElapsedTimer timer; timer.start(); eventLoop.exec(); qint64 elapsed = timer.elapsed(); @@ -280,7 +281,7 @@ protected: DataReader reader(client, false); QObject::connect(client, SIGNAL(disconnected()), &eventLoop, SLOT(quit())); - QTime timer; + QElapsedTimer timer; timer.start(); eventLoop.exec(); qint64 elapsed = timer.elapsed(); @@ -639,7 +640,7 @@ void tst_qnetworkreply::downloadPerformance() QNetworkReplyPtr reply(manager.get(request)); DataReader reader(reply, false); - QTime loopTime; + QElapsedTimer loopTime; connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); loopTime.start(); QTestEventLoop::instance().enterLoop(40); @@ -682,7 +683,7 @@ void tst_qnetworkreply::httpUploadPerformance() connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop())); - QTime time; + QElapsedTimer time; generator.start(); time.start(); QTestEventLoop::instance().enterLoop(40); @@ -710,7 +711,7 @@ void tst_qnetworkreply::performanceControlRate() sink.connectToHost("127.0.0.1", sender.serverPort()); DataReader reader(&sink, false); - QTime loopTime; + QElapsedTimer loopTime; connect(&sink, SIGNAL(disconnected()), &QTestEventLoop::instance(), SLOT(exitLoop())); loopTime.start(); QTestEventLoop::instance().enterLoop(40); @@ -748,7 +749,7 @@ void tst_qnetworkreply::httpDownloadPerformance() connect(reply, SIGNAL(finished()), &QTestEventLoop::instance(), SLOT(exitLoop()), Qt::QueuedConnection); HttpDownloadPerformanceClient client(reply.data()); - QTime time; + QElapsedTimer time; time.start(); QTestEventLoop::instance().enterLoop(40); QCOMPARE(reply->error(), QNetworkReply::NoError); diff --git a/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp b/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp index a9f8634129..f35e5cd3db 100644 --- a/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp +++ b/tests/benchmarks/network/socket/qtcpserver/tst_qtcpserver.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -27,6 +27,7 @@ ****************************************************************************/ #include <QtTest/QtTest> +#include <QtCore/QElapsedTimer> #include <qglobal.h> #include <qcoreapplication.h> #include <qtcpsocket.h> @@ -129,7 +130,7 @@ void tst_QTcpServer::ipv4LoopbackPerformanceTest() QVERIFY(clientB); QByteArray buffer(16384, '@'); - QTime stopWatch; + QElapsedTimer stopWatch; stopWatch.start(); qlonglong totalWritten = 0; while (stopWatch.elapsed() < 5000) { @@ -180,7 +181,7 @@ void tst_QTcpServer::ipv6LoopbackPerformanceTest() QVERIFY(clientB); QByteArray buffer(16384, '@'); - QTime stopWatch; + QElapsedTimer stopWatch; stopWatch.start(); qlonglong totalWritten = 0; while (stopWatch.elapsed() < 5000) { @@ -230,7 +231,7 @@ void tst_QTcpServer::ipv4PerformanceTest() QVERIFY(clientB); QByteArray buffer(16384, '@'); - QTime stopWatch; + QElapsedTimer stopWatch; stopWatch.start(); qlonglong totalWritten = 0; while (stopWatch.elapsed() < 5000) { diff --git a/tests/benchmarks/opengl/main.cpp b/tests/benchmarks/opengl/main.cpp index 0886c0e55b..9462f35c38 100644 --- a/tests/benchmarks/opengl/main.cpp +++ b/tests/benchmarks/opengl/main.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -27,6 +27,7 @@ ****************************************************************************/ #include <QtGui> #include <QtOpenGL> +#include <QtCore/QElapsedTimer> #include <qtest.h> @@ -400,7 +401,7 @@ void OpenGLBench::textureUpload() pb->makeCurrent(); QGLContext *context = const_cast<QGLContext *>(QGLContext::currentContext()); - QTime time; + QElapsedTimer time; time.start(); context->bindTexture(pixmap, GL_TEXTURE_2D, format, (QGLContext::BindOptions) flags); diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp index eabe3671e5..0aa73b9e26 100644 --- a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp +++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/itemrecyclinglist.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. @@ -27,7 +27,7 @@ ****************************************************************************/ #include <QDebug> -#include <QTime> +#include <QElapsedTimer> #include "itemrecyclinglist.h" #include "listitemcontainer.h" @@ -160,10 +160,10 @@ void ItemRecyclingList::themeChange() void ItemRecyclingList::keyPressEvent(QKeyEvent *event) { - static QTime keyPressInterval = QTime::currentTime(); + static QElapsedTimer keyPressInterval; static qreal step = 0.0; static bool repeat = false; - int interval = keyPressInterval.elapsed(); + int interval = keyPressInterval.isValid() ? keyPressInterval.elapsed() : 0; ScrollBar* sb = verticalScrollBar(); qreal currentValue = sb->sliderPosition(); diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp index 8f7736010d..93b8d86019 100644 --- a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp +++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. @@ -132,7 +132,7 @@ qreal MainView::fps() void MainView::fpsReset() { m_frameCount = 0; - m_fpsFirstTs.start(); + m_fpsFirstTs = QTime::currentTime(); m_fpsLatestTs = m_fpsFirstTs; m_fpsUpdated.start(); } @@ -201,7 +201,7 @@ void MainView::paintEvent (QPaintEvent *event) emit repainted(); m_frameCount++; - m_fpsLatestTs.start(); + m_fpsLatestTs = QTime::currentTime(); if(m_fpsUpdated.elapsed() > 2000) { updateFps(); m_fpsUpdated.start(); diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h index d7fe404023..8237ff7469 100644 --- a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h +++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/mainview.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. @@ -31,6 +31,7 @@ #include <QGraphicsView> #include <QTime> +#include <QElapsedTimer> #include <QTimer> #include "settings.h" @@ -100,7 +101,7 @@ private: QTime m_fpsFirstTs; QTime m_fpsLatestTs; bool m_OutputFps; - QTime m_fpsUpdated; + QElapsedTimer m_fpsUpdated; QList<qreal> m_Fpss; int m_angle; diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h index cf11c7fa02..c8769f59b2 100644 --- a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h +++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/scroller_p.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. @@ -42,7 +42,7 @@ #include <QPoint> #include <QTimer> -#include <QTime> +#include <QElapsedTimer> #include "scroller.h" @@ -70,8 +70,8 @@ public: QPoint m_cursorPos; QPointF m_speed; State m_state; - QTime m_lastCursorTime; - QTime m_lastFrameTime; + QElapsedTimer m_lastCursorTime; + QElapsedTimer m_lastFrameTime; QTimer m_scrollTimer; int m_scrollSlowAccum; diff --git a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp index 941cab8c21..d64f3ac38d 100644 --- a/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp +++ b/tests/benchmarks/widgets/graphicsview/functional/GraphicsViewBenchmark/widgets/simplelist.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. @@ -29,7 +29,7 @@ #include <QDebug> #include <QGraphicsLinearLayout> #include <QFont> -#include <QTime> +#include <QElapsedTimer> #include "simplelist.h" static const int MinItemWidth = 276; @@ -99,10 +99,10 @@ void SimpleList::setListItemCaching(bool enable) void SimpleList::keyPressEvent(QKeyEvent *event) { - static QTime keyPressInterval = QTime::currentTime(); + static QElapsedTimer keyPressInterval; static qreal step = 0.0; static bool repeat = false; - int interval = keyPressInterval.elapsed(); + int interval = keyPressInterval.isValid() ? keyPressInterval.elapsed() : 0; ScrollBar* sb = verticalScrollBar(); qreal currentValue = sb->sliderPosition(); diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp index dfa08b6869..93bdc409dc 100644 --- a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp +++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.cpp @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -72,7 +72,6 @@ void ChipTester::runBenchmark() { npaints = 0; timerId = startTimer(0); - stopWatch.start(); eventLoop.exec(); killTimer(timerId); } diff --git a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h index d85686c94e..cc4a5cd2be 100644 --- a/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h +++ b/tests/benchmarks/widgets/graphicsview/qgraphicsview/chiptester/chiptester.h @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2020 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the test suite of the Qt Toolkit. @@ -31,7 +31,6 @@ #include <QtWidgets/QGraphicsView> #include <QtCore/QEventLoop> -#include <QtCore/QTime> QT_FORWARD_DECLARE_CLASS(QGraphicsScene) QT_FORWARD_DECLARE_CLASS(QGraphicsView) @@ -67,7 +66,6 @@ private: int npaints; int timerId; QEventLoop eventLoop; - QTime stopWatch; Operation operation; }; diff --git a/tests/libfuzzer/corelib/serialization/qcborstreamreader/next/main.cpp b/tests/libfuzzer/corelib/serialization/qcborstreamreader/next/main.cpp new file mode 100644 index 0000000000..118f402a15 --- /dev/null +++ b/tests/libfuzzer/corelib/serialization/qcborstreamreader/next/main.cpp @@ -0,0 +1,36 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QCborStreamReader> + +extern "C" int LLVMFuzzerTestOneInput(const char *Data, size_t Size) { + QCborStreamReader reader(QByteArray::fromRawData(Data, Size)); + while (reader.isValid()) + reader.next(1024); + return 0; +} diff --git a/tests/libfuzzer/corelib/serialization/qcborstreamreader/next/next.pro b/tests/libfuzzer/corelib/serialization/qcborstreamreader/next/next.pro new file mode 100644 index 0000000000..6c988c2434 --- /dev/null +++ b/tests/libfuzzer/corelib/serialization/qcborstreamreader/next/next.pro @@ -0,0 +1,10 @@ +QT -= gui +CONFIG += console +CONFIG -= app_bundle +SOURCES += main.cpp +FUZZ_ENGINE = $$(LIB_FUZZING_ENGINE) +isEmpty(FUZZ_ENGINE) { + QMAKE_LFLAGS += -fsanitize=fuzzer +} else { + LIBS += $$FUZZ_ENGINE +} |