| Index: test/cctest/test-debug.cc
|
| ===================================================================
|
| --- test/cctest/test-debug.cc (revision 2034)
|
| +++ test/cctest/test-debug.cc (working copy)
|
| @@ -4693,6 +4693,9 @@
|
|
|
| // Two times compile event and two times break event.
|
| CHECK_GT(message_handler_hit_count, 4);
|
| +
|
| + v8::Debug::SetMessageHandler2(NULL);
|
| + CheckDebuggerUnloaded();
|
| }
|
|
|
|
|
| @@ -4739,11 +4742,14 @@
|
|
|
| // One time compile event and one time break event.
|
| CHECK_GT(message_handler_hit_count, 2);
|
| + v8::Debug::SetMessageHandler2(NULL);
|
| + CheckDebuggerUnloaded();
|
| }
|
|
|
|
|
| static bool sent_eval = false;
|
| static int break_count = 0;
|
| +static int continue_command_send_count = 0;
|
| // Check that the expected context is the one generating the debug event
|
| // including the case of nested break event.
|
| static void DebugEvalContextCheckMessageHandler(
|
| @@ -4773,11 +4779,13 @@
|
| } else {
|
| // It's a break event caused by the evaluation request above.
|
| SendContinueCommand();
|
| + continue_command_send_count++;
|
| }
|
| - } else if (message.IsResponse()) {
|
| + } else if (message.IsResponse() && continue_command_send_count < 2) {
|
| // Response to the evaluation request. We're still on the breakpoint so
|
| // send continue.
|
| SendContinueCommand();
|
| + continue_command_send_count++;
|
| }
|
| }
|
|
|
| @@ -4786,6 +4794,8 @@
|
| // in 'evaluate' debugger request.
|
| TEST(NestedBreakEventContextData) {
|
| v8::HandleScope scope;
|
| + break_count = 0;
|
| + message_handler_hit_count = 0;
|
| v8::Debug::SetMessageHandler2(DebugEvalContextCheckMessageHandler);
|
|
|
| ExecuteScriptForContextCheck();
|
| @@ -4795,6 +4805,8 @@
|
|
|
| // One break from the source and another from the evaluate request.
|
| CHECK_EQ(break_count, 2);
|
| + v8::Debug::SetMessageHandler2(NULL);
|
| + CheckDebuggerUnloaded();
|
| }
|
|
|
|
|
| @@ -4814,6 +4826,7 @@
|
| // Test that scripts collected are reported through the debug event listener.
|
| TEST(ScriptCollectedEvent) {
|
| break_point_hit_count = 0;
|
| + script_collected_count = 0;
|
| v8::HandleScope scope;
|
| DebugLocalContext env;
|
|
|
| @@ -4858,7 +4871,7 @@
|
| // Test that GetEventContext doesn't fail and return empty handle for
|
| // ScriptCollected events.
|
| TEST(ScriptCollectedEventContext) {
|
| - break_point_hit_count = 0;
|
| + script_collected_message_count = 0;
|
| v8::HandleScope scope;
|
|
|
| { // Scope for the DebugLocalContext.
|
| @@ -4871,7 +4884,6 @@
|
| // collected afterwards.
|
| Heap::CollectAllGarbage();
|
|
|
| - script_collected_count = 0;
|
| v8::Debug::SetMessageHandler2(ScriptCollectedMessageHandler);
|
| {
|
| v8::Script::Compile(v8::String::New("eval('a=1')"))->Run();
|
| @@ -4887,3 +4899,101 @@
|
|
|
| v8::Debug::SetMessageHandler2(NULL);
|
| }
|
| +
|
| +
|
| +// Debug event listener which counts the after compile events.
|
| +int after_compile_message_count = 0;
|
| +static void AfterCompileMessageHandler(const v8::Debug::Message& message) {
|
| + // Count the number of scripts collected.
|
| + if (message.IsEvent()) {
|
| + if (message.GetEvent() == v8::AfterCompile) {
|
| + after_compile_message_count++;
|
| + } else if (message.GetEvent() == v8::Break) {
|
| + SendContinueCommand();
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +// Tests that after compile event is sent as many times as there are scripts
|
| +// compiled.
|
| +TEST(AfterCompileMessageWhenMessageHandlerIsReset) {
|
| + v8::HandleScope scope;
|
| + DebugLocalContext env;
|
| + after_compile_message_count = 0;
|
| + const char* script = "var a=1";
|
| +
|
| + v8::Debug::SetMessageHandler2(AfterCompileMessageHandler);
|
| + v8::Script::Compile(v8::String::New(script))->Run();
|
| + v8::Debug::SetMessageHandler2(NULL);
|
| +
|
| + v8::Debug::SetMessageHandler2(AfterCompileMessageHandler);
|
| + v8::Debug::DebugBreak();
|
| + v8::Script::Compile(v8::String::New(script))->Run();
|
| +
|
| + // Setting listener to NULL should cause debugger unload.
|
| + v8::Debug::SetMessageHandler2(NULL);
|
| + CheckDebuggerUnloaded();
|
| +
|
| + // Compilation cache should be disabled when debugger is active.
|
| + CHECK_EQ(2, after_compile_message_count);
|
| +}
|
| +
|
| +
|
| +// Tests that break event is sent when message handler is reset.
|
| +TEST(BreakMessageWhenMessageHandlerIsReset) {
|
| + v8::HandleScope scope;
|
| + DebugLocalContext env;
|
| + after_compile_message_count = 0;
|
| + const char* script = "function f() {};";
|
| +
|
| + v8::Debug::SetMessageHandler2(AfterCompileMessageHandler);
|
| + v8::Script::Compile(v8::String::New(script))->Run();
|
| + v8::Debug::SetMessageHandler2(NULL);
|
| +
|
| + v8::Debug::SetMessageHandler2(AfterCompileMessageHandler);
|
| + v8::Debug::DebugBreak();
|
| + v8::Local<v8::Function> f =
|
| + v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
|
| + f->Call(env->Global(), 0, NULL);
|
| +
|
| + // Setting message handler to NULL should cause debugger unload.
|
| + v8::Debug::SetMessageHandler2(NULL);
|
| + CheckDebuggerUnloaded();
|
| +
|
| + // Compilation cache should be disabled when debugger is active.
|
| + CHECK_EQ(1, after_compile_message_count);
|
| +}
|
| +
|
| +
|
| +static int exception_event_count = 0;
|
| +static void ExceptionMessageHandler(const v8::Debug::Message& message) {
|
| + if (message.IsEvent() && message.GetEvent() == v8::Exception) {
|
| + exception_event_count++;
|
| + SendContinueCommand();
|
| + }
|
| +}
|
| +
|
| +
|
| +// Tests that exception event is sent when message handler is reset.
|
| +TEST(ExceptionMessageWhenMessageHandlerIsReset) {
|
| + v8::HandleScope scope;
|
| + DebugLocalContext env;
|
| + exception_event_count = 0;
|
| + const char* script = "function f() {throw new Error()};";
|
| +
|
| + v8::Debug::SetMessageHandler2(AfterCompileMessageHandler);
|
| + v8::Script::Compile(v8::String::New(script))->Run();
|
| + v8::Debug::SetMessageHandler2(NULL);
|
| +
|
| + v8::Debug::SetMessageHandler2(ExceptionMessageHandler);
|
| + v8::Local<v8::Function> f =
|
| + v8::Local<v8::Function>::Cast(env->Global()->Get(v8::String::New("f")));
|
| + f->Call(env->Global(), 0, NULL);
|
| +
|
| + // Setting message handler to NULL should cause debugger unload.
|
| + v8::Debug::SetMessageHandler2(NULL);
|
| + CheckDebuggerUnloaded();
|
| +
|
| + CHECK_EQ(1, exception_event_count);
|
| +}
|
|
|