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;
76 QTypeRevision version;
78 PendingImport() =
default;
79 PendingImport(
const QQmlRefPointer<Blob> &blob,
const QV4::CompiledData::Import *import,
80 QQmlImports::ImportFlags flags);
82 using PendingImportPtr = std::shared_ptr<PendingImport>;
84 void importQmldirScripts(
const PendingImportPtr &import,
const QQmlTypeLoaderQmldirContent &qmldir,
const QUrl &qmldirUrl);
85 bool handleLocalQmldirForImport(
86 const PendingImportPtr &import,
const QString &qmldirFilePath,
87 const QString &qmldirUrl, QList<QQmlError> *errors);
90 bool addImport(
const QV4::CompiledData::Import *import, QQmlImports::ImportFlags,
91 QList<QQmlError> *errors);
92 bool addImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
95 const QUrl &url,
const PendingImportPtr &import,
int priority,
96 QList<QQmlError> *errors);
97 bool updateQmldir(
const QQmlRefPointer<QQmlQmldirData> &data,
const PendingImportPtr &import, QList<QQmlError> *errors);
100 bool addScriptImport(
const PendingImportPtr &import);
101 bool addFileImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
102 bool addLibraryImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
104 virtual bool qmldirDataAvailable(
const QQmlRefPointer<QQmlQmldirData> &, QList<QQmlError> *);
106 virtual void scriptImported(
107 const QQmlRefPointer<QQmlScriptBlob> &,
const QV4::CompiledData::Location &,
108 const QString &,
const QString &)
110 assertTypeLoaderThread();
113 void dependencyComplete(
const QQmlDataBlob::Ptr &) override;
115 bool loadImportDependencies(
116 const PendingImportPtr ¤tImport,
const QString &qmldirUri,
117 QQmlImports::ImportFlags flags, QList<QQmlError> *errors);
121 bool registerPendingTypes(
const PendingImportPtr &import);
123 bool loadDependentImports(
124 const QList<QQmlDirParser::Import> &imports,
const QString &qualifier,
125 QTypeRevision version, quint8 precedence, QQmlImports::ImportFlags flags,
126 QList<QQmlError> *errors);
127 virtual QString stringAt(
int)
const {
return QString(); }
129 QQmlRefPointer<QQmlImports> m_importCache;
130 QList<PendingImportPtr> m_unresolvedImports;
131 QList<QQmlRefPointer<QQmlQmldirData>> m_qmldirs;
132 QQmlMetaType::CachedUnitLookupError m_cachedUnitStatus = QQmlMetaType::CachedUnitLookupError::NoError;
135 QQmlTypeLoader(QV4::ExecutionEngine *engine);
144 return engine->handle()->typeLoader();
152 return Engine::get(engine)->handle()->typeLoader();
160 if (path->startsWith(QStringLiteral(
"//"))) {
163 *path = QUrl::fromLocalFile(*path).toLocalFile();
169 template<
typename TypeReference>
171 QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypeCache,
172 const QList<TypeReference> &compositeSingletons)
174 QQmlTypeLoaderThreadDataPtr data(&m_data);
176 QCryptographicHash hash(QCryptographicHash::Md5);
177 return (resolvedTypeCache->addToHash(&hash, &data->checksumCache)
178 && addTypeReferenceChecksumsToHash(
179 compositeSingletons, &data->checksumCache, &hash))
193 const QUrl &relativeUrl,
const QV4::CompiledData::Unit *unit);
202 Q_ASSERT(!filePath.endsWith(QLatin1Char(
'/')));
203 const qsizetype pastLastSlash = filePath.lastIndexOf(QLatin1Char(
'/')) + 1;
205 filePath.left(pastLastSlash - 1),
206 filePath.mid(pastLastSlash, filePath.size() - pastLastSlash));
209 bool fileExists(
const QString &dirPath,
const QString &file);
224 void drop(
const QQmlDataBlob::Ptr &blob);
233 QUrl interceptUrl(
const QUrl &url, QQmlAbstractUrlInterceptor::DataType type)
const;
236#if !QT_CONFIG(qml_debug)
237 quintptr profiler()
const {
return 0; }
238 void setProfiler(quintptr) {}
240 QQmlProfiler *profiler()
const
242 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
243 return data->profiler.data();
245 void setProfiler(QQmlProfiler *profiler);
250 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
251 return data->importPaths;
258 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
259 return data->pluginPaths;
266 QQmlTypeLoaderThreadDataPtr data(&m_data);
267 data->initializedPlugins.insert(plugin);
271 QQmlTypeLoaderThreadDataConstPtr data(&m_data);
272 return data->initializedPlugins.contains(plugin);
277 QQmlTypeLoaderThreadDataPtr data(&m_data);
278 data->modulesForWhichPluginsHaveBeenProcessed.insert(module);
282 QQmlTypeLoaderThreadDataConstPtr data(&m_data);
283 return data->modulesForWhichPluginsHaveBeenProcessed.contains(module);
286#if QT_CONFIG(qml_network)
287 QQmlNetworkAccessManagerFactoryPtrConst networkAccessManagerFactory()
const;
288 void setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory);
289 QNetworkAccessManager *createNetworkAccessManager(QObject *parent)
const;
297 friend struct PlainLoader;
303#if QT_CONFIG(qml_network)
304 friend class QQmlTypeLoaderNetworkReplyProxy;
307 enum PathType { Local, Remote, LocalOrRemote };
309 enum LocalQmldirResult {
312 QmldirInterceptedToRemote,
320 void shutdownThread();
328 void trimCache(
const QQmlTypeLoaderSharedDataPtr &data);
330 void loadThread(
const QQmlDataBlob::Ptr &);
331 void loadWithStaticDataThread(
const QQmlDataBlob::Ptr &,
const QByteArray &);
332 void loadWithCachedUnitThread(
const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit);
333#if QT_CONFIG(qml_network)
334 void networkReplyFinished(QNetworkReply *);
335 void networkReplyProgress(QNetworkReply *, qint64, qint64);
338 enum class DataOrigin { Device, Static };
339 void setData(
const QQmlDataBlob::Ptr &,
const QByteArray &, DataOrigin);
340 void setData(
const QQmlDataBlob::Ptr &,
const QString &fileName);
341 void setData(
const QQmlDataBlob::Ptr &,
const QQmlDataBlob::SourceCodeData &);
342 void setCachedUnit(
const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit);
344 QStringList importPathList(PathType type)
const;
345 void clearQmldirInfo();
347 LocalQmldirResult locateLocalQmldir(
348 QQmlTypeLoader::Blob *blob,
const QQmlTypeLoader::Blob::PendingImportPtr &import,
349 QList<QQmlError> *errors);
352 void loadWithCachedUnit(
353 const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit,
356 template<
typename Loader>
357 void doLoad(
const Loader &loader,
const QQmlDataBlob::Ptr &blob,
Mode mode);
358 void updateTypeCacheTrimThreshold(
const QQmlTypeLoaderSharedDataPtr &data);
360 template<
typename TypeReference>
361 static bool addTypeReferenceChecksumsToHash(
362 const QList<TypeReference> &typeRefs,
363 QHash<quintptr, QByteArray> *checksums, QCryptographicHash *hash)
365 for (
const auto &typeRef: typeRefs) {
366 if (typeRef.typeData) {
367 const auto unit = typeRef.typeData->compilationUnit()->unitData();
368 hash->addData({unit->md5Checksum,
sizeof(unit->md5Checksum)});
369 }
else if (
const QMetaObject *mo = typeRef.type.metaObject()) {
370 const auto propertyCache = QQmlMetaType::propertyCache(mo);
372 hash->addData(propertyCache->checksum(checksums, &ok));
380 template<
typename Blob>
381 QQmlRefPointer<Blob> finalizeBlob(QQmlRefPointer<Blob> &&blob, QQmlTypeLoader::Mode mode)
383 QQmlMetaType::CachedUnitLookupError error = QQmlMetaType::CachedUnitLookupError::NoError;
384 const QQmlMetaType::CacheMode cacheMode = aotCacheMode();
385 if (
const QQmlPrivate::CachedQmlUnit *cachedUnit = (cacheMode != QQmlMetaType::RejectAll)
386 ? QQmlMetaType::findCachedCompilationUnit(blob->url(), cacheMode, &error)
388 loadWithCachedUnit(QQmlDataBlob::Ptr(blob.data()), cachedUnit, mode);
390 blob->setCachedUnitStatus(error);
391 load(QQmlDataBlob::Ptr(blob.data()), mode);
397 QQmlMetaType::CacheMode aotCacheMode();
399 QQmlTypeLoaderLockedData m_data;