46 Q_DECLARE_TR_FUNCTIONS(QQmlTypeLoader)
48 using ChecksumCache = QQmlTypeLoaderThreadData::ChecksumCache;
51 class Q_QML_EXPORT
Blob :
public QQmlDataBlob
54 Blob(
const QUrl &url, QQmlDataBlob::Type type, QQmlTypeLoader *loader);
57 const QQmlImports *imports()
const {
return m_importCache.data(); }
59 void setCachedUnitStatus(QQmlMetaType::CachedUnitLookupError status) { m_cachedUnitStatus = status; }
66 QV4::CompiledData::Import::ImportType type
67 = QV4::CompiledData::Import::ImportType::ImportLibrary;
68 QV4::CompiledData::Location location;
70 QQmlImports::ImportFlags flags;
71 quint8 precedence = 0;
74 QTypeRevision version;
76 PendingImport() =
default;
77 PendingImport(
const QQmlRefPointer<Blob> &blob,
const QV4::CompiledData::Import *import,
78 QQmlImports::ImportFlags flags);
80 using PendingImportPtr = std::shared_ptr<PendingImport>;
82 void importQmldirScripts(
const PendingImportPtr &import,
const QQmlTypeLoaderQmldirContent &qmldir,
const QUrl &qmldirUrl);
83 bool handleLocalQmldirForImport(
84 const PendingImportPtr &import,
const QString &qmldirFilePath,
85 const QString &qmldirUrl, QList<QQmlError> *errors);
88 bool addImport(
const QV4::CompiledData::Import *import, QQmlImports::ImportFlags,
89 QList<QQmlError> *errors);
90 bool addImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
93 const QUrl &url,
const PendingImportPtr &import,
int priority,
94 QList<QQmlError> *errors);
95 bool updateQmldir(
const QQmlRefPointer<QQmlQmldirData> &data,
const PendingImportPtr &import, QList<QQmlError> *errors);
98 bool addScriptImport(
const PendingImportPtr &import);
99 bool addFileImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
100 bool addLibraryImport(
const PendingImportPtr &import, QList<QQmlError> *errors);
102 virtual bool qmldirDataAvailable(
const QQmlRefPointer<QQmlQmldirData> &, QList<QQmlError> *);
104 virtual void scriptImported(
105 const QQmlRefPointer<QQmlScriptBlob> &,
const QV4::CompiledData::Location &,
106 const QString &,
const QString &)
108 assertTypeLoaderThread();
111 void dependencyComplete(
const QQmlDataBlob::Ptr &) override;
113 bool loadImportDependencies(
114 const PendingImportPtr ¤tImport,
const QString &qmldirUri,
115 QQmlImports::ImportFlags flags, QList<QQmlError> *errors);
119 bool registerPendingTypes(
const PendingImportPtr &import);
121 bool loadDependentImports(
122 const QList<QQmlDirParser::Import> &imports,
const QString &qualifier,
123 QTypeRevision version, quint8 precedence, QQmlImports::ImportFlags flags,
124 QList<QQmlError> *errors);
125 virtual QString stringAt(
int)
const {
return QString(); }
127 QQmlRefPointer<QQmlImports> m_importCache;
128 QList<PendingImportPtr> m_unresolvedImports;
129 QList<QQmlRefPointer<QQmlQmldirData>> m_qmldirs;
130 QQmlMetaType::CachedUnitLookupError m_cachedUnitStatus = QQmlMetaType::CachedUnitLookupError::NoError;
133 QQmlTypeLoader(QV4::ExecutionEngine *engine);
142 return engine->handle()->typeLoader();
150 return Engine::get(engine)->handle()->typeLoader();
158 if (path->startsWith(QStringLiteral(
"//"))) {
161 *path = QUrl::fromLocalFile(*path).toLocalFile();
167 template<
typename TypeReference>
169 QV4::CompiledData::ResolvedTypeReferenceMap *resolvedTypeCache,
170 const QList<TypeReference> &compositeSingletons)
172 QQmlTypeLoaderThreadDataPtr data(&m_data);
174 QCryptographicHash hash(QCryptographicHash::Md5);
175 return (resolvedTypeCache->addToHash(&hash, &data->checksumCache)
176 && addTypeReferenceChecksumsToHash(
177 compositeSingletons, &data->checksumCache, &hash))
191 const QUrl &relativeUrl,
const QV4::CompiledData::Unit *unit);
200 Q_ASSERT(!filePath.endsWith(QLatin1Char(
'/')));
201 const qsizetype pastLastSlash = filePath.lastIndexOf(QLatin1Char(
'/')) + 1;
203 filePath.left(pastLastSlash - 1),
204 filePath.mid(pastLastSlash, filePath.size() - pastLastSlash));
207 bool fileExists(
const QString &dirPath,
const QString &file);
222 void drop(
const QQmlDataBlob::Ptr &blob);
231 QUrl interceptUrl(
const QUrl &url, QQmlAbstractUrlInterceptor::DataType type)
const;
234#if !QT_CONFIG(qml_debug)
235 quintptr profiler()
const {
return 0; }
236 void setProfiler(quintptr) {}
238 QQmlProfiler *profiler()
const
240 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
241 return data->profiler.data();
243 void setProfiler(QQmlProfiler *profiler);
248 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
249 return data->importPaths;
256 QQmlTypeLoaderConfiguredDataConstPtr data(&m_data);
257 return data->pluginPaths;
264 QQmlTypeLoaderThreadDataPtr data(&m_data);
265 data->initializedPlugins.insert(plugin);
269 QQmlTypeLoaderThreadDataConstPtr data(&m_data);
270 return data->initializedPlugins.contains(plugin);
275 QQmlTypeLoaderThreadDataPtr data(&m_data);
276 data->modulesForWhichPluginsHaveBeenProcessed.insert(module);
280 QQmlTypeLoaderThreadDataConstPtr data(&m_data);
281 return data->modulesForWhichPluginsHaveBeenProcessed.contains(module);
284#if QT_CONFIG(qml_network)
285 QQmlNetworkAccessManagerFactoryPtrConst networkAccessManagerFactory()
const;
286 void setNetworkAccessManagerFactory(QQmlNetworkAccessManagerFactory *factory);
287 QNetworkAccessManager *createNetworkAccessManager(QObject *parent)
const;
295 friend struct PlainLoader;
301#if QT_CONFIG(qml_network)
302 friend class QQmlTypeLoaderNetworkReplyProxy;
305 enum PathType { Local, Remote, LocalOrRemote };
307 enum LocalQmldirResult {
310 QmldirInterceptedToRemote,
318 void shutdownThread();
326 void trimCache(
const QQmlTypeLoaderSharedDataPtr &data);
328 void loadThread(
const QQmlDataBlob::Ptr &);
329 void loadWithStaticDataThread(
const QQmlDataBlob::Ptr &,
const QByteArray &);
330 void loadWithCachedUnitThread(
const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit);
331#if QT_CONFIG(qml_network)
332 void networkReplyFinished(QNetworkReply *);
333 void networkReplyProgress(QNetworkReply *, qint64, qint64);
336 enum class DataOrigin { Device, Static };
337 void setData(
const QQmlDataBlob::Ptr &,
const QByteArray &, DataOrigin);
338 void setData(
const QQmlDataBlob::Ptr &,
const QString &fileName);
339 void setData(
const QQmlDataBlob::Ptr &,
const QQmlDataBlob::SourceCodeData &);
340 void setCachedUnit(
const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit);
342 QStringList importPathList(PathType type)
const;
343 void clearQmldirInfo();
345 LocalQmldirResult locateLocalQmldir(
346 QQmlTypeLoader::Blob *blob,
const QQmlTypeLoader::Blob::PendingImportPtr &import,
347 QList<QQmlError> *errors);
350 void loadWithCachedUnit(
351 const QQmlDataBlob::Ptr &blob,
const QQmlPrivate::CachedQmlUnit *unit,
354 template<
typename Loader>
355 void doLoad(
const Loader &loader,
const QQmlDataBlob::Ptr &blob,
Mode mode);
356 void updateTypeCacheTrimThreshold(
const QQmlTypeLoaderSharedDataPtr &data);
358 template<
typename TypeReference>
359 static bool addTypeReferenceChecksumsToHash(
360 const QList<TypeReference> &typeRefs,
361 QHash<quintptr, QByteArray> *checksums, QCryptographicHash *hash)
363 for (
const auto &typeRef: typeRefs) {
364 if (typeRef.typeData) {
365 const auto unit = typeRef.typeData->compilationUnit()->unitData();
366 hash->addData({unit->md5Checksum,
sizeof(unit->md5Checksum)});
367 }
else if (
const QMetaObject *mo = typeRef.type.metaObject()) {
368 const auto propertyCache = QQmlMetaType::propertyCache(mo);
370 hash->addData(propertyCache->checksum(checksums, &ok));
378 template<
typename Blob>
379 QQmlRefPointer<Blob> finalizeBlob(QQmlRefPointer<Blob> &&blob, QQmlTypeLoader::Mode mode)
381 QQmlMetaType::CachedUnitLookupError error = QQmlMetaType::CachedUnitLookupError::NoError;
382 const QQmlMetaType::CacheMode cacheMode = aotCacheMode();
383 if (
const QQmlPrivate::CachedQmlUnit *cachedUnit = (cacheMode != QQmlMetaType::RejectAll)
384 ? QQmlMetaType::findCachedCompilationUnit(blob->url(), cacheMode, &error)
386 loadWithCachedUnit(QQmlDataBlob::Ptr(blob.data()), cachedUnit, mode);
388 blob->setCachedUnitStatus(error);
389 load(QQmlDataBlob::Ptr(blob.data()), mode);
395 QQmlMetaType::CacheMode aotCacheMode();
397 QQmlTypeLoaderLockedData m_data;