diff options
author | Kirill Burtsev <[email protected]> | 2021-09-16 22:08:22 +0200 |
---|---|---|
committer | Michal Klocek <[email protected]> | 2022-02-10 12:37:02 +0100 |
commit | f5fbc34fc16fc9c6e7f7e8bbbf60f5b343b9466d (patch) | |
tree | 2a8456285c1d79f79ce48842aa16a3760382baf5 /src/webenginequick/api/qquickwebenginescriptcollection.cpp | |
parent | f28c0e6680f3ef8ebb5e82d0fe375afbc6fb0fe9 (diff) |
Fix crash on WebEngine(View|Profile).userScripts.collection get
To create a javascript list on 'collection' method qml engine is needed
for a qml scope, but it's only available for objects, which are created
by the QML Engine itself. The only object in hierarchy of classes is an
actual WebEngineView, so get it from there on collection init.
Also implement delayed initialization of scripts collection for the
usage of default profile through WebEngine singleton, and for the reason
that it's not really needed until really asked by user code.
Pick-to: 6.2 6.3
Fixes: QTBUG-96597
Change-Id: I61e76652a5d0fd5609070fd541816503908f2dc8
Reviewed-by: Allan Sandfeld Jensen <[email protected]>
Diffstat (limited to 'src/webenginequick/api/qquickwebenginescriptcollection.cpp')
-rw-r--r-- | src/webenginequick/api/qquickwebenginescriptcollection.cpp | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/src/webenginequick/api/qquickwebenginescriptcollection.cpp b/src/webenginequick/api/qquickwebenginescriptcollection.cpp index cc1cfb2fa..9a12c6f5c 100644 --- a/src/webenginequick/api/qquickwebenginescriptcollection.cpp +++ b/src/webenginequick/api/qquickwebenginescriptcollection.cpp @@ -38,6 +38,7 @@ ****************************************************************************/ #include "qquickwebenginescriptcollection_p.h" +#include "qquickwebenginescriptcollection_p_p.h" #include "qwebenginescriptcollection.h" #include <QtWebEngineCore/private/qwebenginescriptcollection_p.h> #include <QtQml/qqmlinfo.h> @@ -79,9 +80,18 @@ QWebEngineScript parseScript(const QJSValue &value, bool *ok) return s; } -QQuickWebEngineScriptCollection::QQuickWebEngineScriptCollection( - QWebEngineScriptCollection *collection) - : d(collection) +QQuickWebEngineScriptCollectionPrivate::QQuickWebEngineScriptCollectionPrivate(QWebEngineScriptCollectionPrivate *p) + : QWebEngineScriptCollection(p) +{ + +} + +QQuickWebEngineScriptCollectionPrivate::~QQuickWebEngineScriptCollectionPrivate() +{ +} + +QQuickWebEngineScriptCollection::QQuickWebEngineScriptCollection(QQuickWebEngineScriptCollectionPrivate *p) + : d(p) { } @@ -119,10 +129,13 @@ void QQuickWebEngineScriptCollection::clear() QJSValue QQuickWebEngineScriptCollection::collection() const { + if (!d->m_qmlEngine) { + qmlWarning(this) << "Scripts collection doesn't have QML engine set! Undefined value is returned."; + return QJSValue(); + } + const QList<QWebEngineScript> &list = d->toList(); - QQmlContext *context = QQmlEngine::contextForObject(this); - QQmlEngine *engine = context->engine(); - QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(engine); + QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(d->m_qmlEngine); QV4::Scope scope(v4); QV4::Scoped<QV4::ArrayObject> scriptArray(scope, v4->newArrayObject(list.length())); int i = 0; @@ -155,3 +168,14 @@ void QQuickWebEngineScriptCollection::setCollection(const QJSValue &scripts) Q_EMIT collectionChanged(); } } + +QQmlEngine* QQuickWebEngineScriptCollection::qmlEngine() +{ + return d->m_qmlEngine; +} + +void QQuickWebEngineScriptCollection::setQmlEngine(QQmlEngine *engine) +{ + Q_ASSERT(engine); + d->m_qmlEngine = engine; +} |