diff options
Diffstat (limited to 'tests/auto/qml/debugger/qv4debugger')
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) |