aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/debugger/qv4debugger
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qml/debugger/qv4debugger')
-rw-r--r--tests/auto/qml/debugger/qv4debugger/CMakeLists.txt9
-rw-r--r--tests/auto/qml/debugger/qv4debugger/commontypes.h4
-rw-r--r--tests/auto/qml/debugger/qv4debugger/data/breakPointInJSModule.qml4
-rw-r--r--tests/auto/qml/debugger/qv4debugger/data/module1.js5
-rw-r--r--tests/auto/qml/debugger/qv4debugger/data/module2.mjs7
-rw-r--r--tests/auto/qml/debugger/qv4debugger/data/module3.mjs0
-rw-r--r--tests/auto/qml/debugger/qv4debugger/data/module4.mjs0
-rw-r--r--tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp81
8 files changed, 86 insertions, 24 deletions
diff --git a/tests/auto/qml/debugger/qv4debugger/CMakeLists.txt b/tests/auto/qml/debugger/qv4debugger/CMakeLists.txt
index 0b60a0092b..42f6cf931a 100644
--- a/tests/auto/qml/debugger/qv4debugger/CMakeLists.txt
+++ b/tests/auto/qml/debugger/qv4debugger/CMakeLists.txt
@@ -7,6 +7,12 @@
## tst_qv4debugger Test:
#####################################################################
+if(NOT QT_BUILD_STANDALONE_TESTS AND NOT QT_BUILDING_QT)
+ cmake_minimum_required(VERSION 3.16)
+ project(tst_qv4debugger LANGUAGES CXX)
+ find_package(Qt6BuildInternals REQUIRED COMPONENTS STANDALONE_TEST)
+endif()
+
# Collect test data
file(GLOB_RECURSE test_data_glob
RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
@@ -17,11 +23,12 @@ qt_add_library(testCppTypes STATIC)
qt_autogen_tools_initial_setup(testCppTypes)
target_link_libraries(testCppTypes PRIVATE Qt::Qml Qt::QmlPrivate Qt::Quick)
+qt_policy(SET QTP0001 NEW)
+
qt6_add_qml_module(testCppTypes
URI TestTypes
SOURCES
commontypes.h
- AUTO_RESOURCE_PREFIX
OUTPUT_DIRECTORY TestTypes
)
qt_autogen_tools_initial_setup(testCppTypesplugin)
diff --git a/tests/auto/qml/debugger/qv4debugger/commontypes.h b/tests/auto/qml/debugger/qv4debugger/commontypes.h
index 01b2125ae3..b63059b0e6 100644
--- a/tests/auto/qml/debugger/qv4debugger/commontypes.h
+++ b/tests/auto/qml/debugger/qv4debugger/commontypes.h
@@ -1,5 +1,5 @@
// Copyright (C) 2022 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
#ifndef COMMONTYPES_H
#define COMMONTYPES_H
@@ -14,7 +14,7 @@ class MyType : public QQuickItem
QML_ELEMENT
public:
MyType(QQuickItem *parent = nullptr) : QQuickItem(parent) {}
- Q_INVOKABLE void name(QQmlV4Function*) const {}
+ Q_INVOKABLE void name(QQmlV4FunctionPtr) const {}
};
#endif // COMMONTYPES_H
diff --git a/tests/auto/qml/debugger/qv4debugger/data/breakPointInJSModule.qml b/tests/auto/qml/debugger/qv4debugger/data/breakPointInJSModule.qml
new file mode 100644
index 0000000000..2582a23ec5
--- /dev/null
+++ b/tests/auto/qml/debugger/qv4debugger/data/breakPointInJSModule.qml
@@ -0,0 +1,4 @@
+import QtQml 2.15
+import "module1.js" as Module1
+
+QtObject {}
diff --git a/tests/auto/qml/debugger/qv4debugger/data/module1.js b/tests/auto/qml/debugger/qv4debugger/data/module1.js
new file mode 100644
index 0000000000..9ce1f1e6b1
--- /dev/null
+++ b/tests/auto/qml/debugger/qv4debugger/data/module1.js
@@ -0,0 +1,5 @@
+.pragma library
+
+.import "module2.mjs" as Module2
+
+Module2.crashMe();
diff --git a/tests/auto/qml/debugger/qv4debugger/data/module2.mjs b/tests/auto/qml/debugger/qv4debugger/data/module2.mjs
new file mode 100644
index 0000000000..80f82af953
--- /dev/null
+++ b/tests/auto/qml/debugger/qv4debugger/data/module2.mjs
@@ -0,0 +1,7 @@
+import * as Module3 from "module3.mjs"
+import * as Module4 from "module4.mjs"
+
+export function crashMe()
+{
+ console.log("Hello world!");
+}
diff --git a/tests/auto/qml/debugger/qv4debugger/data/module3.mjs b/tests/auto/qml/debugger/qv4debugger/data/module3.mjs
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/auto/qml/debugger/qv4debugger/data/module3.mjs
diff --git a/tests/auto/qml/debugger/qv4debugger/data/module4.mjs b/tests/auto/qml/debugger/qv4debugger/data/module4.mjs
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/auto/qml/debugger/qv4debugger/data/module4.mjs
diff --git a/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp b/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
index 6f147446f0..3da401b5bb 100644
--- a/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
+++ b/tests/auto/qml/debugger/qv4debugger/tst_qv4debugger.cpp
@@ -1,5 +1,6 @@
// Copyright (C) 2016 The Qt Company Ltd.
-// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
#include <QtQuickTestUtils/private/qmlutils_p.h>
#include <QtTest/QtTest>
@@ -167,7 +168,7 @@ public slots:
m_thrownValue = job.exceptionValue();
}
- foreach (const TestBreakPoint &bp, m_breakPointsToAddWhenPaused)
+ for (const TestBreakPoint &bp : std::as_const(m_breakPointsToAddWhenPaused))
debugger->addBreakPoint(bp.fileName, bp.lineNumber);
m_breakPointsToAddWhenPaused.clear();
@@ -216,10 +217,14 @@ public:
QJsonArray scopes = frameObj.value(QLatin1String("scopes")).toArray();
int nscopes = scopes.size();
int s = 0;
- for (s = 0; s < nscopes; ++s) {
- QJsonObject o = scopes.at(s).toObject();
- if (o.value(QLatin1String("type")).toInt(-2) == 1) // CallContext
- break;
+ if (m_targetScope != -1) {
+ s = m_targetScope;
+ } else {
+ for (s = 0; s < nscopes; ++s) {
+ QJsonObject o = scopes.at(s).toObject();
+ if (o.value(QLatin1String("type")).toInt(-2) == 1) // CallContext
+ break;
+ }
}
if (s == nscopes)
return;
@@ -249,6 +254,7 @@ public:
bool m_wasPaused;
QV4Debugger::PauseReason m_pauseReason;
bool m_captureContextInfo;
+ int m_targetScope = -1;
QList<QV4Debugger::ExecutionState> m_statesWhenPaused;
QList<TestBreakPoint> m_breakPointsToAddWhenPaused;
QVector<QV4::StackFrame> m_stackTrace;
@@ -274,9 +280,10 @@ public:
void dumpStackTrace() const
{
qDebug() << "Stack depth:" << m_stackTrace.size();
- foreach (const QV4::StackFrame &frame, m_stackTrace)
+ for (const QV4::StackFrame &frame : m_stackTrace) {
qDebug("\t%s (%s:%d:%d)", qPrintable(frame.function), qPrintable(frame.source),
- frame.line, frame.column);
+ qAbs(frame.line), frame.column);
+ }
}
};
@@ -322,6 +329,9 @@ private slots:
void readThis();
void signalParameters();
void debuggerNoCrash();
+
+ void breakPointInJSModule();
+
private:
QV4Debugger *debugger() const
{
@@ -329,27 +339,27 @@ private:
}
void evaluateJavaScript(const QString &script, const QString &fileName, int lineNumber = 1)
{
- QMetaObject::invokeMethod(m_engine, "evaluate", Qt::QueuedConnection,
+ QMetaObject::invokeMethod(m_engine.get(), "evaluate", Qt::QueuedConnection,
Q_ARG(QString, script), Q_ARG(QString, fileName),
Q_ARG(int, lineNumber));
- waitForSignal(m_engine, SIGNAL(evaluateFinished()), /*timeout*/0);
+ waitForSignal(m_engine.get(), SIGNAL(evaluateFinished()), /*timeout*/0);
}
- TestEngine *m_engine;
+ std::unique_ptr<TestEngine> m_engine;
QV4::ExecutionEngine *m_v4;
- TestAgent *m_debuggerAgent;
- QThread *m_javaScriptThread;
+ std::unique_ptr<TestAgent> m_debuggerAgent;
+ std::unique_ptr<QThread> m_javaScriptThread;
};
void tst_qv4debugger::init()
{
- m_javaScriptThread = new QThread;
- m_engine = new TestEngine;
+ m_javaScriptThread = std::make_unique<QThread>();
+ m_engine = std::make_unique<TestEngine>();
m_v4 = m_engine->v4Engine();
m_v4->setDebugger(new QV4Debugger(m_v4));
- m_engine->moveToThread(m_javaScriptThread);
+ m_engine->moveToThread(m_javaScriptThread.get());
m_javaScriptThread->start();
- m_debuggerAgent = new TestAgent(m_v4);
+ m_debuggerAgent = std::make_unique<TestAgent>(m_v4);
m_debuggerAgent->addDebugger(debugger());
}
@@ -357,11 +367,11 @@ void tst_qv4debugger::cleanup()
{
m_javaScriptThread->exit();
m_javaScriptThread->wait();
- delete m_engine;
- delete m_javaScriptThread;
+ m_engine.reset();
+ m_javaScriptThread.reset();
m_engine = nullptr;
m_v4 = nullptr;
- delete m_debuggerAgent;
+ m_debuggerAgent.reset();
m_debuggerAgent = nullptr;
}
@@ -453,7 +463,7 @@ void tst_qv4debugger::removeBreakPointForNextInstruction()
"someCall();\n"
"var i = 42;";
- QMetaObject::invokeMethod(m_engine, "injectFunction", Qt::BlockingQueuedConnection,
+ QMetaObject::invokeMethod(m_engine.get(), "injectFunction", Qt::BlockingQueuedConnection,
Q_ARG(QString, "someCall"), Q_ARG(InjectedFunction, someCall));
debugger()->addBreakPoint("removeBreakPointForNextInstruction", 2);
@@ -967,6 +977,35 @@ void tst_qv4debugger::debuggerNoCrash()
debugThread->wait();
}
+void tst_qv4debugger::breakPointInJSModule()
+{
+ QQmlEngine engine;
+ QV4::ExecutionEngine *v4 = engine.handle();
+ QPointer<QV4Debugger> v4Debugger = new QV4Debugger(v4);
+ v4->setDebugger(v4Debugger.data());
+
+ QScopedPointer<QThread> debugThread(new QThread);
+ debugThread->start();
+ QScopedPointer<TestAgent> debuggerAgent(new TestAgent(v4));
+ debuggerAgent->addDebugger(v4Debugger);
+ debuggerAgent->moveToThread(debugThread.data());
+
+ QQmlComponent component(&engine, testFileUrl("breakPointInJSModule.qml"));
+ QVERIFY2(component.isReady(), qPrintable(component.errorString()));
+
+ debuggerAgent->m_captureContextInfo = true;
+ debuggerAgent->m_targetScope = 1;
+ v4Debugger->addBreakPoint("module2.mjs", 6);
+
+ QScopedPointer<QObject> obj(component.create());
+ QVERIFY(!obj.isNull());
+
+ QVERIFY(!debuggerAgent->m_capturedScope.isEmpty());
+
+ debugThread->quit();
+ debugThread->wait();
+}
+
tst_qv4debugger::tst_qv4debugger() : QQmlDataTest(QT_QMLTEST_DATADIR) { }
QTEST_MAIN(tst_qv4debugger)