// Copyright 2020 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_TEST_INSPECTOR_FRONTEND_CHANNEL_H_ #define V8_TEST_INSPECTOR_FRONTEND_CHANNEL_H_ #include #include "include/v8-context.h" #include "include/v8-function.h" #include "include/v8-inspector.h" #include "include/v8-microtask-queue.h" #include "include/v8-persistent-handle.h" #include "test/inspector/task-runner.h" #include "test/inspector/utils.h" namespace v8 { namespace internal { class FrontendChannelImpl : public v8_inspector::V8Inspector::Channel { public: FrontendChannelImpl(TaskRunner* task_runner, int context_group_id, v8::Isolate* isolate, v8::Local function) : task_runner_(task_runner), context_group_id_(context_group_id), function_(isolate, function) {} ~FrontendChannelImpl() override = default; FrontendChannelImpl(const FrontendChannelImpl&) = delete; FrontendChannelImpl& operator=(const FrontendChannelImpl&) = delete; void set_session_id(int session_id) { session_id_ = session_id; } private: void sendResponse( int callId, std::unique_ptr message) override { task_runner_->Append(std::make_unique( session_id_, ToVector(message->string()))); } void sendNotification( std::unique_ptr message) override { task_runner_->Append(std::make_unique( session_id_, ToVector(message->string()))); } void flushProtocolNotifications() override {} class SendMessageTask : public TaskRunner::Task { public: SendMessageTask(int session_id, const std::vector& message) : session_id_(session_id), message_(message) {} ~SendMessageTask() override = default; bool is_priority_task() final { return false; } private: void Run(InspectorIsolateData* data) override { v8::HandleScope handle_scope(data->isolate()); auto* channel = ChannelHolder::GetChannel(session_id_); if (!channel) { // Session got disconnected. Ignore this message. return; } v8::Local context = data->GetDefaultContext(channel->context_group_id_); v8::MicrotasksScope microtasks_scope(context, v8::MicrotasksScope::kRunMicrotasks); v8::Context::Scope context_scope(context); v8::Local message = ToV8String(data->isolate(), message_); v8::MaybeLocal result; result = channel->function_.Get(data->isolate()) ->Call(context, context->Global(), 1, &message); } int session_id_; std::vector message_; }; TaskRunner* task_runner_; int context_group_id_; v8::Global function_; int session_id_; }; } // namespace internal } // namespace v8 #endif // V8_TEST_INSPECTOR_FRONTEND_CHANNEL_H_