From ab0816186b3d35173a98a2a080ff4cb4b84f3c85 Mon Sep 17 00:00:00 2001 From: Rmys Date: Wed, 10 May 2023 15:57:17 +0300 Subject: [PATCH] qt5-declarative rebuild --- .../qt5/qt5-declarative/files/qt_kde.patch | 605 ++++++++++++++++-- desktop/toolkit/qt5/qt5-declarative/pspec.xml | 7 + 2 files changed, 547 insertions(+), 65 deletions(-) diff --git a/desktop/toolkit/qt5/qt5-declarative/files/qt_kde.patch b/desktop/toolkit/qt5/qt5-declarative/files/qt_kde.patch index ca59eea6d0..42d26c61a3 100644 --- a/desktop/toolkit/qt5/qt5-declarative/files/qt_kde.patch +++ b/desktop/toolkit/qt5/qt5-declarative/files/qt_kde.patch @@ -1,3 +1,49 @@ +diff --git a/src/qml/animations/qcontinuinganimationgroupjob.cpp b/src/qml/animations/qcontinuinganimationgroupjob.cpp +index 88c0e9e60e..61a9dc36f8 100644 +--- a/src/qml/animations/qcontinuinganimationgroupjob.cpp ++++ b/src/qml/animations/qcontinuinganimationgroupjob.cpp +@@ -82,9 +82,9 @@ void QContinuingAnimationGroupJob::updateState(QAbstractAnimationJob::State newS + return; + } + for (QAbstractAnimationJob *animation = firstChild(); animation; animation = animation->nextSibling()) { +- resetUncontrolledAnimationFinishTime(animation); ++ RETURN_IF_DELETED(resetUncontrolledAnimationFinishTime(animation)); + animation->setDirection(m_direction); +- animation->start(); ++ RETURN_IF_DELETED(animation->start()); + } + break; + } +diff --git a/src/qml/animations/qparallelanimationgroupjob.cpp b/src/qml/animations/qparallelanimationgroupjob.cpp +index 420a934ba2..a828d0e234 100644 +--- a/src/qml/animations/qparallelanimationgroupjob.cpp ++++ b/src/qml/animations/qparallelanimationgroupjob.cpp +@@ -144,10 +144,10 @@ void QParallelAnimationGroupJob::updateState(QAbstractAnimationJob::State newSta + animation->stop(); + m_previousLoop = m_direction == Forward ? 0 : m_loopCount - 1; + } +- resetUncontrolledAnimationFinishTime(animation); ++ RETURN_IF_DELETED(resetUncontrolledAnimationFinishTime(animation)); + animation->setDirection(m_direction); + if (shouldAnimationStart(animation, oldState == Stopped)) +- animation->start(); ++ RETURN_IF_DELETED(animation->start()); + } + break; + } +diff --git a/src/qml/jsruntime/qv4function.cpp b/src/qml/jsruntime/qv4function.cpp +index aeb4835c40..9082628a1a 100644 +--- a/src/qml/jsruntime/qv4function.cpp ++++ b/src/qml/jsruntime/qv4function.cpp +@@ -136,7 +136,7 @@ void Function::updateInternalClass(ExecutionEngine *engine, const QList td = qenginepriv->typeLoader.getType(typeWrapper->d()->type().sourceUrl()); - ExecutableCompilationUnit *cu = td->compilationUnit(); - myQmlType = qenginepriv->metaObjectForType(cu->metaTypeId); @@ -35,6 +81,19 @@ index 175de8b936..a6ba4b8cb3 100644 } else { myQmlType = qenginepriv->metaObjectForType(myTypeId); } +diff --git a/src/qml/qml/qqmlvmemetaobject.cpp b/src/qml/qml/qqmlvmemetaobject.cpp +index aa9f4bc1bd..09503a7e99 100644 +--- a/src/qml/qml/qqmlvmemetaobject.cpp ++++ b/src/qml/qml/qqmlvmemetaobject.cpp +@@ -254,7 +254,7 @@ void QQmlVMEMetaObjectEndpoint::tryConnect() + if (!pd) + return; + +- if (pd->notifyIndex() != -1) ++ if (pd->notifyIndex() != -1 && ctxt->engine) + connect(target, pd->notifyIndex(), ctxt->engine); + } + diff --git a/src/qml/types/qqmlconnections.cpp b/src/qml/types/qqmlconnections.cpp index 29ed62cd39..aba930dfe1 100644 --- a/src/qml/types/qqmlconnections.cpp @@ -49,7 +108,7 @@ index 29ed62cd39..aba930dfe1 100644 } } diff --git a/src/qmlmodels/qqmldelegatemodel.cpp b/src/qmlmodels/qqmldelegatemodel.cpp -index 523c0df779..bc6b2447af 100644 +index 523c0df779..551e0ede95 100644 --- a/src/qmlmodels/qqmldelegatemodel.cpp +++ b/src/qmlmodels/qqmldelegatemodel.cpp @@ -389,6 +389,12 @@ void QQmlDelegateModelPrivate::connectToAbstractItemModel() @@ -78,10 +137,30 @@ index 523c0df779..bc6b2447af 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)), -@@ -1974,6 +1986,38 @@ void QQmlDelegateModel::_q_rowsMoved( +@@ -1871,10 +1883,15 @@ void QQmlDelegateModelPrivate::emitChanges() + for (int i = 1; i < m_groupCount; ++i) + QQmlDelegateModelGroupPrivate::get(m_groups[i])->emitModelUpdated(reset); + +- auto cacheCopy = m_cache; // deliberate; emitChanges may alter m_cache +- for (QQmlDelegateModelItem *cacheItem : qAsConst(cacheCopy)) { +- if (cacheItem->attached) +- cacheItem->attached->emitChanges(); ++ // emitChanges may alter m_cache and delete items ++ QVarLengthArray> attachedObjects; ++ attachedObjects.reserve(m_cache.length()); ++ for (const QQmlDelegateModelItem *cacheItem : qAsConst(m_cache)) ++ attachedObjects.append(cacheItem->attached); ++ ++ for (const QPointer &attached : qAsConst(attachedObjects)) { ++ if (attached && attached->m_cacheItem) ++ attached->emitChanges(); } } - + +@@ -1974,6 +1991,38 @@ void QQmlDelegateModel::_q_rowsMoved( + } + } + +void QQmlDelegateModel::_q_columnsInserted(const QModelIndex &parent, int begin, int end) +{ + Q_D(QQmlDelegateModel); @@ -117,6 +196,34 @@ index 523c0df779..bc6b2447af 100644 void QQmlDelegateModel::_q_dataChanged(const QModelIndex &begin, const QModelIndex &end, const QVector &roles) { Q_D(QQmlDelegateModel); +@@ -2663,20 +2712,24 @@ void QQmlDelegateModelAttached::emitChanges() + m_previousGroups = m_cacheItem->groups; + + int indexChanges = 0; +- for (int i = 1; i < m_cacheItem->metaType->groupCount; ++i) { ++ const int groupCount = m_cacheItem->metaType->groupCount; ++ for (int i = 1; i < groupCount; ++i) { + if (m_previousIndex[i] != m_currentIndex[i]) { + m_previousIndex[i] = m_currentIndex[i]; + indexChanges |= (1 << i); + } + } + ++ // Don't access m_cacheItem anymore once we've started sending signals. ++ // We don't own it and someone might delete it. ++ + int notifierId = 0; + const QMetaObject *meta = metaObject(); +- for (int i = 1; i < m_cacheItem->metaType->groupCount; ++i, ++notifierId) { ++ for (int i = 1; i < groupCount; ++i, ++notifierId) { + if (groupChanges & (1 << i)) + QMetaObject::activate(this, meta, notifierId, nullptr); + } +- for (int i = 1; i < m_cacheItem->metaType->groupCount; ++i, ++notifierId) { ++ for (int i = 1; i < groupCount; ++i, ++notifierId) { + if (indexChanges & (1 << i)) + QMetaObject::activate(this, meta, notifierId, nullptr); + } diff --git a/src/qmlmodels/qqmldelegatemodel_p.h b/src/qmlmodels/qqmldelegatemodel_p.h index 8aab4badca..d140bfbaaf 100644 --- a/src/qmlmodels/qqmldelegatemodel_p.h @@ -132,7 +239,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 ae1954ae8d..a8df58d450 100644 +index ae1954ae8d..99e6eff7c3 100644 --- a/src/quick/accessible/qaccessiblequickitem.cpp +++ b/src/quick/accessible/qaccessiblequickitem.cpp @@ -46,6 +46,7 @@ @@ -141,10 +248,10 @@ index ae1954ae8d..a8df58d450 100644 #include "QtQuick/qquicktextdocument.h" +#include "QtQuick/qquickrendercontrol.h" QT_BEGIN_NAMESPACE - + #if QT_CONFIG(accessibility) @@ -57,7 +58,19 @@ QAccessibleQuickItem::QAccessibleQuickItem(QQuickItem *item) - + QWindow *QAccessibleQuickItem::window() const { - return item()->window(); @@ -162,7 +269,7 @@ index ae1954ae8d..a8df58d450 100644 + + return window; } - + int QAccessibleQuickItem::childCount() const @@ -113,19 +126,15 @@ QAccessibleInterface *QAccessibleQuickItem::childAt(int x, int y) const QAccessibleInterface *QAccessibleQuickItem::parent() const @@ -174,7 +281,7 @@ index ae1954ae8d..a8df58d450 100644 + QQuickItem *ci = itemWindow ? itemWindow->contentItem() : nullptr; while (parent && !QQuickItemPrivate::get(parent)->isAccessible && parent != ci) parent = parent->parentItem(); - + if (parent) { if (parent == ci) { - // Jump out to the scene widget if the parent is the root item. @@ -191,7 +298,7 @@ index ae1954ae8d..a8df58d450 100644 @@ -193,7 +202,7 @@ QAccessible::State QAccessibleQuickItem::state() const QRect viewRect_ = viewRect(); QRect itemRect = rect(); - + - if (viewRect_.isNull() || itemRect.isNull() || !item()->window() || !item()->window()->isVisible() ||!item()->isVisible() || qFuzzyIsNull(item()->opacity())) + if (viewRect_.isNull() || itemRect.isNull() || !window() || !window()->isVisible() ||!item()->isVisible() || qFuzzyIsNull(item()->opacity())) state.invisible = true; @@ -207,15 +314,24 @@ index ae1954ae8d..a8df58d450 100644 + } return state; } - + +@@ -217,7 +230,7 @@ QAccessible::Role QAccessibleQuickItem::role() const + + QAccessible::Role role = QAccessible::NoRole; + if (item()) +- role = QQuickItemPrivate::get(item())->accessibleRole(); ++ role = QQuickItemPrivate::get(item())->effectiveAccessibleRole(); + if (role == QAccessible::NoRole) { + if (qobject_cast(const_cast(item()))) + role = QAccessible::StaticText; diff --git a/src/quick/accessible/qaccessiblequickview_p.h b/src/quick/accessible/qaccessiblequickview_p.h index 39ffcaf39c..8baa01330c 100644 --- a/src/quick/accessible/qaccessiblequickview_p.h +++ b/src/quick/accessible/qaccessiblequickview_p.h @@ -58,7 +58,7 @@ QT_BEGIN_NAMESPACE - + #if QT_CONFIG(accessibility) - + -class QAccessibleQuickWindow : public QAccessibleObject +class Q_QUICK_EXPORT QAccessibleQuickWindow : public QAccessibleObject { @@ -228,18 +344,18 @@ index 8321fcfeed..383078b3b9 100644 @@ -481,7 +481,9 @@ void QQuickDragAttached::setKeys(const QStringList &keys) \qmlattachedproperty stringlist QtQuick::Drag::mimeData \since 5.2 - + - This property holds a map of mimeData that is used during startDrag. + This property holds a map from mime type to data that is used during startDrag. + The mime data needs to be a \c string, or an \c ArrayBuffer with the data encoded + according to the mime type. */ - + QVariantMap QQuickDragAttached::mimeData() const @@ -766,8 +768,12 @@ Qt::DropAction QQuickDragAttachedPrivate::startDrag(Qt::DropActions supportedAct QDrag *drag = new QDrag(source ? source : q); QMimeData *mimeData = new QMimeData(); - + - for (auto it = externalMimeData.cbegin(), end = externalMimeData.cend(); it != end; ++it) - mimeData->setData(it.key(), it.value().toString().toUtf8()); + for (auto it = externalMimeData.cbegin(), end = externalMimeData.cend(); it != end; ++it) { @@ -248,11 +364,11 @@ index 8321fcfeed..383078b3b9 100644 + else + mimeData->setData(it.key(), it.value().toString().toUtf8()); + } - + drag->setMimeData(mimeData); if (pixmapLoader.isReady()) { diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp -index 33da9762d3..c370d6e5c3 100644 +index 33da9762d3..9e8b289376 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -59,6 +59,7 @@ @@ -260,7 +376,7 @@ index 33da9762d3..c370d6e5c3 100644 #include #include +#include - + #include #include @@ -2326,6 +2327,7 @@ QQuickItem::QQuickItem(QQuickItemPrivate &dd, QQuickItem *parent) @@ -268,9 +384,18 @@ index 33da9762d3..c370d6e5c3 100644 { Q_D(QQuickItem); + d->inDestructor = true; - + if (d->windowRefCount > 1) d->windowRefCount = 1; // Make sure window is set to null in next call to derefWindow(). +@@ -2398,7 +2400,7 @@ bool QQuickItemPrivate::canAcceptTabFocus(QQuickItem *item) + return true; + + #if QT_CONFIG(accessibility) +- QAccessible::Role role = QQuickItemPrivate::get(item)->accessibleRole(); ++ QAccessible::Role role = QQuickItemPrivate::get(item)->effectiveAccessibleRole(); + if (role == QAccessible::EditableText || role == QAccessible::Table || role == QAccessible::List) { + return true; + } else if (role == QAccessible::ComboBox || role == QAccessible::SpinBox) { @@ -2526,6 +2528,7 @@ QQuickItem* QQuickItemPrivate::nextPrevItemInTabFocusChain(QQuickItem *item, boo QQuickItem *current = item; qCDebug(DBG_FOCUS) << "QQuickItemPrivate::nextPrevItemInTabFocusChain: startItem:" << startItem; @@ -292,7 +417,7 @@ index 33da9762d3..c370d6e5c3 100644 if (item == contentItem) { qCDebug(DBG_FOCUS) << "QQuickItemPrivate::nextPrevItemInTabFocusChain: looped, return contentItem"; @@ -2689,9 +2695,8 @@ void QQuickItem::setParentItem(QQuickItem *parentItem) - + const bool wasVisible = isVisible(); op->removeChild(this); - if (wasVisible) { @@ -303,9 +428,9 @@ index 33da9762d3..c370d6e5c3 100644 QQuickWindowPrivate::get(d->window)->parentlessItems.remove(this); } @@ -2768,8 +2773,9 @@ void QQuickItem::setParentItem(QQuickItem *parentItem) - + d->itemChange(ItemParentHasChanged, d->parentItem); - + - emit parentChanged(d->parentItem); - if (isVisible() && d->parentItem) + if (!d->inDestructor) @@ -313,16 +438,16 @@ index 33da9762d3..c370d6e5c3 100644 + if (isVisible() && d->parentItem && !QQuickItemPrivate::get(d->parentItem)->inDestructor) emit d->parentItem->visibleChildrenChanged(); } - + @@ -2965,7 +2971,8 @@ void QQuickItemPrivate::removeChild(QQuickItem *child) - + itemChange(QQuickItem::ItemChildRemovedChange, child); - + - emit q->childrenChanged(); + if (!inDestructor) + emit q->childrenChanged(); } - + void QQuickItemPrivate::refWindow(QQuickWindow *c) @@ -3194,6 +3201,7 @@ QQuickItemPrivate::QQuickItemPrivate() , touchEnabled(false) @@ -344,7 +469,7 @@ index 33da9762d3..c370d6e5c3 100644 + } +#endif } - + QQuickStateGroup *QQuickItemPrivate::_states() @@ -6106,9 +6121,11 @@ bool QQuickItemPrivate::setEffectiveVisibleRecur(bool newEffectiveVisible) QAccessible::updateAccessibility(&ev); @@ -358,12 +483,12 @@ index 33da9762d3..c370d6e5c3 100644 + if (childVisibilityChanged) + emit q->visibleChildrenChanged(); + } - + return true; // effective visibility DID change } @@ -6157,6 +6174,15 @@ void QQuickItemPrivate::setEffectiveEnableRecur(QQuickItem *scope, bool newEffec } - + itemChange(QQuickItem::ItemEnabledHasChanged, effectiveEnable); +#if QT_CONFIG(accessibility) + if (isAccessible) { @@ -376,9 +501,34 @@ index 33da9762d3..c370d6e5c3 100644 +#endif emit q->enabledChanged(); } - + +@@ -8974,13 +9000,20 @@ QQuickItemPrivate::ExtraData::ExtraData() + + + #if QT_CONFIG(accessibility) +-QAccessible::Role QQuickItemPrivate::accessibleRole() const ++QAccessible::Role QQuickItemPrivate::effectiveAccessibleRole() const + { + Q_Q(const QQuickItem); +- QQuickAccessibleAttached *accessibleAttached = qobject_cast(qmlAttachedPropertiesObject(q, false)); +- if (accessibleAttached) +- return accessibleAttached->role(); ++ auto *attached = qmlAttachedPropertiesObject(q, false); ++ auto role = QAccessible::NoRole; ++ if (auto *accessibleAttached = qobject_cast(attached)) ++ role = accessibleAttached->role(); ++ if (role == QAccessible::NoRole) ++ role = accessibleRole(); ++ return role; ++} + ++QAccessible::Role QQuickItemPrivate::accessibleRole() const ++{ + return QAccessible::NoRole; + } + #endif diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h -index 841d91bb40..ade8fb61f2 100644 +index 841d91bb40..6f329bd119 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -472,6 +472,7 @@ public: @@ -386,15 +536,26 @@ index 841d91bb40..ade8fb61f2 100644 bool touchEnabled:1; bool hasCursorHandler:1; + quint32 inDestructor:1; // has entered ~QQuickItem - + enum DirtyType { TransformOrigin = 0x00000001, +@@ -574,7 +575,10 @@ public: + virtual void implicitHeightChanged(); + + #if QT_CONFIG(accessibility) ++ QAccessible::Role effectiveAccessibleRole() const; ++private: + virtual QAccessible::Role accessibleRole() const; ++public: + #endif + + void setImplicitAntialiasing(bool antialiasing); 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 +++ b/src/quick/items/qquickmousearea_p_p.h @@ -61,7 +61,6 @@ QT_BEGIN_NAMESPACE - + class QQuickMouseEvent; class QQuickMouseArea; -class QQuickPointerMask; @@ -409,6 +570,27 @@ index fba383e268..0d63618622 100644 QPointF startScene; QPointF targetStartPos; QPointF lastPos; +diff --git a/src/quick/util/qquickstategroup.cpp b/src/quick/util/qquickstategroup.cpp +index 7cb3138618..f732b1eb4a 100644 +--- a/src/quick/util/qquickstategroup.cpp ++++ b/src/quick/util/qquickstategroup.cpp +@@ -381,8 +381,14 @@ bool QQuickStateGroupPrivate::updateAutoState() + const auto potentialWhenBinding = QQmlPropertyPrivate::binding(whenProp); + // if there is a binding, the value in when might not be up-to-date at this point + // so we manually reevaluate the binding +- if (auto abstractBinding = dynamic_cast(potentialWhenBinding)) +- whenValue = abstractBinding->evaluate().toBool(); ++ if (auto abstractBinding = dynamic_cast(potentialWhenBinding)) { ++ QVariant evalResult = abstractBinding->evaluate(); ++ if (evalResult.userType() == qMetaTypeId()) ++ whenValue = evalResult.value().toBool(); ++ else ++ whenValue = evalResult.toBool(); ++ } ++ + if (whenValue) { + if (stateChangeDebug()) + qWarning() << "Setting auto state due to expression"; diff --git a/src/quickwidgets/qaccessiblequickwidget.cpp b/src/quickwidgets/qaccessiblequickwidget.cpp new file mode 100644 index 0000000000..8a1c901880 @@ -769,17 +951,17 @@ index 39780f8de3..9c97b43518 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -39,6 +39,7 @@ - + #include "qquickwidget.h" #include "qquickwidget_p.h" +#include "qaccessiblequickwidgetfactory_p.h" - + #include "private/qquickwindow_p.h" #include "private/qquickitem_p.h" @@ -75,9 +76,16 @@ - + QT_BEGIN_NAMESPACE - + +QQuickWidgetOffscreenWindow::QQuickWidgetOffscreenWindow(QQuickWindowPrivate &dd, QQuickRenderControl *control) +:QQuickWindow(dd, control) +{ @@ -796,7 +978,7 @@ index 39780f8de3..9c97b43518 100644 Q_Q(QWindow); @@ -105,9 +113,8 @@ void QQuickWidgetPrivate::init(QQmlEngine* e) Q_Q(QQuickWidget); - + renderControl = new QQuickWidgetRenderControl(q); - offscreenWindow = new QQuickWindow(*new QQuickOffcreenWindowPrivate(),renderControl); - offscreenWindow->setTitle(QString::fromLatin1("Offscreen")); @@ -804,7 +986,7 @@ index 39780f8de3..9c97b43518 100644 + offscreenWindow = new QQuickWidgetOffscreenWindow(*new QQuickWidgetOffscreenWindowPrivate(), renderControl); + offscreenWindow->setScreen(q->screen()); // Do not call create() on offscreenWindow. - + // Check if the Software Adaptation is being used @@ -138,6 +145,10 @@ void QQuickWidgetPrivate::init(QQmlEngine* e) QWidget::connect(offscreenWindow, &QQuickWindow::focusObjectChanged, q, &QQuickWidget::propagateFocusObjectChanged); @@ -815,10 +997,10 @@ index 39780f8de3..9c97b43518 100644 + QAccessible::installFactory(&qAccessibleQuickWidgetFactory); +#endif } - + void QQuickWidgetPrivate::ensureEngine() const @@ -901,9 +912,7 @@ void QQuickWidgetPrivate::createContext() - + context = new QOpenGLContext; context->setFormat(offscreenWindow->requestedFormat()); - const QWindow *win = q->window()->windowHandle(); @@ -831,7 +1013,7 @@ index 39780f8de3..9c97b43518 100644 @@ -1520,19 +1529,16 @@ bool QQuickWidget::event(QEvent *e) d->handleWindowChange(); break; - + - case QEvent::ScreenChangeInternal: - if (QWindow *window = this->window()->windowHandle()) { - QScreen *newScreen = window->screen(); @@ -853,7 +1035,7 @@ index 39780f8de3..9c97b43518 100644 + d->context->setScreen(newScreen); #endif - } - + if (d->useSoftwareRenderer #if QT_CONFIG(opengl) @@ -1545,7 +1551,7 @@ bool QQuickWidget::event(QEvent *e) @@ -872,7 +1054,7 @@ index 881f7f9220..1a946bcc71 100644 @@ -148,6 +148,14 @@ public: bool forceFullUpdate; }; - + +class QQuickWidgetOffscreenWindow: public QQuickWindow +{ + Q_OBJECT @@ -882,7 +1064,7 @@ index 881f7f9220..1a946bcc71 100644 +}; + QT_END_NAMESPACE - + #endif // QQuickWidget_P_H diff --git a/src/quickwidgets/quickwidgets.pro b/src/quickwidgets/quickwidgets.pro index 2438e577ae..85d156b8a3 100644 @@ -896,14 +1078,70 @@ index 2438e577ae..85d156b8a3 100644 + qtquickwidgetsglobal.h \ + qaccessiblequickwidget_p.h \ + qaccessiblequickwidgetfactory_p.h - + SOURCES += \ - qquickwidget.cpp + qquickwidget.cpp \ + qaccessiblequickwidget.cpp \ + qaccessiblequickwidgetfactory.cpp - + load(qt_module) +diff --git a/tests/auto/qml/qqmldelegatemodel/data/deleteRace.qml b/tests/auto/qml/qqmldelegatemodel/data/deleteRace.qml +new file mode 100644 +index 0000000000..23874970e7 +--- /dev/null ++++ b/tests/auto/qml/qqmldelegatemodel/data/deleteRace.qml +@@ -0,0 +1,50 @@ ++import QtQuick 2.15 ++import QtQml.Models 2.15 ++ ++Item { ++ DelegateModel { ++ id: delegateModel ++ model: ListModel { ++ id: sourceModel ++ ++ ListElement { title: "foo" } ++ ListElement { title: "bar" } ++ ++ function clear() { ++ if (count > 0) ++ remove(0, count); ++ } ++ } ++ ++ groups: [ ++ DelegateModelGroup { name: "selectedItems" } ++ ] ++ ++ delegate: Text { ++ height: DelegateModel.inSelectedItems ? implicitHeight * 2 : implicitHeight ++ Component.onCompleted: { ++ if (index === 0) ++ DelegateModel.inSelectedItems = true; ++ } ++ } ++ ++ Component.onCompleted: { ++ items.create(0) ++ items.create(1) ++ } ++ } ++ ++ ListView { ++ anchors.fill: parent ++ model: delegateModel ++ } ++ ++ Timer { ++ running: true ++ interval: 10 ++ onTriggered: sourceModel.clear() ++ } ++ ++ property int count: delegateModel.items.count ++} ++ 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 @@ -922,30 +1160,31 @@ index 0000000000..206133bb39 + } +} diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp -index 35f1e2c94d..1722447830 100644 +index 35f1e2c94d..f473cff75f 100644 --- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp +++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp @@ -27,6 +27,8 @@ ****************************************************************************/ - + #include +#include +#include #include #include #include -@@ -47,6 +49,7 @@ private slots: +@@ -47,6 +49,8 @@ private slots: void filterOnGroup_removeWhenCompleted(); void qtbug_86017(); void contextAccessedByHandler(); + void redrawUponColumnChange(); ++ void deleteRace(); }; - + class AbstractItemModel : public QAbstractItemModel -@@ -186,6 +189,30 @@ void tst_QQmlDelegateModel::contextAccessedByHandler() +@@ -186,6 +190,41 @@ void tst_QQmlDelegateModel::contextAccessedByHandler() QVERIFY(root->property("works").toBool()); } - + +void tst_QQmlDelegateModel::redrawUponColumnChange() +{ + QStandardItemModel m1; @@ -969,9 +1208,20 @@ index 35f1e2c94d..1722447830 100644 + + QCOMPARE(item->property("text").toString(), "Coconut"); +} ++ ++void tst_QQmlDelegateModel::deleteRace() ++{ ++ QQmlEngine engine; ++ QQmlComponent c(&engine, testFileUrl("deleteRace.qml")); ++ QVERIFY2(c.isReady(), qPrintable(c.errorString())); ++ QScopedPointer o(c.create()); ++ QVERIFY(!o.isNull()); ++ QTRY_COMPARE(o->property("count").toInt(), 2); ++ QTRY_COMPARE(o->property("count").toInt(), 0); ++} + 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 @@ -987,7 +1237,7 @@ index 9c865b3f73..1f788f7a7f 100644 + 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 @@ -1018,16 +1268,16 @@ index bffb62c59e..97cc64991f 100644 +++ b/tests/auto/qml/qqmllanguage/tst_qqmllanguage.cpp @@ -336,6 +336,7 @@ private slots: void bareInlineComponent(); - + void hangOnWarning(); + void objectAsBroken(); - + void ambiguousContainingType(); - + @@ -5876,6 +5877,21 @@ void tst_qqmllanguage::ambiguousContainingType() } } - + +void tst_qqmllanguage::objectAsBroken() +{ + QQmlEngine engine; @@ -1044,8 +1294,100 @@ index bffb62c59e..97cc64991f 100644 +} + QTEST_MAIN(tst_qqmllanguage) - + #include "tst_qqmllanguage.moc" +diff --git a/tests/auto/quick/qquickgridview/data/qtbug86255.qml b/tests/auto/quick/qquickgridview/data/qtbug86255.qml +new file mode 100644 +index 0000000000..20688b1967 +--- /dev/null ++++ b/tests/auto/quick/qquickgridview/data/qtbug86255.qml +@@ -0,0 +1,55 @@ ++import QtQuick 2.15 ++ ++Item { ++ width: 240 ++ height: 320 ++ ++ GridView { ++ id: grid ++ objectName: "view" ++ anchors.fill: parent ++ cellWidth: 64 ++ cellHeight: 64 ++ model: ListModel { ++ id: listModel ++ ++ Component.onCompleted: reload() ++ ++ function reload() { ++ clear(); ++ for (let i = 0; i < 1000; i++) { ++ let magic = Math.random(); ++ append( { magic } ); ++ } ++ } ++ } ++ clip: true ++ delegate: Item { ++ id: d ++ property string val: magic ++ Loader { ++ property alias value: d.val ++ asynchronous: true ++ sourceComponent: cmp ++ } ++ } ++ } ++ ++ Timer { ++ running: true ++ interval: 1000 ++ onTriggered: listModel.reload() ++ } ++ Timer { ++ running: true ++ interval: 500 ++ onTriggered: grid.flick(0, -4000) ++ } ++ ++ Component { ++ id: cmp ++ Text { ++ text: value ++ } ++ } ++} +diff --git a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp +index 94ec4f44d5..7d0d9fa7a7 100644 +--- a/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp ++++ b/tests/auto/quick/qquickgridview/tst_qquickgridview.cpp +@@ -213,6 +213,7 @@ private slots: + void QTBUG_45640(); + void QTBUG_49218(); + void QTBUG_48870_fastModelUpdates(); ++ void QTBUG_86255(); + + void keyNavigationEnabled(); + void resizeDynamicCellWidthRtL(); +@@ -6814,6 +6815,18 @@ void tst_QQuickGridView::resizeDynamicCellWidthRtL() + QTRY_COMPARE(gridview->contentX(), 0.f); + } + ++void tst_QQuickGridView::QTBUG_86255() ++{ ++ QScopedPointer window(createView()); ++ window->setSource(testFileUrl("qtbug86255.qml")); ++ window->show(); ++ QVERIFY(QTest::qWaitForWindowExposed(window.data())); ++ QQuickGridView *view = findItem(window->rootObject(), "view"); ++ QVERIFY(view != nullptr); ++ QTRY_COMPARE(view->isFlicking(), true); ++ QTRY_COMPARE(view->isFlicking(), false); ++} ++ + void tst_QQuickGridView::releaseItems() + { + QScopedPointer view(createView()); 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 @@ -1074,13 +1416,13 @@ index c8f251dbe1..c8ef36ee68 100644 void activeFocusOnTab_infiniteLoop_data(); void activeFocusOnTab_infiniteLoop(); + void activeFocusOnTab_infiniteLoopControls(); - + void nextItemInFocusChain(); void nextItemInFocusChain2(); @@ -1057,6 +1058,17 @@ void tst_QQuickItem::activeFocusOnTab_infiniteLoop() QCOMPARE(item, window->rootObject()); } - + + +void tst_QQuickItem::activeFocusOnTab_infiniteLoopControls() +{ @@ -1095,3 +1437,136 @@ index c8f251dbe1..c8ef36ee68 100644 void tst_QQuickItem::nextItemInFocusChain() { if (!qt_tab_all_widgets()) +diff --git a/tests/auto/quick/qquickstates/data/jsValueWhen.qml b/tests/auto/quick/qquickstates/data/jsValueWhen.qml +new file mode 100644 +index 0000000000..6d5eb1600c +--- /dev/null ++++ b/tests/auto/quick/qquickstates/data/jsValueWhen.qml +@@ -0,0 +1,18 @@ ++import QtQuick 2.15 ++ ++Item { ++ id: root ++ property var prop: null ++ property bool works: false ++ states: [ ++ State { ++ name: "mystate" ++ when: root.prop ++ PropertyChanges { ++ target: root ++ works: "works" ++ } ++ } ++ ] ++ Component.onCompleted: root.prop = new Object ++} +diff --git a/tests/auto/quick/qquickstates/tst_qquickstates.cpp b/tests/auto/quick/qquickstates/tst_qquickstates.cpp +index aa55b42935..26e86672b0 100644 +--- a/tests/auto/quick/qquickstates/tst_qquickstates.cpp ++++ b/tests/auto/quick/qquickstates/tst_qquickstates.cpp +@@ -188,6 +188,7 @@ private slots: + void revertListMemoryLeak(); + void duplicateStateName(); + void trivialWhen(); ++ void jsValueWhen(); + void noStateOsciallation(); + void parentChangeCorrectReversal(); + void revertNullObjectBinding(); +@@ -1734,6 +1735,16 @@ void tst_qquickstates::trivialWhen() + QVERIFY(c.create()); + } + ++void tst_qquickstates::jsValueWhen() ++{ ++ QQmlEngine engine; ++ ++ QQmlComponent c(&engine, testFileUrl("jsValueWhen.qml")); ++ QScopedPointer root(c.create()); ++ QVERIFY(root); ++ QVERIFY(root->property("works").toBool()); ++} ++ + void tst_qquickstates::noStateOsciallation() + { + QQmlEngine engine; +diff --git a/tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml b/tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml +new file mode 100644 +index 0000000000..38dfde41c3 +--- /dev/null ++++ b/tests/manual/quickcontrols2/swipedelegate/CloseOnCompletedWorks.qml +@@ -0,0 +1,74 @@ ++/**************************************************************************** ++** ++** Copyright (C) 2022 The Qt Company Ltd. ++** Contact: https://www.qt.io/licensing/ ++** ++** This file is part of the test suite of the Qt Toolkit. ++** ++** $QT_BEGIN_LICENSE:BSD$ ++** 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. ++** ++** BSD License Usage ++** Alternatively, you may use this file under the terms of the BSD license ++** as follows: ++** ++** "Redistribution and use in source and binary forms, with or without ++** modification, are permitted provided that the following conditions are ++** met: ++** * Redistributions of source code must retain the above copyright ++** notice, this list of conditions and the following disclaimer. ++** * Redistributions in binary form must reproduce the above copyright ++** notice, this list of conditions and the following disclaimer in ++** the documentation and/or other materials provided with the ++** distribution. ++** * Neither the name of The Qt Company Ltd nor the names of its ++** contributors may be used to endorse or promote products derived ++** from this software without specific prior written permission. ++** ++** ++** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ++** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ++** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ++** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ++** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ++** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ++** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ++** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ++** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ++** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ++** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ++** ++** $QT_END_LICENSE$ ++** ++****************************************************************************/ ++ ++import QtQuick 2 ++import QtQuick.Controls 2 ++ApplicationWindow { ++ visible: true ++ width: 640 ++ height: 480 ++ ++ ListView { ++ anchors.fill: parent ++ model: 2 ++ ++ delegate: SwipeDelegate { ++ text: "Swipe me left (should not crash)" ++ ++ swipe.right: Label { ++ text: "Release (should not crash)" ++ } ++ ++ swipe.onCompleted: { ++ swipe.close() ++ } ++ } ++ } ++} diff --git a/desktop/toolkit/qt5/qt5-declarative/pspec.xml b/desktop/toolkit/qt5/qt5-declarative/pspec.xml index f849b26b48..2a37e070ab 100755 --- a/desktop/toolkit/qt5/qt5-declarative/pspec.xml +++ b/desktop/toolkit/qt5/qt5-declarative/pspec.xml @@ -69,6 +69,13 @@ + + 2023-05-10 + 5.15.9 + Rebuild. + Mustafa Cinasal + muscnsl@gmail.com + 2023-04-10 5.15.9