| Index: test/cctest/test-debug.cc
|
| ===================================================================
|
| --- test/cctest/test-debug.cc (revision 2004)
|
| +++ test/cctest/test-debug.cc (working copy)
|
| @@ -4172,11 +4172,8 @@
|
| }
|
|
|
|
|
| -// Debugger message handler which counts the number of times it is called.
|
| -static int message_handler_hit_count = 0;
|
| -static void MessageHandlerHitCount(const v8::Debug::Message& message) {
|
| - message_handler_hit_count++;
|
| -
|
| +// Sends continue command to the debugger.
|
| +static void SendContinueCommand() {
|
| const int kBufferSize = 1000;
|
| uint16_t buffer[kBufferSize];
|
| const char* command_continue =
|
| @@ -4188,6 +4185,15 @@
|
| }
|
|
|
|
|
| +// Debugger message handler which counts the number of times it is called.
|
| +static int message_handler_hit_count = 0;
|
| +static void MessageHandlerHitCount(const v8::Debug::Message& message) {
|
| + message_handler_hit_count++;
|
| +
|
| + SendContinueCommand();
|
| +}
|
| +
|
| +
|
| // Test clearing the debug message handler.
|
| TEST(DebuggerClearMessageHandler) {
|
| v8::HandleScope scope;
|
| @@ -4624,16 +4630,9 @@
|
| expected_context_data));
|
| message_handler_hit_count++;
|
|
|
| - const int kBufferSize = 1000;
|
| - uint16_t buffer[kBufferSize];
|
| - const char* command_continue =
|
| - "{\"seq\":0,"
|
| - "\"type\":\"request\","
|
| - "\"command\":\"continue\"}";
|
| -
|
| // Send a continue command for break events.
|
| if (message.GetEvent() == v8::Break) {
|
| - v8::Debug::SendCommand(buffer, AsciiToUtf16(command_continue, buffer));
|
| + SendContinueCommand();
|
| }
|
| }
|
|
|
| @@ -4694,6 +4693,108 @@
|
| }
|
|
|
|
|
| +// Common part of EvalContextData and NestedBreakEventContextData tests.
|
| +static void ExecuteScriptForContextCheck() {
|
| + // Create a context.
|
| + v8::Persistent<v8::Context> context_1;
|
| + v8::Handle<v8::ObjectTemplate> global_template =
|
| + v8::Handle<v8::ObjectTemplate>();
|
| + v8::Handle<v8::Value> global_object = v8::Handle<v8::Value>();
|
| + context_1 = v8::Context::New(NULL, global_template, global_object);
|
| +
|
| + // Default data value is undefined.
|
| + CHECK(context_1->GetData()->IsUndefined());
|
| +
|
| + // Set and check a data value.
|
| + v8::Handle<v8::Value> data_1 = v8::Number::New(1);
|
| + context_1->SetData(data_1);
|
| + CHECK(context_1->GetData()->StrictEquals(data_1));
|
| +
|
| + // Simple test function with eval that causes a break.
|
| + const char* source = "function f() { eval('debugger;'); }";
|
| +
|
| + // Enter and run function in the context.
|
| + {
|
| + v8::Context::Scope context_scope(context_1);
|
| + expected_context = context_1;
|
| + expected_context_data = data_1;
|
| + v8::Local<v8::Function> f = CompileFunction(source, "f");
|
| + f->Call(context_1->Global(), 0, NULL);
|
| + }
|
| +}
|
| +
|
| +
|
| +// Test which creates a context and sets embedder data on it. Checks that this
|
| +// data is set correctly and that when the debug message handler is called for
|
| +// break event in an eval statement the expected context is the one returned by
|
| +// Message.GetEventContext.
|
| +TEST(EvalContextData) {
|
| + v8::HandleScope scope;
|
| + v8::Debug::SetMessageHandler2(ContextCheckMessageHandler);
|
| +
|
| + ExecuteScriptForContextCheck();
|
| +
|
| + // One time compile event and one time break event.
|
| + CHECK_GT(message_handler_hit_count, 2);
|
| +}
|
| +
|
| +
|
| +static bool sent_eval = false;
|
| +static int break_count = 0;
|
| +// Check that the expected context is the one generating the debug event
|
| +// including the case of nested break event.
|
| +static void DebugEvalContextCheckMessageHandler(
|
| + const v8::Debug::Message& message) {
|
| + CHECK(message.GetEventContext() == expected_context);
|
| + CHECK(message.GetEventContext()->GetData()->StrictEquals(
|
| + expected_context_data));
|
| + message_handler_hit_count++;
|
| +
|
| + if (message.IsEvent() && message.GetEvent() == v8::Break) {
|
| + break_count++;
|
| + if (!sent_eval) {
|
| + sent_eval = true;
|
| +
|
| + const int kBufferSize = 1000;
|
| + uint16_t buffer[kBufferSize];
|
| + const char* eval_command =
|
| + "{\"seq\":0,"
|
| + "\"type\":\"request\","
|
| + "\"command\":\"evaluate\","
|
| + "arguments:{\"expression\":\"debugger;\","
|
| + "\"global\":true,\"disable_break\":false}}";
|
| +
|
| + // Send evaluate command.
|
| + v8::Debug::SendCommand(buffer, AsciiToUtf16(eval_command, buffer));
|
| + return;
|
| + } else {
|
| + // It's a break event caused by the evaluation request above.
|
| + SendContinueCommand();
|
| + }
|
| + } else if (message.IsResponse()) {
|
| + // Response to the evaluation request. We're still on the breakpoint so
|
| + // send continue.
|
| + SendContinueCommand();
|
| + }
|
| +}
|
| +
|
| +
|
| +// Tests that context returned for break event is correct when the event occurs
|
| +// in 'evaluate' debugger request.
|
| +TEST(NestedBreakEventContextData) {
|
| + v8::HandleScope scope;
|
| + v8::Debug::SetMessageHandler2(DebugEvalContextCheckMessageHandler);
|
| +
|
| + ExecuteScriptForContextCheck();
|
| +
|
| + // One time compile event and two times break event.
|
| + CHECK_GT(message_handler_hit_count, 3);
|
| +
|
| + // One break from the source and another from the evaluate request.
|
| + CHECK_EQ(break_count, 2);
|
| +}
|
| +
|
| +
|
| // Debug event listener which counts the script collected events.
|
| int script_collected_count = 0;
|
| static void DebugEventScriptCollectedEvent(v8::DebugEvent event,
|
|
|