diff --git a/desktop/toolkit/qt5/qt5-declarative/files/qt_kde.patch b/desktop/toolkit/qt5/qt5-declarative/files/qt_kde.patch index cbfaaddbf7..ca59eea6d0 100644 --- a/desktop/toolkit/qt5/qt5-declarative/files/qt_kde.patch +++ b/desktop/toolkit/qt5/qt5-declarative/files/qt_kde.patch @@ -1,52 +1,23 @@ -diff --git a/src/qml/common/qqmljsfixedpoolarray_p.h b/src/qml/common/qqmljsfixedpoolarray_p.h -index b65b994d6c..15a8cd6878 100644 ---- a/src/qml/common/qqmljsfixedpoolarray_p.h -+++ b/src/qml/common/qqmljsfixedpoolarray_p.h -@@ -86,7 +86,7 @@ public: - if (QTypeInfo::isComplex) { - for (int i = 0; i < count; ++i) - new (data + i) T(vector.at(i)); -- } else { -+ } else if (count) { - memcpy(data, static_cast(vector.constData()), count * sizeof(T)); - } - } -diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp -index e57cdd8278..94613598af 100644 ---- a/src/qml/jsruntime/qv4qobjectwrapper.cpp -+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp -@@ -1145,8 +1145,7 @@ void Heap::QObjectWrapper::markObjects(Heap::Base *that, QV4::MarkStack *markSta - void QObjectWrapper::destroyObject(bool lastCall) - { - Heap::QObjectWrapper *h = d(); -- if (!h->internalClass) -- return; // destroyObject already got called -+ Q_ASSERT(h->internalClass); - - if (h->object()) { - QQmlData *ddata = QQmlData::get(h->object(), false); -@@ -1176,7 +1175,7 @@ void QObjectWrapper::destroyObject(bool lastCall) - } +diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp +index 10c6c41338..39bfcdc999 100644 +--- a/src/qml/qml/qqmlimport.cpp ++++ b/src/qml/qml/qqmlimport.cpp +@@ -2120,9 +2120,12 @@ void QQmlImportDatabase::addImportPath(const QString& path) + cPath.replace(Backslash, Slash); } -- h->~Data(); -+ h->destroy(); +- if (!cPath.isEmpty() +- && !fileImportPath.contains(cPath)) +- fileImportPath.prepend(cPath); ++ if (!cPath.isEmpty()) { ++ if (fileImportPath.contains(cPath)) ++ fileImportPath.move(fileImportPath.indexOf(cPath), 0); ++ else ++ fileImportPath.prepend(cPath); ++ } } - -diff --git a/src/qml/memory/qv4mm.cpp b/src/qml/memory/qv4mm.cpp -index 06caf04e5a..da149a67c4 100644 ---- a/src/qml/memory/qv4mm.cpp -+++ b/src/qml/memory/qv4mm.cpp -@@ -981,7 +981,7 @@ void MemoryManager::sweep(bool lastSweep, ClassDestroyStatsCallback classCountPt - - if (MultiplyWrappedQObjectMap *multiplyWrappedQObjects = engine->m_multiplyWrappedQObjects) { - for (MultiplyWrappedQObjectMap::Iterator it = multiplyWrappedQObjects->begin(); it != multiplyWrappedQObjects->end();) { -- if (!it.value().isNullOrUndefined()) -+ if (it.value().isNullOrUndefined()) - it = multiplyWrappedQObjects->erase(it); - else - ++it; + /*! diff --git a/src/qml/qml/qqmltypewrapper.cpp b/src/qml/qml/qqmltypewrapper.cpp index 175de8b936..a6ba4b8cb3 100644 --- a/src/qml/qml/qqmltypewrapper.cpp @@ -78,7 +49,7 @@ index 29ed62cd39..aba930dfe1 100644 } } diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp -index 2079a8ed04..a577cb2351 100644 +index 523c0df779..bc6b2447af 100644 --- a/src/qmlmodels/qqmldelegatemodel.cpp +++ b/src/qmlmodels/qqmldelegatemodel.cpp @@ -389,6 +389,12 @@ void QQmlDelegateModelPrivate::connectToAbstractItemModel() @@ -107,7 +78,7 @@ index 2079a8ed04..a577cb2351 100644 QObject::disconnect(aim, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector)), q, SLOT(_q_dataChanged(QModelIndex,QModelIndex,QVector))); QObject::disconnect(aim, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), -@@ -1973,6 +1985,38 @@ void QQmlDelegateModel::_q_rowsMoved( +@@ -1974,6 +1986,38 @@ void QQmlDelegateModel::_q_rowsMoved( } } @@ -161,7 +132,7 @@ index 8aab4badca..d140bfbaaf 100644 void _q_rowsRemoved(const QModelIndex &,int,int); void _q_rowsMoved(const QModelIndex &, int, int, const QModelIndex &, int); diff --git a/src/quick/accessible/qaccessiblequickitem.cpp b/src/quick/accessible/qaccessiblequickitem.cpp -index 85719fdc80..78e2ab302c 100644 +index ae1954ae8d..a8df58d450 100644 --- a/src/quick/accessible/qaccessiblequickitem.cpp +++ b/src/quick/accessible/qaccessiblequickitem.cpp @@ -46,6 +46,7 @@ @@ -217,7 +188,7 @@ index 85719fdc80..78e2ab302c 100644 } else { while (parent && !parent->d_func()->isAccessible) parent = parent->parentItem(); -@@ -188,7 +197,7 @@ QAccessible::State QAccessibleQuickItem::state() const +@@ -193,7 +202,7 @@ QAccessible::State QAccessibleQuickItem::state() const QRect viewRect_ = viewRect(); QRect itemRect = rect(); @@ -226,7 +197,7 @@ index 85719fdc80..78e2ab302c 100644 state.invisible = true; if (!viewRect_.intersects(itemRect)) state.offscreen = true; -@@ -201,6 +210,10 @@ QAccessible::State QAccessibleQuickItem::state() const +@@ -206,6 +215,10 @@ QAccessible::State QAccessibleQuickItem::state() const if (role() == QAccessible::EditableText) if (auto ti = qobject_cast(item())) state.passwordEdit = ti->echoMode() != QQuickTextInput::Normal; @@ -281,7 +252,7 @@ index 8321fcfeed..383078b3b9 100644 drag->setMimeData(mimeData); if (pixmapLoader.isReady()) { diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp -index 75f1457816..dec0ae19ae 100644 +index 33da9762d3..c370d6e5c3 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -59,6 +59,7 @@ @@ -418,19 +389,6 @@ index 841d91bb40..ade8fb61f2 100644 enum DirtyType { TransformOrigin = 0x00000001, -diff --git a/src/quick/items/qquickitemview.cpp b/src/quick/items/qquickitemview.cpp -index 010a0152e1..f8ad168a17 100644 ---- a/src/quick/items/qquickitemview.cpp -+++ b/src/quick/items/qquickitemview.cpp -@@ -1785,7 +1785,7 @@ void QQuickItemViewPrivate::refill(qreal from, qreal to) - - do { - bufferPause.stop(); -- if (currentChanges.hasPendingChanges() || bufferedChanges.hasPendingChanges()) { -+ if (currentChanges.hasPendingChanges() || bufferedChanges.hasPendingChanges() || currentChanges.active) { - currentChanges.reset(); - bufferedChanges.reset(); - releaseVisibleItems(reusableFlag); diff --git a/src/quick/items/qquickmousearea_p_p.h b/src/quick/items/qquickmousearea_p_p.h index fba383e268..0d63618622 100644 --- a/src/quick/items/qquickmousearea_p_p.h @@ -451,65 +409,6 @@ index fba383e268..0d63618622 100644 QPointF startScene; QPointF targetStartPos; QPointF lastPos; -diff --git a/src/quick/items/qquicktext.cpp b/src/quick/items/qquicktext.cpp -index 6230186933..e823ca1095 100644 ---- a/src/quick/items/qquicktext.cpp -+++ b/src/quick/items/qquicktext.cpp -@@ -2168,7 +2168,7 @@ void QQuickText::resetMaximumLineCount() - - inline images -
    ,
      and
    • - ordered and unordered lists -
       - preformatted
      --    > < &
      -+    > < & "   '
      -     \endcode
      -
      -     \c Text.StyledText parser is strict, requiring tags to be correctly nested.
      -diff --git a/src/quick/scenegraph/qsgrhidistancefieldglyphcache.cpp b/src/quick/scenegraph/qsgrhidistancefieldglyphcache.cpp
      -index eb4db0f85e..2325a2665b 100644
      ---- a/src/quick/scenegraph/qsgrhidistancefieldglyphcache.cpp
      -+++ b/src/quick/scenegraph/qsgrhidistancefieldglyphcache.cpp
      -@@ -446,7 +446,7 @@ bool QSGRhiDistanceFieldGlyphCache::loadPregeneratedCache(const QRawFont &font)
      -
      -         const char *textureRecord = allocatorData;
      -         for (int i = 0; i < textureCount; ++i, textureRecord += Qtdf::TextureRecordSize) {
      --            if (textureRecord + Qtdf::TextureRecordSize > qtdfTableEnd) {
      -+            if (qtdfTableEnd - textureRecord < Qtdf::TextureRecordSize) {
      -                 qWarning("qtdf table too small in font '%s'.",
      -                          qPrintable(font.familyName()));
      -                 return false;
      -@@ -462,7 +462,7 @@ bool QSGRhiDistanceFieldGlyphCache::loadPregeneratedCache(const QRawFont &font)
      -
      -         const char *glyphRecord = textureRecord;
      -         for (quint32 i = 0; i < glyphCount; ++i, glyphRecord += Qtdf::GlyphRecordSize) {
      --            if (glyphRecord + Qtdf::GlyphRecordSize > qtdfTableEnd) {
      -+            if (qtdfTableEnd - glyphRecord < Qtdf:: GlyphRecordSize) {
      -                 qWarning("qtdf table too small in font '%s'.",
      -                          qPrintable(font.familyName()));
      -                 return false;
      -@@ -512,8 +512,8 @@ bool QSGRhiDistanceFieldGlyphCache::loadPregeneratedCache(const QRawFont &font)
      -
      -             int width = texInfo->allocatedArea.width();
      -             int height = texInfo->allocatedArea.height();
      --            qint64 size = width * height;
      --            if (reinterpret_cast(textureData + size) > qtdfTableEnd) {
      -+            qint64 size = qint64(width) * height;
      -+            if (qtdfTableEnd - reinterpret_cast(textureData) < size) {
      -                 qWarning("qtdf table too small in font '%s'.",
      -                          qPrintable(font.familyName()));
      -                 return false;
      -diff --git a/src/quick/util/qquickstyledtext.cpp b/src/quick/util/qquickstyledtext.cpp
      -index d531fc9205..a25af90414 100644
      ---- a/src/quick/util/qquickstyledtext.cpp
      -+++ b/src/quick/util/qquickstyledtext.cpp
      -@@ -564,6 +564,8 @@ void QQuickStyledTextPrivate::parseEntity(const QChar *&ch, const QString &textI
      -                 textOut += QChar(60);
      -             else if (entity == QLatin1String("amp"))
      -                 textOut += QChar(38);
      -+            else if (entity == QLatin1String("apos"))
      -+                textOut += QChar(39);
      -             else if (entity == QLatin1String("quot"))
      -                 textOut += QChar(34);
      -             else if (entity == QLatin1String("nbsp"))
       diff --git a/src/quickwidgets/qaccessiblequickwidget.cpp b/src/quickwidgets/qaccessiblequickwidget.cpp
       new file mode 100644
       index 0000000000..8a1c901880
      @@ -1005,63 +904,6 @@ index 2438e577ae..85d156b8a3 100644
       +    qaccessiblequickwidgetfactory.cpp
       
        load(qt_module)
      -diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
      -index 3b7d74df63..b75bf820d5 100644
      ---- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
      -+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
      -@@ -102,6 +102,7 @@ private slots:
      -     void valueConversion_RegularExpression();
      -     void castWithMultipleInheritance();
      -     void collectGarbage();
      -+    void collectGarbageNestedWrappersTwoEngines();
      -     void gcWithNestedDataStructure();
      -     void stacktrace();
      -     void numberParsing_data();
      -@@ -1809,6 +1810,44 @@ void tst_QJSEngine::collectGarbage()
      -     QVERIFY(ptr.isNull());
      - }
      -
      -+class TestObjectContainer : public QObject
      -+{
      -+    Q_OBJECT
      -+    Q_PROPERTY(QObject *dummy MEMBER m_dummy CONSTANT)
      -+
      -+public:
      -+    TestObjectContainer() : m_dummy(new QObject(this)) {}
      -+
      -+private:
      -+    QObject *m_dummy;
      -+};
      -+
      -+void tst_QJSEngine::collectGarbageNestedWrappersTwoEngines()
      -+{
      -+    QJSEngine engine1;
      -+    QJSEngine engine2;
      -+
      -+    TestObjectContainer container;
      -+    QQmlEngine::setObjectOwnership(&container, QQmlEngine::CppOwnership);
      -+
      -+    engine1.globalObject().setProperty("foobar", engine1.newQObject(&container));
      -+    engine2.globalObject().setProperty("foobar", engine2.newQObject(&container));
      -+
      -+    engine1.evaluate("foobar.dummy.baz = 42");
      -+    engine2.evaluate("foobar.dummy.baz = 43");
      -+
      -+    QCOMPARE(engine1.evaluate("foobar.dummy.baz").toInt(), 42);
      -+    QCOMPARE(engine2.evaluate("foobar.dummy.baz").toInt(), 43);
      -+
      -+    engine1.collectGarbage();
      -+    engine2.collectGarbage();
      -+
      -+    // The GC should not collect dummy object wrappers neither in engine1 nor engine2, we
      -+    // verify that by checking whether the baz property still has its previous value.
      -+    QCOMPARE(engine1.evaluate("foobar.dummy.baz").toInt(), 42);
      -+    QCOMPARE(engine2.evaluate("foobar.dummy.baz").toInt(), 43);
      -+}
      -+
      - void tst_QJSEngine::gcWithNestedDataStructure()
      - {
      -     // The GC must be able to traverse deeply nested objects, otherwise this
       diff --git a/tests/auto/qml/qqmldelegatemodel/data/redrawUponColumnChange.qml b/tests/auto/qml/qqmldelegatemodel/data/redrawUponColumnChange.qml
       new file mode 100644
       index 0000000000..206133bb39
      @@ -1131,6 +973,22 @@ index 35f1e2c94d..1722447830 100644
        QTEST_MAIN(tst_QQmlDelegateModel)
       
        #include "tst_qqmldelegatemodel.moc"
      +diff --git a/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp b/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp
      +index 9c865b3f73..1f788f7a7f 100644
      +--- a/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp
      ++++ b/tests/auto/qml/qqmlimport/tst_qqmlimport.cpp
      +@@ -154,6 +154,11 @@ void tst_QQmlImport::importPathOrder()
      +     engine.addImportPath(QT_QMLTEST_DATADIR);
      +     expectedImportPaths.prepend(QT_QMLTEST_DATADIR);
      +     QCOMPARE(expectedImportPaths, engine.importPathList());
      ++
      ++    // Add qml2Imports again to make it the first of the list
      ++    engine.addImportPath(qml2Imports);
      ++    expectedImportPaths.move(expectedImportPaths.indexOf(qml2Imports), 0);
      ++    QCOMPARE(expectedImportPaths, engine.importPathList());
      + }
      +
      + Q_DECLARE_METATYPE(QQmlImports::ImportVersion)
       diff --git a/tests/auto/qml/qqmllanguage/data/Broken.qml b/tests/auto/qml/qqmllanguage/data/Broken.qml
       new file mode 100644
       index 0000000000..e24d9112a8
      @@ -1188,24 +1046,6 @@ index bffb62c59e..97cc64991f 100644
        QTEST_MAIN(tst_qqmllanguage)
       
        #include "tst_qqmllanguage.moc"
      -diff --git a/tests/auto/qml/qv4mm/tst_qv4mm.cpp b/tests/auto/qml/qv4mm/tst_qv4mm.cpp
      -index 5d635aa63b..824fd89e5b 100644
      ---- a/tests/auto/qml/qv4mm/tst_qv4mm.cpp
      -+++ b/tests/auto/qml/qv4mm/tst_qv4mm.cpp
      -@@ -76,10 +76,10 @@ void tst_qv4mm::multiWrappedQObjects()
      -         QCOMPARE(engine1.memoryManager->m_pendingFreedObjectWrapperValue.size(), 1);
      -         QCOMPARE(engine2.memoryManager->m_pendingFreedObjectWrapperValue.size(), 0);
      -
      --        // Moves the additional WeakValue from m_multiplyWrappedQObjects to
      --        // m_pendingFreedObjectWrapperValue. It's still alive after all.
      -+        // The additional WeakValue from m_multiplyWrappedQObjects hasn't been moved
      -+        // to m_pendingFreedObjectWrapperValue yet. It's still alive after all.
      -         engine1.memoryManager->runGC();
      --        QCOMPARE(engine1.memoryManager->m_pendingFreedObjectWrapperValue.size(), 2);
      -+        QCOMPARE(engine1.memoryManager->m_pendingFreedObjectWrapperValue.size(), 1);
      -
      -         // engine2 doesn't own the object as engine1 was the first to wrap it above.
      -         // Therefore, no effect here.
       diff --git a/tests/auto/quick/qquickitem2/data/activeFocusOnTab_infiniteLoop3.qml b/tests/auto/quick/qquickitem2/data/activeFocusOnTab_infiniteLoop3.qml
       new file mode 100644
       index 0000000000..889e480f3b