| Index: test/cctest/test-debug.cc
|
| ===================================================================
|
| --- test/cctest/test-debug.cc (revision 3306)
|
| +++ test/cctest/test-debug.cc (working copy)
|
| @@ -5605,3 +5605,86 @@
|
| v8::Debug::SetDebugEventListener(NULL);
|
| CheckDebuggerUnloaded();
|
| }
|
| +
|
| +
|
| +v8::Handle<v8::Context> debugee_context;
|
| +v8::Handle<v8::Context> debugger_context;
|
| +
|
| +
|
| +// Property getter that checks that current and calling contexts
|
| +// are both the debugee contexts.
|
| +static v8::Handle<v8::Value> NamedGetterWithCallingContextCheck(
|
| + v8::Local<v8::String> name,
|
| + const v8::AccessorInfo& info) {
|
| + CHECK(strcmp(*v8::String::AsciiValue(name), "a") == 0);
|
| + v8::Handle<v8::Context> current = v8::Context::GetCurrent();
|
| + CHECK(current == debugee_context);
|
| + CHECK(current != debugger_context);
|
| + v8::Handle<v8::Context> calling = v8::Context::GetCalling();
|
| + CHECK(calling == debugee_context);
|
| + CHECK(calling != debugger_context);
|
| + return v8::Int32::New(1);
|
| +}
|
| +
|
| +
|
| +// Debug event listener that checks if the first argument of a function is
|
| +// an object with property 'a' == 1. If the property has custom accessor
|
| +// this handler will eventually invoke it.
|
| +static void DebugEventGetAtgumentPropertyValue(
|
| + v8::DebugEvent event,
|
| + v8::Handle<v8::Object> exec_state,
|
| + v8::Handle<v8::Object> event_data,
|
| + v8::Handle<v8::Value> data) {
|
| + if (event == v8::Break) {
|
| + break_point_hit_count++;
|
| + CHECK(debugger_context == v8::Context::GetCurrent());
|
| + v8::Handle<v8::Function> func(v8::Function::Cast(*CompileRun(
|
| + "(function(exec_state) {\n"
|
| + " return (exec_state.frame(0).argumentValue(0).property('a').\n"
|
| + " value().value() == 1);\n"
|
| + "})")));
|
| + const int argc = 1;
|
| + v8::Handle<v8::Value> argv[argc] = { exec_state };
|
| + v8::Handle<v8::Value> result = func->Call(exec_state, argc, argv);
|
| + CHECK(result->IsTrue());
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST(CallingContextIsNotDebugContext) {
|
| + // Create and enter a debugee context.
|
| + v8::HandleScope scope;
|
| + DebugLocalContext env;
|
| + env.ExposeDebug();
|
| +
|
| + // Save handles to the debugger and debugee contexts to be used in
|
| + // NamedGetterWithCallingContextCheck.
|
| + debugee_context = v8::Local<v8::Context>(*env);
|
| + debugger_context = v8::Utils::ToLocal(Debug::debug_context());
|
| +
|
| + // Create object with 'a' property accessor.
|
| + v8::Handle<v8::ObjectTemplate> named = v8::ObjectTemplate::New();
|
| + named->SetAccessor(v8::String::New("a"),
|
| + NamedGetterWithCallingContextCheck);
|
| + env->Global()->Set(v8::String::New("obj"),
|
| + named->NewInstance());
|
| +
|
| + // Register the debug event listener
|
| + v8::Debug::SetDebugEventListener(DebugEventGetAtgumentPropertyValue);
|
| +
|
| + // Create a function that invokes debugger.
|
| + v8::Local<v8::Function> foo = CompileFunction(
|
| + &env,
|
| + "function bar(x) { debugger; }"
|
| + "function foo(){ bar(obj); }",
|
| + "foo");
|
| +
|
| + break_point_hit_count = 0;
|
| + foo->Call(env->Global(), 0, NULL);
|
| + CHECK_EQ(1, break_point_hit_count);
|
| +
|
| + v8::Debug::SetDebugEventListener(NULL);
|
| + debugee_context = v8::Handle<v8::Context>();
|
| + debugger_context = v8::Handle<v8::Context>();
|
| + CheckDebuggerUnloaded();
|
| +}
|
|
|