Index: src/debug/debug.cc |
diff --git a/src/debug/debug.cc b/src/debug/debug.cc |
index 08da3d8b26f0b52e9bb8b946389a1436e41af93a..75ff222765125df94ceb84ab931bcee125df5342 100644 |
--- a/src/debug/debug.cc |
+++ b/src/debug/debug.cc |
@@ -1815,6 +1815,27 @@ void ResetPromiseHandle(const v8::WeakCallbackInfo<void>& info) { |
GlobalHandles::Destroy(data->location); |
info.SetSecondPassCallback(&SendAsyncTaskEventCancel); |
} |
+ |
+debug::PromiseDebugActionName ToInterfaceDebugActionName( |
+ PromiseDebugActionName name) { |
+ switch (name) { |
+ case kDebugAsyncFunction: |
+ return debug::kDebugAsyncFunction; |
+ case kDebugPromiseResolve: |
+ return debug::kDebugPromiseResolve; |
+ case kDebugPromiseReject: |
+ return debug::kDebugPromiseReject; |
+ case kDebugPromiseResolveThenableJob: |
+ return debug::kDebugPromiseResolveThenableJob; |
+ case kDebugPromiseCollected: |
+ return debug::kDebugPromiseCollected; |
+ case kDebugNotActive: |
+ UNREACHABLE(); |
+ return debug::kDebugAsyncFunction; |
+ } |
+ UNREACHABLE(); |
+ return debug::kDebugAsyncFunction; |
+} |
} // namespace |
int Debug::NextAsyncTaskId(Handle<JSObject> promise) { |
@@ -1844,10 +1865,26 @@ int Debug::NextAsyncTaskId(Handle<JSObject> promise) { |
return async_id->value(); |
} |
+void Debug::SetAsyncTaskListener(debug::AsyncTaskListener listener, |
+ void* data) { |
+ async_task_listener_ = listener; |
+ async_task_listener_data_ = data; |
+ UpdateState(); |
+} |
+ |
void Debug::OnAsyncTaskEvent(debug::PromiseDebugActionType type, int id, |
PromiseDebugActionName name) { |
if (in_debug_scope() || ignore_events()) return; |
+ if (async_task_listener_) { |
+ async_task_listener_(type, id, ToInterfaceDebugActionName(name), |
+ async_task_listener_data_); |
+ if (message_handler_ == NULL && |
dgozman
2017/01/13 00:01:48
nullptr
dgozman
2017/01/13 00:01:48
Let's extract variable |only_foreign_listener_pres
kozy
2017/01/13 15:59:13
Done.
kozy
2017/01/13 15:59:13
Done.
|
+ (event_listener_.is_null() || event_listener_->IsForeign())) { |
+ return; |
+ } |
+ } |
+ |
HandleScope scope(isolate_); |
DebugScope debug_scope(this); |
if (debug_scope.failed()) return; |
@@ -2131,7 +2168,8 @@ void Debug::SetMessageHandler(v8::Debug::MessageHandler handler) { |
} |
void Debug::UpdateState() { |
- bool is_active = message_handler_ != NULL || !event_listener_.is_null(); |
+ bool is_active = message_handler_ != NULL || !event_listener_.is_null() || |
+ async_task_listener_ != NULL; |
if (is_active || in_debug_scope()) { |
// Note that the debug context could have already been loaded to |
// bootstrap test cases. |