diff options
author | Liang Qi <liang.qi@qt.io> | 2020-05-18 08:52:33 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2020-05-18 08:52:33 +0200 |
commit | 2cd6d76d680b1bddef774acc51d80da9e29f1c2e (patch) | |
tree | 69f2aac58f25223910debd0f20b9d5550c69541c | |
parent | b800f3039a754f67466df5e195e70ea2821f9404 (diff) | |
parent | 786ae0141a524c66e01e652aed0e6ed4c97d08bc (diff) |
Merge remote-tracking branch 'origin/5.15' into dev
Conflicts:
src/corelib/text/qbytearray.cpp
Change-Id: I63706409464d31391012bacdadfd1f6300509787
-rw-r--r-- | dist/changes-5.15.0 | 26 | ||||
-rw-r--r-- | mkspecs/features/cmake_functions.prf | 9 | ||||
-rw-r--r-- | mkspecs/features/qt.prf | 2 | ||||
-rw-r--r-- | src/corelib/io/qstandardpaths_win.cpp | 7 | ||||
-rw-r--r-- | src/corelib/serialization/qcborvalue.cpp | 2 | ||||
-rw-r--r-- | src/gui/painting/qicc.cpp | 3 | ||||
-rw-r--r-- | src/gui/text/qtextdocumentlayout.cpp | 7 | ||||
-rw-r--r-- | src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp | 5 | ||||
-rw-r--r-- | src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp | 26 | ||||
-rw-r--r-- | src/widgets/dialogs/qfiledialog.cpp | 7 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/cborlargedatavalidation.cpp | 20 | ||||
-rw-r--r-- | tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp | 15 | ||||
-rw-r--r-- | tests/auto/gui/text/qtextdocumentlayout/BLACKLIST | 1 |
13 files changed, 98 insertions, 32 deletions
diff --git a/dist/changes-5.15.0 b/dist/changes-5.15.0 index f8e2330311..c42ff4b84d 100644 --- a/dist/changes-5.15.0 +++ b/dist/changes-5.15.0 @@ -46,23 +46,21 @@ information about a particular change. - QtNetwork: * QNetworkConfigurationManager, QNetworkConfiguration and QNetworkSession are deprecated, to be removed in Qt 6. + * QNetworkAccessManager::activeConfiguration, configuration and + setConfiguration are deprecated, to be removed in Qt 6. + * QNetworkAccessManager::networkAccessible, setNetworkAccessible and + the NetworkAccessibility enum are deprecated, to be removed in Qt 6. + * QLocalSocket::error() (the signal) is deprecated; superseded by + errorOccurred() + * QAbstractSocket::error() (the signal) is deprecated; superseded by + errorOccurred() + * QNetworkReply::error() (the signal) is deprecated; superseded by + errorOccurred() + * [QTBUG-80369] QSslSocket::sslErrors() (the getter) was deprecated and + superseded by sslHandshakeErrors() - - [REVERTED] [QTBUG-80369] QAbstractSocket::error() (the getter) is - deprecated; superseded by socketError(). - - [REVERTED] [QTBUG-80369] QLocalSocket::error() (the getter) is - deprecated; superseded by socketError(). - - [QTBUG-80369] QSslSocket::sslErrors() (the getter) was deprecated and - superseded by sslHandshakeErrors() - - [REVERTED] [QTBUG-80369] QNetworkReply::error() (the getter) was - deprecated; superseded by networkError(). - [QTBUG-81630][QTBUG-80312] QLinkedList is deprecated and will be moved to Qt5Compat in Qt 6. It is recommended to use std::list instead. - - QLocalSocket::error() (the signal) is deprecated; superseded by - errorOccurred() - - QAbstractSocket::error() (the signal) is deprecated; superseded by - errorOccurred() - - QNetworkReply::error() (the signal) is deprecated; superseded by - errorOccurred() See also the various sections below, which include many more deprecations. diff --git a/mkspecs/features/cmake_functions.prf b/mkspecs/features/cmake_functions.prf index 1e6b05c78e..0c62b46af3 100644 --- a/mkspecs/features/cmake_functions.prf +++ b/mkspecs/features/cmake_functions.prf @@ -42,10 +42,17 @@ defineReplace(cmakeTargetPaths) { } defineReplace(cmakePortablePaths) { + SYSR = $$[QT_SYSROOT] + !isEmpty(SYSR): SYSR = ${CMAKE_SYSROOT} variable = $$1 out = for(v, variable) { - out += $$[QT_SYSROOT]$$cmakeTargetPath($$v) + path = $$cmakeTargetPath($$v) + contains(path, /.*): \ + sysroot_prefix = $$SYSR + else: \ + sysroot_prefix = $$SYSR/ + out += $${sysroot_prefix}$${path} } return ($$join(out, ";")) } diff --git a/mkspecs/features/qt.prf b/mkspecs/features/qt.prf index 6fe0059bf7..99b7fe6562 100644 --- a/mkspecs/features/qt.prf +++ b/mkspecs/features/qt.prf @@ -293,7 +293,7 @@ contains(all_qt_module_deps, qml): \ !isEmpty(SCANNERRESOURCES) { IMPORTPATHS += -qrcFiles - for (RESOURCE, SCANNERRESOURCES) + for (RESOURCE, SCANNERRESOURCES): \ IMPORTPATHS += $$absolute_path($$system_quote($$RESOURCE), $$_PRO_FILE_PWD_) } diff --git a/src/corelib/io/qstandardpaths_win.cpp b/src/corelib/io/qstandardpaths_win.cpp index 5055f4020c..cbe4ccd0b2 100644 --- a/src/corelib/io/qstandardpaths_win.cpp +++ b/src/corelib/io/qstandardpaths_win.cpp @@ -47,6 +47,7 @@ #include <qcoreapplication.h> #endif +#include <qoperatingsystemversion.h> #include <qt_windows.h> #include <shlobj.h> #include <intshcut.h> @@ -99,7 +100,11 @@ static bool isProcessLowIntegrity() { // Disable function until Qt CI is updated return false; #else - HANDLE process_token = GetCurrentProcessToken(); // non-leaking pseudo-handle + if (QOperatingSystemVersion::current() < QOperatingSystemVersion::Windows8) + return false; + // non-leaking pseudo-handle. Expanded inline function GetCurrentProcessToken() + // (was made an inline function in Windows 8). + const auto process_token = HANDLE(quintptr(-4)); QVarLengthArray<char,256> token_info_buf(256); auto* token_info = reinterpret_cast<TOKEN_MANDATORY_LABEL*>(token_info_buf.data()); diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp index be22e2c043..0b95bf5b8e 100644 --- a/src/corelib/serialization/qcborvalue.cpp +++ b/src/corelib/serialization/qcborvalue.cpp @@ -1635,7 +1635,7 @@ void QCborContainerPrivate::decodeStringFromCbor(QCborStreamReader &reader) if (len == rawlen) { auto oldSize = data.size(); auto newSize = oldSize; - if (!add_overflow(newSize, len, &newSize)) { + if (!add_overflow(newSize, len, &newSize) && newSize < MaxByteArraySize) { if (newSize != oldSize) data.resize(newSize); diff --git a/src/gui/painting/qicc.cpp b/src/gui/painting/qicc.cpp index e2257c27da..ca06e8763f 100644 --- a/src/gui/painting/qicc.cpp +++ b/src/gui/painting/qicc.cpp @@ -225,7 +225,7 @@ static bool isValidIccProfile(const ICCProfileHeader &header) } // Don't overflow 32bit integers: - if (header.tagCount >= INT32_MAX / sizeof(TagTableEntry)) { + if (header.tagCount >= (INT32_MAX - sizeof(ICCProfileHeader)) / sizeof(TagTableEntry)) { qCWarning(lcIcc, "Failed tag count sanity"); return false; } @@ -629,6 +629,7 @@ bool fromIccProfile(const QByteArray &data, QColorSpace *colorSpace) // Read tag index const TagTableEntry *tagTable = (const TagTableEntry *)(data.constData() + sizeof(ICCProfileHeader)); const qsizetype offsetToData = sizeof(ICCProfileHeader) + header->tagCount * sizeof(TagTableEntry); + Q_ASSERT(offsetToData > 0); if (offsetToData > data.size()) { qCWarning(lcIcc) << "fromIccProfile: failed index size sanity"; return false; diff --git a/src/gui/text/qtextdocumentlayout.cpp b/src/gui/text/qtextdocumentlayout.cpp index e5731bcfab..fc61ee50bb 100644 --- a/src/gui/text/qtextdocumentlayout.cpp +++ b/src/gui/text/qtextdocumentlayout.cpp @@ -105,13 +105,14 @@ public: bool sizeDirty; bool layoutDirty; + bool fullLayoutCompleted; QVector<QPointer<QTextFrame> > floats; }; QTextFrameData::QTextFrameData() : maximumWidth(QFIXED_MAX), - currentLayoutStruct(nullptr), sizeDirty(true), layoutDirty(true) + currentLayoutStruct(nullptr), sizeDirty(true), layoutDirty(true), fullLayoutCompleted(false) { } @@ -2943,7 +2944,7 @@ QRectF QTextDocumentLayoutPrivate::layoutFrame(QTextFrame *f, int layoutFrom, in QTextFrameData *fd = data(f); QFixed newContentsWidth; - bool fullLayout = false; + bool fullLayout = (f == document->rootFrame() && !fd->fullLayoutCompleted); { QTextFrameFormat fformat = f->frameFormat(); // set sizes of this frame from the format @@ -3397,6 +3398,7 @@ void QTextDocumentLayoutPrivate::layoutFlow(QTextFrame::Iterator it, QTextLayout cp.contentsWidth = layoutStruct->contentsWidth; checkPoints.append(cp); checkPoints.reserve(checkPoints.size()); + fd->fullLayoutCompleted = true; } else { currentLazyLayoutPosition = checkPoints.constLast().positionInFrame; // ####### @@ -3808,6 +3810,7 @@ void QTextDocumentLayout::documentChanged(int from, int oldLength, int length) d->contentHasAlignment = false; d->currentLazyLayoutPosition = 0; d->checkPoints.clear(); + data(d->docPrivate->rootFrame())->fullLayoutCompleted = false; d->layoutStep(); } else { d->ensureLayoutedByPosition(from); diff --git a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp index 13c39436ba..4b37367ad0 100644 --- a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp +++ b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportalfiledialog.cpp @@ -107,6 +107,7 @@ public: { } WId winId = 0; + bool directoryMode = false; bool modal = false; bool multipleFiles = false; bool saveFile = false; @@ -145,6 +146,9 @@ void QXdgDesktopPortalFileDialog::initializeDialog() if (options()->fileMode() == QFileDialogOptions::ExistingFiles) d->multipleFiles = true; + if (options()->fileMode() == QFileDialogOptions::Directory || options()->fileMode() == QFileDialogOptions::DirectoryOnly) + d->directoryMode = true; + if (options()->isLabelExplicitlySet(QFileDialogOptions::Accept)) d->acceptLabel = options()->labelText(QFileDialogOptions::Accept); @@ -179,6 +183,7 @@ void QXdgDesktopPortalFileDialog::openPortal() options.insert(QLatin1String("modal"), d->modal); options.insert(QLatin1String("multiple"), d->multipleFiles); + options.insert(QLatin1String("directory"), d->directoryMode); if (d->saveFile) { if (!d->directory.isEmpty()) diff --git a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp index fb65f6d909..30c43b67dc 100644 --- a/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp +++ b/src/plugins/platformthemes/xdgdesktopportal/qxdgdesktopportaltheme.cpp @@ -45,6 +45,12 @@ #include <qpa/qplatformthemefactory_p.h> #include <qpa/qplatformintegration.h> +#include <QDBusConnection> +#include <QDBusMessage> +#include <QDBusPendingCall> +#include <QDBusPendingCallWatcher> +#include <QDBusPendingReply> + QT_BEGIN_NAMESPACE class QXdgDesktopPortalThemePrivate : public QPlatformThemePrivate @@ -60,6 +66,7 @@ public: } QPlatformTheme *baseTheme; + uint fileChooserPortalVersion = 0; }; QXdgDesktopPortalTheme::QXdgDesktopPortalTheme() @@ -90,6 +97,21 @@ QXdgDesktopPortalTheme::QXdgDesktopPortalTheme() // 3) Fall back on the built-in "null" platform theme. if (!d->baseTheme) d->baseTheme = new QPlatformTheme; + + // Get information about portal version + QDBusMessage message = QDBusMessage::createMethodCall(QLatin1String("org.freedesktop.portal.Desktop"), + QLatin1String("/org/freedesktop/portal/desktop"), + QLatin1String("org.freedesktop.DBus.Properties"), + QLatin1String("Get")); + message << QLatin1String("org.freedesktop.portal.FileChooser") << QLatin1String("version"); + QDBusPendingCall pendingCall = QDBusConnection::sessionBus().asyncCall(message); + QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingCall); + QObject::connect(watcher, &QDBusPendingCallWatcher::finished, [d] (QDBusPendingCallWatcher *watcher) { + QDBusPendingReply<QVariant> reply = *watcher; + if (reply.isValid()) { + d->fileChooserPortalVersion = reply.value().toUInt(); + } + }); } QPlatformMenuItem* QXdgDesktopPortalTheme::createPlatformMenuItem() const @@ -131,7 +153,9 @@ QPlatformDialogHelper* QXdgDesktopPortalTheme::createPlatformDialogHelper(Dialog Q_D(const QXdgDesktopPortalTheme); if (type == FileDialog) { - if (d->baseTheme->usePlatformNativeDialog(type)) + // Older versions of FileChooser portal don't support opening directories, therefore we fallback + // to native file dialog opened inside the sandbox to open a directory. + if (d->fileChooserPortalVersion < 3 && d->baseTheme->usePlatformNativeDialog(type)) return new QXdgDesktopPortalFileDialog(static_cast<QPlatformFileDialogHelper*>(d->baseTheme->createPlatformDialogHelper(type))); return new QXdgDesktopPortalFileDialog; diff --git a/src/widgets/dialogs/qfiledialog.cpp b/src/widgets/dialogs/qfiledialog.cpp index 77fec76c6f..b268864132 100644 --- a/src/widgets/dialogs/qfiledialog.cpp +++ b/src/widgets/dialogs/qfiledialog.cpp @@ -1378,8 +1378,8 @@ QStringList qt_make_filter_list(const QString &filter) \snippet code/src_gui_dialogs_qfiledialog.cpp 6 - \note This is not supported on Android's native file dialog. Use - \l{setMimeTypeFilters()} instead. + \note With Android's native file dialog, the mime type matching the given + name filter is used because only mime types are supported. \sa setMimeTypeFilters(), setNameFilters() */ @@ -1431,9 +1431,6 @@ QStringList qt_strip_filters(const QStringList &filters) filters for each file type. For example, JPEG images have three possible extensions; if your application can open such files, selecting the \c image/jpeg mime type as a filter will allow you to open all of them. - - \note This is not supported on Android's native file dialog. Use - \l{setMimeTypeFilters()} instead. */ void QFileDialog::setNameFilters(const QStringList &filters) { diff --git a/tests/auto/corelib/serialization/cborlargedatavalidation.cpp b/tests/auto/corelib/serialization/cborlargedatavalidation.cpp index 9abfe0f575..f3b6893957 100644 --- a/tests/auto/corelib/serialization/cborlargedatavalidation.cpp +++ b/tests/auto/corelib/serialization/cborlargedatavalidation.cpp @@ -81,19 +81,31 @@ qint64 LargeIODevice::readData(char *data, qint64 maxlen) void addValidationLargeData(qsizetype minInvalid, qsizetype maxInvalid) { - char toolong[2 + sizeof(qsizetype)] = { char(0x81) }; + char toolong[1 + sizeof(qsizetype)]; for (qsizetype v = maxInvalid; v >= minInvalid; --v) { // 0x5a for 32-bit, 0x5b for 64-bit - toolong[1] = sizeof(v) > 4 ? 0x5b : 0x5a; - qToBigEndian(v, toolong + 2); + toolong[0] = sizeof(v) > 4 ? 0x5b : 0x5a; + qToBigEndian(v, toolong + 1); QTest::addRow("bytearray-too-big-for-qbytearray-%llx", v) << QByteArray(toolong, sizeof(toolong)) << 0 << CborErrorDataTooLarge; - toolong[1] |= 0x20; + QTest::addRow("bytearray-chunked-too-big-for-qbytearray-%llx", v) + << ('\x5f' + QByteArray(toolong, sizeof(toolong)) + '\xff') + << 0 << CborErrorDataTooLarge; + QTest::addRow("bytearray-2chunked-too-big-for-qbytearray-%llx", v) + << ("\x5f\x40" + QByteArray(toolong, sizeof(toolong)) + '\xff') + << 0 << CborErrorDataTooLarge; + toolong[0] |= 0x20; // QCborStreamReader::readString copies to a QByteArray first QTest::addRow("string-too-big-for-qbytearray-%llx", v) << QByteArray(toolong, sizeof(toolong)) << 0 << CborErrorDataTooLarge; + QTest::addRow("string-chunked-too-big-for-qbytearray-%llx", v) + << ('\x7f' + QByteArray(toolong, sizeof(toolong)) + '\xff') + << 0 << CborErrorDataTooLarge; + QTest::addRow("string-2chunked-too-big-for-qbytearray-%llx", v) + << ("\x7f\x60" + QByteArray(toolong, sizeof(toolong)) + '\xff') + << 0 << CborErrorDataTooLarge; } } diff --git a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp index 9c1341e252..1379cc348d 100644 --- a/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp +++ b/tests/auto/corelib/serialization/qcborvalue/tst_qcborvalue.cpp @@ -1926,11 +1926,24 @@ void tst_QCborValue::validation_data() // Add QCborStreamReader-specific limitations due to use of QByteArray and // QString, which are allocated by QArrayData::allocate(). const qsizetype MaxInvalid = std::numeric_limits<QByteArray::size_type>::max(); - const qsizetype MinInvalid = MaxByteArraySize + 1; + const qsizetype MinInvalid = MaxByteArraySize + 1 - sizeof(QByteArray::size_type); addValidationColumns(); addValidationData(MinInvalid); addValidationLargeData(MinInvalid, MaxInvalid); + // Chunked strings whose total overflows the limit, but each individual + // chunk doesn't. 0x5a for 32-bit, 0x5b for 64-bit. + char toolong[1 + sizeof(qsizetype)]; + toolong[0] = sizeof(MinInvalid) > 4 ? 0x5b : 0x5a; + qToBigEndian(MinInvalid - 1, toolong + 1); + QTest::addRow("bytearray-2chunked+1-too-big-for-qbytearray-%llx", MinInvalid) + << ("\x5f\x41z" + QByteArray(toolong, sizeof(toolong)) + '\xff') + << 0 << CborErrorDataTooLarge; + toolong[0] |= 0x20; + QTest::addRow("string-2chunked+1-too-big-for-qbytearray-%llx", MinInvalid) + << ("\x7f\x61z" + QByteArray(toolong, sizeof(toolong)) + '\xff') + << 0 << CborErrorDataTooLarge; + // These tests say we have arrays and maps with very large item counts. // They are meant to ensure we don't pre-allocate a lot of memory // unnecessarily and possibly crash the application. The actual number of diff --git a/tests/auto/gui/text/qtextdocumentlayout/BLACKLIST b/tests/auto/gui/text/qtextdocumentlayout/BLACKLIST index 5c81e74aa0..e646d71144 100644 --- a/tests/auto/gui/text/qtextdocumentlayout/BLACKLIST +++ b/tests/auto/gui/text/qtextdocumentlayout/BLACKLIST @@ -2,3 +2,4 @@ rhel-6.6 rhel-7.4 rhel-7.6 +sles |