@@ -1715,6 +1715,16 @@ void Debug::OnPromiseReject(Handle<Object> promise, Handle<Object> value) {
17151715 }
17161716}
17171717
1718+ namespace {
1719+ v8::Local<v8::Context> GetDebugEventContext (Isolate* isolate) {
1720+ Handle<Context> context = isolate->debug ()->debugger_entry ()->GetContext ();
1721+ // Isolate::context() may have been NULL when "script collected" event
1722+ // occured.
1723+ if (context.is_null ()) return v8::Local<v8::Context>();
1724+ Handle<Context> native_context (context->native_context ());
1725+ return v8::Utils::ToLocal (native_context);
1726+ }
1727+ } // anonymous namespace
17181728
17191729void Debug::OnException (Handle<Object> exception, Handle<Object> promise) {
17201730 // We cannot generate debug events when JS execution is disallowed.
@@ -1754,6 +1764,21 @@ void Debug::OnException(Handle<Object> exception, Handle<Object> promise) {
17541764 DebugScope debug_scope (this );
17551765 if (debug_scope.failed ()) return ;
17561766
1767+ if (debug_event_listener_) {
1768+ HandleScope scope (isolate_);
1769+
1770+ // Create the execution state.
1771+ Handle<Object> exec_state;
1772+ // Bail out and don't call debugger if exception.
1773+ if (!MakeExecutionState ().ToHandle (&exec_state)) return ;
1774+
1775+ debug_event_listener_->ExceptionThrown (
1776+ GetDebugEventContext (isolate_),
1777+ v8::Utils::ToLocal (Handle<JSObject>::cast (exec_state)),
1778+ v8::Utils::ToLocal (exception), promise->IsJSObject (), uncaught);
1779+ if (!non_inspector_listener_exists ()) return ;
1780+ }
1781+
17571782 // Create the event data object.
17581783 Handle<Object> event_data;
17591784 // Bail out and don't call debugger if exception.
@@ -1777,6 +1802,24 @@ void Debug::OnDebugBreak(Handle<Object> break_points_hit, bool auto_continue) {
17771802 PrintBreakLocation ();
17781803#endif // DEBUG
17791804
1805+ if (debug_event_listener_) {
1806+ HandleScope scope (isolate_);
1807+
1808+ // Create the execution state.
1809+ Handle<Object> exec_state;
1810+ // Bail out and don't call debugger if exception.
1811+ if (!MakeExecutionState ().ToHandle (&exec_state)) return ;
1812+
1813+ bool previous = in_debug_event_listener_;
1814+ in_debug_event_listener_ = true ;
1815+ debug_event_listener_->BreakProgramRequested (
1816+ GetDebugEventContext (isolate_),
1817+ v8::Utils::ToLocal (Handle<JSObject>::cast (exec_state)),
1818+ v8::Utils::ToLocal (break_points_hit));
1819+ in_debug_event_listener_ = previous;
1820+ if (!non_inspector_listener_exists ()) return ;
1821+ }
1822+
17801823 HandleScope scope (isolate_);
17811824 // Create the event data object.
17821825 Handle<Object> event_data;
@@ -1854,18 +1897,11 @@ int Debug::NextAsyncTaskId(Handle<JSObject> promise) {
18541897 return async_id->value ();
18551898}
18561899
1857- void Debug::SetAsyncTaskListener (debug::AsyncTaskListener listener,
1858- void * data) {
1859- async_task_listener_ = listener;
1860- async_task_listener_data_ = data;
1861- UpdateState ();
1862- }
1863-
18641900void Debug::OnAsyncTaskEvent (debug::PromiseDebugActionType type, int id) {
18651901 if (in_debug_scope () || ignore_events ()) return ;
18661902
1867- if (async_task_listener_ ) {
1868- async_task_listener_ (type, id, async_task_listener_data_ );
1903+ if (debug_event_listener_ ) {
1904+ debug_event_listener_-> PromiseEventOccurred (type, id);
18691905 if (!non_inspector_listener_exists ()) return ;
18701906 }
18711907
@@ -1920,7 +1956,7 @@ void Debug::CallEventCallback(v8::DebugEvent event,
19201956 in_debug_event_listener_ = true ;
19211957 if (event_listener_->IsForeign ()) {
19221958 // Invoke the C debug event listener.
1923- debug:: EventCallback callback = FUNCTION_CAST <debug ::EventCallback>(
1959+ v8::Debug:: EventCallback callback = FUNCTION_CAST <v8::Debug ::EventCallback>(
19241960 Handle<Foreign>::cast (event_listener_)->foreign_address ());
19251961 EventDetailsImpl event_details (event,
19261962 Handle<JSObject>::cast (exec_state),
@@ -1945,13 +1981,6 @@ void Debug::CallEventCallback(v8::DebugEvent event,
19451981 in_debug_event_listener_ = previous;
19461982}
19471983
1948- void Debug::SetCompileEventListener (debug::CompileEventListener listener,
1949- void * data) {
1950- compile_event_listener_ = listener;
1951- compile_event_listener_data_ = data;
1952- UpdateState ();
1953- }
1954-
19551984void Debug::ProcessCompileEvent (v8::DebugEvent event, Handle<Script> script) {
19561985 if (ignore_events ()) return ;
19571986 if (script->type () != i::Script::TYPE_NORMAL &&
@@ -1963,10 +1992,9 @@ void Debug::ProcessCompileEvent(v8::DebugEvent event, Handle<Script> script) {
19631992 DebugScope debug_scope (this );
19641993 if (debug_scope.failed ()) return ;
19651994
1966- if (compile_event_listener_) {
1967- compile_event_listener_ (ToApiHandle<debug::Script>(script),
1968- event != v8::AfterCompile,
1969- compile_event_listener_data_);
1995+ if (debug_event_listener_) {
1996+ debug_event_listener_->ScriptCompiled (ToApiHandle<debug::Script>(script),
1997+ event != v8::AfterCompile);
19701998 if (!non_inspector_listener_exists ()) return ;
19711999 }
19722000
@@ -2162,10 +2190,14 @@ void Debug::SetMessageHandler(v8::Debug::MessageHandler handler) {
21622190 }
21632191}
21642192
2193+ void Debug::SetDebugEventListener (debug::DebugEventListener* listener) {
2194+ debug_event_listener_ = listener;
2195+ UpdateState ();
2196+ }
2197+
21652198void Debug::UpdateState () {
21662199 bool is_active = message_handler_ != nullptr || !event_listener_.is_null () ||
2167- async_task_listener_ != nullptr ||
2168- compile_event_listener_ != nullptr ;
2200+ debug_event_listener_ != nullptr ;
21692201 if (is_active || in_debug_scope ()) {
21702202 // Note that the debug context could have already been loaded to
21712203 // bootstrap test cases.
@@ -2503,17 +2535,6 @@ v8::Local<v8::String> MessageImpl::GetJSON() const {
25032535 }
25042536}
25052537
2506- namespace {
2507- v8::Local<v8::Context> GetDebugEventContext (Isolate* isolate) {
2508- Handle<Context> context = isolate->debug ()->debugger_entry ()->GetContext ();
2509- // Isolate::context() may have been NULL when "script collected" event
2510- // occured.
2511- if (context.is_null ()) return v8::Local<v8::Context>();
2512- Handle<Context> native_context (context->native_context ());
2513- return v8::Utils::ToLocal (native_context);
2514- }
2515- } // anonymous namespace
2516-
25172538v8::Local<v8::Context> MessageImpl::GetEventContext () const {
25182539 Isolate* isolate = event_data_->GetIsolate ();
25192540 v8::Local<v8::Context> context = GetDebugEventContext (isolate);
0 commit comments