Merge "Merge remote-tracking branch 'origin/5.14' into 5.15"

This commit is contained in:
Qt Forward Merge Bot 2020-01-28 01:00:09 +01:00 committed by Simon Hausmann
commit 6c3eb39832
54 changed files with 9411 additions and 185 deletions

View File

@ -212,21 +212,17 @@ contains(CONFIG, plugin) {
CMAKE_PLUGIN_TYPE_ESCAPED = $$replace(PLUGIN_TYPE, [-/], _)
win32 {
CMAKE_PRL_FILE_LOCATION_RELEASE = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}.prl
CMAKE_PRL_FILE_LOCATION_DEBUG = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}d.prl
isEmpty(CMAKE_STATIC_TYPE) {
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}.dll
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}d.dll
CMAKE_PRL_FILE_LOCATION_RELEASE = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}.prl
CMAKE_PRL_FILE_LOCATION_DEBUG = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}d.prl
} else:mingw {
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}.a
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}d.a
CMAKE_PRL_FILE_LOCATION_RELEASE = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}.prl
CMAKE_PRL_FILE_LOCATION_DEBUG = $$PLUGIN_TYPE/lib$${CMAKE_QT_STEM}d.prl
} else { # MSVC static
CMAKE_PLUGIN_LOCATION_RELEASE = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}.lib
CMAKE_PLUGIN_LOCATION_DEBUG = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}d.lib
CMAKE_PRL_FILE_LOCATION_RELEASE = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}.prl
CMAKE_PRL_FILE_LOCATION_DEBUG = $$PLUGIN_TYPE/$${CMAKE_QT_STEM}d.prl
}
} else {
mac {
@ -320,36 +316,25 @@ mac {
CMAKE_LIB_FILE_LOCATION_DEBUG = $${CMAKE_QT_STEM}d.dll
CMAKE_LIB_FILE_LOCATION_RELEASE = $${CMAKE_QT_STEM}.dll
!isEmpty(CMAKE_STATIC_TYPE) {
CMAKE_STATIC_WINDOWS_BUILD = "true"
CMAKE_PRL_FILE_LOCATION_DEBUG = $${CMAKE_QT_STEM}d.prl
CMAKE_PRL_FILE_LOCATION_RELEASE = $${CMAKE_QT_STEM}.prl
}
mingw {
CMAKE_WINMAIN_FILE_LOCATION_DEBUG = libqtmain$${QT_LIBINFIX}d.a
CMAKE_WINMAIN_FILE_LOCATION_RELEASE = libqtmain$${QT_LIBINFIX}.a
!isEmpty(CMAKE_STATIC_TYPE) {
CMAKE_STATIC_WINDOWS_BUILD = "true"
CMAKE_IMPLIB_FILE_LOCATION_DEBUG = lib$${CMAKE_QT_STEM}d.a
CMAKE_IMPLIB_FILE_LOCATION_RELEASE = lib$${CMAKE_QT_STEM}.a
CMAKE_PRL_FILE_LOCATION_DEBUG = lib$${CMAKE_QT_STEM}d.prl
CMAKE_PRL_FILE_LOCATION_RELEASE = lib$${CMAKE_QT_STEM}.prl
} else {
CMAKE_IMPLIB_FILE_LOCATION_DEBUG = lib$${CMAKE_QT_STEM}d.a
CMAKE_IMPLIB_FILE_LOCATION_RELEASE = lib$${CMAKE_QT_STEM}.a
}
CMAKE_IMPLIB_FILE_LOCATION_DEBUG = lib$${CMAKE_QT_STEM}d.a
CMAKE_IMPLIB_FILE_LOCATION_RELEASE = lib$${CMAKE_QT_STEM}.a
} else {
CMAKE_WINMAIN_FILE_LOCATION_DEBUG = qtmain$${QT_LIBINFIX}d.lib
CMAKE_WINMAIN_FILE_LOCATION_RELEASE = qtmain$${QT_LIBINFIX}.lib
!isEmpty(CMAKE_STATIC_TYPE) {
CMAKE_STATIC_WINDOWS_BUILD = "true"
CMAKE_IMPLIB_FILE_LOCATION_DEBUG = $${CMAKE_QT_STEM}d.lib
CMAKE_IMPLIB_FILE_LOCATION_RELEASE = $${CMAKE_QT_STEM}.lib
CMAKE_PRL_FILE_LOCATION_DEBUG = $${CMAKE_QT_STEM}d.prl
CMAKE_PRL_FILE_LOCATION_RELEASE = $${CMAKE_QT_STEM}.prl
} else {
CMAKE_IMPLIB_FILE_LOCATION_DEBUG = $${CMAKE_QT_STEM}d.lib
CMAKE_IMPLIB_FILE_LOCATION_RELEASE = $${CMAKE_QT_STEM}.lib
}
CMAKE_IMPLIB_FILE_LOCATION_DEBUG = $${CMAKE_QT_STEM}d.lib
CMAKE_IMPLIB_FILE_LOCATION_RELEASE = $${CMAKE_QT_STEM}.lib
}
} else {
!isEmpty(CMAKE_STATIC_TYPE) {

View File

@ -64,11 +64,13 @@ debug {
QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_DEBUG
QMAKE_LFLAGS += $$QMAKE_LFLAGS_DEBUG
QMAKE_LIBFLAGS += $$QMAKE_LIBFLAGS_DEBUG
DEFINES += $$DEFINES_DEBUG
} else {
QMAKE_CFLAGS += $$QMAKE_CFLAGS_RELEASE
QMAKE_CXXFLAGS += $$QMAKE_CXXFLAGS_RELEASE
QMAKE_LFLAGS += $$QMAKE_LFLAGS_RELEASE
QMAKE_LIBFLAGS += $$QMAKE_LIBFLAGS_RELEASE
DEFINES += $$DEFINES_RELEASE
}
stack_protector_strong {

View File

@ -26,10 +26,4 @@ CONFIG = \
unset(today)
}
CONFIG(debug, debug|release) {
DEFINES += $$DEFINES_DEBUG
} else {
DEFINES += $$DEFINES_RELEASE
}
load(toolchain)

View File

@ -36,6 +36,7 @@ EMCC_COMMON_LFLAGS += \
-s USE_WEBGL2=1 \
-s NO_EXIT_RUNTIME=0 \
-s ERROR_ON_UNDEFINED_SYMBOLS=1 \
-s EXTRA_EXPORTED_RUNTIME_METHODS=[\"UTF16ToString\",\"stringToUTF16\"] \
--bind
# The -s arguments can also be used with release builds,

View File

@ -1168,7 +1168,7 @@
\section1 DEFINES_DEBUG
Specifies preprocessor defines for the debug configuration. The values of
this variable get added to \l{DEFINES} before the project is loaded. This
this variable get added to \l{DEFINES} after the project is loaded. This
variable is typically set in \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
@ -1178,10 +1178,13 @@
\section1 DEFINES_RELEASE
Specifies preprocessor defines for the release configuration. The values of
this variable get added to \l{DEFINES} before the project is loaded. This
this variable get added to \l{DEFINES} after the project is loaded. This
variable is typically set in \l{#QMAKESPEC}{qmake.conf} and rarely needs
to be modified.
\note For MSVC mkspecs, this variable contains the value \c NDEBUG by
default.
This variable was introduced in Qt 5.13.2.
\target DEF_FILE

View File

@ -535,8 +535,25 @@ static QString getRelocatablePrefix()
#if defined(QT_STATIC)
prefixPath = prefixFromAppDirHelper();
#elif defined(Q_OS_DARWIN) && QT_CONFIG(framework)
CFBundleRef qtCoreBundle = CFBundleGetBundleWithIdentifier(
CFSTR("org.qt-project.QtCore"));
auto qtCoreBundle = CFBundleGetBundleWithIdentifier(CFSTR("org.qt-project.QtCore"));
if (!qtCoreBundle) {
// When running Qt apps over Samba shares, CoreFoundation will fail to find
// the Resources directory inside the bundle, This directory is a symlink,
// and CF relies on readdir() and dtent.dt_type to detect symlinks, which
// does not work reliably for Samba shares. We work around it by manually
// looking for the QtCore bundle.
auto allBundles = CFBundleGetAllBundles();
auto bundleCount = CFArrayGetCount(allBundles);
for (int i = 0; i < bundleCount; ++i) {
auto bundle = CFBundleRef(CFArrayGetValueAtIndex(allBundles, i));
auto url = QCFType<CFURLRef>(CFBundleCopyBundleURL(bundle));
auto path = QCFType<CFStringRef>(CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle));
if (CFStringHasSuffix(path, CFSTR("/QtCore.framework"))) {
qtCoreBundle = bundle;
break;
}
}
}
Q_ASSERT(qtCoreBundle);
QCFType<CFURLRef> qtCorePath = CFBundleCopyBundleURL(qtCoreBundle);

View File

@ -1023,7 +1023,7 @@
\value WA_MacNoClickThrough This value is obsolete and has no effect.
\value WA_MacOpaqueSizeGrip Indicates that the native Carbon size grip
\value WA_MacOpaqueSizeGrip Indicates that the native size grip
should be opaque instead of transparent (the default). This attribute
is only applicable to \macos and is set by the widget's author.

View File

@ -50,6 +50,7 @@
#endif
#include <qstack.h>
#include <qbuffer.h>
#include <qscopeguard.h>
#ifndef QT_BOOTSTRAPPED
#include <qcoreapplication.h>
#else
@ -68,6 +69,8 @@ public: \
{ return QString::fromLatin1(sourceText); } \
private:
#endif
#include <private/qmemory_p.h>
QT_BEGIN_NAMESPACE
#include "qxmlstream_p.h"
@ -847,7 +850,7 @@ void QXmlStreamReaderPrivate::init()
#endif
attributeStack.clear();
attributeStack.reserve(16);
entityParser = nullptr;
entityParser.reset();
hasCheckedStartDocument = false;
normalizeLiterals = false;
hasSeenTag = false;
@ -880,7 +883,7 @@ void QXmlStreamReaderPrivate::parseEntity(const QString &value)
if (!entityParser)
entityParser = new QXmlStreamReaderPrivate(q);
entityParser = qt_make_unique<QXmlStreamReaderPrivate>(q);
else
entityParser->init();
entityParser->inParseEntity = true;
@ -910,7 +913,6 @@ QXmlStreamReaderPrivate::~QXmlStreamReaderPrivate()
#endif
free(sym_stack);
free(state_stack);
delete entityParser;
}
@ -1582,6 +1584,7 @@ QStringRef QXmlStreamReaderPrivate::namespaceForPrefix(const QStringRef &prefix)
*/
void QXmlStreamReaderPrivate::resolveTag()
{
const auto attributeStackCleaner = qScopeGuard([this](){ attributeStack.clear(); });
int n = attributeStack.size();
if (namespaceProcessing) {
@ -1649,7 +1652,10 @@ void QXmlStreamReaderPrivate::resolveTag()
if (attributes[j].name() == attribute.name()
&& attributes[j].namespaceUri() == attribute.namespaceUri()
&& (namespaceProcessing || attributes[j].qualifiedName() == attribute.qualifiedName()))
{
raiseWellFormedError(QXmlStream::tr("Attribute '%1' redefined.").arg(attribute.qualifiedName()));
return;
}
}
}
@ -1680,8 +1686,6 @@ void QXmlStreamReaderPrivate::resolveTag()
attribute.m_isDefault = true;
attributes.append(attribute);
}
attributeStack.clear();
}
void QXmlStreamReaderPrivate::resolvePublicNamespaces()

View File

@ -981,7 +981,7 @@ public:
QString resolveUndeclaredEntity(const QString &name);
void parseEntity(const QString &value);
QXmlStreamReaderPrivate *entityParser;
std::unique_ptr<QXmlStreamReaderPrivate> entityParser;
bool scanAfterLangleBang();
bool scanPublicOrSystem();

View File

@ -734,23 +734,23 @@ static void updateSystemPrivate()
globalLocaleData.m_script_id = res.toInt();
res = sys_locale->query(QSystemLocale::DecimalPoint, QVariant());
if (!res.isNull())
if (!res.isNull() && !res.toString().isEmpty())
globalLocaleData.m_decimal = res.toString().at(0).unicode();
res = sys_locale->query(QSystemLocale::GroupSeparator, QVariant());
if (!res.isNull())
if (!res.isNull() && !res.toString().isEmpty())
globalLocaleData.m_group = res.toString().at(0).unicode();
res = sys_locale->query(QSystemLocale::ZeroDigit, QVariant());
if (!res.isNull())
if (!res.isNull() && !res.toString().isEmpty())
globalLocaleData.m_zero = res.toString().at(0).unicode();
res = sys_locale->query(QSystemLocale::NegativeSign, QVariant());
if (!res.isNull())
if (!res.isNull() && !res.toString().isEmpty())
globalLocaleData.m_minus = res.toString().at(0).unicode();
res = sys_locale->query(QSystemLocale::PositiveSign, QVariant());
if (!res.isNull())
if (!res.isNull() && !res.toString().isEmpty())
globalLocaleData.m_plus = res.toString().at(0).unicode();
}
#endif // !QT_NO_SYSTEMLOCALE
@ -4463,6 +4463,8 @@ QStringList QLocale::uiLanguages() const
for (const auto entry : qAsConst(uiLanguages))
locales.append(QLocale(entry));
}
if (locales.isEmpty())
locales.append(systemLocale()->fallbackUiLocale());
} else
#endif
{

View File

@ -48,7 +48,7 @@ SOURCES += \
NO_PCH_SOURCES += text/qstring_compat.cpp
false: SOURCES += $$NO_PCH_SOURCES # Hack for QtCreator
!nacl:macos: {
!nacl:darwin: {
SOURCES += text/qlocale_mac.mm
}
else:unix {

View File

@ -1269,6 +1269,55 @@
\row \li \c word-spacing
\li <width>px
\li Specifies an alternate spacing between each word.
\row \li \c line-height
\li <number>[% | px | pt | cm]
\li Specifies the height of a line. It can be one of the
following:
\list
\li fixed line height in pixels, points, or centimeters.
\li a percentage of the current font size.
\endlist
\endtable
\section1 Qt-specific CSS properties
Besides the standard CSS properties listed earlier, the following
Qt-specific properties can also be used to style a text block:
\table
\header \li Property
\li Values
\li Description
\row
\li \c -qt-block-indent
\li \c <number>
\li Indents the text block by the specified no. spaces.
\row
\li \c -qt-list-indent
\li \c <number>
\li Indents the list items by the specified no. of spaces.
\row
\li \c -qt-list-number-prefix
\li \c <string>
\li Prefixes the given string to list number in an HTML ordered list.
\row
\li \c -qt-list-number-suffix
\li <string>
\li Suffixes the given string to list number in an HTML ordered list.
\row
\li \c -qt-paragraph-type
\li \c empty
\li Hides the text block.
\row
\li \c -qt-table-type
\li \c{root | frame}
\li \c root renders the text blocks inline without borders and
indentation, whereas \c frame renders them on a new line
with a frame around.
\row
\li \c -qt-user-state
\li \c <number>
\li Adds it as user data for the text block.
\endtable
\section1 Supported CSS Selectors

View File

@ -916,6 +916,9 @@ bool QPNGImageWriter::writeImage(const QImage& image, int compression_in, const
}
png_set_error_fn(png_ptr, nullptr, nullptr, qt_png_warning);
#ifdef PNG_BENIGN_ERRORS_SUPPORTED
png_set_benign_errors(png_ptr, 1);
#endif
info_ptr = png_create_info_struct(png_ptr);
if (!info_ptr) {

View File

@ -1150,8 +1150,8 @@ QKeyEvent::~QKeyEvent()
Note: The native scan code may be 0, even if the key event contains
extended information.
Note: On Mac OS/X, this function is not useful, because there is no
way to get the scan code from Carbon or Cocoa. The function always
Note: On \macos, this function is not useful, because there is no
way to get the scan code from the system APIs. The function always
returns 1 (or 0 in the case explained above).
*/

View File

@ -900,7 +900,7 @@ Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void */*reserved*/)
uenv.venv = nullptr;
m_javaVM = nullptr;
if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_6) != JNI_OK) {
__android_log_print(ANDROID_LOG_FATAL, "Qt", "GetEnv failed");
return -1;
}
@ -922,5 +922,5 @@ Q_DECL_EXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void */*reserved*/)
if (threadSetter.thread())
threadSetter.thread()->setObjectName("QtMainLoopThread");
__android_log_print(ANDROID_LOG_INFO, "Qt", "qt started");
return JNI_VERSION_1_4;
return JNI_VERSION_1_6;
}

View File

@ -29,6 +29,7 @@
#include "qwasmclipboard.h"
#include "qwasmwindow.h"
#include "qwasmstring.h"
#include <emscripten.h>
#include <emscripten/html5.h>
@ -40,22 +41,22 @@
using namespace emscripten;
// there has got to be a better way...
static QByteArray g_clipboardArray;
static QByteArray g_clipboardFormat;
static QString g_clipboardText;
static QString g_clipboardFormat;
static val getClipboardData()
{
return val(g_clipboardArray.constData());
return QWasmString::fromQString(g_clipboardText);
}
static val getClipboardFormat()
{
return val(g_clipboardFormat.constData());
return QWasmString::fromQString(g_clipboardFormat);
}
static void pasteClipboardData(emscripten::val format, emscripten::val dataPtr)
{
QString formatString = QString::fromStdString(format.as<std::string>());
QString formatString = QWasmString::toQString(format);
QByteArray dataArray = QByteArray::fromStdString(dataPtr.as<std::string>());
QMimeData *mMimeData = new QMimeData;
mMimeData->setData(formatString, dataArray);
@ -102,11 +103,10 @@ static void qClipboardPasteTo(val event)
bool hasClipboardApi = QWasmIntegration::get()->getWasmClipboard()->hasClipboardApi;
val clipdata = hasClipboardApi ?
val::global("Module").call<val>("qtGetClipboardData") :
event["clipboardData"].call<val>("getData", std::string("text"));
event["clipboardData"].call<val>("getData", val("text"));
const std::string data = clipdata.as<std::string>();
if (data.length() > 0) {
QString qstr = QString::fromStdString(data);
const QString qstr = QWasmString::toQString(clipdata);
if (qstr.length() > 0) {
QMimeData *mMimeData = new QMimeData;
mMimeData->setText(qstr);
QWasmClipboard::qWasmClipboardPaste(mMimeData);
@ -133,7 +133,7 @@ QWasmClipboard::QWasmClipboard()
QWasmClipboard::~QWasmClipboard()
{
g_clipboardArray.clear();
g_clipboardText.clear();
g_clipboardFormat.clear();
}
@ -148,11 +148,11 @@ QMimeData* QWasmClipboard::mimeData(QClipboard::Mode mode)
void QWasmClipboard::setMimeData(QMimeData* mimeData, QClipboard::Mode mode)
{
if (mimeData->hasText()) {
g_clipboardFormat = mimeData->formats().at(0).toUtf8();
g_clipboardArray = mimeData->text().toUtf8();
g_clipboardFormat = mimeData->formats().at(0);
g_clipboardText = mimeData->text();
} else if (mimeData->hasHtml()) {
g_clipboardFormat =mimeData->formats().at(0).toUtf8();
g_clipboardArray = mimeData->html().toUtf8();
g_clipboardFormat = mimeData->formats().at(0);
g_clipboardText = mimeData->html();
}
QPlatformClipboard::setMimeData(mimeData, mode);
@ -199,13 +199,13 @@ void QWasmClipboard::installEventHandlers(const QString &canvasId)
// Fallback path for browsers which do not support direct clipboard access
val document = val::global("document");
val canvas = document.call<val>("getElementById", val(canvasId.toUtf8().constData()));
val canvas = document.call<val>("getElementById", QWasmString::fromQString(canvasId));
canvas.call<void>("addEventListener", std::string("cut"),
canvas.call<void>("addEventListener", val("cut"),
val::module_property("qtClipboardCutTo"));
canvas.call<void>("addEventListener", std::string("copy"),
canvas.call<void>("addEventListener", val("copy"),
val::module_property("qtClipboardCopyTo"));
canvas.call<void>("addEventListener", std::string("paste"),
canvas.call<void>("addEventListener", val("paste"),
val::module_property("qtClipboardPasteTo"));
}
@ -226,6 +226,6 @@ void QWasmClipboard::writeTextToClipboard()
val txt = module.call<val>("qtGetClipboardData");
val format = module.call<val>("qtGetClipboardFormat");
val navigator = val::global("navigator");
navigator["clipboard"].call<void>("writeText", txt.as<std::string>());
navigator["clipboard"].call<void>("writeText", txt);
}
}

View File

@ -29,6 +29,7 @@
#include "qwasmcursor.h"
#include "qwasmscreen.h"
#include "qwasmstring.h"
#include <QtCore/qdebug.h>
#include <QtGui/qwindow.h>
@ -56,11 +57,11 @@ void QWasmCursor::changeCursor(QCursor *windowCursor, QWindow *window)
htmlCursorName = "auto";
// Set cursor on the canvas
QByteArray canvasId = QWasmScreen::get(screen)->canvasId().toUtf8();
val jsCanvasId = QWasmString::fromQString(QWasmScreen::get(screen)->canvasId());
val document = val::global("document");
val canvas = document.call<val>("getElementById", val(canvasId.constData()));
val canvas = document.call<val>("getElementById", jsCanvasId);
val canvasStyle = canvas["style"];
canvasStyle.set("cursor", emscripten::val(htmlCursorName.constData()));
canvasStyle.set("cursor", val(htmlCursorName.constData()));
}
QByteArray QWasmCursor::cursorShapeToHtml(Qt::CursorShape shape)

View File

@ -32,6 +32,7 @@
#include "qwasmcompositor.h"
#include "qwasmintegration.h"
#include "qwasmclipboard.h"
#include "qwasmstring.h"
#include <QtGui/qevent.h>
#include <qpa/qwindowsysteminterface.h>
@ -355,9 +356,10 @@ void QWasmEventTranslator::initEventHandlers()
if (emscripten::val::global("window")["safari"].isUndefined()) {
val document = val::global("document");
val canvas = document.call<val>("getElementById", val(canvasId));
val jsCanvasId = QWasmString::fromQString(screen()->canvasId());
val canvas = document.call<val>("getElementById", jsCanvasId);
canvas.call<void>("addEventListener",
std::string("wheel"),
val("wheel"),
val::module_property("qtMouseWheelEvent"));
}
}

View File

@ -36,6 +36,7 @@
#include "qwasmclipboard.h"
#include "qwasmservices.h"
#include "qwasmoffscreensurface.h"
#include "qwasmstring.h"
#include "qwasmwindow.h"
#ifndef QT_NO_OPENGL
@ -67,19 +68,19 @@ static void browserBeforeUnload(emscripten::val)
static void addCanvasElement(emscripten::val canvas)
{
QString canvasId = QString::fromStdString(canvas["id"].as<std::string>());
QString canvasId = QWasmString::toQString(canvas["id"]);
QWasmIntegration::get()->addScreen(canvasId);
}
static void removeCanvasElement(emscripten::val canvas)
{
QString canvasId = QString::fromStdString(canvas["id"].as<std::string>());
QString canvasId = QWasmString::toQString(canvas["id"]);
QWasmIntegration::get()->removeScreen(canvasId);
}
static void resizeCanvasElement(emscripten::val canvas)
{
QString canvasId = QString::fromStdString(canvas["id"].as<std::string>());
QString canvasId = QWasmString::toQString(canvas["id"]);
QWasmIntegration::get()->resizeScreen(canvasId);
}
@ -115,11 +116,11 @@ QWasmIntegration::QWasmIntegration()
int screenCount = qtCanvaseElements["length"].as<int>();
for (int i = 0; i < screenCount; ++i) {
emscripten::val canvas = qtCanvaseElements[i].as<emscripten::val>();
QString canvasId = QString::fromStdString(canvas["id"].as<std::string>());
QString canvasId = QWasmString::toQString(canvas["id"]);
addScreen(canvasId);
}
} else if (!canvas.isUndefined()){
QString canvasId = QString::fromStdString(canvas["id"].as<std::string>());
QString canvasId = QWasmString::toQString(canvas["id"]);
addScreen(canvasId);
}

View File

@ -32,6 +32,8 @@
#include "qwasmeventtranslator.h"
#include "qwasmcompositor.h"
#include "qwasmintegration.h"
#include "qwasmstring.h"
#include <emscripten/bind.h>
#include <emscripten/val.h>
@ -186,7 +188,7 @@ void QWasmScreen::updateQScreenAndCanvasRenderSize()
QSizeF canvasSize = cssSize * devicePixelRatio();
val document = val::global("document");
val canvas = document.call<val>("getElementById", val(canvasId.constData()));
val canvas = document.call<val>("getElementById", QWasmString::fromQString(m_canvasId));
canvas.set("width", canvasSize.width());
canvas.set("height", canvasSize.height());

View File

@ -28,6 +28,8 @@
****************************************************************************/
#include "qwasmservices.h"
#include "qwasmstring.h"
#include <QtCore/QUrl>
#include <QtCore/QDebug>
@ -37,8 +39,8 @@ QT_BEGIN_NAMESPACE
bool QWasmServices::openUrl(const QUrl &url)
{
QByteArray utf8Url = url.toString().toUtf8();
emscripten::val::global("window").call<void>("open", emscripten::val(utf8Url.constData()), emscripten::val("_blank"));
emscripten::val jsUrl = QWasmString::fromQString(url.toString());
emscripten::val::global("window").call<void>("open", jsUrl, emscripten::val("_blank"));
return true;
}

View File

@ -0,0 +1,61 @@
/****************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** 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 or (at your option) 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.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-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#include "qwasmstring.h"
QT_BEGIN_NAMESPACE
using namespace emscripten;
val QWasmString::fromQString(const QString &str)
{
static const val UTF16ToString(
val::global("Module")["UTF16ToString"]);
auto ptr = quintptr(str.utf16());
return UTF16ToString(val(ptr));
}
QString QWasmString::toQString(const val &v)
{
QString result;
if (!v.isString())
return result;
static const val stringToUTF16(
val::global("Module")["stringToUTF16"]);
static const val length("length");
result.resize(v[length].as<int>());
auto ptr = quintptr(result.utf16());
stringToUTF16(v, val(ptr));
return result;
}
QT_END_NAMESPACE

View File

@ -0,0 +1,45 @@
/****************************************************************************
**
** Copyright (C) 2020 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the plugins of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL$
** 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 or (at your option) 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.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-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#pragma once
#include <qstring.h>
#include <emscripten/val.h>
QT_BEGIN_NAMESPACE
class QWasmString
{
public:
static emscripten::val fromQString(const QString &str);
static QString toQString(const emscripten::val &v);
};
QT_END_NAMESPACE

View File

@ -23,7 +23,8 @@ SOURCES = \
qwasmtheme.cpp \
qwasmclipboard.cpp \
qwasmservices.cpp \
qwasmoffscreensurface.cpp
qwasmoffscreensurface.cpp \
qwasmstring.cpp
HEADERS = \
qwasmintegration.h \
@ -39,7 +40,8 @@ HEADERS = \
qwasmtheme.h \
qwasmclipboard.h \
qwasmservices.h \
qwasmoffscreensurface.h
qwasmoffscreensurface.h \
qwasmstring.h
wasmfonts.files = \
../../../3rdparty/wasm/Vera.ttf \

View File

@ -249,16 +249,15 @@ void QSqlQueryModel_snippets()
}
//! [21]
QSqlTableModel model;
model.setTable("employee");
model.select();
QSqlQueryModel model;
model.setQuery("SELECT name, salary FROM employee");
int salary = model.record(4).value("salary").toInt();
//! [21]
Q_UNUSED(salary);
{
//! [22]
int salary = model.data(model.index(4, 2)).toInt();
int salary = model.data(model.index(4, 1)).toInt();
//! [22]
Q_UNUSED(salary);
}
@ -308,7 +307,8 @@ void QSqlTableModel_snippets()
//! [25]
QSqlTableModel model;
model.setTable("employee");
QString name = model.record(4).value("name").toString();
model.select();
int salary = model.record(4).value("salary").toInt();
//! [25]
}
}

View File

@ -124,8 +124,8 @@ int QSqlQueryModelPrivate::columnInQuery(int modelColumn) const
\snippet sqldatabase/sqldatabase.cpp 21
The code snippet above extracts the \c salary field from record 4 in
the result set of the query \c{SELECT * from employee}. Assuming
that \c salary is column 2, we can rewrite the last line as follows:
the result set of the \c SELECT query. Since \c salary is the 2nd
column (or column index 1), we can rewrite the last line as follows:
\snippet sqldatabase/sqldatabase.cpp 22

View File

@ -222,7 +222,7 @@ bool QSqlTableModelPrivate::exec(const QString &stmt, bool prepStatement,
QSqlTableModel can also be used to access a database
programmatically, without binding it to a view:
\snippet sqldatabase/sqldatabase.cpp 21
\snippet sqldatabase/sqldatabase.cpp 25
The code snippet above extracts the \c salary field from record 4 in
the result set of the query \c{SELECT * from employee}.

View File

@ -2543,6 +2543,18 @@
See also \l{#height-prop}{height}.
\row
\li \b -qt-background-role
\li \l{#paletterole}{PaletteRole}
\li The \c{background-color} for the subcontrol or widget based on the
chosen role.
\row
\li \b -qt-style-features
\li \c list
\li The list of CSS properties that you want to apply Qt-specific styles on.
\note The \c list can only include properties that are not pixmap-based.
\endtable
\target list of icons

View File

@ -2124,7 +2124,8 @@ QWidget *QApplicationPrivate::focusNextPrevChild_helper(QWidget *toplevel, bool
&& !(!next && focusProxy && test->isAncestorOf(focusProxy))
&& test->isVisibleTo(toplevel) && test->isEnabled()
&& !(w->windowType() == Qt::SubWindow && !w->isAncestorOf(test))
&& (toplevel->windowType() != Qt::SubWindow || toplevel->isAncestorOf(test))) {
&& (toplevel->windowType() != Qt::SubWindow || toplevel->isAncestorOf(test))
&& f != focusProxy) {
w = test;
if (seenWindow)
focusWidgetAfterWindow = true;

View File

@ -490,14 +490,14 @@ void QScrollArea::ensureWidgetVisible(QWidget *childWidget, int xmargin, int yma
if (focusRect.width() > visibleRect.width())
d->hbar->setValue(focusRect.center().x() - d->viewport->width() / 2);
else if (focusRect.right() > visibleRect.right())
d->hbar->setValue(focusRect.right() - d->viewport->width());
d->hbar->setValue(focusRect.right() - d->viewport->width() + 1);
else if (focusRect.left() < visibleRect.left())
d->hbar->setValue(focusRect.left());
if (focusRect.height() > visibleRect.height())
d->vbar->setValue(focusRect.center().y() - d->viewport->height() / 2);
else if (focusRect.bottom() > visibleRect.bottom())
d->vbar->setValue(focusRect.bottom() - d->viewport->height());
d->vbar->setValue(focusRect.bottom() - d->viewport->height() + 1);
else if (focusRect.top() < visibleRect.top())
d->vbar->setValue(focusRect.top());
}

View File

@ -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 QtWidgets module of the Qt Toolkit.
@ -1168,11 +1168,11 @@ QVariant QSpinBoxPrivate::validateAndInterpret(QString &input, int &pos,
} else {
num = locale.toInt(copy, &ok);
if (!ok && (max >= 1000 || min <= -1000)) {
const QChar sep = locale.groupSeparator();
const QChar doubleSep[2] = {sep, sep};
if (copy.contains(sep) && !copy.contains(QString(doubleSep, 2))) {
const QString sep(locale.groupSeparator());
const QString doubleSep = sep + sep;
if (copy.contains(sep) && !copy.contains(doubleSep)) {
QString copy2 = copy;
copy2.remove(locale.groupSeparator());
copy2.remove(sep);
num = locale.toInt(copy2, &ok);
}
}
@ -1314,6 +1314,10 @@ QVariant QDoubleSpinBoxPrivate::validateAndInterpret(QString &input, int &pos,
const bool plus = max >= 0;
const bool minus = min <= 0;
const QString group(locale.groupSeparator());
const uint groupUcs = (group.size() > 1 && group.at(0).isHighSurrogate()
? QChar::surrogateToUcs4(group.at(0), group.at(1))
: group.at(0).unicode());
switch (len) {
case 0:
state = max != min ? QValidator::Intermediate : QValidator::Invalid;
@ -1360,14 +1364,15 @@ QVariant QDoubleSpinBoxPrivate::validateAndInterpret(QString &input, int &pos,
}
}
} else {
const QChar last = copy.at(len - 1);
const QChar secondLast = copy.at(len - 2);
if ((last == locale.groupSeparator() || last.isSpace())
&& (secondLast == locale.groupSeparator() || secondLast.isSpace())) {
const QChar last = copy.back();
const bool groupEnd = copy.endsWith(group);
const QStringView head(copy.constData(), groupEnd ? len - group.size() : len - 1);
const QChar secondLast = head.back();
if ((groupEnd || last.isSpace()) && (head.endsWith(group) || secondLast.isSpace())) {
state = QValidator::Invalid;
QSBDEBUG() << __FILE__ << __LINE__<< "state is set to Invalid";
goto end;
} else if (last.isSpace() && (!locale.groupSeparator().isSpace() || secondLast.isSpace())) {
} else if (last.isSpace() && (!QChar::isSpace(groupUcs) || secondLast.isSpace())) {
state = QValidator::Invalid;
QSBDEBUG() << __FILE__ << __LINE__<< "state is set to Invalid";
goto end;
@ -1381,26 +1386,31 @@ QVariant QDoubleSpinBoxPrivate::validateAndInterpret(QString &input, int &pos,
QSBDEBUG() << __FILE__ << __LINE__ << locale << copy << num << ok;
if (!ok) {
if (locale.groupSeparator().isPrint()) {
if (max < 1000 && min > -1000 && copy.contains(locale.groupSeparator())) {
if (QChar::isPrint(groupUcs)) {
if (max < 1000 && min > -1000 && copy.contains(group)) {
state = QValidator::Invalid;
QSBDEBUG() << __FILE__ << __LINE__<< "state is set to Invalid";
goto end;
}
const int len = copy.size();
for (int i=0; i<len- 1; ++i) {
if (copy.at(i) == locale.groupSeparator() && copy.at(i + 1) == locale.groupSeparator()) {
QSBDEBUG() << __FILE__ << __LINE__<< "state is set to Invalid";
state = QValidator::Invalid;
goto end;
for (int i = 0; i < len - 1;) {
if (QStringView(copy).mid(i).startsWith(group)) {
if (QStringView(copy).mid(i + group.size()).startsWith(group)) {
QSBDEBUG() << __FILE__ << __LINE__<< "state is set to Invalid";
state = QValidator::Invalid;
goto end;
}
i += group.size();
} else {
i++;
}
}
QString copy2 = copy;
copy2.remove(locale.groupSeparator());
copy2.remove(group);
num = locale.toDouble(copy2, &ok);
QSBDEBUG() << locale.groupSeparator() << num << copy2 << ok;
QSBDEBUG() << group << num << copy2 << ok;
if (!ok) {
state = QValidator::Invalid;

View File

@ -1,2 +1,2 @@
[deleteChildrenWithRunningGroup]
osx-10.13
macos

View File

@ -1,5 +1,6 @@
[pauseAndPropertyAnimations]
osx
macos
[multipleSequentialGroups]
osx
macos
[noTimerUpdates]
macos

View File

@ -1,6 +1,6 @@
[finishWithUncontrolledAnimation]
windows-10 msvc-2015
osx-10.13
macos
[groupWithZeroDurationAnimations]
osx-10.13
macos

View File

@ -1,3 +1,3 @@
[elapsed]
osx-10.13
macos
windows-10

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,9 +2,7 @@
osx
[tryAcquireWithTimeout:0.2s]
windows
osx-10.12
osx-10.13
macos
[tryAcquireWithTimeout:2s]
windows
osx-10.12
osx-10.13
macos

View File

@ -2,6 +2,5 @@
windows-10 msvc-2015
osx
[frameRate]
osx-10.12
osx-10.13
macos

View File

@ -2,10 +2,10 @@
opensuse-leap
[positioning:default]
linux
osx-10.12 ci
macos ci
winrt
[positioning:fake]
osx-10.12 ci
macos ci
[modalWithChildWindow]
# QTBUG-66851
# QTBUG-69160

View File

@ -49,21 +49,21 @@ windows-7sp1
windows-10
osx
[backgroundRequest]
osx-10.12
macos
[connectToIPv6Address]
osx-10.12
macos
[deleteFromHttp]
osx-10.12
macos
[downloadProgress]
osx-10.12
macos
[encrypted]
osx-10.13
macos
[httpCanReadLine]
osx-10.12
macos
[httpRecursiveCreation]
osx
[httpWithNoCredentialUsage]
osx-10.12
macos
[ignoreSslErrorsList]
osx
[ignoreSslErrorsListWithSlot]
@ -71,27 +71,27 @@ osx
[ioGetFromBuiltinHttp]
osx
[ioGetFromHttp]
osx-10.12
macos
[ioPostToHttpFromFile]
osx-10.13
macos
[ioPostToHttpFromSocketSynchronous]
osx
[ioPostToHttpUploadProgress]
osx
[ioPutToHttpFromFile]
osx-10.13
macos
[lastModifiedHeaderForHttp]
osx-10.12
macos
[multipartSkipIndices]
osx-10.12
macos
[nestedEventLoops]
osx
[postToHttp]
osx-10.12
macos
[postToHttpMultipart]
osx-10.12
macos
[postToHttpSynchronous]
osx-10.12
macos
[postToHttps]
osx
[postToHttpsMultipart]
@ -99,17 +99,17 @@ osx
[postToHttpsSynchronous]
osx
[putGetDeleteGetFromHttp]
osx-10.12
macos
[putToHttpSynchronous]
osx-10.12
macos
[putToHttps]
osx
[putToHttpsSynchronous]
osx
[putWithRateLimiting]
osx-10.13
macos
[qtbug13431replyThrottling]
osx-10.12
macos
[receiveCookiesFromHttp]
osx
[receiveCookiesFromHttpSynchronous]
@ -119,7 +119,7 @@ osx
[sendCookiesSynchronous]
osx
[sendCustomRequestToHttp]
osx-10.12
macos
[sslConfiguration]
osx
[synchronousRequest]

View File

@ -3,9 +3,9 @@ windows
[spontaneousWrite]
windows-7sp1
[connectToHostEncrypted]
osx-10.13
macos
[setSslConfiguration]
windows-10 msvc-2015
windows-7sp1
[connectToHostEncryptedWithVerificationPeerName]
osx-10.13
macos

View File

@ -19,7 +19,7 @@ osx
osx
[testMouseDragToNonClientArea]
osx
osx-10.12 ci
macos ci
# The following key tests fail after switching to synchronous
# expose events, and we don't know why yet. QTBUG-62042
[testKeyPressOnToplevel]
@ -32,8 +32,8 @@ osx
osx
# QTQAINFRA-1292
[testPushButtonPressRelease]
osx-10.12 ci
macos ci
# QTQAINFRA-1292
[testModifierCtrlWithDontSwapCtrlAndMeta]
osx-10.12 ci
macos ci

View File

@ -1,4 +1,4 @@
[snapToDefaultButton]
osx-10.14
macos
[showFullScreen]
osx-10.13 ci
macos ci

View File

@ -1,4 +1,2 @@
[QTBUG4419_lineEditSelectAll]
osx-10.12
osx-10.14
osx-10.13
macos

View File

@ -1,2 +1,2 @@
[autoShow]
osx-10.13
macos

View File

@ -0,0 +1,2 @@
[task200665_itemEntered]
macos # Can't move cursor (QTBUG-76312)

View File

@ -24,9 +24,7 @@ opensuse-42.3
[childEvents]
macos
[renderInvisible]
osx-10.12
osx-10.11
osx-10.14
macos
[optimizedResizeMove]
osx
[optimizedResize_topLevel]

View File

@ -72,6 +72,7 @@
#include <QtWidgets/QGraphicsProxyWidget>
#include <QtGui/qwindow.h>
#include <qtimer.h>
#include <QtWidgets/QDoubleSpinBox>
#if defined(Q_OS_OSX)
#include "tst_qwidget_mac_helpers.h" // Abstract the ObjC stuff out so not everyone must run an ObjC++ compile.
@ -187,6 +188,7 @@ private slots:
void tabOrderNoChange2();
void appFocusWidgetWithFocusProxyLater();
void appFocusWidgetWhenLosingFocusProxy();
void explicitTabOrderWithComplexWidget();
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
void activation();
#endif
@ -2110,6 +2112,32 @@ void tst_QWidget::appFocusWidgetWhenLosingFocusProxy()
QCOMPARE(QApplication::focusWidget(), lineEdit);
}
void tst_QWidget::explicitTabOrderWithComplexWidget()
{
// Check that handling tab/backtab with a widget comprimised of other widgets
// handles tabbing correctly
Container window;
auto lineEditOne = new QLineEdit;
window.box->addWidget(lineEditOne);
auto lineEditTwo = new QLineEdit;
window.box->addWidget(lineEditTwo);
QWidget::setTabOrder(lineEditOne, lineEditTwo);
lineEditOne->setFocus();
window.show();
QApplication::setActiveWindow(&window);
QVERIFY(QTest::qWaitForWindowActive(&window));
QTRY_COMPARE(QApplication::focusWidget(), lineEditOne);
window.tab();
QTRY_COMPARE(QApplication::focusWidget(), lineEditTwo);
window.tab();
QTRY_COMPARE(QApplication::focusWidget(), lineEditOne);
window.backTab();
QTRY_COMPARE(QApplication::focusWidget(), lineEditTwo);
window.backTab();
QTRY_COMPARE(QApplication::focusWidget(), lineEditOne);
}
#if defined(Q_OS_WIN) && !defined(Q_OS_WINRT)
void tst_QWidget::activation()
{

View File

@ -0,0 +1,5 @@
[scrollTo]
macos
[scroll]
macos

View File

@ -1,4 +1,2 @@
[editingFinished]
osx-10.12
osx-10.14
osx-10.13
macos

View File

@ -2,15 +2,12 @@
ubuntu-16.04
rhel-7.6
opensuse-leap
osx-10.11
osx-10.13
macos
ubuntu-18.04
osx-10.14
macos
rhel-7.4
osx-10.12
macos
opensuse-42.3
[resizeTimer]
osx-10.12
osx-10.14
osx-10.13
macos

View File

@ -1,14 +1,12 @@
[task258920_mouseBorder]
osx-10.14
osx-10.13
macos
[layoutDirection]
osx-10.12
osx-10.13
macos
# Fails when enabling synchronous expose events QTBUG-62092
[pushButtonPopulateOnAboutToShow]
osx-10.13
macos
[tearOff]
osx-10.14
macos
[activeSubMenuPosition]
winrt
[submenuTearOffDontClose]

View File

@ -1,2 +1,2 @@
[task176137_autoRepeatOfAction]
osx-10.13
macos