diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2023-02-02 11:45:19 +0100 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2023-02-02 16:55:03 +0000 |
commit | 55f3bf8882fc8eeb132b4d2af9158bd1fee6bd78 (patch) | |
tree | 0999a2fd0250b9e148d5c3b896ce3202391d047e /src/qml/qml/qqmlengine.cpp | |
parent | e4e20fabfe5cbee890b91cf6cc35ceb57ce3fe43 (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.cpp | 27 |
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" |