diff options
Diffstat (limited to 'src/qml/qml/qqmltypeloader_p.h')
-rw-r--r-- | src/qml/qml/qqmltypeloader_p.h | 142 |
1 files changed, 66 insertions, 76 deletions
diff --git a/src/qml/qml/qqmltypeloader_p.h b/src/qml/qml/qqmltypeloader_p.h index eb6e549911..e9c4559527 100644 --- a/src/qml/qml/qqmltypeloader_p.h +++ b/src/qml/qml/qqmltypeloader_p.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QQMLTYPELOADER_P_H #define QQMLTYPELOADER_P_H @@ -54,6 +18,7 @@ #include <private/qqmldatablob_p.h> #include <private/qqmlimport_p.h> #include <private/qqmlmetatype_p.h> +#include <private/qv4compileddata_p.h> #include <QtQml/qtqmlglobal.h> #include <QtQml/qqmlerror.h> @@ -74,64 +39,82 @@ class QQmlProfiler; class QQmlTypeLoaderThread; class QQmlEngine; -class Q_QML_PRIVATE_EXPORT QQmlTypeLoader +class Q_QML_EXPORT QQmlTypeLoader { Q_DECLARE_TR_FUNCTIONS(QQmlTypeLoader) public: + using ChecksumCache = QHash<quintptr, QByteArray>; enum Mode { PreferSynchronous, Asynchronous, Synchronous }; - class Q_QML_PRIVATE_EXPORT Blob : public QQmlDataBlob + class Q_QML_EXPORT Blob : public QQmlDataBlob { public: Blob(const QUrl &url, QQmlDataBlob::Type type, QQmlTypeLoader *loader); ~Blob() override; - const QQmlImports &imports() const { return m_importCache; } + const QQmlImports *imports() const { return m_importCache.data(); } void setCachedUnitStatus(QQmlMetaType::CachedUnitLookupError status) { m_cachedUnitStatus = status; } struct PendingImport { - QV4::CompiledData::Import::ImportType type = QV4::CompiledData::Import::ImportType::ImportLibrary; - QString uri; QString qualifier; - QTypeRevision version; - + QV4::CompiledData::Import::ImportType type + = QV4::CompiledData::Import::ImportType::ImportLibrary; QV4::CompiledData::Location location; + QQmlImports::ImportFlags flags; + quint8 precedence = 0; int priority = 0; + QTypeRevision version; + PendingImport() = default; - PendingImport(Blob *blob, const QV4::CompiledData::Import *import); + PendingImport(Blob *blob, const QV4::CompiledData::Import *import, + QQmlImports::ImportFlags flags); }; using PendingImportPtr = std::shared_ptr<PendingImport>; + void importQmldirScripts(const PendingImportPtr &import, const QQmlTypeLoaderQmldirContent &qmldir, const QUrl &qmldirUrl); + protected: - bool addImport(const QV4::CompiledData::Import *import, uint flags, + bool addImport(const QV4::CompiledData::Import *import, QQmlImports::ImportFlags, QList<QQmlError> *errors); - bool addImport(PendingImportPtr import, uint flags, QList<QQmlError> *errors); + bool addImport(PendingImportPtr import, QList<QQmlError> *errors); bool fetchQmldir(const QUrl &url, PendingImportPtr import, int priority, QList<QQmlError> *errors); - bool updateQmldir(const QQmlRefPointer<QQmlQmldirData> &data, PendingImportPtr import, QList<QQmlError> *errors); + bool updateQmldir(const QQmlRefPointer<QQmlQmldirData> &data, const PendingImportPtr &import, QList<QQmlError> *errors); private: + bool addScriptImport(const PendingImportPtr &import); + bool addFileImport(const PendingImportPtr &import, QList<QQmlError> *errors); + bool addLibraryImport(const PendingImportPtr &import, QList<QQmlError> *errors); + virtual bool qmldirDataAvailable(const QQmlRefPointer<QQmlQmldirData> &, QList<QQmlError> *); virtual void scriptImported(const QQmlRefPointer<QQmlScriptBlob> &, const QV4::CompiledData::Location &, const QString &, const QString &) {} void dependencyComplete(QQmlDataBlob *) override; - bool loadImportDependencies(PendingImportPtr currentImport, const QString &qmldirUri, QList<QQmlError> *errors); + bool loadImportDependencies( + const PendingImportPtr ¤tImport, const QString &qmldirUri, + QQmlImports::ImportFlags flags, QList<QQmlError> *errors); protected: + bool loadDependentImports( + const QList<QQmlDirParser::Import> &imports, const QString &qualifier, + QTypeRevision version, quint16 precedence, QQmlImports::ImportFlags flags, + QList<QQmlError> *errors); virtual QString stringAt(int) const { return QString(); } bool isDebugging() const; - bool diskCacheEnabled() const; + bool readCacheFile() const; + bool writeCacheFile() const; + QQmlMetaType::CacheMode aotCacheMode() const; - QQmlImports m_importCache; + QQmlRefPointer<QQmlImports> m_importCache; QVector<PendingImportPtr> m_unresolvedImports; QVector<QQmlRefPointer<QQmlQmldirData>> m_qmldirs; QQmlMetaType::CachedUnitLookupError m_cachedUnitStatus = QQmlMetaType::CachedUnitLookupError::NoError; @@ -140,13 +123,35 @@ public: QQmlTypeLoader(QQmlEngine *); ~QQmlTypeLoader(); + template< + typename Engine, + typename EnginePrivate = QQmlEnginePrivate, + typename = std::enable_if_t<std::is_same_v<Engine, QQmlEngine>>> + static QQmlTypeLoader *get(Engine *engine) + { + return get(EnginePrivate::get(engine)); + } + + template< + typename Engine, + typename = std::enable_if_t<std::is_same_v<Engine, QQmlEnginePrivate>>> + static QQmlTypeLoader *get(Engine *engine) + { + return &engine->typeLoader; + } + QQmlImportDatabase *importDatabase() const; + ChecksumCache *checksumCache() { return &m_checksumCache; } + const ChecksumCache *checksumCache() const { return &m_checksumCache; } static QUrl normalize(const QUrl &unNormalizedUrl); QQmlRefPointer<QQmlTypeData> getType(const QUrl &unNormalizedUrl, Mode mode = PreferSynchronous); QQmlRefPointer<QQmlTypeData> getType(const QByteArray &, const QUrl &url, Mode mode = PreferSynchronous); + void injectScript(const QUrl &relativeUrl, const QV4::Value &value); + QQmlRefPointer<QQmlScriptBlob> injectedScript(const QUrl &relativeUrl); + QQmlRefPointer<QQmlScriptBlob> getScript(const QUrl &unNormalizedUrl); QQmlRefPointer<QQmlQmldirData> getQmldir(const QUrl &); @@ -193,36 +198,20 @@ private: void shutdownThread(); - void loadThread(QQmlDataBlob *); - void loadWithStaticDataThread(QQmlDataBlob *, const QByteArray &); - void loadWithCachedUnitThread(QQmlDataBlob *blob, const QQmlPrivate::CachedQmlUnit *unit); + void loadThread(const QQmlDataBlob::Ptr &); + void loadWithStaticDataThread(const QQmlDataBlob::Ptr &, const QByteArray &); + void loadWithCachedUnitThread(const QQmlDataBlob::Ptr &blob, const QQmlPrivate::CachedQmlUnit *unit); #if QT_CONFIG(qml_network) void networkReplyFinished(QNetworkReply *); void networkReplyProgress(QNetworkReply *, qint64, qint64); - typedef QHash<QNetworkReply *, QQmlDataBlob *> NetworkReplies; + typedef QHash<QNetworkReply *, QQmlDataBlob::Ptr> NetworkReplies; #endif - void setData(QQmlDataBlob *, const QByteArray &); - void setData(QQmlDataBlob *, const QString &fileName); - void setData(QQmlDataBlob *, const QQmlDataBlob::SourceCodeData &); - void setCachedUnit(QQmlDataBlob *blob, const QQmlPrivate::CachedQmlUnit *unit); - - template<typename T> - struct TypedCallback - { - TypedCallback(T *object, void (T::*func)(QQmlTypeData *)) : o(object), mf(func) {} - - static void redirect(void *arg, QQmlTypeData *type) - { - TypedCallback<T> *self = reinterpret_cast<TypedCallback<T> *>(arg); - ((self->o)->*(self->mf))(type); - } - - private: - T *o; - void (T::*mf)(QQmlTypeData *); - }; + void setData(const QQmlDataBlob::Ptr &, const QByteArray &); + void setData(const QQmlDataBlob::Ptr &, const QString &fileName); + void setData(const QQmlDataBlob::Ptr &, const QQmlDataBlob::SourceCodeData &); + void setCachedUnit(const QQmlDataBlob::Ptr &blob, const QQmlPrivate::CachedQmlUnit *unit); typedef QHash<QUrl, QQmlTypeData *> TypeCache; typedef QHash<QUrl, QQmlScriptBlob *> ScriptCache; @@ -247,6 +236,7 @@ private: QmldirCache m_qmldirCache; ImportDirCache m_importDirCache; ImportQmlDirCache m_importQmlDirCache; + ChecksumCache m_checksumCache; template<typename Loader> void doLoad(const Loader &loader, QQmlDataBlob *blob, Mode mode); |