Merge remote-tracking branch 'origin/5.13' into dev

Conflicts:
	.qmake.conf

Change-Id: I20ad6f8a260f387a3b73566a32c35a5772b401a5
This commit is contained in:
Qt Forward Merge Bot 2019-07-04 13:32:18 +02:00
commit 07205972ca
15 changed files with 59999 additions and 9 deletions

View File

@ -1384,7 +1384,8 @@ QQmlContextData *QQmlObjectCreator::finalize(QQmlInstantiationInterrupt &interru
QQmlPropertyData::DontRemoveBinding);
if (!b->isValueTypeProxy()) {
QQmlBinding *binding = static_cast<QQmlBinding*>(b.data());
if (!binding->hasError() && !binding->hasDependencies())
if (!binding->hasError() && !binding->hasDependencies()
&& binding->context() && !binding->context()->unresolvedNames)
b->removeFromObject();
}

View File

@ -2654,10 +2654,10 @@ QJSValue QQmlDelegateModelGroup::get(int index)
model->m_cacheMetaType->initializePrototype();
QV4::ExecutionEngine *v4 = model->m_cacheMetaType->v4Engine;
QV4::Scope scope(v4);
++cacheItem->scriptRef;
QV4::ScopedObject o(scope, v4->memoryManager->allocate<QQmlDelegateModelItemObject>(cacheItem));
QV4::ScopedObject p(scope, model->m_cacheMetaType->modelItemProto.value());
o->setPrototypeOf(p);
++cacheItem->scriptRef;
return QJSValue(v4, o->asReturnedValue());
}

View File

@ -75,6 +75,7 @@
#include <QtCore/qlist.h>
#include <QtCore/qdebug.h>
#include <QtCore/qelapsedtimer.h>
#include <QtCore/qpointer.h>
#if QT_CONFIG(quick_shadereffect)
#include <QtQuick/private/qquickshadereffectsource_p.h>
@ -687,12 +688,12 @@ public:
: leftSet(false), rightSet(false), upSet(false), downSet(false),
tabSet(false), backtabSet(false) {}
QQuickItem *left = nullptr;
QQuickItem *right = nullptr;
QQuickItem *up = nullptr;
QQuickItem *down = nullptr;
QQuickItem *tab = nullptr;
QQuickItem *backtab = nullptr;
QPointer<QQuickItem> left;
QPointer<QQuickItem> right;
QPointer<QQuickItem> up;
QPointer<QQuickItem> down;
QPointer<QQuickItem> tab;
QPointer<QQuickItem> backtab;
bool leftSet : 1;
bool rightSet : 1;
bool upSet : 1;

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,15 @@
pragma Singleton
import QtQml 2.0
QtObject {
property string name
property string category
property string sound
property int size: Animal.SizeSmall
enum SizeType {
SizeSmall,
SizeMedium,
SizeLarge
}
}

View File

@ -0,0 +1,3 @@
module dumper.CompositeWithEnum
singleton Animal 1.0 Animal.qml
depends QtQml 2.0

View File

@ -46,6 +46,7 @@ private slots:
void builtins();
void singleton();
void compositeWithinSingleton();
void compositeWithEnum();
void plugin_data();
void plugin();
@ -135,6 +136,21 @@ void tst_qmlplugindump::compositeWithinSingleton()
QVERIFY2(result.contains(QLatin1String("exportMetaObjectRevisions: [0]")), qPrintable(result));
}
void tst_qmlplugindump::compositeWithEnum()
{
QProcess dumper;
QStringList args;
args << QLatin1String("dumper.CompositeWithEnum") << QLatin1String("1.0")
<< QLatin1String(QT_QMLTEST_DIR "/data");
dumper.start(qmlplugindumpPath, args);
QVERIFY2(dumper.waitForStarted(), qPrintable(dumper.errorString()));
QVERIFY2(dumper.waitForFinished(), qPrintable(dumper.errorString()));
const QString &result = dumper.readAllStandardOutput();
QVERIFY2(result.contains(QLatin1String("exports: [\"Animal 1.0\"]")), qPrintable(result));
QVERIFY2(result.contains(QLatin1String("Enum {")), qPrintable(result));
}
void tst_qmlplugindump::plugin_data()
{
QTest::addColumn<QString>("import");

View File

@ -0,0 +1,4 @@
import QtQml 2.0
QtObject {
property string testTypeOf: typeof(contextProp)
}

View File

@ -356,6 +356,7 @@ private slots:
void callPropertyOnUndefined();
void jumpStrictNotEqualUndefined();
void removeBindingsWithNoDependencies();
void preserveBindingWithUnresolvedNames();
void temporaryDeadZone();
void importLexicalVariables_data();
void importLexicalVariables();
@ -8843,6 +8844,18 @@ void tst_qqmlecmascript::removeBindingsWithNoDependencies()
}
void tst_qqmlecmascript::preserveBindingWithUnresolvedNames()
{
QQmlEngine engine;
QQmlComponent component(&engine, testFileUrl("preserveBindingWithUnresolvedNames.qml"));
QScopedPointer<QObject> object(component.create());
QVERIFY(!object.isNull());
QCOMPARE(object->property("testTypeOf").toString(), QString("undefined"));
QObject obj;
engine.rootContext()->setContextProperty("contextProp", &obj);
QCOMPARE(object->property("testTypeOf").toString(), QString("object"));
}
void tst_qqmlecmascript::temporaryDeadZone()
{
QJSEngine engine;

View File

@ -0,0 +1,13 @@
import QtQuick 2.12
Item {
id: root
function createImplicitKeyNavigation() {
var item = Qt.createQmlObject("import QtQuick 2.0; Item { }", root);
item.KeyNavigation.up = root
item.destroy();
forceActiveFocus();
}
}

View File

@ -86,6 +86,7 @@ private slots:
void keyNavigation_RightToLeft();
void keyNavigation_skipNotVisible();
void keyNavigation_implicitSetting();
void keyNavigation_implicitDestroy();
void keyNavigation_focusReason();
void keyNavigation_loop();
void layoutMirroring();
@ -2164,6 +2165,29 @@ void tst_QQuickItem::keyNavigation_implicitSetting()
delete window;
}
// QTBUG-75399
void tst_QQuickItem::keyNavigation_implicitDestroy()
{
QQuickView view;
view.setSource(testFileUrl("keynavigationtest_implicitDestroy.qml"));
view.show();
QVERIFY(QTest::qWaitForWindowActive(&view));
QQuickItem *root = view.rootObject();
QVERIFY(QMetaObject::invokeMethod(root, "createImplicitKeyNavigation"));
// process events is necessary to trigger upcoming memory access violation
QTest::qWait(0);
QVERIFY(root->hasActiveFocus());
QKeyEvent keyPress = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
QGuiApplication::sendEvent(&view, &keyPress); // <-- access violation happens here
// this should fail the test, even if the access violation does not occur
QVERIFY(!keyPress.isAccepted());
}
void tst_QQuickItem::keyNavigation_focusReason()
{
QQuickView *window = new QQuickView(nullptr);

View File

@ -478,8 +478,12 @@ public:
}
}
for (const QMetaObject *meta : qAsConst(objectsToMerge))
for (const QMetaObject *meta : qAsConst(objectsToMerge)) {
for (int index = meta->enumeratorOffset(); index < meta->enumeratorCount(); ++index)
dump(meta->enumerator(index));
writeMetaContent(meta, &knownAttributes);
}
qml->writeEndObject();
}