From 2b84f9f3696dde27bfcc7373ff296703c160705a Mon Sep 17 00:00:00 2001
From: Aurindam Jana <aurindam.jana@nokia.com>
Date: Mon, 22 Aug 2011 13:08:58 +0200
Subject: [PATCH] Synchronize the client with the debug service

The v8 engine is blocked till the client is connected to the service to ensure proper hitting of breakpoints.

Task-number: QTCREATORBUG-5412

Change-Id: Iec772cb547a31fef4cccbd4bb1116699c52d20e5
Reviewed-on: http://codereview.qt.nokia.com/3308
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
---
 src/plugins/debugger/qml/qmladapter.cpp            |  1 +
 src/plugins/debugger/qml/qmldebuggerclient.h       |  4 +++-
 src/plugins/debugger/qml/qmlengine.cpp             |  2 +-
 src/plugins/debugger/qml/qmlv8debuggerclient.cpp   | 14 +++++++++++++-
 src/plugins/debugger/qml/qmlv8debuggerclient.h     |  4 +++-
 src/plugins/debugger/qml/qscriptdebuggerclient.cpp |  5 ++++-
 src/plugins/debugger/qml/qscriptdebuggerclient.h   |  4 +++-
 7 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/src/plugins/debugger/qml/qmladapter.cpp b/src/plugins/debugger/qml/qmladapter.cpp
index 4ec0e417a5a..dbe23aab931 100644
--- a/src/plugins/debugger/qml/qmladapter.cpp
+++ b/src/plugins/debugger/qml/qmladapter.cpp
@@ -170,6 +170,7 @@ void QmlAdapter::clientStatusChanged(QDeclarativeDebugClient::Status status)
 
     if (status == QDeclarativeDebugClient::Enabled) {
         d->m_qmlClient = d->debugClients.value(serviceName);
+        d->m_qmlClient->connect();
         d->m_qmlClient->flushSendBuffer();
     }
 }
diff --git a/src/plugins/debugger/qml/qmldebuggerclient.h b/src/plugins/debugger/qml/qmldebuggerclient.h
index 93c05299e23..a7391f65b0e 100644
--- a/src/plugins/debugger/qml/qmldebuggerclient.h
+++ b/src/plugins/debugger/qml/qmldebuggerclient.h
@@ -52,6 +52,9 @@ public:
     QmlDebuggerClient(QmlJsDebugClient::QDeclarativeDebugConnection* client, QLatin1String clientName);
     virtual ~QmlDebuggerClient();
 
+    virtual void connect() = 0;
+    virtual void disconnect() = 0;
+
     virtual void executeStep() = 0;
     virtual void executeStepOut() = 0;
     virtual void executeNext() = 0;
@@ -59,7 +62,6 @@ public:
 
     virtual void continueInferior() = 0;
     virtual void interruptInferior() = 0;
-    virtual void shutdownInferior() = 0;
 
     virtual void activateFrame(int index) = 0;
 
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index 9ff95179ee4..0af34b13575 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -375,7 +375,7 @@ void QmlEngine::handleRemoteSetupFailed(const QString &message)
 
 void QmlEngine::shutdownInferior()
 {
-    d->m_adapter.activeDebuggerClient()->shutdownInferior();
+    d->m_adapter.activeDebuggerClient()->disconnect();
 
     if (isSlaveEngine()) {
         resetLocation();
diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp
index 9c99a4fef33..2a6c4f5f33c 100644
--- a/src/plugins/debugger/qml/qmlv8debuggerclient.cpp
+++ b/src/plugins/debugger/qml/qmlv8debuggerclient.cpp
@@ -192,7 +192,19 @@ void QmlV8DebuggerClient::interruptInferior()
 
 }
 
-void QmlV8DebuggerClient::shutdownInferior()
+void QmlV8DebuggerClient::connect()
+{
+    QByteArray request;
+
+    JsonInputStream(request) << '{' << INITIALPARAMS ;
+    JsonInputStream(request) << ',' << "command" << ':' << "connect";
+
+    JsonInputStream(request) << '}';
+
+    sendMessage(packMessage(request));
+}
+
+void QmlV8DebuggerClient::disconnect()
 {
     QByteArray request;
 
diff --git a/src/plugins/debugger/qml/qmlv8debuggerclient.h b/src/plugins/debugger/qml/qmlv8debuggerclient.h
index decb635b5fd..b3ff37bd4e8 100644
--- a/src/plugins/debugger/qml/qmlv8debuggerclient.h
+++ b/src/plugins/debugger/qml/qmlv8debuggerclient.h
@@ -52,6 +52,9 @@ public:
     explicit QmlV8DebuggerClient(QmlJsDebugClient::QDeclarativeDebugConnection *client);
     ~QmlV8DebuggerClient();
 
+    void connect();
+    void disconnect();
+
     void executeStep();
     void executeStepOut();
     void executeNext();
@@ -59,7 +62,6 @@ public:
 
     void continueInferior();
     void interruptInferior();
-    void shutdownInferior();
 
     void activateFrame(int index);
 
diff --git a/src/plugins/debugger/qml/qscriptdebuggerclient.cpp b/src/plugins/debugger/qml/qscriptdebuggerclient.cpp
index 6246e2ce891..692fef36e76 100644
--- a/src/plugins/debugger/qml/qscriptdebuggerclient.cpp
+++ b/src/plugins/debugger/qml/qscriptdebuggerclient.cpp
@@ -192,9 +192,12 @@ void QScriptDebuggerClient::interruptInferior()
     sendMessage(reply);
 }
 
-void QScriptDebuggerClient::shutdownInferior()
+void QScriptDebuggerClient::connect()
 {
+}
 
+void QScriptDebuggerClient::disconnect()
+{
 }
 
 void QScriptDebuggerClient::activateFrame(int index)
diff --git a/src/plugins/debugger/qml/qscriptdebuggerclient.h b/src/plugins/debugger/qml/qscriptdebuggerclient.h
index 9ebb93d4b7a..6723347f016 100644
--- a/src/plugins/debugger/qml/qscriptdebuggerclient.h
+++ b/src/plugins/debugger/qml/qscriptdebuggerclient.h
@@ -51,6 +51,9 @@ public:
     QScriptDebuggerClient(QmlJsDebugClient::QDeclarativeDebugConnection *client);
     ~QScriptDebuggerClient();
 
+    void connect();
+    void disconnect();
+
     void executeStep();
     void executeStepOut();
     void executeNext();
@@ -58,7 +61,6 @@ public:
 
     void continueInferior();
     void interruptInferior();
-    void shutdownInferior();
 
     void activateFrame(int index);
 
-- 
GitLab