summaryrefslogtreecommitdiffstats
path: root/src/webenginequick/api/qquickwebenginescriptcollection.cpp
diff options
context:
space:
mode:
authorKirill Burtsev <[email protected]>2021-09-16 22:08:22 +0200
committerMichal Klocek <[email protected]>2022-02-10 12:37:02 +0100
commitf5fbc34fc16fc9c6e7f7e8bbbf60f5b343b9466d (patch)
tree2a8456285c1d79f79ce48842aa16a3760382baf5 /src/webenginequick/api/qquickwebenginescriptcollection.cpp
parentf28c0e6680f3ef8ebb5e82d0fe375afbc6fb0fe9 (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.cpp36
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;
+}