diff options
author | Michal Klocek <michal.klocek@qt.io> | 2020-08-24 14:10:14 +0200 |
---|---|---|
committer | Michal Klocek <michal.klocek@qt.io> | 2020-09-22 11:05:44 +0200 |
commit | 98702f186c66a6eedb90b5d4823c53afd8794770 (patch) | |
tree | 14da3bc0799d97a47bc1522209b6ad363a4b7af1 /src/core/api | |
parent | cfda1a04cb7a0b389fc067fe2cccdbde93ebde27 (diff) |
Move to qwebenginescript to core
Just a move of qwebenginescript from widgets to core.
[ChangleLog] QWebEngineScirpt is now in QtWebEngineCore
Change-Id: I45380377579283e27c86bb05981b227559b9630b
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/api')
-rw-r--r-- | src/core/api/core_api.pro | 6 | ||||
-rw-r--r-- | src/core/api/qwebenginescript.cpp | 293 | ||||
-rw-r--r-- | src/core/api/qwebenginescript.h | 113 |
3 files changed, 410 insertions, 2 deletions
diff --git a/src/core/api/core_api.pro b/src/core/api/core_api.pro index 29738520d..33b54a341 100644 --- a/src/core/api/core_api.pro +++ b/src/core/api/core_api.pro @@ -56,7 +56,8 @@ HEADERS = \ qwebenginecontextmenurequest_p.h \ qwebenginedownloadrequest.h \ qwebenginedownloadrequest_p.h \ - qwebenginesettings.h + qwebenginesettings.h \ + qwebenginescript.h SOURCES = \ qtwebenginecoreglobal.cpp \ @@ -76,7 +77,8 @@ SOURCES = \ qwebengineurlschemehandler.cpp \ qwebenginecontextmenurequest.cpp \ qwebenginedownloadrequest.cpp \ - qwebenginesettings.cpp + qwebenginesettings.cpp \ + qwebenginescript.cpp # Chromium headers included are not remotely clean CONFIG -= warning_clean diff --git a/src/core/api/qwebenginescript.cpp b/src/core/api/qwebenginescript.cpp new file mode 100644 index 000000000..e56017166 --- /dev/null +++ b/src/core/api/qwebenginescript.cpp @@ -0,0 +1,293 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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 "qwebenginescript.h" + +#include "user_script.h" +#include <QtCore/QDebug> + +using QtWebEngineCore::UserScript; + +/*! + \class QWebEngineScript + \inmodule QtWebEngineCore + \since 5.5 + \brief The QWebEngineScript class encapsulates a JavaScript program. + + + QWebEngineScript enables the programmatic injection of so called \e {user scripts} in the + JavaScript engine at different points, determined by injectionPoint(), during the loading of web + contents. + + Scripts can be executed either in the main JavaScript \e world, along with the rest of the + JavaScript coming from the web contents, or in their own isolated world. While the DOM of the + page can be accessed from any world, JavaScript variables of a function defined in one world are + not accessible from a different one. ScriptWorldId provides some predefined IDs for this + purpose. + + The following \l Greasemonkey attributes are supported since Qt 5.8: + \c @exclude, \c @include, \c @name, \c @match, and \c @run-at. + + Use QWebEnginePage::scripts() and QWebEngineProfile::scripts() to access + the collection of scripts associated with a single page or a + number of pages sharing the same profile. + + \sa {Script Injection} +*/ +/*! + \enum QWebEngineScript::InjectionPoint + + This enum describes the timing of the script injection: + + \value DocumentCreation The script will be executed as soon as the document is created. This is not suitable for + any DOM operation. + \value DocumentReady The script will run as soon as the DOM is ready. This is equivalent to the + \c DOMContentLoaded event firing in JavaScript. + \value Deferred The script will run when the page load finishes, or 500ms after the document is ready, whichever + comes first. + +*/ +/*! + \enum QWebEngineScript::ScriptWorldId + + This enum provides pre-defined world IDs for isolating user scripts into different worlds: + + \value MainWorld The world used by the page's web contents. It can be useful in order to expose custom functionality + to web contents in certain scenarios. + \value ApplicationWorld The default isolated world used for application level functionality implemented in JavaScript. + \value UserWorld The first isolated world to be used by scripts set by users if the application is not making use + of more worlds. As a rule of thumb, if that functionality is exposed to the application users, each individual script + should probably get its own isolated world. + +*/ + +/*! + \fn QWebEngineScript::operator!=(const QWebEngineScript &other) const + + Returns \c true if the script is not equal to \a other, otherwise returns \c false. +*/ + +/*! + \fn QWebEngineScript::swap(QWebEngineScript &other) + + Swaps the contents of the script with the contents of \a other. +*/ + +/*! + * Constructs a null script. + */ + +QWebEngineScript::QWebEngineScript() + : d(new UserScript) +{ +} + +/*! + * Constructs a user script using the contents of \a other. + */ +QWebEngineScript::QWebEngineScript(const QWebEngineScript &other) + : d(other.d) +{ +} + +/*! + Destroys a script. +*/ +QWebEngineScript::~QWebEngineScript() +{ +} + +/*! + Assigns \a other to the script. +*/ +QWebEngineScript &QWebEngineScript::operator=(const QWebEngineScript &other) +{ + d = other.d; + return *this; +} + +/*! + Returns \c true is the script is null; otherwise returns \c false. +*/ +bool QWebEngineScript::isNull() const +{ + return d->isNull(); +} + +/*! + * Returns the name of the script. Can be useful to retrieve a particular script from a + * QWebEngineScriptCollection. + * + * \sa QWebEngineScriptCollection::findScript(), QWebEngineScriptCollection::findScripts() + */ + +QString QWebEngineScript::name() const +{ + return d->name(); +} + +/*! + * Sets the script name to \a scriptName. + */ +void QWebEngineScript::setName(const QString &scriptName) +{ + if (scriptName == name()) + return; + d->setName(scriptName); +} + +/*! + Returns the source of the script. + */ +QString QWebEngineScript::sourceCode() const +{ + return d->sourceCode(); +} + +/*! + * Sets the script source to \a scriptSource. + */ +void QWebEngineScript::setSourceCode(const QString &scriptSource) +{ + if (scriptSource == sourceCode()) + return; + d->setSourceCode(scriptSource); +} + +ASSERT_ENUMS_MATCH(QWebEngineScript::Deferred, UserScript::AfterLoad) +ASSERT_ENUMS_MATCH(QWebEngineScript::DocumentReady, UserScript::DocumentLoadFinished) +ASSERT_ENUMS_MATCH(QWebEngineScript::DocumentCreation, UserScript::DocumentElementCreation) + +/*! + * Returns the point in the loading process at which the script will be executed. + * The default value is QWebEngineScript::Deferred. + * + * \sa setInjectionPoint() + */ +QWebEngineScript::InjectionPoint QWebEngineScript::injectionPoint() const +{ + return static_cast<QWebEngineScript::InjectionPoint>(d->injectionPoint()); +} +/*! + * Sets the point at which to execute the script to be \a p. + * + * \sa InjectionPoint + */ +void QWebEngineScript::setInjectionPoint(QWebEngineScript::InjectionPoint p) +{ + if (p == injectionPoint()) + return; + d->setInjectionPoint(static_cast<UserScript::InjectionPoint>(p)); +} + +/*! + Returns the world ID defining which world the script is executed in. + */ +quint32 QWebEngineScript::worldId() const +{ + return d->worldId(); +} + +/*! + Sets the world ID of the isolated world to \a id when running this script. + + Must be between \c 0 and \c 256. + */ +void QWebEngineScript::setWorldId(quint32 id) +{ + if (id == d->worldId()) + return; + d->setWorldId(id); +} + +/*! + Returns \c true if the script is executed on every frame in the page, or \c false if it is only + ran for the main frame. + */ +bool QWebEngineScript::runsOnSubFrames() const +{ + return d->runsOnSubFrames(); +} + +/*! + * Executes the script on sub frames in addition to the main frame if \a on returns \c true. + */ +void QWebEngineScript::setRunsOnSubFrames(bool on) +{ + if (runsOnSubFrames() == on) + return; + d->setRunsOnSubFrames(on); +} + +/*! + Returns \c true if the script is equal to \a other, otherwise returns \c false. + */ +bool QWebEngineScript::operator==(const QWebEngineScript &other) const +{ + return d == other.d || *d == *(other.d); +} + +QWebEngineScript::QWebEngineScript(const UserScript &coreScript) + : d(new UserScript(coreScript)) +{ +} + +#ifndef QT_NO_DEBUG_STREAM +QDebug operator<<(QDebug d, const QWebEngineScript &script) +{ + if (script.isNull()) + return d.maybeSpace() << "QWebEngineScript()"; + + d.nospace() << "QWebEngineScript(" << script.name() << ", "; + switch (script.injectionPoint()) { + case QWebEngineScript::DocumentCreation: + d << "QWebEngineScript::DocumentCreation" << ", "; + break; + case QWebEngineScript::DocumentReady: + d << "QWebEngineScript::DocumentReady" << ", "; + break; + case QWebEngineScript::Deferred: + d << "QWebEngineScript::Deferred" << ", "; + break; + } + d << script.worldId() << ", " + << script.runsOnSubFrames() << ", " << script.sourceCode() << ")"; + return d.space(); +} +#endif diff --git a/src/core/api/qwebenginescript.h b/src/core/api/qwebenginescript.h new file mode 100644 index 000000000..628e24ed5 --- /dev/null +++ b/src/core/api/qwebenginescript.h @@ -0,0 +1,113 @@ +/**************************************************************************** +** +** Copyright (C) 2016 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$ +** +****************************************************************************/ + +#ifndef QWEBENGINESCRIPT_H +#define QWEBENGINESCRIPT_H + +#include <QtWebEngineCore/qtwebenginecoreglobal.h> + +#include <QtCore/qshareddata.h> +#include <QtCore/qstring.h> + +namespace QtWebEngineCore { +class UserScript; +} // namespace + +QT_BEGIN_NAMESPACE + +class Q_WEBENGINECORE_EXPORT QWebEngineScript { +public: + enum InjectionPoint { + Deferred, + DocumentReady, + DocumentCreation + }; + + enum ScriptWorldId { + MainWorld = 0, + ApplicationWorld, + UserWorld + }; + + QWebEngineScript(); + QWebEngineScript(const QWebEngineScript &other); + ~QWebEngineScript(); + + QWebEngineScript &operator=(const QWebEngineScript &other); + + bool isNull() const; + + QString name() const; + void setName(const QString &); + + QString sourceCode() const; + void setSourceCode(const QString &); + + InjectionPoint injectionPoint() const; + void setInjectionPoint(InjectionPoint); + + quint32 worldId() const; + void setWorldId(quint32); + + bool runsOnSubFrames() const; + void setRunsOnSubFrames(bool on); + + bool operator==(const QWebEngineScript &other) const; + inline bool operator!=(const QWebEngineScript &other) const + { return !operator==(other); } + void swap(QWebEngineScript &other) { qSwap(d, other.d); } + + +private: + friend class QWebEngineScriptCollectionPrivate; + friend class QWebEngineScriptCollection; + QWebEngineScript(const QtWebEngineCore::UserScript &); + + QSharedDataPointer<QtWebEngineCore::UserScript> d; +}; + +Q_DECLARE_SHARED_NOT_MOVABLE_UNTIL_QT6(QWebEngineScript) + +#ifndef QT_NO_DEBUG_STREAM +Q_WEBENGINECORE_EXPORT QDebug operator<<(QDebug, const QWebEngineScript &); +#endif + +QT_END_NAMESPACE + +#endif // QWEBENGINESCRIPT_H |