diff options
Diffstat (limited to 'src/webengine/api/qquickwebenginescriptcollection.cpp')
-rw-r--r-- | src/webengine/api/qquickwebenginescriptcollection.cpp | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/src/webengine/api/qquickwebenginescriptcollection.cpp b/src/webengine/api/qquickwebenginescriptcollection.cpp new file mode 100644 index 000000000..b02e9f84d --- /dev/null +++ b/src/webengine/api/qquickwebenginescriptcollection.cpp @@ -0,0 +1,248 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine 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$ +** +****************************************************************************/ + +#include "qquickwebenginescriptcollection.h" +#include "qquickwebenginescriptcollection_p.h" +#include "renderer_host/user_resource_controller_host.h" +#include <QtQml/QQmlInfo> +#include <QtQml/private/qqmlengine_p.h> +#include <QtQml/private/qv4scopedvalue_p.h> +#include <QtQml/private/qv4arrayobject_p.h> + +QQuickWebEngineScript parseScript(const QJSValue &value, bool *ok) +{ + QQuickWebEngineScript s; + if (ok) + *ok = false; + + if (value.isObject()) { + + if (value.hasProperty(QStringLiteral("name"))) + s.setName(value.property(QStringLiteral("name")).toString()); + + if (value.hasProperty(QStringLiteral("sourceUrl"))) + s.setSourceUrl(value.property(QStringLiteral("sourceUrl")).toString()); + + if (value.hasProperty(QStringLiteral("injectionPoint"))) + s.setInjectionPoint(QQuickWebEngineScript::InjectionPoint( + value.property(QStringLiteral("injectionPoint")).toUInt())); + + if (value.hasProperty(QStringLiteral("sourceCode"))) + s.setSourceCode(value.property(QStringLiteral("sourceCode")).toString()); + + if (value.hasProperty(QStringLiteral("worldId"))) + s.setWorldId(QQuickWebEngineScript::ScriptWorldId( + value.property(QStringLiteral("worldId")).toUInt())); + + if (value.hasProperty(QStringLiteral("runOnSubframes"))) + s.setRunOnSubframes(value.property(QStringLiteral("runOnSubframes")).toBool()); + + if (ok) + *ok = true; + } + return s; +} + +QQuickWebEngineScriptCollection::QQuickWebEngineScriptCollection( + QQuickWebEngineScriptCollectionPrivate *collectionPrivate) + : d(collectionPrivate) +{ +} + +QQuickWebEngineScriptCollection::~QQuickWebEngineScriptCollection() { } + +int QQuickWebEngineScriptCollection::count() const +{ + return d->count(); +} + +bool QQuickWebEngineScriptCollection::contains(const QQuickWebEngineScript &value) const +{ + return d->contains(value); +} + +QQuickWebEngineScript QQuickWebEngineScriptCollection::findScript(const QString &name) const +{ + return d->find(name); +} + +QList<QQuickWebEngineScript> QQuickWebEngineScriptCollection::findScripts(const QString &name) const +{ + return d->toList(name); +} + +void QQuickWebEngineScriptCollection::insert(const QQuickWebEngineScript &s) +{ + d->insert(s); +} + +void QQuickWebEngineScriptCollection::insert(const QList<QQuickWebEngineScript> &list) +{ + d->reserve(list.size()); + for (const QQuickWebEngineScript &s : list) + d->insert(s); +} + +bool QQuickWebEngineScriptCollection::remove(const QQuickWebEngineScript &script) +{ + return d->remove(script); +} + +void QQuickWebEngineScriptCollection::clear() +{ + d->clear(); +} + +QList<QQuickWebEngineScript> QQuickWebEngineScriptCollection::toList() const +{ + return d->toList(); +} + +QQuickWebEngineScriptCollectionPrivate::QQuickWebEngineScriptCollectionPrivate( + QtWebEngineCore::UserResourceControllerHost *controller, + QSharedPointer<QtWebEngineCore::WebContentsAdapter> webContents) + : m_scriptController(controller), m_contents(webContents) +{ +} + +int QQuickWebEngineScriptCollectionPrivate::count() const +{ + return m_scripts.count(); +} + +bool QQuickWebEngineScriptCollectionPrivate::contains(const QQuickWebEngineScript &s) const +{ + return m_scripts.contains(s); +} + +void QQuickWebEngineScriptCollectionPrivate::insert(const QQuickWebEngineScript &script) +{ + m_scripts.append(script); + if (!m_contents || m_contents->isInitialized()) + m_scriptController->addUserScript(*script.d, m_contents.data()); +} + +bool QQuickWebEngineScriptCollectionPrivate::remove(const QQuickWebEngineScript &script) +{ + if (!m_contents || m_contents->isInitialized()) + m_scriptController->removeUserScript(*script.d, m_contents.data()); + return m_scripts.removeAll(script); +} + +QList<QQuickWebEngineScript> +QQuickWebEngineScriptCollectionPrivate::toList(const QString &scriptName) const +{ + QList<QQuickWebEngineScript> ret; + for (const QQuickWebEngineScript &script : qAsConst(m_scripts)) + if (scriptName == script.name()) + ret.append(script); + return ret; +} + +QQuickWebEngineScript QQuickWebEngineScriptCollectionPrivate::find(const QString &name) const +{ + for (const QQuickWebEngineScript &script : qAsConst(m_scripts)) + if (name == script.name()) + return script; + return QQuickWebEngineScript(); +} + +void QQuickWebEngineScriptCollectionPrivate::clear() +{ + m_scripts.clear(); + if (!m_contents || m_contents->isInitialized()) + m_scriptController->clearAllScripts(m_contents.data()); +} + +void QQuickWebEngineScriptCollectionPrivate::reserve(int capacity) +{ + m_scripts.reserve(capacity); + if (!m_contents || m_contents->isInitialized()) + m_scriptController->reserve(m_contents.data(), capacity); +} + +void QQuickWebEngineScriptCollectionPrivate::initializationFinished( + QSharedPointer<QtWebEngineCore::WebContentsAdapter> contents) +{ + Q_ASSERT(m_contents); + Q_ASSERT(contents); + + for (const QQuickWebEngineScript &script : qAsConst(m_scripts)) + m_scriptController->addUserScript(*script.d, contents.data()); + m_contents = contents; +} + +QJSValue QQuickWebEngineScriptCollection::collection() const +{ + const QList<QQuickWebEngineScript> &list = d->m_scripts; + QQmlContext *context = QQmlEngine::contextForObject(this); + QQmlEngine *engine = context->engine(); + QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(engine); + QV4::Scope scope(v4); + QV4::Scoped<QV4::ArrayObject> scriptArray(scope, v4->newArrayObject(list.length())); + int i = 0; + for (const auto &val : list) { + QV4::ScopedValue sv(scope, v4->fromVariant(QVariant::fromValue(val))); + scriptArray->put(i++, sv); + } + return QJSValuePrivate::fromReturnedValue(scriptArray.asReturnedValue()); +} + +void QQuickWebEngineScriptCollection::setCollection(const QJSValue &scripts) +{ + if (!scripts.isArray()) + return; + + QList<QQuickWebEngineScript> scriptList; + quint32 length = scripts.property(QStringLiteral("length")).toUInt(); + for (quint32 i = 0; i < length; ++i) { + bool ok; + QQuickWebEngineScript s = parseScript(scripts.property(i), &ok); + if (!ok) { + qmlWarning(this) << "Unsupported script type"; + return; + } + scriptList.append(s); + } + if (scriptList != d->m_scripts) { + clear(); + insert(scriptList); + Q_EMIT collectionChanged(); + } +} |