diff options
author | Liang Qi <liang.qi@qt.io> | 2017-12-20 08:32:22 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@qt.io> | 2017-12-20 08:50:58 +0100 |
commit | 9a38fdcf8f9b734808bb54422e306872f3bfa944 (patch) | |
tree | 20fd361db6c505d99a40ab7a695511b97dcdcbd3 /src/qml/qml | |
parent | 1db9405128972d5ba77e33181bee40356f718cea (diff) | |
parent | 4fff2bb14e55484eacec0a1b49a2b02958f75eca (diff) |
Merge remote-tracking branch 'origin/5.10' into dev
Conflicts:
tests/auto/quick/pointerhandlers/flickableinterop/data/FlashAnimation.qml
tests/auto/quick/pointerhandlers/flickableinterop/data/Slider.qml
tests/auto/quick/pointerhandlers/flickableinterop/data/TapHandlerButton.qml
tests/auto/quick/pointerhandlers/flickableinterop/data/flickableWithHandlers.qml
tests/auto/quick/pointerhandlers/multipointtoucharea_interop/data/pinchDragMPTA.qml
tests/auto/quick/pointerhandlers/qquickdraghandler/data/DragAnywhereSlider.qml
tests/auto/quick/pointerhandlers/qquickdraghandler/data/FlashAnimation.qml
tests/auto/quick/pointerhandlers/qquickdraghandler/data/Slider.qml
tests/auto/quick/pointerhandlers/qquickdraghandler/data/draggables.qml
tests/auto/quick/pointerhandlers/qquickdraghandler/data/multipleSliders.qml
tests/auto/quick/pointerhandlers/qquicktaphandler/data/Button.qml
tests/auto/quick/pointerhandlers/qquicktaphandler/data/FlashAnimation.qml
tests/auto/quick/pointerhandlers/qquicktaphandler/data/buttons.qml
tests/manual/pointer/content/FakeFlickable.qml
tests/manual/pointer/content/FlashAnimation.qml
tests/manual/pointer/content/MomentumAnimation.qml
tests/manual/pointer/content/MouseAreaButton.qml
tests/manual/pointer/content/MouseAreaSlider.qml
tests/manual/pointer/content/MptaButton.qml
tests/manual/pointer/content/MultiButton.qml
tests/manual/pointer/content/ScrollBar.qml
tests/manual/pointer/content/Slider.qml
tests/manual/pointer/content/TapHandlerButton.qml
tests/manual/pointer/fakeFlickable.qml
tests/manual/pointer/flickableWithHandlers.qml
tests/manual/pointer/flingAnimation.qml
tests/manual/pointer/joystick.qml
tests/manual/pointer/main.cpp
tests/manual/pointer/main.qml
tests/manual/pointer/map.qml
tests/manual/pointer/map2.qml
tests/manual/pointer/mixer.qml
tests/manual/pointer/multibuttons.qml
tests/manual/pointer/photosurface.qml
tests/manual/pointer/pinchDragFlingMPTA.qml
tests/manual/pointer/pinchHandler.qml
tests/manual/pointer/singlePointHandlerProperties.qml
tests/manual/pointer/tapHandler.qml
tests/manual/pointer/tapWithModifiers.qml
tests/manual/shapestest/main.cpp
Change-Id: I4f233a521305fab1ebfecbac801da192434ed524
Diffstat (limited to 'src/qml/qml')
-rw-r--r-- | src/qml/qml/qqmlengine.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/qqmlglobal_p.h | 16 | ||||
-rw-r--r-- | src/qml/qml/qqmlimport.cpp | 12 | ||||
-rw-r--r-- | src/qml/qml/qqmlmetatype.cpp | 4 | ||||
-rw-r--r-- | src/qml/qml/qqmltypeloader.cpp | 20 | ||||
-rw-r--r-- | src/qml/qml/qqmltypeloader_p.h | 1 |
6 files changed, 36 insertions, 19 deletions
diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp index 9ef47b2c2e..61345f05a8 100644 --- a/src/qml/qml/qqmlengine.cpp +++ b/src/qml/qml/qqmlengine.cpp @@ -897,6 +897,8 @@ void QQmlData::setQueuedForDeletion(QObject *object) if (ddata->ownContext) { Q_ASSERT(ddata->ownContext == ddata->context); ddata->context->emitDestruction(); + if (ddata->ownContext->contextObject == object) + ddata->ownContext->contextObject = nullptr; ddata->ownContext = 0; ddata->context = 0; } diff --git a/src/qml/qml/qqmlglobal_p.h b/src/qml/qml/qqmlglobal_p.h index a6c113f5a7..5c46da0ea4 100644 --- a/src/qml/qml/qqmlglobal_p.h +++ b/src/qml/qml/qqmlglobal_p.h @@ -193,16 +193,6 @@ do { \ return QObjectPrivate::get(sender)->isSignalConnected(signalIdx); \ } while (0) -struct QQmlGraphics_DerivedObject : public QObject -{ - void setParent_noEvent(QObject *parent) { - bool sce = d_ptr->sendChildEvents; - d_ptr->sendChildEvents = false; - setParent(parent); - d_ptr->sendChildEvents = sce; - } -}; - /*! Returns true if the case of \a fileName is equivalent to the file case of \a fileName on disk, and false otherwise. @@ -230,7 +220,11 @@ bool QQml_isFileCaseCorrect(const QString &fileName, int length = -1); */ inline void QQml_setParent_noEvent(QObject *object, QObject *parent) { - static_cast<QQmlGraphics_DerivedObject *>(object)->setParent_noEvent(parent); + QObjectPrivate *d_ptr = QObjectPrivate::get(object); + bool sce = d_ptr->sendChildEvents; + d_ptr->sendChildEvents = false; + object->setParent(parent); + d_ptr->sendChildEvents = sce; } class Q_QML_PRIVATE_EXPORT QQmlValueTypeProvider diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp index a85166da65..a7cafa1a93 100644 --- a/src/qml/qml/qqmlimport.cpp +++ b/src/qml/qml/qqmlimport.cpp @@ -1231,10 +1231,12 @@ QString QQmlImportsPrivate::resolvedUri(const QString &dir_arg, QQmlImportDataba stableRelativePath.replace(Backslash, Slash); // remove optional versioning in dot notation from uri - int lastSlash = stableRelativePath.lastIndexOf(Slash); - if (lastSlash >= 0) { - int versionDot = stableRelativePath.indexOf(Dot, lastSlash); - if (versionDot >= 0) + int versionDot = stableRelativePath.lastIndexOf(Dot); + if (versionDot >= 0) { + int nextSlash = stableRelativePath.indexOf(Slash, versionDot); + if (nextSlash >= 0) + stableRelativePath.remove(versionDot, nextSlash - versionDot); + else stableRelativePath = stableRelativePath.left(versionDot); } @@ -1539,7 +1541,7 @@ bool QQmlImportsPrivate::addFileImport(const QString& uri, const QString &prefix if (isImplicitImport) { for (QList<QQmlImportInstance *>::const_iterator it = nameSpace->imports.constBegin(); it != nameSpace->imports.constEnd(); ++it) { - if ((*it)->uri == importUri) { + if ((*it)->url == url) { (*it)->implicitlyImported = true; return true; } diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp index 5836c85666..e696dc0362 100644 --- a/src/qml/qml/qqmlmetatype.cpp +++ b/src/qml/qml/qqmlmetatype.cpp @@ -272,8 +272,10 @@ void QQmlType::SingletonInstanceInfo::init(QQmlEngine *e) QQmlData::ensurePropertyCache(e, o); } else if (!url.isEmpty() && !qobjectApi(e)) { QQmlComponent component(e, url, QQmlComponent::PreferSynchronous); - QObject *o = component.create(); + QObject *o = component.beginCreate(e->rootContext()); setQObjectApi(e, o); + if (o) + component.completeCreate(); } } diff --git a/src/qml/qml/qqmltypeloader.cpp b/src/qml/qml/qqmltypeloader.cpp index 55e05afdaa..2b895994d2 100644 --- a/src/qml/qml/qqmltypeloader.cpp +++ b/src/qml/qml/qqmltypeloader.cpp @@ -317,7 +317,8 @@ Returns true if the status is WaitingForDependencies. */ bool QQmlDataBlob::isWaiting() const { - return status() == WaitingForDependencies; + return status() == WaitingForDependencies || + status() == ResolvingDependencies; } /*! @@ -609,6 +610,7 @@ The default implementation does nothing. */ void QQmlDataBlob::allDependenciesDone() { + m_data.setStatus(QQmlDataBlob::ResolvingDependencies); } /*! @@ -2408,7 +2410,15 @@ void QQmlTypeData::dataReceived(const SourceCodeData &data) void QQmlTypeData::initializeFromCachedUnit(const QQmlPrivate::CachedQmlUnit *unit) { m_document.reset(new QmlIR::Document(isDebugging())); - unit->loadIR(m_document.data(), unit); + if (unit->loadIR) { + // old code path for older generated code + unit->loadIR(m_document.data(), unit); + } else { + // new code path + QmlIR::IRLoader loader(unit->qmlData, m_document.data()); + loader.load(); + m_document->javaScriptCompilationUnit.adopt(unit->createCompilationUnit()); + } continueLoadFromIR(); } @@ -2500,6 +2510,8 @@ void QQmlTypeData::continueLoadFromIR() void QQmlTypeData::allDependenciesDone() { + QQmlTypeLoader::Blob::allDependenciesDone(); + if (!m_typesResolved) { // Check that all imports were resolved QList<QQmlError> errors; @@ -2619,6 +2631,10 @@ void QQmlTypeData::resolveTypes() if (ref.type.isCompositeSingleton()) { ref.typeData = typeLoader()->getType(ref.type.sourceUrl()); + if (ref.typeData->status() == QQmlDataBlob::ResolvingDependencies) { + // TODO: give an error message? If so, we should record and show the path of the cycle. + continue; + } addDependency(ref.typeData); ref.prefix = csRef.prefix; diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index 94552cd5a0..0ec9f9240e 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -98,6 +98,7 @@ public: Null, // Prior to QQmlTypeLoader::load() Loading, // Prior to data being received and dataReceived() being called WaitingForDependencies, // While there are outstanding addDependency()s + ResolvingDependencies, // While resolving outstanding dependencies, to detect cycles Complete, // Finished Error // Error }; |