Index: src/debug-agent.cc |
=================================================================== |
--- src/debug-agent.cc (revision 6165) |
+++ src/debug-agent.cc (working copy) |
@@ -27,9 +27,11 @@ |
#include "v8.h" |
+#include "debug.h" |
#include "debug-agent.h" |
#ifdef ENABLE_DEBUGGER_SUPPORT |
+ |
namespace v8 { |
namespace internal { |
@@ -167,22 +169,33 @@ |
while (true) { |
// Read data from the debugger front end. |
SmartPointer<char> message = DebuggerAgentUtil::ReceiveMessage(client_); |
- if (*message == NULL) { |
- // Session is closed. |
- agent_->OnSessionClosed(this); |
- return; |
+ |
+ const char* msg = *message; |
+ bool is_closing_session = (msg == NULL); |
+ |
+ if (msg == NULL) { |
+ // If we lost the connection, then simulate a disconnect msg: |
+ msg = "{\"seq\":1,\"type\":\"request\",\"command\":\"disconnect\"}"; |
+ |
+ } else { |
+ // Check if we're getting a disconnect request: |
+ const char* disconnectRequestStr = |
+ "\"type\":\"request\",\"command\":\"disconnect\"}"; |
+ const char* result = strstr(msg, disconnectRequestStr); |
+ if (result != NULL) { |
+ is_closing_session = true; |
+ } |
} |
// Convert UTF-8 to UTF-16. |
- unibrow::Utf8InputBuffer<> buf(*message, |
- StrLength(*message)); |
+ unibrow::Utf8InputBuffer<> buf(msg, StrLength(msg)); |
int len = 0; |
while (buf.has_more()) { |
buf.GetNext(); |
len++; |
} |
ScopedVector<int16_t> temp(len + 1); |
- buf.Reset(*message, StrLength(*message)); |
+ buf.Reset(msg, StrLength(msg)); |
for (int i = 0; i < len; i++) { |
temp[i] = buf.GetNext(); |
} |
@@ -190,6 +203,12 @@ |
// Send the request received to the debugger. |
v8::Debug::SendCommand(reinterpret_cast<const uint16_t *>(temp.start()), |
len); |
+ |
+ if (is_closing_session) { |
+ // Session is closed. |
+ agent_->OnSessionClosed(this); |
+ return; |
+ } |
} |
} |