Merge remote-tracking branch 'origin/5.14' into 5.15
Change-Id: Iaab37b633a8286c2c21425aaac34d30529a3ea82
This commit is contained in:
commit
22daba4ff9
@ -6,7 +6,8 @@
|
|||||||
xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"
|
xmlns:uap=\"http://schemas.microsoft.com/appx/manifest/uap/windows10\"
|
||||||
xmlns:uap3=\"http://schemas.microsoft.com/appx/manifest/uap/windows10/3\"
|
xmlns:uap3=\"http://schemas.microsoft.com/appx/manifest/uap/windows10/3\"
|
||||||
xmlns:mobile=\"http://schemas.microsoft.com/appx/manifest/mobile/windows10\"
|
xmlns:mobile=\"http://schemas.microsoft.com/appx/manifest/mobile/windows10\"
|
||||||
IgnorableNamespaces=\"uap uap3 mp mobile\">
|
xmlns:iot=\"http://schemas.microsoft.com/appx/manifest/iot/windows10\"
|
||||||
|
IgnorableNamespaces=\"uap uap3 mp mobile iot\">
|
||||||
|
|
||||||
<Identity
|
<Identity
|
||||||
Name=\"$${WINRT_MANIFEST.identity}\"
|
Name=\"$${WINRT_MANIFEST.identity}\"
|
||||||
|
@ -123,6 +123,8 @@
|
|||||||
|
|
||||||
UAP3_CAPABILITIES += backgroundMediaPlayback remoteSystem userNotificationListener
|
UAP3_CAPABILITIES += backgroundMediaPlayback remoteSystem userNotificationListener
|
||||||
|
|
||||||
|
IOT_CAPABILITIES += systemManagement
|
||||||
|
|
||||||
# Capabilities are given as a string list and may change with the configuration (network, sensors, etc.)
|
# Capabilities are given as a string list and may change with the configuration (network, sensors, etc.)
|
||||||
WINRT_MANIFEST.capabilities = $$unique(WINRT_MANIFEST.capabilities)
|
WINRT_MANIFEST.capabilities = $$unique(WINRT_MANIFEST.capabilities)
|
||||||
WINRT_MANIFEST.capabilities_device = $$unique(WINRT_MANIFEST.capabilities_device)
|
WINRT_MANIFEST.capabilities_device = $$unique(WINRT_MANIFEST.capabilities_device)
|
||||||
@ -133,6 +135,8 @@
|
|||||||
MANIFEST_CAPABILITIES += " <uap:Capability Name=\"$$CAPABILITY\" />"
|
MANIFEST_CAPABILITIES += " <uap:Capability Name=\"$$CAPABILITY\" />"
|
||||||
else:contains(UAP3_CAPABILITIES, $$CAPABILITY): \
|
else:contains(UAP3_CAPABILITIES, $$CAPABILITY): \
|
||||||
MANIFEST_CAPABILITIES += " <uap3:Capability Name=\"$$CAPABILITY\" />"
|
MANIFEST_CAPABILITIES += " <uap3:Capability Name=\"$$CAPABILITY\" />"
|
||||||
|
else:contains(IOT_CAPABILITIES, $$CAPABILITY): \
|
||||||
|
MANIFEST_CAPABILITIES += " <iot:Capability Name=\"$$CAPABILITY\" />"
|
||||||
else: \
|
else: \
|
||||||
MANIFEST_CAPABILITIES += " <Capability Name=\"$$CAPABILITY\" />"
|
MANIFEST_CAPABILITIES += " <Capability Name=\"$$CAPABILITY\" />"
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ EMCC_COMMON_LFLAGS += \
|
|||||||
-s NO_EXIT_RUNTIME=0 \
|
-s NO_EXIT_RUNTIME=0 \
|
||||||
-s ERROR_ON_UNDEFINED_SYMBOLS=1 \
|
-s ERROR_ON_UNDEFINED_SYMBOLS=1 \
|
||||||
-s EXTRA_EXPORTED_RUNTIME_METHODS=[\"UTF16ToString\",\"stringToUTF16\"] \
|
-s EXTRA_EXPORTED_RUNTIME_METHODS=[\"UTF16ToString\",\"stringToUTF16\"] \
|
||||||
|
-s DISABLE_DEPRECATED_FIND_EVENT_TARGET_BEHAVIOR=0 \
|
||||||
--bind
|
--bind
|
||||||
|
|
||||||
# The -s arguments can also be used with release builds,
|
# The -s arguments can also be used with release builds,
|
||||||
|
@ -31,7 +31,6 @@ struct TranslatedAttribute;
|
|||||||
// The order of this enum governs priority of 'getLatestBufferStorage'.
|
// The order of this enum governs priority of 'getLatestBufferStorage'.
|
||||||
enum BufferUsage
|
enum BufferUsage
|
||||||
{
|
{
|
||||||
BUFFER_USAGE_SYSTEM_MEMORY,
|
|
||||||
BUFFER_USAGE_STAGING,
|
BUFFER_USAGE_STAGING,
|
||||||
BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
|
BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
|
||||||
BUFFER_USAGE_INDEX,
|
BUFFER_USAGE_INDEX,
|
||||||
@ -40,6 +39,7 @@ enum BufferUsage
|
|||||||
BUFFER_USAGE_PIXEL_UNPACK,
|
BUFFER_USAGE_PIXEL_UNPACK,
|
||||||
BUFFER_USAGE_PIXEL_PACK,
|
BUFFER_USAGE_PIXEL_PACK,
|
||||||
BUFFER_USAGE_UNIFORM,
|
BUFFER_USAGE_UNIFORM,
|
||||||
|
BUFFER_USAGE_SYSTEM_MEMORY,
|
||||||
BUFFER_USAGE_EMULATED_INDEXED_VERTEX,
|
BUFFER_USAGE_EMULATED_INDEXED_VERTEX,
|
||||||
|
|
||||||
BUFFER_USAGE_COUNT,
|
BUFFER_USAGE_COUNT,
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
From b215999d63d6e6b087e53e24a47b8b60520ec9e4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Oliver Wolff <oliver.wolff@qt.io>
|
||||||
|
Date: Wed, 11 Mar 2020 13:59:39 +0100
|
||||||
|
Subject: [PATCH] ANGLE: Fix severe performance regression
|
||||||
|
|
||||||
|
The changed buffer usage priority that was introduced in our ANGLE
|
||||||
|
update caused severe performance regressions for Qt applications.
|
||||||
|
|
||||||
|
Fixes: QTBUG-73835
|
||||||
|
Change-Id: I49839bb272cdeec0027264f2751b88bc149665ad
|
||||||
|
---
|
||||||
|
src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
|
||||||
|
index ddbeeb90d2..f92a68454b 100644
|
||||||
|
--- a/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
|
||||||
|
+++ b/src/3rdparty/angle/src/libANGLE/renderer/d3d/d3d11/Buffer11.h
|
||||||
|
@@ -31,7 +31,6 @@ struct TranslatedAttribute;
|
||||||
|
// The order of this enum governs priority of 'getLatestBufferStorage'.
|
||||||
|
enum BufferUsage
|
||||||
|
{
|
||||||
|
- BUFFER_USAGE_SYSTEM_MEMORY,
|
||||||
|
BUFFER_USAGE_STAGING,
|
||||||
|
BUFFER_USAGE_VERTEX_OR_TRANSFORM_FEEDBACK,
|
||||||
|
BUFFER_USAGE_INDEX,
|
||||||
|
@@ -40,6 +39,7 @@ enum BufferUsage
|
||||||
|
BUFFER_USAGE_PIXEL_UNPACK,
|
||||||
|
BUFFER_USAGE_PIXEL_PACK,
|
||||||
|
BUFFER_USAGE_UNIFORM,
|
||||||
|
+ BUFFER_USAGE_SYSTEM_MEMORY,
|
||||||
|
BUFFER_USAGE_EMULATED_INDEXED_VERTEX,
|
||||||
|
|
||||||
|
BUFFER_USAGE_COUNT,
|
||||||
|
--
|
||||||
|
2.20.1.windows.1
|
||||||
|
|
@ -123,6 +123,10 @@
|
|||||||
a vector can be quite slow, because it can lead to large numbers
|
a vector can be quite slow, because it can lead to large numbers
|
||||||
of items having to be moved by one position in memory.
|
of items having to be moved by one position in memory.
|
||||||
|
|
||||||
|
\row \li \l{QVarLengthArray}<T, Prealloc>
|
||||||
|
\li This provides a low-level variable-length array. It can be used
|
||||||
|
instead of QVector in places where speed is particularly important.
|
||||||
|
|
||||||
\row \li \l{QStack}<T>
|
\row \li \l{QStack}<T>
|
||||||
\li This is a convenience subclass of QVector that provides
|
\li This is a convenience subclass of QVector that provides
|
||||||
"last in, first out" (LIFO) semantics. It adds the following
|
"last in, first out" (LIFO) semantics. It adds the following
|
||||||
@ -622,15 +626,11 @@
|
|||||||
|
|
||||||
\section1 Other Container-Like Classes
|
\section1 Other Container-Like Classes
|
||||||
|
|
||||||
Qt includes three template classes that resemble containers in
|
Qt includes other template classes that resemble containers in
|
||||||
some respects. These classes don't provide iterators and cannot
|
some respects. These classes don't provide iterators and cannot
|
||||||
be used with the \c foreach keyword.
|
be used with the \c foreach keyword.
|
||||||
|
|
||||||
\list
|
\list
|
||||||
\li QVarLengthArray<T, Prealloc> provides a low-level
|
|
||||||
variable-length array. It can be used instead of QVector in
|
|
||||||
places where speed is particularly important.
|
|
||||||
|
|
||||||
\li QCache<Key, T> provides a cache to store objects of a certain
|
\li QCache<Key, T> provides a cache to store objects of a certain
|
||||||
type T associated with keys of type Key.
|
type T associated with keys of type Key.
|
||||||
|
|
||||||
|
@ -102,7 +102,7 @@ void QAndroidTimeZonePrivate::init(const QByteArray &ianaId)
|
|||||||
for (int style = 1; m_id.isEmpty() && style-- > 0;) {
|
for (int style = 1; m_id.isEmpty() && style-- > 0;) {
|
||||||
for (int dst = 1; m_id.isEmpty() && dst-- > 0;) {
|
for (int dst = 1; m_id.isEmpty() && dst-- > 0;) {
|
||||||
m_id = match(androidTimeZone.callObjectMethod(
|
m_id = match(androidTimeZone.callObjectMethod(
|
||||||
"getDisplayName", "(ZI;)Ljava/lang/String;", bool(dst), style));
|
"getDisplayName", "(ZI)Ljava/lang/String;", bool(dst), style));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -797,8 +797,12 @@ QPixmap ScalableEntry::pixmap(const QSize &size, QIcon::Mode mode, QIcon::State
|
|||||||
if (svgIcon.isNull())
|
if (svgIcon.isNull())
|
||||||
svgIcon = QIcon(filename);
|
svgIcon = QIcon(filename);
|
||||||
|
|
||||||
// Simply reuse svg icon engine
|
// Bypass QIcon API, as that will scale by device pixel ratio of the
|
||||||
return svgIcon.pixmap(size, mode, state);
|
// highest DPR screen since we're not passing on any QWindow.
|
||||||
|
if (QIconEngine *engine = svgIcon.data_ptr() ? svgIcon.data_ptr()->engine : nullptr)
|
||||||
|
return engine->pixmap(size, mode, state);
|
||||||
|
|
||||||
|
return QPixmap();
|
||||||
}
|
}
|
||||||
|
|
||||||
QPixmap QIconLoaderEngine::pixmap(const QSize &size, QIcon::Mode mode,
|
QPixmap QIconLoaderEngine::pixmap(const QSize &size, QIcon::Mode mode,
|
||||||
|
@ -1006,6 +1006,13 @@ QByteArray QWindowsContext::comErrorString(HRESULT hr)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QWindowsContext::forceNcCalcSize(HWND hwnd)
|
||||||
|
{
|
||||||
|
// Force WM_NCCALCSIZE to adjust margin
|
||||||
|
SetWindowPos(hwnd, nullptr, 0, 0, 0, 0,
|
||||||
|
SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
|
||||||
|
}
|
||||||
|
|
||||||
bool QWindowsContext::systemParametersInfo(unsigned action, unsigned param, void *out,
|
bool QWindowsContext::systemParametersInfo(unsigned action, unsigned param, void *out,
|
||||||
unsigned dpi)
|
unsigned dpi)
|
||||||
{
|
{
|
||||||
|
@ -249,6 +249,8 @@ public:
|
|||||||
bool asyncExpose() const;
|
bool asyncExpose() const;
|
||||||
void setAsyncExpose(bool value);
|
void setAsyncExpose(bool value);
|
||||||
|
|
||||||
|
static void forceNcCalcSize(HWND hwnd);
|
||||||
|
|
||||||
static bool systemParametersInfo(unsigned action, unsigned param, void *out, unsigned dpi = 0);
|
static bool systemParametersInfo(unsigned action, unsigned param, void *out, unsigned dpi = 0);
|
||||||
static bool systemParametersInfoForScreen(unsigned action, unsigned param, void *out,
|
static bool systemParametersInfoForScreen(unsigned action, unsigned param, void *out,
|
||||||
const QPlatformScreen *screen = nullptr);
|
const QPlatformScreen *screen = nullptr);
|
||||||
|
@ -794,20 +794,13 @@ QWindowsMenuBar *QWindowsMenuBar::menuBarOf(const QWindow *notYetCreatedWindow)
|
|||||||
? qobject_cast<QWindowsMenuBar *>(menuBarV.value<QObject *>()) : nullptr;
|
? qobject_cast<QWindowsMenuBar *>(menuBarV.value<QObject *>()) : nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void forceNcCalcSize(HWND hwnd)
|
|
||||||
{
|
|
||||||
// Force WM_NCCALCSIZE to adjust margin: Does not appear to work?
|
|
||||||
SetWindowPos(hwnd, nullptr, 0, 0, 0, 0,
|
|
||||||
SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_NOOWNERZORDER);
|
|
||||||
}
|
|
||||||
|
|
||||||
void QWindowsMenuBar::install(QWindowsWindow *window)
|
void QWindowsMenuBar::install(QWindowsWindow *window)
|
||||||
{
|
{
|
||||||
const HWND hwnd = window->handle();
|
const HWND hwnd = window->handle();
|
||||||
const BOOL result = SetMenu(hwnd, m_hMenuBar);
|
const BOOL result = SetMenu(hwnd, m_hMenuBar);
|
||||||
if (result) {
|
if (result) {
|
||||||
window->setMenuBar(this);
|
window->setMenuBar(this);
|
||||||
forceNcCalcSize(hwnd);
|
QWindowsContext::forceNcCalcSize(hwnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -817,7 +810,7 @@ void QWindowsMenuBar::removeFromWindow()
|
|||||||
const HWND hwnd = window->handle();
|
const HWND hwnd = window->handle();
|
||||||
SetMenu(hwnd, nullptr);
|
SetMenu(hwnd, nullptr);
|
||||||
window->setMenuBar(nullptr);
|
window->setMenuBar(nullptr);
|
||||||
forceNcCalcSize(hwnd);
|
QWindowsContext::forceNcCalcSize(hwnd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2442,7 +2442,17 @@ void QWindowsWindow::setFullFrameMargins(const QMargins &newMargins)
|
|||||||
|
|
||||||
void QWindowsWindow::updateFullFrameMargins()
|
void QWindowsWindow::updateFullFrameMargins()
|
||||||
{
|
{
|
||||||
// Normally obtained from WM_NCCALCSIZE
|
// QTBUG-82580: If a native menu is present, force a WM_NCCALCSIZE.
|
||||||
|
if (GetMenu(m_data.hwnd))
|
||||||
|
QWindowsContext::forceNcCalcSize(m_data.hwnd);
|
||||||
|
else
|
||||||
|
calculateFullFrameMargins();
|
||||||
|
}
|
||||||
|
|
||||||
|
void QWindowsWindow::calculateFullFrameMargins()
|
||||||
|
{
|
||||||
|
// Normally obtained from WM_NCCALCSIZE. This calculation only works
|
||||||
|
// when no native menu is present.
|
||||||
const auto systemMargins = testFlag(DisableNonClientScaling)
|
const auto systemMargins = testFlag(DisableNonClientScaling)
|
||||||
? QWindowsGeometryHint::frameOnPrimaryScreen(m_data.hwnd)
|
? QWindowsGeometryHint::frameOnPrimaryScreen(m_data.hwnd)
|
||||||
: frameMargins_sys();
|
: frameMargins_sys();
|
||||||
|
@ -373,6 +373,7 @@ private:
|
|||||||
void handleWindowStateChange(Qt::WindowStates state);
|
void handleWindowStateChange(Qt::WindowStates state);
|
||||||
inline void destroyIcon();
|
inline void destroyIcon();
|
||||||
void fireExpose(const QRegion ®ion, bool force=false);
|
void fireExpose(const QRegion ®ion, bool force=false);
|
||||||
|
void calculateFullFrameMargins();
|
||||||
|
|
||||||
mutable QWindowsWindowData m_data;
|
mutable QWindowsWindowData m_data;
|
||||||
QPointer<QWindowsMenuBar> m_menuBar;
|
QPointer<QWindowsMenuBar> m_menuBar;
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
#include <QtCore/QDir>
|
#include <QtCore/QDir>
|
||||||
#include <QtCore/QCoreApplication>
|
#include <QtCore/QCoreApplication>
|
||||||
#include <QtCore/qfunctions_winrt.h>
|
#include <QtCore/qfunctions_winrt.h>
|
||||||
|
#include <private/qeventdispatcher_winrt_p.h>
|
||||||
|
|
||||||
#include <wrl.h>
|
#include <wrl.h>
|
||||||
#include <windows.foundation.h>
|
#include <windows.foundation.h>
|
||||||
@ -94,13 +95,17 @@ bool QWinRTServices::openUrl(const QUrl &url)
|
|||||||
HRESULT hr = d->uriFactory->CreateUri(uriString.Get(), &uri);
|
HRESULT hr = d->uriFactory->CreateUri(uriString.Get(), &uri);
|
||||||
RETURN_FALSE_IF_FAILED("Failed to create URI from QUrl.");
|
RETURN_FALSE_IF_FAILED("Failed to create URI from QUrl.");
|
||||||
|
|
||||||
ComPtr<IAsyncOperation<bool>> op;
|
|
||||||
hr = d->launcher->LaunchUriAsync(uri.Get(), &op);
|
|
||||||
RETURN_FALSE_IF_FAILED("Failed to start URI launch.");
|
|
||||||
|
|
||||||
boolean result;
|
boolean result;
|
||||||
hr = QWinRTFunctions::await(op, &result);
|
hr = QEventDispatcherWinRT::runOnXamlThread([this, d, uri, &result]() {
|
||||||
RETURN_FALSE_IF_FAILED("Failed to launch URI.");
|
ComPtr<IAsyncOperation<bool>> op;
|
||||||
|
HRESULT hr = d->launcher->LaunchUriAsync(uri.Get(), &op);
|
||||||
|
RETURN_HR_IF_FAILED("Failed to start URI launch.");
|
||||||
|
|
||||||
|
hr = QWinRTFunctions::await(op, &result);
|
||||||
|
RETURN_HR_IF_FAILED("Failed to launch URI.");
|
||||||
|
return hr;
|
||||||
|
});
|
||||||
|
RETURN_FALSE_IF_FAILED("Failed to launch URI from Xaml thread.");
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -131,12 +136,16 @@ bool QWinRTServices::openDocument(const QUrl &url)
|
|||||||
|
|
||||||
boolean result;
|
boolean result;
|
||||||
{
|
{
|
||||||
ComPtr<IAsyncOperation<bool>> op;
|
hr = QEventDispatcherWinRT::runOnXamlThread([this, d, file, &result]() {
|
||||||
hr = d->launcher->LaunchFileAsync(file.Get(), &op);
|
ComPtr<IAsyncOperation<bool>> op;
|
||||||
RETURN_FALSE_IF_FAILED("Failed to start file launch.");
|
HRESULT hr = d->launcher->LaunchFileAsync(file.Get(), &op);
|
||||||
|
RETURN_HR_IF_FAILED("Failed to start file launch.");
|
||||||
|
|
||||||
hr = QWinRTFunctions::await(op, &result);
|
hr = QWinRTFunctions::await(op, &result);
|
||||||
RETURN_FALSE_IF_FAILED("Failed to launch file.");
|
RETURN_HR_IF_FAILED("Failed to launch file.");
|
||||||
|
return hr;
|
||||||
|
});
|
||||||
|
RETURN_FALSE_IF_FAILED("Failed to launch file from Xaml thread.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -3755,7 +3755,8 @@ int QTreeViewPrivate::itemDecorationAt(const QPoint &pos) const
|
|||||||
bool spanned = false;
|
bool spanned = false;
|
||||||
if (!spanningIndexes.isEmpty()) {
|
if (!spanningIndexes.isEmpty()) {
|
||||||
const QModelIndex index = q->indexAt(pos);
|
const QModelIndex index = q->indexAt(pos);
|
||||||
spanned = q->isFirstColumnSpanned(index.row(), index.parent());
|
if (index.isValid())
|
||||||
|
spanned = q->isFirstColumnSpanned(index.row(), index.parent());
|
||||||
}
|
}
|
||||||
const int column = spanned ? 0 : header->logicalIndexAt(pos.x());
|
const int column = spanned ? 0 : header->logicalIndexAt(pos.x());
|
||||||
if (!isTreePosition(column))
|
if (!isTreePosition(column))
|
||||||
|
@ -1090,12 +1090,21 @@ void tst_QUdpSocket::outOfProcessConnectedClientServerTest()
|
|||||||
QProcess serverProcess;
|
QProcess serverProcess;
|
||||||
serverProcess.start(QLatin1String("clientserver/clientserver server 1 1"),
|
serverProcess.start(QLatin1String("clientserver/clientserver server 1 1"),
|
||||||
QIODevice::ReadWrite | QIODevice::Text);
|
QIODevice::ReadWrite | QIODevice::Text);
|
||||||
QVERIFY2(serverProcess.waitForStarted(3000),
|
|
||||||
qPrintable("Failed to start subprocess: " + serverProcess.errorString()));
|
const auto serverProcessCleaner = qScopeGuard([&serverProcess] {
|
||||||
|
serverProcess.kill();
|
||||||
|
serverProcess.waitForFinished();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!serverProcess.waitForStarted(3000))
|
||||||
|
QSKIP("Failed to start server as a subprocess");
|
||||||
|
|
||||||
// Wait until the server has started and reports success.
|
// Wait until the server has started and reports success.
|
||||||
while (!serverProcess.canReadLine())
|
while (!serverProcess.canReadLine()) {
|
||||||
QVERIFY(serverProcess.waitForReadyRead(3000));
|
if (!serverProcess.waitForReadyRead(3000))
|
||||||
|
QSKIP("No output from the server process, bailing out");
|
||||||
|
}
|
||||||
|
|
||||||
QByteArray serverGreeting = serverProcess.readLine();
|
QByteArray serverGreeting = serverProcess.readLine();
|
||||||
QVERIFY(serverGreeting != QByteArray("XXX\n"));
|
QVERIFY(serverGreeting != QByteArray("XXX\n"));
|
||||||
int serverPort = serverGreeting.trimmed().toInt();
|
int serverPort = serverGreeting.trimmed().toInt();
|
||||||
@ -1105,12 +1114,21 @@ void tst_QUdpSocket::outOfProcessConnectedClientServerTest()
|
|||||||
clientProcess.start(QString::fromLatin1("clientserver/clientserver connectedclient %1 %2")
|
clientProcess.start(QString::fromLatin1("clientserver/clientserver connectedclient %1 %2")
|
||||||
.arg(QLatin1String("127.0.0.1")).arg(serverPort),
|
.arg(QLatin1String("127.0.0.1")).arg(serverPort),
|
||||||
QIODevice::ReadWrite | QIODevice::Text);
|
QIODevice::ReadWrite | QIODevice::Text);
|
||||||
QVERIFY2(clientProcess.waitForStarted(3000),
|
|
||||||
qPrintable("Failed to start subprocess: " + clientProcess.errorString()));
|
|
||||||
|
|
||||||
// Wait until the server has started and reports success.
|
const auto clientProcessCleaner = qScopeGuard([&clientProcess] {
|
||||||
while (!clientProcess.canReadLine())
|
clientProcess.kill();
|
||||||
QVERIFY(clientProcess.waitForReadyRead(3000));
|
clientProcess.waitForFinished();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!clientProcess.waitForStarted(3000))
|
||||||
|
QSKIP("Client process did not start");
|
||||||
|
|
||||||
|
// Wait until the client has started and reports success.
|
||||||
|
while (!clientProcess.canReadLine()) {
|
||||||
|
if (!clientProcess.waitForReadyRead(3000))
|
||||||
|
QSKIP("No output from the client process, bailing out");
|
||||||
|
}
|
||||||
|
|
||||||
QByteArray clientGreeting = clientProcess.readLine();
|
QByteArray clientGreeting = clientProcess.readLine();
|
||||||
QCOMPARE(clientGreeting, QByteArray("ok\n"));
|
QCOMPARE(clientGreeting, QByteArray("ok\n"));
|
||||||
|
|
||||||
@ -1135,11 +1153,6 @@ void tst_QUdpSocket::outOfProcessConnectedClientServerTest()
|
|||||||
QCOMPARE(serverData.at(i * 3 + 2).trimmed().mid(8).toInt(),
|
QCOMPARE(serverData.at(i * 3 + 2).trimmed().mid(8).toInt(),
|
||||||
sdata.mid(4).trimmed().toInt() * 2);
|
sdata.mid(4).trimmed().toInt() * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
clientProcess.kill();
|
|
||||||
QVERIFY(clientProcess.waitForFinished());
|
|
||||||
serverProcess.kill();
|
|
||||||
QVERIFY(serverProcess.waitForFinished());
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1151,12 +1164,21 @@ void tst_QUdpSocket::outOfProcessUnconnectedClientServerTest()
|
|||||||
QProcess serverProcess;
|
QProcess serverProcess;
|
||||||
serverProcess.start(QLatin1String("clientserver/clientserver server 1 1"),
|
serverProcess.start(QLatin1String("clientserver/clientserver server 1 1"),
|
||||||
QIODevice::ReadWrite | QIODevice::Text);
|
QIODevice::ReadWrite | QIODevice::Text);
|
||||||
QVERIFY2(serverProcess.waitForStarted(3000),
|
|
||||||
qPrintable("Failed to start subprocess: " + serverProcess.errorString()));
|
const auto serverProcessCleaner = qScopeGuard([&serverProcess] {
|
||||||
|
serverProcess.kill();
|
||||||
|
serverProcess.waitForFinished();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!serverProcess.waitForStarted(3000))
|
||||||
|
QSKIP("Failed to start the server subprocess");
|
||||||
|
|
||||||
// Wait until the server has started and reports success.
|
// Wait until the server has started and reports success.
|
||||||
while (!serverProcess.canReadLine())
|
while (!serverProcess.canReadLine()) {
|
||||||
QVERIFY(serverProcess.waitForReadyRead(3000));
|
if (!serverProcess.waitForReadyRead(3000))
|
||||||
|
QSKIP("No output from the server, probably, it is not running");
|
||||||
|
}
|
||||||
|
|
||||||
QByteArray serverGreeting = serverProcess.readLine();
|
QByteArray serverGreeting = serverProcess.readLine();
|
||||||
QVERIFY(serverGreeting != QByteArray("XXX\n"));
|
QVERIFY(serverGreeting != QByteArray("XXX\n"));
|
||||||
int serverPort = serverGreeting.trimmed().toInt();
|
int serverPort = serverGreeting.trimmed().toInt();
|
||||||
@ -1166,12 +1188,21 @@ void tst_QUdpSocket::outOfProcessUnconnectedClientServerTest()
|
|||||||
clientProcess.start(QString::fromLatin1("clientserver/clientserver unconnectedclient %1 %2")
|
clientProcess.start(QString::fromLatin1("clientserver/clientserver unconnectedclient %1 %2")
|
||||||
.arg(QLatin1String("127.0.0.1")).arg(serverPort),
|
.arg(QLatin1String("127.0.0.1")).arg(serverPort),
|
||||||
QIODevice::ReadWrite | QIODevice::Text);
|
QIODevice::ReadWrite | QIODevice::Text);
|
||||||
QVERIFY2(clientProcess.waitForStarted(3000),
|
|
||||||
qPrintable("Failed to start subprocess: " + clientProcess.errorString()));
|
|
||||||
|
|
||||||
// Wait until the server has started and reports success.
|
const auto clientProcessCleaner = qScopeGuard([&clientProcess] {
|
||||||
while (!clientProcess.canReadLine())
|
clientProcess.kill();
|
||||||
QVERIFY(clientProcess.waitForReadyRead(3000));
|
clientProcess.waitForFinished();
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!clientProcess.waitForStarted(3000))
|
||||||
|
QSKIP("Failed to start the client's subprocess");
|
||||||
|
|
||||||
|
// Wait until the client has started and reports success.
|
||||||
|
while (!clientProcess.canReadLine()) {
|
||||||
|
if (!clientProcess.waitForReadyRead(3000))
|
||||||
|
QSKIP("The client subprocess produced not output, exiting.");
|
||||||
|
}
|
||||||
|
|
||||||
QByteArray clientGreeting = clientProcess.readLine();
|
QByteArray clientGreeting = clientProcess.readLine();
|
||||||
QCOMPARE(clientGreeting, QByteArray("ok\n"));
|
QCOMPARE(clientGreeting, QByteArray("ok\n"));
|
||||||
|
|
||||||
@ -1197,11 +1228,6 @@ void tst_QUdpSocket::outOfProcessUnconnectedClientServerTest()
|
|||||||
QCOMPARE(serverData.at(i * 3 + 2).trimmed().mid(8).toInt(),
|
QCOMPARE(serverData.at(i * 3 + 2).trimmed().mid(8).toInt(),
|
||||||
sdata.mid(4).trimmed().toInt() * 2);
|
sdata.mid(4).trimmed().toInt() * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
clientProcess.kill();
|
|
||||||
QVERIFY(clientProcess.waitForFinished());
|
|
||||||
serverProcess.kill();
|
|
||||||
QVERIFY(serverProcess.waitForFinished());
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ private slots:
|
|||||||
void about();
|
void about();
|
||||||
void detailsText();
|
void detailsText();
|
||||||
void detailsButtonText();
|
void detailsButtonText();
|
||||||
void expandDetails_QTBUG_32473();
|
void expandDetailsWithoutMoving();
|
||||||
|
|
||||||
#ifndef Q_OS_MAC
|
#ifndef Q_OS_MAC
|
||||||
void shortcut();
|
void shortcut();
|
||||||
@ -499,7 +499,7 @@ void tst_QMessageBox::detailsButtonText()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QMessageBox::expandDetails_QTBUG_32473()
|
void tst_QMessageBox::expandDetailsWithoutMoving() // QTBUG-32473
|
||||||
{
|
{
|
||||||
tst_ResizingMessageBox box;
|
tst_ResizingMessageBox box;
|
||||||
box.setDetailedText("bla");
|
box.setDetailedText("bla");
|
||||||
@ -516,18 +516,14 @@ void tst_QMessageBox::expandDetails_QTBUG_32473()
|
|||||||
auto moreButton = *it;
|
auto moreButton = *it;
|
||||||
|
|
||||||
QVERIFY(QTest::qWaitForWindowExposed(&box));
|
QVERIFY(QTest::qWaitForWindowExposed(&box));
|
||||||
|
QTRY_VERIFY2(!box.geometry().topLeft().isNull(), "window manager is expected to decorate and position the dialog");
|
||||||
QRect geom = box.geometry();
|
QRect geom = box.geometry();
|
||||||
box.resized = false;
|
box.resized = false;
|
||||||
|
// now click the "more" button, and verify that the dialog resizes but does not move
|
||||||
moreButton->click();
|
moreButton->click();
|
||||||
QTRY_VERIFY(box.resized);
|
QTRY_VERIFY(box.resized);
|
||||||
// After we receive the expose event for a second widget, it's likely
|
QVERIFY(box.geometry().height() > geom.height());
|
||||||
// that the window manager is also done manipulating the first QMessageBox.
|
QCOMPARE(box.geometry().topLeft(), geom.topLeft());
|
||||||
QWidget fleece;
|
|
||||||
fleece.show();
|
|
||||||
QVERIFY(QTest::qWaitForWindowExposed(&fleece));
|
|
||||||
if (geom.topLeft() == box.geometry().topLeft())
|
|
||||||
QTest::qWait(500);
|
|
||||||
QCOMPARE(geom.topLeft(), box.geometry().topLeft());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QMessageBox::incorrectDefaultButton()
|
void tst_QMessageBox::incorrectDefaultButton()
|
||||||
|
@ -294,6 +294,12 @@ public:
|
|||||||
|
|
||||||
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
|
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
|
||||||
{
|
{
|
||||||
|
if (onlyValidCalls) {
|
||||||
|
Q_ASSERT(row >= 0);
|
||||||
|
Q_ASSERT(column >= 0);
|
||||||
|
Q_ASSERT(row < rows);
|
||||||
|
Q_ASSERT(column < cols);
|
||||||
|
}
|
||||||
if (row < 0 || column < 0 || (level(parent) > levels) || column >= cols || row >= rows) {
|
if (row < 0 || column < 0 || (level(parent) > levels) || column >= cols || row >= rows) {
|
||||||
return QModelIndex();
|
return QModelIndex();
|
||||||
}
|
}
|
||||||
@ -402,6 +408,7 @@ public:
|
|||||||
mutable bool fetched = false;
|
mutable bool fetched = false;
|
||||||
bool decorationsEnabled = false;
|
bool decorationsEnabled = false;
|
||||||
bool statusTipsEnabled = false;
|
bool statusTipsEnabled = false;
|
||||||
|
bool onlyValidCalls = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Testing get/set functions
|
// Testing get/set functions
|
||||||
@ -2450,6 +2457,7 @@ void tst_QTreeView::hiddenItems()
|
|||||||
void tst_QTreeView::spanningItems()
|
void tst_QTreeView::spanningItems()
|
||||||
{
|
{
|
||||||
QtTestModel model(10, 10);
|
QtTestModel model(10, 10);
|
||||||
|
model.onlyValidCalls = true;
|
||||||
QTreeView view;
|
QTreeView view;
|
||||||
view.setModel(&model);
|
view.setModel(&model);
|
||||||
view.show();
|
view.show();
|
||||||
@ -2489,6 +2497,8 @@ void tst_QTreeView::spanningItems()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
QCOMPARE(view.sizeHintForColumn(0), w);
|
QCOMPARE(view.sizeHintForColumn(0), w);
|
||||||
|
|
||||||
|
view.repaint(); // to check that this doesn't hit any assert
|
||||||
}
|
}
|
||||||
|
|
||||||
void tst_QTreeView::selectionOrderTest()
|
void tst_QTreeView::selectionOrderTest()
|
||||||
|
Loading…
Reference in New Issue
Block a user