Index: test/inspector/inspector-test.cc |
diff --git a/test/inspector/inspector-test.cc b/test/inspector/inspector-test.cc |
index 409afe6107a0bc48e67a3750477a13bc4185aaf9..cf53e4f42f8a3c063d7d2fd873526a579a77ce11 100644 |
--- a/test/inspector/inspector-test.cc |
+++ b/test/inspector/inspector-test.cc |
@@ -13,7 +13,6 @@ |
#include "src/base/platform/platform.h" |
#include "src/flags.h" |
-#include "src/inspector/test-interface.h" |
#include "src/utils.h" |
#include "src/vector.h" |
@@ -51,6 +50,20 @@ v8::Local<v8::String> ToV8String(v8::Isolate* isolate, const char* str) { |
.ToLocalChecked(); |
} |
+v8::Local<v8::String> ToV8String(v8::Isolate* isolate, const char* str, |
+ int length) { |
+ return v8::String::NewFromUtf8(isolate, str, v8::NewStringType::kNormal, |
+ length) |
+ .ToLocalChecked(); |
+} |
+ |
+v8::Local<v8::String> ToV8String(v8::Isolate* isolate, |
+ const v8::internal::Vector<uint16_t>& buffer) { |
+ return v8::String::NewFromTwoByte(isolate, buffer.start(), |
+ v8::NewStringType::kNormal, buffer.length()) |
+ .ToLocalChecked(); |
+} |
+ |
v8::internal::Vector<uint16_t> ToVector( |
const v8_inspector::StringView& string) { |
v8::internal::Vector<uint16_t> buffer = |
@@ -64,180 +77,193 @@ v8::internal::Vector<uint16_t> ToVector( |
return buffer; |
} |
-class CreateContextGroupTask : public TaskRunner::Task { |
- public: |
- CreateContextGroupTask(v8::base::Semaphore* ready_semaphore, |
- int* context_group_id) |
- : ready_semaphore_(ready_semaphore), |
- context_group_id_(context_group_id) {} |
- virtual ~CreateContextGroupTask() = default; |
- bool is_inspector_task() final { return true; } |
- |
- private: |
- void Run() override { |
- *context_group_id_ = data()->CreateContextGroup(); |
- if (ready_semaphore_) ready_semaphore_->Signal(); |
- } |
- |
- v8::base::Semaphore* ready_semaphore_; |
- int* context_group_id_; |
-}; |
- |
-class ConnectSessionTask : public TaskRunner::Task { |
+class FrontendChannelImpl : public v8_inspector::V8Inspector::Channel { |
public: |
- ConnectSessionTask(v8::base::Semaphore* ready_semaphore, int context_group_id, |
- const v8::internal::Vector<uint16_t>& state, |
- int* session_id) |
- : ready_semaphore_(ready_semaphore), |
+ FrontendChannelImpl(TaskRunner* task_runner, int context_group_id, |
+ v8::Isolate* isolate, v8::Local<v8::Function> function) |
+ : task_runner_(task_runner), |
context_group_id_(context_group_id), |
- state_(state), |
- session_id_(session_id) {} |
- virtual ~ConnectSessionTask() = default; |
- bool is_inspector_task() final { return true; } |
+ function_(isolate, function) {} |
+ virtual ~FrontendChannelImpl() = default; |
+ |
+ void set_session_id(int session_id) { session_id_ = session_id; } |
private: |
- void Run() override { |
- v8_inspector::StringView state(state_.start(), state_.length()); |
- *session_id_ = data()->ConnectSession(context_group_id_, state); |
- if (ready_semaphore_) ready_semaphore_->Signal(); |
- } |
+ void sendResponse( |
+ int callId, |
+ std::unique_ptr<v8_inspector::StringBuffer> message) override { |
+ task_runner_->Append( |
+ new SendMessageTask(this, ToVector(message->string()))); |
+ } |
+ void sendNotification( |
+ std::unique_ptr<v8_inspector::StringBuffer> message) override { |
+ task_runner_->Append( |
+ new SendMessageTask(this, ToVector(message->string()))); |
+ } |
+ void flushProtocolNotifications() override {} |
+ |
+ class SendMessageTask : public TaskRunner::Task { |
+ public: |
+ SendMessageTask(FrontendChannelImpl* channel, |
+ const v8::internal::Vector<uint16_t>& message) |
+ : channel_(channel), message_(message) {} |
+ virtual ~SendMessageTask() {} |
+ bool is_priority_task() final { return false; } |
+ |
+ private: |
+ void Run(IsolateData* data) override { |
+ v8::MicrotasksScope microtasks_scope(data->isolate(), |
+ v8::MicrotasksScope::kRunMicrotasks); |
+ v8::HandleScope handle_scope(data->isolate()); |
+ v8::Local<v8::Context> context = |
+ data->GetContext(channel_->context_group_id_); |
+ v8::Context::Scope context_scope(context); |
+ v8::Local<v8::Value> message = ToV8String(data->isolate(), message_); |
+ v8::MaybeLocal<v8::Value> result; |
+ result = channel_->function_.Get(data->isolate()) |
+ ->Call(context, context->Global(), 1, &message); |
+ } |
+ FrontendChannelImpl* channel_; |
+ v8::internal::Vector<uint16_t> message_; |
+ }; |
- v8::base::Semaphore* ready_semaphore_; |
+ TaskRunner* task_runner_; |
int context_group_id_; |
- const v8::internal::Vector<uint16_t>& state_; |
- int* session_id_; |
+ v8::Global<v8::Function> function_; |
+ int session_id_; |
+ DISALLOW_COPY_AND_ASSIGN(FrontendChannelImpl); |
}; |
-class DisconnectSessionTask : public TaskRunner::Task { |
- public: |
- DisconnectSessionTask(v8::base::Semaphore* ready_semaphore, int session_id, |
- v8::internal::Vector<uint16_t>* state) |
- : ready_semaphore_(ready_semaphore), |
- session_id_(session_id), |
- state_(state) {} |
- virtual ~DisconnectSessionTask() = default; |
- bool is_inspector_task() final { return true; } |
+template <typename T> |
+void RunSyncTask(TaskRunner* task_runner, T callback) { |
+ class SyncTask : public TaskRunner::Task { |
+ public: |
+ SyncTask(v8::base::Semaphore* ready_semaphore, T callback) |
+ : ready_semaphore_(ready_semaphore), callback_(callback) {} |
+ virtual ~SyncTask() = default; |
+ bool is_priority_task() final { return true; } |
+ |
+ private: |
+ void Run(IsolateData* data) override { |
+ callback_(data); |
+ if (ready_semaphore_) ready_semaphore_->Signal(); |
+ } |
- private: |
- void Run() override { |
- std::unique_ptr<v8_inspector::StringBuffer> state = |
- data()->DisconnectSession(session_id_); |
- *state_ = ToVector(state->string()); |
- if (ready_semaphore_) ready_semaphore_->Signal(); |
- } |
+ v8::base::Semaphore* ready_semaphore_; |
+ T callback_; |
+ }; |
- v8::base::Semaphore* ready_semaphore_; |
- int session_id_; |
- v8::internal::Vector<uint16_t>* state_; |
-}; |
+ v8::base::Semaphore ready_semaphore(0); |
+ task_runner->Append(new SyncTask(&ready_semaphore, callback)); |
+ ready_semaphore.Wait(); |
+} |
class SendMessageToBackendTask : public TaskRunner::Task { |
public: |
- explicit SendMessageToBackendTask( |
- int session_id, const v8::internal::Vector<uint16_t>& message) |
+ SendMessageToBackendTask(int session_id, |
+ const v8::internal::Vector<uint16_t>& message) |
: session_id_(session_id), message_(message) {} |
- bool is_inspector_task() final { return true; } |
+ bool is_priority_task() final { return true; } |
private: |
- void Run() override { |
+ void Run(IsolateData* data) override { |
v8_inspector::StringView message_view(message_.start(), message_.length()); |
- data()->SendMessage(session_id_, message_view); |
+ data->SendMessage(session_id_, message_view); |
} |
int session_id_; |
v8::internal::Vector<uint16_t> message_; |
}; |
-class SchedulePauseOnNextStatementTask : public TaskRunner::Task { |
- public: |
- SchedulePauseOnNextStatementTask( |
- v8::base::Semaphore* ready_semaphore, int context_group_id, |
- const v8::internal::Vector<uint16_t>& reason, |
- const v8::internal::Vector<uint16_t>& details) |
- : ready_semaphore_(ready_semaphore), |
- context_group_id_(context_group_id), |
- reason_(reason), |
- details_(details) {} |
- virtual ~SchedulePauseOnNextStatementTask() = default; |
- bool is_inspector_task() final { return true; } |
+void RunAsyncTask(TaskRunner* task_runner, const char* task_name, |
+ TaskRunner::Task* task) { |
+ class AsyncTask : public TaskRunner::Task { |
+ public: |
+ explicit AsyncTask(TaskRunner::Task* inner) : inner_(inner) {} |
+ virtual ~AsyncTask() = default; |
+ bool is_priority_task() override { return inner_->is_priority_task(); } |
+ void Run(IsolateData* data) override { |
+ data->AsyncTaskStarted(inner_.get()); |
+ inner_->Run(data); |
+ data->AsyncTaskFinished(inner_.get()); |
+ } |
- private: |
- void Run() override { |
- v8_inspector::StringView reason(reason_.start(), reason_.length()); |
- v8_inspector::StringView details(details_.start(), details_.length()); |
- data()->SchedulePauseOnNextStatement(context_group_id_, reason, details); |
- if (ready_semaphore_) ready_semaphore_->Signal(); |
- } |
+ private: |
+ std::unique_ptr<TaskRunner::Task> inner_; |
+ DISALLOW_COPY_AND_ASSIGN(AsyncTask); |
+ }; |
- v8::base::Semaphore* ready_semaphore_; |
- int context_group_id_; |
- const v8::internal::Vector<uint16_t>& reason_; |
- const v8::internal::Vector<uint16_t>& details_; |
-}; |
+ task_runner->data()->AsyncTaskScheduled( |
+ v8_inspector::StringView(reinterpret_cast<const uint8_t*>(task_name), |
+ strlen(task_name)), |
+ task, false); |
+ task_runner->Append(new AsyncTask(task)); |
+} |
-class CancelPauseOnNextStatementTask : public TaskRunner::Task { |
+class ExecuteStringTask : public TaskRunner::Task { |
public: |
- CancelPauseOnNextStatementTask(v8::base::Semaphore* ready_semaphore, |
- int context_group_id) |
- : ready_semaphore_(ready_semaphore), |
+ ExecuteStringTask(int context_group_id, |
+ const v8::internal::Vector<uint16_t>& expression, |
+ v8::Local<v8::String> name, |
+ v8::Local<v8::Integer> line_offset, |
+ v8::Local<v8::Integer> column_offset, |
+ v8::Local<v8::Boolean> is_module) |
+ : expression_(expression), |
+ name_(ToVector(name)), |
+ line_offset_(line_offset.As<v8::Int32>()->Value()), |
+ column_offset_(column_offset.As<v8::Int32>()->Value()), |
+ is_module_(is_module->Value()), |
context_group_id_(context_group_id) {} |
- virtual ~CancelPauseOnNextStatementTask() = default; |
- bool is_inspector_task() final { return true; } |
- |
- private: |
- void Run() override { |
- data()->CancelPauseOnNextStatement(context_group_id_); |
- if (ready_semaphore_) ready_semaphore_->Signal(); |
- } |
- |
- v8::base::Semaphore* ready_semaphore_; |
- int context_group_id_; |
-}; |
- |
-class SendMessageToFrontendTask : public TaskRunner::Task { |
- public: |
- SendMessageToFrontendTask(int context_group_id, int session_id, |
- const v8::internal::Vector<uint16_t>& message) |
- : context_group_id_(context_group_id), |
- session_id_(session_id), |
- message_(message) {} |
- virtual ~SendMessageToFrontendTask() {} |
- |
- bool is_inspector_task() final { return false; } |
- |
- static void Register(int session_id, v8::Isolate* isolate, |
- v8::Local<v8::Function> dispatcher) { |
- dispatchers_[session_id].Reset(isolate, dispatcher); |
- } |
- |
- static void Unregister(int session_id) { dispatchers_.erase(session_id); } |
- |
- private: |
- void Run() override { |
- v8::MicrotasksScope microtasks_scope(isolate(), |
+ ExecuteStringTask(const v8::internal::Vector<const char>& expression, |
+ int context_group_id) |
+ : expression_utf8_(expression), context_group_id_(context_group_id) {} |
+ bool is_priority_task() override { return false; } |
+ void Run(IsolateData* data) override { |
+ v8::MicrotasksScope microtasks_scope(data->isolate(), |
v8::MicrotasksScope::kRunMicrotasks); |
- v8::HandleScope handle_scope(isolate()); |
- v8::Local<v8::Context> context = data()->GetContext(context_group_id_); |
+ v8::HandleScope handle_scope(data->isolate()); |
+ v8::Local<v8::Context> context = data->GetContext(context_group_id_); |
v8::Context::Scope context_scope(context); |
+ v8::ScriptOrigin origin( |
+ ToV8String(data->isolate(), name_), |
+ v8::Integer::New(data->isolate(), line_offset_), |
+ v8::Integer::New(data->isolate(), column_offset_), |
+ /* resource_is_shared_cross_origin */ v8::Local<v8::Boolean>(), |
+ /* script_id */ v8::Local<v8::Integer>(), |
+ /* source_map_url */ v8::Local<v8::Value>(), |
+ /* resource_is_opaque */ v8::Local<v8::Boolean>(), |
+ /* is_wasm */ v8::Local<v8::Boolean>(), |
+ v8::Boolean::New(data->isolate(), is_module_)); |
+ v8::Local<v8::String> source; |
+ if (expression_.length()) |
+ source = ToV8String(data->isolate(), expression_); |
+ else |
+ source = ToV8String(data->isolate(), expression_utf8_.start(), |
+ expression_utf8_.length()); |
- if (dispatchers_.find(session_id_) == dispatchers_.end()) return; |
- v8::Local<v8::Function> function = dispatchers_[session_id_].Get(isolate()); |
- v8::Local<v8::Value> message = |
- v8::String::NewFromTwoByte(isolate(), message_.start(), |
- v8::NewStringType::kNormal, |
- static_cast<int>(message_.size())) |
- .ToLocalChecked(); |
- v8::MaybeLocal<v8::Value> result; |
- result = function->Call(context, context->Global(), 1, &message); |
+ v8::ScriptCompiler::Source scriptSource(source, origin); |
+ if (!is_module_) { |
+ v8::Local<v8::Script> script; |
+ if (!v8::ScriptCompiler::Compile(context, &scriptSource).ToLocal(&script)) |
+ return; |
+ v8::MaybeLocal<v8::Value> result; |
+ result = script->Run(context); |
+ } else { |
+ data->RegisterModule(context, name_, &scriptSource); |
+ } |
} |
- static std::map<int, v8::Global<v8::Function>> dispatchers_; |
+ private: |
+ v8::internal::Vector<uint16_t> expression_; |
+ v8::internal::Vector<const char> expression_utf8_; |
+ v8::internal::Vector<uint16_t> name_; |
+ int32_t line_offset_ = 0; |
+ int32_t column_offset_ = 0; |
+ bool is_module_ = false; |
int context_group_id_; |
- int session_id_; |
- v8::internal::Vector<uint16_t> message_; |
-}; |
-std::map<int, v8::Global<v8::Function>> SendMessageToFrontendTask::dispatchers_; |
+ DISALLOW_COPY_AND_ASSIGN(ExecuteStringTask); |
+}; |
class UtilsExtension : public IsolateData::SetupGlobalTask { |
public: |
@@ -346,10 +372,7 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
std::string filename(*str, str.length()); |
*chars = v8::internal::ReadFile(filename.c_str(), &exists); |
if (!exists) { |
- isolate->ThrowException( |
- v8::String::NewFromUtf8(isolate, "Error reading file", |
- v8::NewStringType::kNormal) |
- .ToLocalChecked()); |
+ isolate->ThrowException(ToV8String(isolate, "Error reading file")); |
return false; |
} |
return true; |
@@ -362,12 +385,8 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
} |
v8::internal::Vector<const char> chars; |
v8::Isolate* isolate = args.GetIsolate(); |
- if (ReadFile(isolate, args[0], &chars)) { |
- args.GetReturnValue().Set( |
- v8::String::NewFromUtf8(isolate, chars.start(), |
- v8::NewStringType::kNormal, chars.length()) |
- .ToLocalChecked()); |
- } |
+ if (ReadFile(isolate, args[0], &chars)) |
+ args.GetReturnValue().Set(ToV8String(isolate, chars.start())); |
} |
static void Load(const v8::FunctionCallbackInfo<v8::Value>& args) { |
@@ -381,7 +400,7 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
IsolateData* data = IsolateData::FromContext(context); |
int context_group_id = data->GetContextGroupId(context); |
if (ReadFile(isolate, args[0], &chars)) { |
- ExecuteStringTask(chars, context_group_id).RunOnIsolate(data); |
+ ExecuteStringTask(chars, context_group_id).Run(data); |
} |
} |
@@ -398,10 +417,9 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
} |
backend_runner_->Append(new ExecuteStringTask( |
- nullptr, args[0].As<v8::Int32>()->Value(), nullptr, |
- ToVector(args[1].As<v8::String>()), args[2].As<v8::String>(), |
- args[3].As<v8::Int32>(), args[4].As<v8::Int32>(), |
- args[5].As<v8::Boolean>())); |
+ args[0].As<v8::Int32>()->Value(), ToVector(args[1].As<v8::String>()), |
+ args[2].As<v8::String>(), args[3].As<v8::Int32>(), |
+ args[4].As<v8::Int32>(), args[5].As<v8::Boolean>())); |
} |
static void SetCurrentTimeMSForTest( |
@@ -434,10 +452,14 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
} |
v8::internal::Vector<uint16_t> reason = ToVector(args[1].As<v8::String>()); |
v8::internal::Vector<uint16_t> details = ToVector(args[2].As<v8::String>()); |
- v8::base::Semaphore ready_semaphore(0); |
- backend_runner_->Append(new SchedulePauseOnNextStatementTask( |
- &ready_semaphore, args[0].As<v8::Int32>()->Value(), reason, details)); |
- ready_semaphore.Wait(); |
+ int context_group_id = args[0].As<v8::Int32>()->Value(); |
+ RunSyncTask(backend_runner_, [&context_group_id, &reason, |
+ &details](IsolateData* data) { |
+ data->SchedulePauseOnNextStatement( |
+ context_group_id, |
+ v8_inspector::StringView(reason.start(), reason.length()), |
+ v8_inspector::StringView(details.start(), details.length())); |
+ }); |
} |
static void CancelPauseOnNextStatement( |
@@ -447,10 +469,10 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
"Internal error: cancelPauseOnNextStatement(context_group_id)."); |
Exit(); |
} |
- v8::base::Semaphore ready_semaphore(0); |
- backend_runner_->Append(new CancelPauseOnNextStatementTask( |
- &ready_semaphore, args[0].As<v8::Int32>()->Value())); |
- ready_semaphore.Wait(); |
+ int context_group_id = args[0].As<v8::Int32>()->Value(); |
+ RunSyncTask(backend_runner_, [&context_group_id](IsolateData* data) { |
+ data->CancelPauseOnNextStatement(context_group_id); |
+ }); |
} |
static void SetLogConsoleApiMessageCalls( |
@@ -469,11 +491,10 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
fprintf(stderr, "Internal error: createContextGroup()."); |
Exit(); |
} |
- v8::base::Semaphore ready_semaphore(0); |
int context_group_id = 0; |
- backend_runner_->Append( |
- new CreateContextGroupTask(&ready_semaphore, &context_group_id)); |
- ready_semaphore.Wait(); |
+ RunSyncTask(backend_runner_, [&context_group_id](IsolateData* data) { |
+ context_group_id = data->CreateContextGroup(); |
+ }); |
args.GetReturnValue().Set( |
v8::Int32::New(args.GetIsolate(), context_group_id)); |
} |
@@ -486,15 +507,24 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
"dispatch)."); |
Exit(); |
} |
+ v8::Local<v8::Context> context = args.GetIsolate()->GetCurrentContext(); |
+ FrontendChannelImpl* channel = new FrontendChannelImpl( |
+ IsolateData::FromContext(context)->task_runner(), |
+ IsolateData::FromContext(context)->GetContextGroupId(context), |
+ args.GetIsolate(), args[2].As<v8::Function>()); |
+ |
v8::internal::Vector<uint16_t> state = ToVector(args[1].As<v8::String>()); |
- v8::base::Semaphore ready_semaphore(0); |
+ int context_group_id = args[0].As<v8::Int32>()->Value(); |
int session_id = 0; |
- backend_runner_->Append(new ConnectSessionTask( |
- &ready_semaphore, args[0].As<v8::Int32>()->Value(), state, |
- &session_id)); |
- ready_semaphore.Wait(); |
- SendMessageToFrontendTask::Register(session_id, args.GetIsolate(), |
- args[2].As<v8::Function>()); |
+ RunSyncTask(backend_runner_, [&context_group_id, &session_id, &channel, |
+ &state](IsolateData* data) { |
+ session_id = data->ConnectSession( |
+ context_group_id, |
+ v8_inspector::StringView(state.start(), state.length()), channel); |
+ channel->set_session_id(session_id); |
+ }); |
+ |
+ channels_[session_id].reset(channel); |
args.GetReturnValue().Set(v8::Int32::New(args.GetIsolate(), session_id)); |
} |
@@ -505,17 +535,12 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
Exit(); |
} |
int session_id = args[0].As<v8::Int32>()->Value(); |
- SendMessageToFrontendTask::Unregister(session_id); |
- v8::base::Semaphore ready_semaphore(0); |
v8::internal::Vector<uint16_t> state; |
- backend_runner_->Append( |
- new DisconnectSessionTask(&ready_semaphore, session_id, &state)); |
- ready_semaphore.Wait(); |
- args.GetReturnValue().Set( |
- v8::String::NewFromTwoByte(args.GetIsolate(), state.start(), |
- v8::NewStringType::kNormal, |
- static_cast<int>(state.size())) |
- .ToLocalChecked()); |
+ RunSyncTask(backend_runner_, [&session_id, &state](IsolateData* data) { |
+ state = ToVector(data->DisconnectSession(session_id)->string()); |
+ }); |
+ channels_.erase(session_id); |
+ args.GetReturnValue().Set(ToV8String(args.GetIsolate(), state)); |
} |
static void SendMessageToBackend( |
@@ -528,30 +553,30 @@ class UtilsExtension : public IsolateData::SetupGlobalTask { |
backend_runner_->Append(new SendMessageToBackendTask( |
args[0].As<v8::Int32>()->Value(), ToVector(args[1].As<v8::String>()))); |
} |
+ |
+ static std::map<int, std::unique_ptr<FrontendChannelImpl>> channels_; |
}; |
TaskRunner* UtilsExtension::backend_runner_ = nullptr; |
+std::map<int, std::unique_ptr<FrontendChannelImpl>> UtilsExtension::channels_; |
-class SetTimeoutTask : public AsyncTask { |
+class SetTimeoutTask : public TaskRunner::Task { |
public: |
- SetTimeoutTask(IsolateData* data, int context_group_id, const char* task_name, |
+ SetTimeoutTask(int context_group_id, v8::Isolate* isolate, |
v8::Local<v8::Function> function) |
- : AsyncTask(data, task_name), |
- function_(data->isolate(), function), |
- context_group_id_(context_group_id) {} |
+ : function_(isolate, function), context_group_id_(context_group_id) {} |
virtual ~SetTimeoutTask() {} |
- |
- bool is_inspector_task() final { return false; } |
+ bool is_priority_task() final { return false; } |
private: |
- void AsyncRun() override { |
- v8::MicrotasksScope microtasks_scope(isolate(), |
+ void Run(IsolateData* data) override { |
+ v8::MicrotasksScope microtasks_scope(data->isolate(), |
v8::MicrotasksScope::kRunMicrotasks); |
- v8::HandleScope handle_scope(isolate()); |
- v8::Local<v8::Context> context = data()->GetContext(context_group_id_); |
+ v8::HandleScope handle_scope(data->isolate()); |
+ v8::Local<v8::Context> context = data->GetContext(context_group_id_); |
v8::Context::Scope context_scope(context); |
- v8::Local<v8::Function> function = function_.Get(isolate()); |
+ v8::Local<v8::Function> function = function_.Get(data->isolate()); |
v8::MaybeLocal<v8::Value> result; |
result = function->Call(context, context->Global(), 0, nullptr); |
} |
@@ -583,18 +608,18 @@ class SetTimeoutExtension : public IsolateData::SetupGlobalTask { |
v8::Local<v8::Context> context = isolate->GetCurrentContext(); |
IsolateData* data = IsolateData::FromContext(context); |
int context_group_id = data->GetContextGroupId(context); |
- std::unique_ptr<TaskRunner::Task> task; |
if (args[0]->IsFunction()) { |
- task.reset(new SetTimeoutTask(data, context_group_id, "setTimeout", |
- v8::Local<v8::Function>::Cast(args[0]))); |
+ RunAsyncTask(data->task_runner(), "setTimeout", |
+ new SetTimeoutTask(context_group_id, isolate, |
+ v8::Local<v8::Function>::Cast(args[0]))); |
} else { |
- task.reset(new ExecuteStringTask( |
- data, context_group_id, "setTimeout", |
- ToVector(args[0].As<v8::String>()), v8::String::Empty(isolate), |
- v8::Integer::New(isolate, 0), v8::Integer::New(isolate, 0), |
- v8::Boolean::New(isolate, false))); |
+ RunAsyncTask( |
+ data->task_runner(), "setTimeout", |
+ new ExecuteStringTask( |
+ context_group_id, ToVector(args[0].As<v8::String>()), |
+ v8::String::Empty(isolate), v8::Integer::New(isolate, 0), |
+ v8::Integer::New(isolate, 0), v8::Boolean::New(isolate, false))); |
} |
- data->task_runner()->Append(task.release()); |
} |
}; |
@@ -661,10 +686,8 @@ class InspectorExtension : public IsolateData::SetupGlobalTask { |
fprintf(stderr, "Internal error: setMaxAsyncTaskStacks(max)."); |
Exit(); |
} |
- v8_inspector::SetMaxAsyncTaskStacksForTest( |
- IsolateData::FromContext(args.GetIsolate()->GetCurrentContext()) |
- ->inspector(), |
- args[0].As<v8::Int32>()->Value()); |
+ IsolateData::FromContext(args.GetIsolate()->GetCurrentContext()) |
+ ->SetMaxAsyncTaskStacksForTest(args[0].As<v8::Int32>()->Value()); |
} |
static void DumpAsyncTaskStacksStateForTest( |
@@ -673,9 +696,8 @@ class InspectorExtension : public IsolateData::SetupGlobalTask { |
fprintf(stderr, "Internal error: dumpAsyncTaskStacksStateForTest()."); |
Exit(); |
} |
- v8_inspector::DumpAsyncTaskStacksStateForTest( |
- IsolateData::FromContext(args.GetIsolate()->GetCurrentContext()) |
- ->inspector()); |
+ IsolateData::FromContext(args.GetIsolate()->GetCurrentContext()) |
+ ->DumpAsyncTaskStacksStateForTest(); |
} |
static void BreakProgram(const v8::FunctionCallbackInfo<v8::Value>& args) { |
@@ -739,9 +761,7 @@ class InspectorExtension : public IsolateData::SetupGlobalTask { |
v8::Local<v8::Object> object = args[0].As<v8::Object>(); |
v8::Isolate* isolate = args.GetIsolate(); |
v8::Local<v8::Private> shouldFormatAccessorsPrivate = v8::Private::ForApi( |
- isolate, v8::String::NewFromUtf8(isolate, "allowAccessorFormatting", |
- v8::NewStringType::kNormal) |
- .ToLocalChecked()); |
+ isolate, ToV8String(isolate, "allowAccessorFormatting")); |
object |
->SetPrivate(isolate->GetCurrentContext(), shouldFormatAccessorsPrivate, |
v8::Null(isolate)) |
@@ -749,24 +769,6 @@ class InspectorExtension : public IsolateData::SetupGlobalTask { |
} |
}; |
-class FrontendChannelImpl : public IsolateData::FrontendChannel { |
- public: |
- FrontendChannelImpl(TaskRunner* frontend_task_runner, int context_group_id) |
- : frontend_task_runner_(frontend_task_runner), |
- context_group_id_(context_group_id) {} |
- virtual ~FrontendChannelImpl() {} |
- |
- void SendMessageToFrontend(int session_id, |
- const v8_inspector::StringView& message) final { |
- frontend_task_runner_->Append(new SendMessageToFrontendTask( |
- context_group_id_, session_id, ToVector(message))); |
- } |
- |
- private: |
- TaskRunner* frontend_task_runner_; |
- int context_group_id_; |
-}; |
- |
} // namespace |
int main(int argc, char* argv[]) { |
@@ -792,22 +794,21 @@ int main(int argc, char* argv[]) { |
IsolateData::SetupGlobalTasks frontend_extensions; |
frontend_extensions.emplace_back(new UtilsExtension()); |
TaskRunner frontend_runner(std::move(frontend_extensions), true, |
- &ready_semaphore, nullptr, nullptr); |
+ &ready_semaphore, nullptr, false); |
ready_semaphore.Wait(); |
int frontend_context_group_id = 0; |
- frontend_runner.Append( |
- new CreateContextGroupTask(&ready_semaphore, &frontend_context_group_id)); |
- ready_semaphore.Wait(); |
+ RunSyncTask(&frontend_runner, |
+ [&frontend_context_group_id](IsolateData* data) { |
+ frontend_context_group_id = data->CreateContextGroup(); |
+ }); |
IsolateData::SetupGlobalTasks backend_extensions; |
backend_extensions.emplace_back(new SetTimeoutExtension()); |
backend_extensions.emplace_back(new InspectorExtension()); |
- FrontendChannelImpl frontend_channel(&frontend_runner, |
- frontend_context_group_id); |
- TaskRunner backend_runner( |
- std::move(backend_extensions), false, &ready_semaphore, |
- startup_data.data ? &startup_data : nullptr, &frontend_channel); |
+ TaskRunner backend_runner(std::move(backend_extensions), false, |
+ &ready_semaphore, |
+ startup_data.data ? &startup_data : nullptr, true); |
ready_semaphore.Wait(); |
UtilsExtension::set_backend_task_runner(&backend_runner); |