aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml/qqmlimport.cpp
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-06-22 18:10:23 +0200
committerUlf Hermann <ulf.hermann@qt.io>2020-06-29 15:51:16 +0200
commitd8513d338d8537506984a13bf1f4ef6507678286 (patch)
tree087b524a17c38a9bfa44849e3c8e45fdeba3423b /src/qml/qml/qqmlimport.cpp
parentbd1c28a82c2ff955e0d154fac2e2df8d5a110dd7 (diff)
Match specific module imports also for versionless QML imports
Previously, if you registered a module import for a specific version X of a module, and the user imported the module without specifying a version, the module import would not be carried out even if X was the version actually imported. Change-Id: I853ed6f275501cf4cbd4e5a360985e67b07f3773 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqmlimport.cpp')
-rw-r--r--src/qml/qml/qqmlimport.cpp296
1 files changed, 173 insertions, 123 deletions
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp
index b237ba174a..14320f71f6 100644
--- a/src/qml/qml/qqmlimport.cpp
+++ b/src/qml/qml/qqmlimport.cpp
@@ -84,7 +84,13 @@ namespace {
QTypeRevision relevantVersion(const QString &uri, QTypeRevision version)
{
- return QQmlMetaType::isAnyModule(uri) ? version : QTypeRevision();
+ return QQmlMetaType::latestModuleVersion(uri).isValid() ? version : QTypeRevision();
+}
+
+QTypeRevision validVersion(QTypeRevision version = QTypeRevision())
+{
+ // If the given version is invalid, return a valid but useless version to signal "It's OK".
+ return version.isValid() ? version : QTypeRevision::fromMinorVersion(0);
}
QQmlError moduleNotFoundError(const QString &uri, QTypeRevision version)
@@ -262,17 +268,16 @@ public:
QQmlImportNamespace *importNamespace(const QString &prefix) const;
- bool addLibraryImport(const QString& uri, const QString &prefix,
- QTypeRevision version, const QString &qmldirIdentifier,
- const QString &qmldirUrl, uint flags,
- QQmlImportDatabase *database,
- QList<QQmlError> *errors);
+ QTypeRevision addLibraryImport(
+ const QString& uri, const QString &prefix, QTypeRevision version,
+ const QString &qmldirIdentifier, const QString &qmldirUrl, uint flags,
+ QQmlImportDatabase *database, QList<QQmlError> *errors);
- bool addFileImport(const QString &uri, const QString &prefix, QTypeRevision version,
- uint flags, QQmlImportDatabase *database,
- QList<QQmlError> *errors);
+ QTypeRevision addFileImport(
+ const QString &uri, const QString &prefix, QTypeRevision version, uint flags,
+ QQmlImportDatabase *database, QList<QQmlError> *errors);
- bool updateQmldirContent(const QString &uri, const QString &prefix,
+ QTypeRevision updateQmldirContent(const QString &uri, const QString &prefix,
const QString &qmldirIdentifier, const QString& qmldirUrl,
QQmlImportDatabase *database,
QList<QQmlError> *errors);
@@ -300,13 +305,14 @@ public:
const QString &uri, QTypeRevision version, QQmlImportDatabase *database,
QString *outQmldirFilePath, QString *outUrl);
- static bool validateQmldirVersion(const QQmlTypeLoaderQmldirContent &qmldir, const QString &uri,
- QTypeRevision version, QList<QQmlError> *errors);
+ static QTypeRevision matchingQmldirVersion(
+ const QQmlTypeLoaderQmldirContent &qmldir, const QString &uri,
+ QTypeRevision version, QList<QQmlError> *errors);
- bool importExtension(const QString &absoluteFilePath, const QString &uri, QTypeRevision version,
- QQmlImportDatabase *database,
- const QQmlTypeLoaderQmldirContent &qmldir,
- QList<QQmlError> *errors);
+ QTypeRevision importExtension(
+ const QString &absoluteFilePath, const QString &uri, QTypeRevision version,
+ QQmlImportDatabase *database, const QQmlTypeLoaderQmldirContent &qmldir,
+ QList<QQmlError> *errors);
bool getQmldirContent(const QString &qmldirIdentifier, const QString &uri,
QQmlTypeLoaderQmldirContent *qmldir, QList<QQmlError> *errors);
@@ -1180,11 +1186,10 @@ Import an extension defined by a qmldir file.
\a qmldirFilePath is a raw file path.
*/
-bool QQmlImportsPrivate::importExtension(const QString &qmldirFilePath,
- const QString &uri, QTypeRevision version,
- QQmlImportDatabase *database,
- const QQmlTypeLoaderQmldirContent &qmldir,
- QList<QQmlError> *errors)
+QTypeRevision QQmlImportsPrivate::importExtension(
+ const QString &qmldirFilePath, const QString &uri, QTypeRevision version,
+ QQmlImportDatabase *database, const QQmlTypeLoaderQmldirContent &qmldir,
+ QList<QQmlError> *errors)
{
Q_ASSERT(qmldir.hasContent());
@@ -1199,12 +1204,12 @@ bool QQmlImportsPrivate::importExtension(const QString &qmldirFilePath,
error.setUrl(QUrl::fromLocalFile(qmldirFilePath));
errors->prepend(error);
}
- return false;
+ return QTypeRevision();
}
int qmldirPluginCount = qmldir.plugins().count();
if (qmldirPluginCount == 0)
- return true;
+ return validVersion(version);
if (!database->qmlDirFilesForWhichPluginsHaveBeenLoaded.contains(qmldirFilePath)) {
// First search for listed qmldir plugins dynamically. If we cannot resolve them all, we continue
@@ -1231,10 +1236,10 @@ bool QQmlImportsPrivate::importExtension(const QString &qmldirFilePath,
continue;
++dynamicPluginsFound;
- if (!database->importDynamicPlugin(
- resolvedFilePath, uri, typeNamespace, version, plugin.optional, errors)) {
- return false;
- }
+ version = database->importDynamicPlugin(
+ resolvedFilePath, uri, typeNamespace, version, plugin.optional, errors);
+ if (!version.isValid())
+ return QTypeRevision();
}
if (dynamicPluginsFound < qmldirPluginCount) {
@@ -1246,7 +1251,7 @@ bool QQmlImportsPrivate::importExtension(const QString &qmldirFilePath,
const QStringList versionUris = versionUriList(uri, version);
QVector<StaticPluginPair> pluginPairs;
if (!populatePluginPairVector(pluginPairs, uri, versionUris, qmldirFilePath, errors))
- return false;
+ return QTypeRevision();
const QString basePath = QFileInfo(qmldirPath).absoluteFilePath();
for (const QString &versionUri : versionUris) {
@@ -1255,7 +1260,9 @@ bool QQmlImportsPrivate::importExtension(const QString &qmldirFilePath,
if (versionUri == metaTagUri.toString()) {
staticPluginsFound++;
QObject *instance = pair.first.instance();
- if (!database->importStaticPlugin(instance, basePath, uri, typeNamespace, version, errors)) {
+ version = database->importStaticPlugin(
+ instance, basePath, uri, typeNamespace, version, errors);
+ if (!version.isValid()){
if (errors) {
QQmlError poppedError = errors->takeFirst();
QQmlError error;
@@ -1264,7 +1271,7 @@ bool QQmlImportsPrivate::importExtension(const QString &qmldirFilePath,
error.setUrl(QUrl::fromLocalFile(qmldirFilePath));
errors->prepend(error);
}
- return false;
+ return QTypeRevision();
}
break;
}
@@ -1285,12 +1292,12 @@ bool QQmlImportsPrivate::importExtension(const QString &qmldirFilePath,
error.setUrl(QUrl::fromLocalFile(qmldirFilePath));
errors->prepend(error);
}
- return false;
+ return QTypeRevision();
}
database->qmlDirFilesForWhichPluginsHaveBeenLoaded.insert(qmldirFilePath);
}
- return true;
+ return validVersion(version);
}
bool QQmlImportsPrivate::getQmldirContent(const QString &qmldirIdentifier, const QString &uri,
@@ -1434,12 +1441,31 @@ QQmlImports::LocalQmldirResult QQmlImportsPrivate::locateLocalQmldir(
return pathTurnedRemote ? QQmlImports::QmldirInterceptedToRemote : QQmlImports::QmldirNotFound;
}
-bool QQmlImportsPrivate::validateQmldirVersion(const QQmlTypeLoaderQmldirContent &qmldir,
- const QString &uri, QTypeRevision version,
- QList<QQmlError> *errors)
+QTypeRevision QQmlImportsPrivate::matchingQmldirVersion(
+ const QQmlTypeLoaderQmldirContent &qmldir, const QString &uri, QTypeRevision version,
+ QList<QQmlError> *errors)
{
- quint8 lowest_min = std::numeric_limits<quint8>::max();
- quint8 highest_min = 0;
+ int bestMajorVersion = -1;
+ quint8 lowestMinorVersion = std::numeric_limits<quint8>::max();
+ quint8 highestMinorVersion = 0;
+
+ auto addVersion = [&](QTypeRevision newVersion) {
+ if (!newVersion.hasMajorVersion())
+ return;
+ if (!version.hasMajorVersion() || version.majorVersion() == newVersion.majorVersion()) {
+ if (newVersion.majorVersion() > bestMajorVersion) {
+ bestMajorVersion = newVersion.majorVersion();
+ if (newVersion.hasMinorVersion()) {
+ lowestMinorVersion = newVersion.minorVersion();
+ highestMinorVersion = newVersion.minorVersion();
+ }
+ } else if (newVersion.majorVersion() == bestMajorVersion
+ && newVersion.hasMinorVersion()) {
+ lowestMinorVersion = qMin(lowestMinorVersion, newVersion.minorVersion());
+ highestMinorVersion = qMax(highestMinorVersion, newVersion.minorVersion());
+ }
+ }
+ };
typedef QQmlDirComponents::const_iterator ConstIterator;
const QQmlDirComponents &components = qmldir.components();
@@ -1454,14 +1480,11 @@ bool QQmlImportsPrivate::validateQmldirVersion(const QQmlTypeLoaderQmldirContent
.arg(cit->typeName).arg(cit->version.majorVersion())
.arg(cit->version.minorVersion()).arg(uri));
errors->prepend(error);
- return false;
+ return QTypeRevision();
}
}
- if (cit->version.majorVersion() == version.majorVersion()) {
- lowest_min = qMin(lowest_min, cit->version.minorVersion());
- highest_min = qMax(highest_min, cit->version.minorVersion());
- }
+ addVersion(cit->version);
}
typedef QList<QQmlDirParser::Script>::const_iterator SConstIterator;
@@ -1477,22 +1500,32 @@ bool QQmlImportsPrivate::validateQmldirVersion(const QQmlTypeLoaderQmldirContent
.arg(sit->nameSpace).arg(sit->version.majorVersion())
.arg(sit->version.minorVersion()).arg(uri));
errors->prepend(error);
- return false;
+ return QTypeRevision();
}
}
- if (sit->version.majorVersion() == version.majorVersion()) {
- lowest_min = qMin(lowest_min, sit->version.minorVersion());
- highest_min = qMax(highest_min, sit->version.minorVersion());
- }
+ addVersion(sit->version);
}
- if (lowest_min > version.minorVersion() || highest_min < version.minorVersion()) {
+ // Failure to find a match is only an error if we were asking for a specific version ...
+ if (version.hasMajorVersion()
+ && (bestMajorVersion < 0
+ || (version.hasMinorVersion()
+ && (lowestMinorVersion > version.minorVersion()
+ || highestMinorVersion < version.minorVersion())))) {
errors->prepend(moduleNotFoundError(uri, version));
- return false;
+ return QTypeRevision();
}
- return true;
+ // ... otherwise, anything is valid.
+ if (bestMajorVersion < 0)
+ return validVersion();
+
+ return QTypeRevision::fromVersion(
+ bestMajorVersion,
+ (version.hasMajorVersion() && version.hasMinorVersion())
+ ? version.minorVersion()
+ : highestMinorVersion);
}
QQmlImportNamespace *QQmlImportsPrivate::importNamespace(const QString &prefix) const
@@ -1552,8 +1585,8 @@ QQmlImportInstance *QQmlImportsPrivate::addImportToNamespace(
return import;
}
-bool QQmlImportsPrivate::addLibraryImport(
- const QString& uri, const QString &prefix, QTypeRevision version,
+QTypeRevision QQmlImportsPrivate::addLibraryImport(
+ const QString &uri, const QString &prefix, QTypeRevision version,
const QString &qmldirIdentifier, const QString &qmldirUrl, uint flags,
QQmlImportDatabase *database, QList<QQmlError> *errors)
{
@@ -1574,39 +1607,43 @@ bool QQmlImportsPrivate::addLibraryImport(
if (!qmldirIdentifier.isEmpty()) {
if (!getQmldirContent(qmldirIdentifier, uri, &qmldir, errors))
- return false;
+ return QTypeRevision();
if (qmldir.hasContent()) {
- if (!importExtension(qmldir.pluginLocation(), uri, version, database, qmldir, errors))
- return false;
+ version = importExtension(
+ qmldir.pluginLocation(), uri, version, database, qmldir, errors);
+ if (!version.isValid())
+ return QTypeRevision();
if (!inserted->setQmldirContent(qmldirUrl, qmldir, nameSpace, errors))
- return false;
+ return QTypeRevision();
}
}
// Ensure that we are actually providing something
- if (!QQmlMetaType::isModule(uri, version)) {
- if (inserted->qmlDirComponents.isEmpty() && inserted->qmlDirScripts.isEmpty()) {
- if (qmldir.plugins().isEmpty() && !qmldir.imports().isEmpty())
- return true; // This is a pure redirection
- errors->prepend(moduleNotFoundError(uri, relevantVersion(uri, version)));
- return false;
- } else if (version.hasMajorVersion() && version.hasMinorVersion()
- && qmldir.hasContent()) {
- // Verify that the qmldir content is valid for this version
- if (!validateQmldirVersion(qmldir, uri, version, errors))
- return false;
- }
+ const QTypeRevision matchingVersion = QQmlMetaType::matchingModuleVersion(uri, version);
+ if (matchingVersion.isValid())
+ return matchingVersion;
+
+ if (inserted->qmlDirComponents.isEmpty() && inserted->qmlDirScripts.isEmpty()) {
+ if (qmldir.plugins().isEmpty() && !qmldir.imports().isEmpty())
+ return validVersion(); // This is a pure redirection
+ errors->prepend(moduleNotFoundError(uri, relevantVersion(uri, version)));
+ return QTypeRevision();
+ } else if (qmldir.hasContent()) {
+ // Verify that the qmldir content is valid for this version
+ version = matchingQmldirVersion(qmldir, uri, version, errors);
+ if (!version.isValid())
+ return QTypeRevision();
}
}
- return true;
+ return validVersion(version);
}
-bool QQmlImportsPrivate::addFileImport(const QString& uri, const QString &prefix,
- QTypeRevision version, uint flags,
- QQmlImportDatabase *database, QList<QQmlError> *errors)
+QTypeRevision QQmlImportsPrivate::addFileImport(
+ const QString& uri, const QString &prefix, QTypeRevision version, uint flags,
+ QQmlImportDatabase *database, QList<QQmlError> *errors)
{
Q_ASSERT(errors);
@@ -1636,7 +1673,7 @@ bool QQmlImportsPrivate::addFileImport(const QString& uri, const QString &prefix
error.setUrl(QUrl(qmldirUrl));
errors->prepend(error);
}
- return false;
+ return QTypeRevision();
}
// Transforms the (possible relative) uri into our best guess relative to the
@@ -1657,7 +1694,7 @@ bool QQmlImportsPrivate::addFileImport(const QString& uri, const QString &prefix
errors->prepend(error);
}
- return false;
+ return QTypeRevision();
}
@@ -1675,7 +1712,7 @@ bool QQmlImportsPrivate::addFileImport(const QString& uri, const QString &prefix
it != nameSpace->imports.constEnd(); ++it) {
if ((*it)->url == url) {
(*it)->implicitlyImported = true;
- return true;
+ return validVersion(version);
}
}
}
@@ -1690,21 +1727,23 @@ bool QQmlImportsPrivate::addFileImport(const QString& uri, const QString &prefix
if (!(flags & QQmlImports::ImportIncomplete) && !qmldirIdentifier.isEmpty()) {
QQmlTypeLoaderQmldirContent qmldir;
if (!getQmldirContent(qmldirIdentifier, importUri, &qmldir, errors))
- return false;
+ return QTypeRevision();
if (qmldir.hasContent()) {
- if (!importExtension(qmldir.pluginLocation(), importUri, version, database, qmldir, errors))
- return false;
+ version = importExtension(
+ qmldir.pluginLocation(), importUri, version, database, qmldir, errors);
+ if (!version.isValid())
+ return QTypeRevision();
if (!inserted->setQmldirContent(url, qmldir, nameSpace, errors))
- return false;
+ return QTypeRevision();
}
}
- return true;
+ return validVersion(version);
}
-bool QQmlImportsPrivate::updateQmldirContent(const QString &uri, const QString &prefix,
+QTypeRevision QQmlImportsPrivate::updateQmldirContent(const QString &uri, const QString &prefix,
const QString &qmldirIdentifier, const QString& qmldirUrl,
QQmlImportDatabase *database, QList<QQmlError> *errors)
{
@@ -1714,26 +1753,28 @@ bool QQmlImportsPrivate::updateQmldirContent(const QString &uri, const QString &
if (QQmlImportInstance *import = nameSpace->findImport(uri)) {
QQmlTypeLoaderQmldirContent qmldir;
if (!getQmldirContent(qmldirIdentifier, uri, &qmldir, errors))
- return false;
+ return QTypeRevision();
if (qmldir.hasContent()) {
- QTypeRevision version = import->version;
- if (!importExtension(qmldir.pluginLocation(), uri, version, database, qmldir, errors))
- return false;
+ QTypeRevision version = importExtension(
+ qmldir.pluginLocation(), uri, import->version, database, qmldir, errors);
+ if (!version.isValid())
+ return QTypeRevision();
if (import->setQmldirContent(qmldirUrl, qmldir, nameSpace, errors)) {
if (import->qmlDirComponents.isEmpty() && import->qmlDirScripts.isEmpty()) {
// The implicit import qmldir can be empty, and plugins have no extra versions
- if (uri != QLatin1String(".") && !QQmlMetaType::isModule(uri, version)) {
+ if (uri != QLatin1String(".") && !QQmlMetaType::matchingModuleVersion(uri, version).isValid()) {
errors->prepend(moduleNotFoundError(uri, relevantVersion(uri, version)));
- return false;
+ return QTypeRevision();
}
- } else if (version.hasMajorVersion() && version.hasMinorVersion()) {
+ } else {
// Verify that the qmldir content is valid for this version
- if (!validateQmldirVersion(qmldir, uri, version, errors))
- return false;
+ version = matchingQmldirVersion(qmldir, uri, version, errors);
+ if (!version.isValid())
+ return QTypeRevision();
}
- return true;
+ return validVersion(version);
}
}
}
@@ -1744,7 +1785,7 @@ bool QQmlImportsPrivate::updateQmldirContent(const QString &uri, const QString &
errors->prepend(error);
}
- return false;
+ return QTypeRevision();
}
/*!
@@ -1755,7 +1796,7 @@ bool QQmlImportsPrivate::updateQmldirContent(const QString &uri, const QString &
Additionally, this will add the import with lowest instead of highest precedence.
*/
-bool QQmlImports::addImplicitImport(QQmlImportDatabase *importDb, QList<QQmlError> *errors)
+QTypeRevision QQmlImports::addImplicitImport(QQmlImportDatabase *importDb, QList<QQmlError> *errors)
{
Q_ASSERT(errors);
@@ -1804,9 +1845,9 @@ bool QQmlImports::addInlineComponentImport(QQmlImportInstance *const importInsta
Returns true on success, and false on failure. In case of failure, the errors array will
filled appropriately.
*/
-bool QQmlImports::addFileImport(QQmlImportDatabase *importDb,
- const QString& uri, const QString& prefix, QTypeRevision version,
- uint flags, QList<QQmlError> *errors)
+QTypeRevision QQmlImports::addFileImport(
+ QQmlImportDatabase *importDb, const QString& uri, const QString& prefix,
+ QTypeRevision version, uint flags, QList<QQmlError> *errors)
{
Q_ASSERT(importDb);
Q_ASSERT(errors);
@@ -1818,10 +1859,10 @@ bool QQmlImports::addFileImport(QQmlImportDatabase *importDb,
return d->addFileImport(uri, prefix, version, flags, importDb, errors);
}
-bool QQmlImports::addLibraryImport(QQmlImportDatabase *importDb,
- const QString &uri, const QString &prefix, QTypeRevision version,
- const QString &qmldirIdentifier, const QString& qmldirUrl,
- uint flags, QList<QQmlError> *errors)
+QTypeRevision QQmlImports::addLibraryImport(
+ QQmlImportDatabase *importDb, const QString &uri, const QString &prefix,
+ QTypeRevision version, const QString &qmldirIdentifier, const QString& qmldirUrl,
+ uint flags, QList<QQmlError> *errors)
{
Q_ASSERT(importDb);
Q_ASSERT(errors);
@@ -1834,9 +1875,9 @@ bool QQmlImports::addLibraryImport(QQmlImportDatabase *importDb,
importDb, errors);
}
-bool QQmlImports::updateQmldirContent(QQmlImportDatabase *importDb,
- const QString &uri, const QString &prefix,
- const QString &qmldirIdentifier, const QString& qmldirUrl, QList<QQmlError> *errors)
+QTypeRevision QQmlImports::updateQmldirContent(
+ QQmlImportDatabase *importDb, const QString &uri, const QString &prefix,
+ const QString &qmldirIdentifier, const QString& qmldirUrl, QList<QQmlError> *errors)
{
Q_ASSERT(importDb);
Q_ASSERT(errors);
@@ -2176,9 +2217,11 @@ void QQmlImportDatabase::setImportPathList(const QStringList &paths)
/*!
\internal
*/
-static bool lockModule(const QString &uri, const QString &typeNamespace, QTypeRevision version,
- QList<QQmlError> *errors)
+static QTypeRevision lockModule(const QString &uri, const QString &typeNamespace,
+ QTypeRevision version, QList<QQmlError> *errors)
{
+ if (!version.hasMajorVersion())
+ version = QQmlMetaType::latestModuleVersion(uri);
if (version.hasMajorVersion() && !typeNamespace.isEmpty()
&& !QQmlMetaType::protectModule(uri, version, true)) {
// Not being able to protect the module means there are not types registered for it,
@@ -2187,16 +2230,16 @@ static bool lockModule(const QString &uri, const QString &typeNamespace, QTypeRe
// hit this path or another one that only figures "plugin is already loaded but module
// unavailable" and doesn't try to protect it anymore.
errors->prepend(moduleNotFoundError(uri, version));
- return false;
+ return QTypeRevision();
}
- return true;
+ return version;
}
/*!
\internal
*/
-bool QQmlImportDatabase::importStaticPlugin(
+QTypeRevision QQmlImportDatabase::importStaticPlugin(
QObject *instance, const QString &basePath, const QString &uri,
const QString &typeNamespace, QTypeRevision version, QList<QQmlError> *errors)
{
@@ -2214,10 +2257,13 @@ bool QQmlImportDatabase::importStaticPlugin(
plugins->insert(std::make_pair(uniquePluginID, QmlPlugin()));
if (QQmlMetaType::registerPluginTypes(
instance, basePath, uri, typeNamespace, version, errors)
- == QQmlMetaType::RegistrationResult::Failure
- || !lockModule(uri, typeNamespace, version, errors)) {
- return false;
+ == QQmlMetaType::RegistrationResult::Failure) {
+ return QTypeRevision();
}
+
+ version = lockModule(uri, typeNamespace, version, errors);
+ if (!version.isValid())
+ return QTypeRevision();
}
// Release the lock on plugins early as we're done with the global part. Releasing the lock
@@ -2229,13 +2275,13 @@ bool QQmlImportDatabase::importStaticPlugin(
if (!initializedPlugins.contains(uniquePluginID))
finalizePlugin(instance, uniquePluginID, uri);
- return true;
+ return validVersion(version);
}
/*!
\internal
*/
-bool QQmlImportDatabase::importDynamicPlugin(
+QTypeRevision QQmlImportDatabase::importDynamicPlugin(
const QString &filePath, const QString &uri, const QString &typeNamespace,
QTypeRevision version, bool isOptional, QList<QQmlError> *errors)
{
@@ -2255,7 +2301,7 @@ bool QQmlImportDatabase::importDynamicPlugin(
error.setDescription(tr("File name case mismatch for \"%1\"").arg(absoluteFilePath));
errors->prepend(error);
}
- return false;
+ return QTypeRevision();
}
QmlPlugin plugin;
@@ -2268,15 +2314,16 @@ bool QQmlImportDatabase::importDynamicPlugin(
// try again with plugin
break;
case QQmlMetaType::RegistrationResult::Success:
- if (!lockModule(uri, typeNamespace, version, errors))
- return false;
+ version = lockModule(uri, typeNamespace, version, errors);
+ if (!version.isValid())
+ return QTypeRevision();
// instance and loader intentionally left at nullptr
plugins->insert(std::make_pair(absoluteFilePath, std::move(plugin)));
// Not calling initializeEngine with null instance
initializedPlugins.insert(absoluteFilePath);
- return true;
+ return version;
case QQmlMetaType::RegistrationResult::Failure:
- return false;
+ return QTypeRevision();
}
}
@@ -2289,7 +2336,7 @@ bool QQmlImportDatabase::importDynamicPlugin(
error.setDescription(plugin.loader->errorString());
errors->prepend(error);
}
- return false;
+ return QTypeRevision();
}
instance = plugin.loader->instance();
@@ -2298,10 +2345,13 @@ bool QQmlImportDatabase::importDynamicPlugin(
// Continue with shared code path for dynamic and static plugins:
if (QQmlMetaType::registerPluginTypes(
instance, fileInfo.absolutePath(), uri, typeNamespace, version, errors)
- == QQmlMetaType::RegistrationResult::Failure
- || !lockModule(uri, typeNamespace, version, errors)) {
- return false;
+ == QQmlMetaType::RegistrationResult::Failure) {
+ return QTypeRevision();
}
+
+ version = lockModule(uri, typeNamespace, version, errors);
+ if (!version.isValid())
+ return QTypeRevision();
} else {
auto it = plugins->find(absoluteFilePath);
if (it != plugins->end() && it->second.loader)
@@ -2319,7 +2369,7 @@ bool QQmlImportDatabase::importDynamicPlugin(
if (!engineInitialized)
finalizePlugin(instance, absoluteFilePath, uri);
- return true;
+ return validVersion(version);
}
bool QQmlImportDatabase::removeDynamicPlugin(const QString &filePath)