diff --git a/test/inspector/inspector-test.cc b/test/inspector/inspector-test.cc index 6983448d028..a86f5c4e3ca 100644 --- a/test/inspector/inspector-test.cc +++ b/test/inspector/inspector-test.cc @@ -565,6 +565,9 @@ class InspectorExtension : public InspectorIsolateData::SetupGlobalTask { inspector->Set(isolate, "runNestedMessageLoop", v8::FunctionTemplate::New( isolate, &InspectorExtension::RunNestedMessageLoop)); + inspector->Set(isolate, "disconnectSession", + v8::FunctionTemplate::New( + isolate, &InspectorExtension::DisconnectSessionSync)); global->Set(isolate, "inspector", inspector); } @@ -853,6 +856,16 @@ class InspectorExtension : public InspectorIsolateData::SetupGlobalTask { data->task_runner()->RunMessageLoop(true); } + + static void DisconnectSessionSync( + const v8::FunctionCallbackInfo& info) { + if (info.Length() != 1 || !info[0]->IsInt32()) { + FATAL("Internal error: inspector.disconnectSession(session_id)."); + } + v8::Local context = info.GetIsolate()->GetCurrentContext(); + InspectorIsolateData* data = InspectorIsolateData::FromContext(context); + data->DisconnectSessionSync(info[0].As()->Value()); + } }; int InspectorTestMain(int argc, char* argv[]) { diff --git a/test/inspector/isolate-data.cc b/test/inspector/isolate-data.cc index 0cc9bb53dce..85e7b4a7405 100644 --- a/test/inspector/isolate-data.cc +++ b/test/inspector/isolate-data.cc @@ -226,6 +226,13 @@ std::vector InspectorIsolateData::DisconnectSession( return result; } +void InspectorIsolateData::DisconnectSessionSync(int session_id) { + auto it = sessions_.find(session_id); + if (it == sessions_.end()) return; + it->second->Disconnect(); + sessions_.erase(it); +} + void InspectorIsolateData::SendMessage( int session_id, const v8_inspector::StringView& message) { v8::SealHandleScope seal_handle_scope(isolate()); diff --git a/test/inspector/isolate-data.h b/test/inspector/isolate-data.h index 915afd76464..a201964a822 100644 --- a/test/inspector/isolate-data.h +++ b/test/inspector/isolate-data.h @@ -73,6 +73,11 @@ class InspectorIsolateData : public v8_inspector::V8InspectorClient { bool is_fully_trusted); std::vector DisconnectSession(int session_id, TaskRunner* context_task_runner); + // Models Blink DevToolsSession::Detach() running synchronously on the + // renderer main thread (e.g. from a Mojo disconnect handler dispatched in a + // nested message loop). No SealHandleScope so it can be called from inside + // re-entrant page JS. + void DisconnectSessionSync(int session_id); void SendMessage(int session_id, const v8_inspector::StringView& message); void BreakProgram(int context_group_id, const v8_inspector::StringView& reason,