aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlengine.cpp
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2023-02-02 11:45:19 +0100
committerFabian Kosmale <fabian.kosmale@qt.io>2023-02-02 16:55:03 +0000
commit55f3bf8882fc8eeb132b4d2af9158bd1fee6bd78 (patch)
tree0999a2fd0250b9e148d5c3b896ce3202391d047e /src/qml/qml/qqmlengine.cpp
parente4e20fabfe5cbee890b91cf6cc35ceb57ce3fe43 (diff)
loadFromModule: Properly handle QML only modules
QQmlMetaType::typeModule only returns a sensible result for modules with some C++ integration. That is not the case for a pure QML module (qmldir put into an import path). Detect the missing module case by instead checking whether addImport failed to handle the module (either returning false, or returning true but with unresolved imports). Fixes: QTBUG-110882 Pick-to: 6.5 Change-Id: I7b25e225e1a34ec91f7ce4d9f4a182a24168ba47 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlengine.cpp')
-rw-r--r--src/qml/qml/qqmlengine.cpp27
1 files changed, 21 insertions, 6 deletions
diff --git a/src/qml/qml/qqmlengine.cpp b/src/qml/qml/qqmlengine.cpp
index 67d2f9ae6c..7c218276c2 100644
--- a/src/qml/qml/qqmlengine.cpp
+++ b/src/qml/qml/qqmlengine.cpp
@@ -2034,18 +2034,23 @@ LoadHelper::LoadHelper(QQmlTypeLoader *loader, QAnyStringView uri)
auto import = std::make_shared<PendingImport>();
import->uri = uri.toString();
QList<QQmlError> errorList;
- Blob::addImport(import, &errorList);
+ if (!Blob::addImport(import, &errorList))
+ m_uri = QString(); // reset m_uri to remember the failure
}
LoadHelper::ResolveTypeResult LoadHelper::resolveType(QAnyStringView typeName)
{
QQmlType type;
- QQmlTypeModule *module = QQmlMetaType::typeModule(m_uri, QTypeRevision{});
- if (!module)
+ if (!couldFindModule())
return {ResolveTypeResult::NoSuchModule, type};
- type = module->type(typeName.toString(), {});
- if (type.isValid())
- return {ResolveTypeResult::ModuleFound, type};
+ QQmlTypeModule *module = QQmlMetaType::typeModule(m_uri, QTypeRevision{});
+ if (module) {
+ type = module->type(typeName.toString(), {});
+ if (type.isValid())
+ return {ResolveTypeResult::ModuleFound, type};
+ }
+ // The module exists (see check above), but there is no QQmlTypeModule
+ // ==> pure QML module, attempt resolveType
QTypeRevision versionReturn;
QList<QQmlError> errors;
QQmlImportNamespace *ns_return = nullptr;
@@ -2055,6 +2060,16 @@ LoadHelper::ResolveTypeResult LoadHelper::resolveType(QAnyStringView typeName)
return {ResolveTypeResult::ModuleFound, type};
}
+bool LoadHelper::couldFindModule() const
+{
+ if (m_uri.isEmpty())
+ return false;
+ for (const auto &import: std::as_const(m_unresolvedImports))
+ if (import->priority == 0) // compare QQmlTypeData::allDependenciesDone
+ return false;
+ return true;
+}
+
QT_END_NAMESPACE
#include "moc_qqmlengine_p.cpp"