8#include <QtCore/QPluginLoader>
9#include <QtCore/QCborArray>
10#include <QtCore/QCoreApplication>
12#include <QtCore/QDebug>
13#include <QtCore/QDataStream>
15#include <private/qcoreapplication_p.h>
16#include <private/qqmlengine_p.h>
26int QQmlDebugConnector::s_dataStreamVersion = QDataStream::Qt_4_7;
37 QCoreApplicationPrivate *appD =
38 static_cast<QCoreApplicationPrivate*>(QObjectPrivate::get(qApp));
40 arguments = appD->qmljsDebugArgumentsString();
47void QQmlDebugConnector::setPluginKey(
const QString &key)
49 QQmlDebugConnectorParams *params = qmlDebugConnectorParams();
50 if (params && params->pluginKey != key) {
52 qWarning() <<
"QML debugger: Cannot set plugin key after loading the plugin.";
54 params->pluginKey = key;
58void QQmlDebugConnector::setServices(
const QStringList &services)
60 QQmlDebugConnectorParams *params = qmlDebugConnectorParams();
62 params->services = services;
65QString QQmlDebugConnector::commandLineArguments()
67 QQmlDebugConnectorParams *params = qmlDebugConnectorParams();
70 return params->arguments;
73QQmlDebugConnector *QQmlDebugConnector::instance()
75 QQmlDebugConnectorParams *params = qmlDebugConnectorParams();
79 if (!QQmlEnginePrivate::qml_debugging_enabled.load(std::memory_order_relaxed)) {
80 if (!params->arguments.isEmpty()) {
81 qWarning().noquote() << QString::fromLatin1(
82 "QML Debugger: Ignoring \"-qmljsdebugger=%1\". Debugging "
83 "has not been enabled.").arg(params->arguments);
84 params->arguments.clear();
89 if (!params->instance) {
90 if (!params->pluginKey.isEmpty()) {
91 params->instance = loadQQmlDebugConnector(params->pluginKey);
92 }
else if (params->arguments.isEmpty()) {
94 }
else if (params->arguments.startsWith(QLatin1String(
"connector:"))) {
95 static const int connectorBegin =
int(strlen(
"connector:"));
97 int connectorEnd = params->arguments.indexOf(QLatin1Char(
','), connectorBegin);
98 if (connectorEnd == -1)
99 connectorEnd = params->arguments.size();
101 params->instance = loadQQmlDebugConnector(params->arguments.mid(
103 connectorEnd - connectorBegin));
105 params->instance = loadQQmlDebugConnector(
106 params->arguments.startsWith(QLatin1String(
"native")) ?
107 QStringLiteral(
"QQmlNativeDebugConnector") :
108 QStringLiteral(
"QQmlDebugServer"));
111 if (params->instance) {
112 const auto metaData = metaDataForQQmlDebugService();
113 for (
const QPluginParsedMetaData &md : metaData) {
114 const auto keys = md.value(QtPluginMetaDataKeys::MetaData).toMap()
115 .value(QLatin1String(
"Keys")).toArray();
116 for (
const QCborValue key : keys) {
117 QString keyString = key.toString();
118 if (params->services.isEmpty() || params->services.contains(keyString))
119 loadQQmlDebugService(keyString);
125 return params->instance;
128QQmlDebugConnectorFactory::~QQmlDebugConnectorFactory()
131 QQmlDebugConnectorParams *params = qmlDebugConnectorParams();
133 params->pluginKey.clear();
134 params->arguments.clear();
135 params->services.clear();
136 delete params->instance;
137 params->instance =
nullptr;
143#include "moc_qqmldebugconnector_p.cpp"
Combined button and popup list for selecting options.
#define Q_QML_DEBUG_PLUGIN_LOADER(interfaceName)
QQmlDebugConnector * instance
QQmlDebugConnectorParams()