45 Q_DECLARE_TR_FUNCTIONS(QQmlTypeLoader)
47 using ChecksumCache = QQmlTypeLoaderThreadData::ChecksumCache;
50 class Q_QML_EXPORT
Blob :
public QQmlDataBlob
53 Blob(
const QUrl &url, QQmlDataBlob::Type type, QQmlTypeLoader *loader);
56 const QQmlImports *imports()
const {
return m_importCache.data(); }
58 void setCachedUnitStatus(QQmlMetaType::CachedUnitLookupError status) { m_cachedUnitStatus = status; }
65 QV4::CompiledData::Import::ImportType type
66 = QV4::CompiledData::Import::ImportType::ImportLibrary;
67 QV4::CompiledData::Location location;
69 QQmlImports::ImportFlags flags;
70 quint8 precedence = 0;
73 QTypeRevision version;
75 PendingImport() =
default;
76 PendingImport(
const QQmlRefPointer<Blob> &blob,
const QV4::CompiledData::Import *import,
77 QQmlImports::ImportFlags flags);
79 using PendingImportPtr = std::shared_ptr<PendingImport>;
81 void importQmldirScripts(
const PendingImportPtr &import,
const QQmlTypeLoaderQmldirContent &qmldir,
const QUrl &qmldirUrl);
82 bool handleLocalQmldirForImport(
83 const PendingImportPtr &import,
const QString &qmldirFilePath,
84 const QString &qmldirUrl, QList<QQmlError> *errors);
87 bool addImport(
const QV4::CompiledData::Import *import, QQmlImports::ImportFlags,
88 QList<QQmlError> *errors);
89 bool addImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
92 const QUrl &url,
const PendingImportPtr &import,
int priority,
93 QList<QQmlError> *errors);
94 bool updateQmldir(
const QQmlRefPointer<QQmlQmldirData> &data,
const PendingImportPtr &import, QList<QQmlError> *errors);
97 bool addScriptImport(
const PendingImportPtr &import);
98 bool addFileImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
99 bool addLibraryImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
101 virtual bool qmldirDataAvailable(
const QQmlRefPointer<QQmlQmldirData> &, QList<QQmlError> *);
103 virtual void scriptImported(
104 const QQmlRefPointer<QQmlScriptBlob> &,
const QV4::CompiledData::Location &,
105 const QString &,
const QString &)
107 assertTypeLoaderThread();
110 void dependencyComplete(
const QQmlDataBlob::Ptr &) override;
112 bool loadImportDependencies(
113 const PendingImportPtr ¤tImport,
const QString &qmldirUri,
114 QQmlImports::ImportFlags flags, QList<QQmlError> *errors);
118 bool registerPendingTypes(
const PendingImportPtr &import);
120 bool loadDependentImports(
121 const QList<QQmlDirParser::Import> &imports,
const QString &qualifier,
122 QTypeRevision version, quint8 precedence, QQmlImports::ImportFlags flags,
123 QList<QQmlError> *errors);
124 virtual QString stringAt(
int)
const {
return QString(); }
126 QQmlRefPointer<QQmlImports> m_importCache;
127 QVector<PendingImportPtr> m_unresolvedImports;
128 QVector<QQmlRefPointer<QQmlQmldirData>> m_qmldirs;
129 QQmlMetaType::CachedUnitLookupError m_cachedUnitStatus = QQmlMetaType::CachedUnitLookupError::NoError;
132 QQmlTypeLoader(QV4::ExecutionEngine *engine);
141 return engine->handle()->typeLoader();
149 return Engine::get(engine)->handle()->typeLoader();
157 if (path->startsWith(QStringLiteral(
"//"))) {
160 *path = QUrl::fromLocalFile(*path).toLocalFile();
166 template<
typename TypeReference>
168 QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypeCache,
169 const QList<TypeReference> &compositeSingletons)
171 QQmlTypeLoaderThreadDataPtr data(&m_data);
173 QCryptographicHash hash(QCryptographicHash::Md5);
174 return (resolvedTypeCache->addToHash(&hash, &data->checksumCache)
175 && addTypeReferenceChecksumsToHash(
176 compositeSingletons, &data->checksumCache, &hash))
190 const QUrl &relativeUrl,
const QV4::CompiledData::Unit *unit);
199 Q_ASSERT(!filePath.endsWith(QLatin1Char(
'/')));
200 const qsizetype pastLastSlash = filePath.lastIndexOf(QLatin1Char(
'/')) + 1;
202 filePath.left(pastLastSlash - 1),
203 filePath.mid(pastLastSlash, filePath.size() - pastLastSlash));
206 bool fileExists(
const QString &dirPath,
const QString &file);
221 void drop(
const QQmlDataBlob::Ptr &blob);
230 QUrl interceptUrl(
const QUrl &url, QQmlAbstractUrlInterceptor::DataType type)
const;
233#if !QT_CONFIG(qml_debug)
234 quintptr profiler()
const {
return 0; }
235 void setProfiler(quintptr) {}
237 QQmlProfiler *profiler()
const
239 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
240 return data->profiler.data();
242 void setProfiler(QQmlProfiler *profiler);
247 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
248 return data->importPaths;
255 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
256 return data->pluginPaths;
263 QQmlTypeLoaderThreadDataPtr data(&m_data);
264 data->initializedPlugins.insert(plugin);
268 QQmlTypeLoaderThreadDataConstPtr data(&m_data);
269 return data->initializedPlugins.contains(plugin);
274 QQmlTypeLoaderThreadDataPtr data(&m_data);
275 data->modulesForWhichPluginsHaveBeenProcessed.insert(module);
279 QQmlTypeLoaderThreadDataConstPtr data(&m_data);
280 return data->modulesForWhichPluginsHaveBeenProcessed.contains(module);
283#if QT_CONFIG(qml_network)
284 QQmlNetworkAccessManagerFactoryPtrConst networkAccessManagerFactory()
const;
285 void setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory);
286 QNetworkAccessManager *createNetworkAccessManager(QObject *parent)
const;
294 friend struct PlainLoader;
300#if QT_CONFIG(qml_network)
301 friend class QQmlTypeLoaderNetworkReplyProxy;
304 enum PathType { Local, Remote, LocalOrRemote };
306 enum LocalQmldirResult {
309 QmldirInterceptedToRemote,
317 void shutdownThread();
325 void trimCache(
const QQmlTypeLoaderSharedDataPtr &data);
327 void loadThread(
const QQmlDataBlob::Ptr &);
328 void loadWithStaticDataThread(
const QQmlDataBlob::Ptr &,
const QByteArray &);
329 void loadWithCachedUnitThread(
const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit);
330#if QT_CONFIG(qml_network)
331 void networkReplyFinished(QNetworkReply *);
332 void networkReplyProgress(QNetworkReply *, qint64, qint64);
335 enum class DataOrigin { Device, Static };
336 void setData(
const QQmlDataBlob::Ptr &,
const QByteArray &, DataOrigin);
337 void setData(
const QQmlDataBlob::Ptr &,
const QString &fileName);
338 void setData(
const QQmlDataBlob::Ptr &,
const QQmlDataBlob::SourceCodeData &);
339 void setCachedUnit(
const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit);
341 QStringList importPathList(PathType type)
const;
342 void clearQmldirInfo();
344 LocalQmldirResult locateLocalQmldir(
345 QQmlTypeLoader::Blob *blob,
const QQmlTypeLoader::Blob::PendingImportPtr &import,
346 QList<QQmlError> *errors);
349 void loadWithCachedUnit(
350 const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit,
353 template<
typename Loader>
354 void doLoad(
const Loader &loader,
const QQmlDataBlob::Ptr &blob,
Mode mode);
355 void updateTypeCacheTrimThreshold(
const QQmlTypeLoaderSharedDataPtr &data);
357 template<
typename TypeReference>
358 static bool addTypeReferenceChecksumsToHash(
359 const QList<TypeReference> &typeRefs,
360 QHash<quintptr, QByteArray> *checksums, QCryptographicHash *hash)
362 for (
const auto &typeRef: typeRefs) {
363 if (typeRef.typeData) {
364 const auto unit = typeRef.typeData->compilationUnit()->unitData();
365 hash->addData({unit->md5Checksum,
sizeof(unit->md5Checksum)});
366 }
else if (
const QMetaObject *mo = typeRef.type.metaObject()) {
367 const auto propertyCache = QQmlMetaType::propertyCache(mo);
369 hash->addData(propertyCache->checksum(checksums, &ok));
377 template<
typename Blob>
378 QQmlRefPointer<Blob> finalizeBlob(QQmlRefPointer<Blob> &&blob, QQmlTypeLoader::Mode mode)
380 QQmlMetaType::CachedUnitLookupError error = QQmlMetaType::CachedUnitLookupError::NoError;
381 const QQmlMetaType::CacheMode cacheMode = aotCacheMode();
382 if (
const QQmlPrivate::CachedQmlUnit *cachedUnit = (cacheMode != QQmlMetaType::RejectAll)
383 ? QQmlMetaType::findCachedCompilationUnit(blob->url(), cacheMode, &error)
385 loadWithCachedUnit(QQmlDataBlob::Ptr(blob.data()), cachedUnit, mode);
387 blob->setCachedUnitStatus(error);
388 load(QQmlDataBlob::Ptr(blob.data()), mode);
394 QQmlMetaType::CacheMode aotCacheMode();
396 QQmlTypeLoaderLockedData m_data;