48 Q_DECLARE_TR_FUNCTIONS(QQmlTypeLoader)
50 using ChecksumCache = QQmlTypeLoaderThreadData::ChecksumCache;
53 class Q_QML_EXPORT
Blob :
public QQmlDataBlob
56 Blob(
const QUrl &url, QQmlDataBlob::Type type, QQmlTypeLoader *loader);
59 const QQmlImports *imports()
const {
return m_importCache.data(); }
61 void setCachedUnitStatus(QQmlMetaType::CachedUnitLookupError status) { m_cachedUnitStatus = status; }
68 QV4::CompiledData::Import::ImportType type
69 = QV4::CompiledData::Import::ImportType::ImportLibrary;
70 QV4::CompiledData::Location location;
72 QQmlImports::ImportFlags flags;
73 quint8 precedence = 0;
81 QTypeRevision version;
86 QTypeRevision searchVersion;
88 PendingImport() =
default;
89 PendingImport(
const QQmlRefPointer<Blob> &blob,
const QV4::CompiledData::Import *import,
90 QQmlImports::ImportFlags flags);
92 using PendingImportPtr = std::shared_ptr<PendingImport>;
94 void importQmldirScripts(
const PendingImportPtr &import,
const QQmlTypeLoaderQmldirContent &qmldir,
const QUrl &qmldirUrl);
95 bool handleLocalQmldirForImport(
96 const PendingImportPtr &import,
const QString &qmldirFilePath,
97 const QString &qmldirUrl, QList<QQmlError> *errors);
100 bool addImport(
const QV4::CompiledData::Import *import, QQmlImports::ImportFlags,
101 QList<QQmlError> *errors);
102 bool addImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
105 const QUrl &url,
const PendingImportPtr &import,
int priority,
106 QList<QQmlError> *errors);
107 bool updateQmldir(
const QQmlRefPointer<QQmlQmldirData> &data,
const PendingImportPtr &import, QList<QQmlError> *errors);
110 bool addScriptImport(
const PendingImportPtr &import);
111 bool addFileImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
112 bool addLibraryImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
114 virtual bool qmldirDataAvailable(
const QQmlRefPointer<QQmlQmldirData> &, QList<QQmlError> *);
116 virtual void scriptImported(
117 const QQmlRefPointer<QQmlScriptBlob> &,
const QV4::CompiledData::Location &,
118 const QString &,
const QString &)
120 assertTypeLoaderThread();
123 void dependencyComplete(
const QQmlDataBlob::Ptr &) override;
125 bool loadImportDependencies(
126 const PendingImportPtr ¤tImport,
const QString &qmldirUri,
127 QQmlImports::ImportFlags flags, QList<QQmlError> *errors);
131 bool registerPendingTypes(
const PendingImportPtr &import);
133 bool loadDependentImports(
134 const QList<QQmlDirParser::Import> &imports,
const QString &qualifier,
135 QTypeRevision version, QTypeRevision searchVersion, quint8 precedence,
136 QQmlImports::ImportFlags flags, QList<QQmlError> *errors);
137 virtual QString stringAt(
int)
const {
return QString(); }
139 QQmlRefPointer<QQmlImports> m_importCache;
140 QList<PendingImportPtr> m_unresolvedImports;
141 QList<QQmlRefPointer<QQmlQmldirData>> m_qmldirs;
142 QQmlMetaType::CachedUnitLookupError m_cachedUnitStatus = QQmlMetaType::CachedUnitLookupError::NoError;
145 QQmlTypeLoader(QV4::ExecutionEngine *engine);
154 return engine->handle()->typeLoader();
162 return Engine::get(engine)->handle()->typeLoader();
170 if (path->startsWith(QStringLiteral(
"//"))) {
173 *path = QUrl::fromLocalFile(*path).toLocalFile();
179 template<
typename TypeReference>
181 QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypeCache,
182 const QList<TypeReference> &compositeSingletons)
184 QQmlTypeLoaderThreadDataPtr data(&m_data);
186 QCryptographicHash hash(QCryptographicHash::Md5);
187 return (resolvedTypeCache->addToHash(&hash, &data->checksumCache)
188 && addTypeReferenceChecksumsToHash(
189 compositeSingletons, &data->checksumCache, &hash))
203 const QUrl &relativeUrl,
const QV4::CompiledData::Unit *unit);
212 Q_ASSERT(!filePath.endsWith(QLatin1Char(
'/')));
213 const qsizetype pastLastSlash = filePath.lastIndexOf(QLatin1Char(
'/')) + 1;
215 filePath.left(pastLastSlash - 1),
216 filePath.mid(pastLastSlash, filePath.size() - pastLastSlash));
219 bool fileExists(
const QString &dirPath,
const QString &file)
const;
235 void drop(
const QQmlDataBlob::Ptr &blob);
244 QUrl interceptUrl(
const QUrl &url, QQmlAbstractUrlInterceptor::DataType type)
const;
247#if !QT_CONFIG(qml_debug)
248 quintptr profiler()
const {
return 0; }
249 void setProfiler(quintptr) {}
251 QQmlProfiler *profiler()
const
253 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
254 return data->profiler.data();
256 void setProfiler(QQmlProfiler *profiler);
263 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
264 return data->importPaths;
271 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
272 return data->pluginPaths;
279 QQmlTypeLoaderThreadDataPtr data(&m_data);
280 data->initializedPlugins.insert(plugin);
284 QQmlTypeLoaderThreadDataConstPtr data(&m_data);
285 return data->initializedPlugins.contains(plugin);
290 QQmlTypeLoaderThreadDataPtr data(&m_data);
291 data->modulesForWhichPluginsHaveBeenProcessed.insert(module);
295 QQmlTypeLoaderThreadDataConstPtr data(&m_data);
296 return data->modulesForWhichPluginsHaveBeenProcessed.contains(module);
299#if QT_CONFIG(qml_network)
300 QQmlNetworkAccessManagerFactoryPtrConst networkAccessManagerFactory()
const;
301 void setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory);
302 QNetworkAccessManager *createNetworkAccessManager(QObject *parent)
const;
312 friend struct PlainLoader;
318#if QT_CONFIG(qml_network)
319 friend class QQmlTypeLoaderNetworkReplyProxy;
322 enum PathType { Local, Remote, LocalOrRemote };
324 enum LocalQmldirResult {
327 QmldirInterceptedToRemote,
335 void shutdownThread();
343 void trimCache(
const QQmlTypeLoaderSharedDataPtr &data);
345 void loadThread(
const QQmlDataBlob::Ptr &);
346 void loadWithStaticDataThread(
const QQmlDataBlob::Ptr &,
const QByteArray &);
347 void loadWithCachedUnitThread(
const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit);
348#if QT_CONFIG(qml_network)
349 void networkReplyFinished(QNetworkReply *);
350 void networkReplyProgress(QNetworkReply *, qint64, qint64);
353 enum class DataOrigin { Device, Static };
354 void setData(
const QQmlDataBlob::Ptr &,
const QByteArray &, DataOrigin);
355 void setData(
const QQmlDataBlob::Ptr &,
const QString &fileName,
bool exists);
356 void setData(
const QQmlDataBlob::Ptr &,
const QQmlDataBlob::SourceCodeData &);
357 void setCachedUnit(
const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit);
359 QStringList importPathList(PathType type)
const;
360 void clearQmldirInfo();
362 LocalQmldirResult locateLocalQmldir(
363 QQmlTypeLoader::Blob *blob,
const QQmlTypeLoader::Blob::PendingImportPtr &import,
364 QList<QQmlError> *errors);
367 void loadWithCachedUnit(
368 const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit,
371 template<
typename Loader>
372 void doLoad(
const Loader &loader,
const QQmlDataBlob::Ptr &blob,
Mode mode);
373 void updateTypeCacheTrimThreshold(
const QQmlTypeLoaderSharedDataPtr &data);
375 template<
typename TypeReference>
376 static bool addTypeReferenceChecksumsToHash(
377 const QList<TypeReference> &typeRefs,
378 QHash<quintptr, QByteArray> *checksums, QCryptographicHash *hash)
380 for (
const auto &typeRef: typeRefs) {
381 if (typeRef.typeData) {
382 const auto unit = typeRef.typeData->compilationUnit()->unitData();
383 hash->addData({unit->md5Checksum,
sizeof(unit->md5Checksum)});
384 }
else if (
const QMetaObject *mo = typeRef.type.metaObject()) {
385 const auto propertyCache = QQmlMetaType::propertyCache(mo);
387 hash->addData(propertyCache->checksum(checksums, &ok));
395 template<
typename Blob>
396 QQmlRefPointer<Blob> finalizeBlob(QQmlRefPointer<Blob> &&blob, QQmlTypeLoader::Mode mode)
398 QQmlMetaType::CachedUnitLookupError error = QQmlMetaType::CachedUnitLookupError::NoError;
399 const QQmlMetaType::CacheMode cacheMode = aotCacheMode();
400 if (
const QQmlPrivate::CachedQmlUnit *cachedUnit = (cacheMode != QQmlMetaType::RejectAll)
401 ? QQmlMetaType::findCachedCompilationUnit(blob->url(), cacheMode, &error)
403 loadWithCachedUnit(QQmlDataBlob::Ptr(blob.data()), cachedUnit, mode);
405 blob->setCachedUnitStatus(error);
406 load(QQmlDataBlob::Ptr(blob.data()), mode);
412 QQmlMetaType::CacheMode aotCacheMode();
414 QQmlTypeLoaderLockedData m_data;