aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/qml
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-06-29 01:02:07 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2018-06-29 01:02:07 +0200
commitdd333172e2ade1db6d0af72b4ed44262c2b4d8c7 (patch)
tree16301a9b938826cf4b78b751907378d96423c5d0 /src/qml/qml
parent3d266d90cb920375bb856844baea290e52355aad (diff)
parentffeaac704efc9eb85464d0a401d98e28991ec4d3 (diff)
Merge remote-tracking branch 'origin/5.11' into dev
Diffstat (limited to 'src/qml/qml')
-rw-r--r--src/qml/qml/qqmlimport.cpp14
-rw-r--r--src/qml/qml/qqmlmetatype.cpp42
-rw-r--r--src/qml/qml/qqmlmetatype_p.h13
3 files changed, 48 insertions, 21 deletions
diff --git a/src/qml/qml/qqmlimport.cpp b/src/qml/qml/qqmlimport.cpp
index 962c92fdb0..1c37894751 100644
--- a/src/qml/qml/qqmlimport.cpp
+++ b/src/qml/qml/qqmlimport.cpp
@@ -158,6 +158,8 @@ QQmlType fetchOrCreateTypeForUrl(const QString &urlString, const QHashedStringRe
// can guarentee it will live long enough to reach qmlregister.
QByteArray buf(unqualifiedtype.toString().toUtf8());
+ QQmlMetaTypeRegistrationFailureRecorder failureRecorder;
+
// Register the type. Note that the URI parameters here are empty; for
// file type imports, we do not place them in a URI as we don't
// necessarily have a good and unique one (picture a library import,
@@ -200,9 +202,9 @@ QQmlType fetchOrCreateTypeForUrl(const QString &urlString, const QHashedStringRe
// data.
if (!ret.isValid()) {
if (!errors) // Cannot list errors properly, just quit
- qFatal("%s", QQmlMetaType::typeRegistrationFailures().join('\n').toLatin1().constData());
+ qFatal("%s", failureRecorder.failures().join('\n').toLatin1().constData());
QQmlError error;
- error.setDescription(QQmlMetaType::typeRegistrationFailures().join('\n'));
+ error.setDescription(failureRecorder.failures().join('\n'));
errors->prepend(error);
}
return ret;
@@ -2022,7 +2024,7 @@ bool QQmlImportDatabase::registerPluginTypes(QObject *instance, const QString &b
const QByteArray bytes = uri.toUtf8();
const char *moduleId = bytes.constData();
- QStringList registrationFailures;
+ QQmlMetaTypeRegistrationFailureRecorder failureRecorder;
{
// Create a scope for QWriteLocker to keep it as narrow as possible, and
// to ensure that we release it before the call to initalizeEngine below
@@ -2064,14 +2066,12 @@ bool QQmlImportDatabase::registerPluginTypes(QObject *instance, const QString &b
}
iface->registerTypes(moduleId);
-
- registrationFailures = QQmlMetaType::typeRegistrationFailures();
QQmlMetaType::setTypeRegistrationNamespace(QString());
} // QWriteLocker lock(QQmlMetaType::typeRegistrationLock())
- if (!registrationFailures.isEmpty()) {
+ if (!failureRecorder.failures().isEmpty()) {
if (errors) {
- for (const QString &failure : qAsConst(registrationFailures)) {
+ for (const QString &failure : failureRecorder.failures()) {
QQmlError error;
error.setDescription(failure);
errors->prepend(error);
diff --git a/src/qml/qml/qqmlmetatype.cpp b/src/qml/qml/qqmlmetatype.cpp
index 69a8ff034a..b31058ece5 100644
--- a/src/qml/qml/qqmlmetatype.cpp
+++ b/src/qml/qml/qqmlmetatype.cpp
@@ -114,13 +114,27 @@ struct QQmlMetaTypeData
QSet<QString> protectedNamespaces;
QString typeRegistrationNamespace;
- QStringList typeRegistrationFailures;
QHash<int, int> qmlLists;
QHash<const QMetaObject *, QQmlPropertyCache *> propertyCaches;
QQmlPropertyCache *propertyCache(const QMetaObject *metaObject);
QQmlPropertyCache *propertyCache(const QQmlType &type, int minorVersion);
+
+ void startRecordingTypeRegFailures(QStringList *storage)
+ { typeRegistrationFailures = storage; }
+ void stopRecordingTypeRegFailures()
+ { startRecordingTypeRegFailures(nullptr); }
+ void recordTypeRegFailure(const QString &message)
+ {
+ if (typeRegistrationFailures)
+ typeRegistrationFailures->append(message);
+ else
+ qWarning("%s", message.toUtf8().constData());
+ }
+
+private:
+ QStringList *typeRegistrationFailures = nullptr;
};
class QQmlTypeModulePrivate
@@ -152,6 +166,16 @@ static uint qHash(const QQmlMetaTypeData::VersionedUri &v)
return v.uri.hash() ^ qHash(v.majorVersion);
}
+QQmlMetaTypeRegistrationFailureRecorder::QQmlMetaTypeRegistrationFailureRecorder()
+{
+ metaTypeData()->startRecordingTypeRegFailures(&_failures);
+}
+
+QQmlMetaTypeRegistrationFailureRecorder::~QQmlMetaTypeRegistrationFailureRecorder()
+{
+ metaTypeData()->stopRecordingTypeRegFailures();
+}
+
QQmlMetaTypeData::QQmlMetaTypeData()
{
}
@@ -1581,7 +1605,7 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da
if (!typeName.isEmpty()) {
if (typeName.at(0).isLower()) {
QString failure(QCoreApplication::translate("qmlRegisterType", "Invalid QML %1 name \"%2\"; type names must begin with an uppercase letter"));
- data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName));
+ data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName));
return false;
}
@@ -1589,7 +1613,7 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da
for (int ii = 0; ii < typeNameLen; ++ii) {
if (!(typeName.at(ii).isLetterOrNumber() || typeName.at(ii) == '_')) {
QString failure(QCoreApplication::translate("qmlRegisterType", "Invalid QML %1 name \"%2\""));
- data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName));
+ data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName));
return false;
}
}
@@ -1603,7 +1627,7 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da
if (data->protectedNamespaces.contains(nameSpace)) {
QString failure(QCoreApplication::translate("qmlRegisterType",
"Cannot install %1 '%2' into protected namespace '%3'"));
- data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace));
+ data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace));
return false;
}
} else if (majorVersion >= 0) {
@@ -1614,7 +1638,7 @@ bool checkRegistration(QQmlType::RegistrationType typeType, QQmlMetaTypeData *da
if (QQmlTypeModulePrivate::get(qqtm)->locked){
QString failure(QCoreApplication::translate("qmlRegisterType",
"Cannot install %1 '%2' into protected module '%3' version '%4'"));
- data->typeRegistrationFailures.append(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace).arg(majorVersion));
+ data->recordTypeRegFailure(failure.arg(registrationTypeString(typeType)).arg(typeName).arg(nameSpace).arg(majorVersion));
return false;
}
}
@@ -1905,14 +1929,6 @@ void QQmlMetaType::setTypeRegistrationNamespace(const QString &uri)
QQmlMetaTypeData *data = metaTypeData();
data->typeRegistrationNamespace = uri;
- data->typeRegistrationFailures.clear();
-}
-
-QStringList QQmlMetaType::typeRegistrationFailures()
-{
- QQmlMetaTypeData *data = metaTypeData();
-
- return data->typeRegistrationFailures;
}
QMutex *QQmlMetaType::typeRegistrationLock()
diff --git a/src/qml/qml/qqmlmetatype_p.h b/src/qml/qml/qqmlmetatype_p.h
index 6df439cd7a..4a5e4ba266 100644
--- a/src/qml/qml/qqmlmetatype_p.h
+++ b/src/qml/qml/qqmlmetatype_p.h
@@ -155,7 +155,6 @@ public:
static void protectNamespace(const QString &);
static void setTypeRegistrationNamespace(const QString &);
- static QStringList typeRegistrationFailures();
static QMutex *typeRegistrationLock();
@@ -361,6 +360,18 @@ private:
int m_minor;
};
+class Q_AUTOTEST_EXPORT QQmlMetaTypeRegistrationFailureRecorder
+{
+ QStringList _failures;
+
+public:
+ QQmlMetaTypeRegistrationFailureRecorder();
+ ~QQmlMetaTypeRegistrationFailureRecorder();
+
+ QStringList failures() const
+ { return _failures; }
+};
+
QT_END_NAMESPACE
#endif // QQMLMETATYPE_P_H