| OLD | NEW |
| 1 // Copyright 2017 the V8 project authors. All rights reserved. | 1 // Copyright 2017 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "test/inspector/isolate-data.h" | 5 #include "test/inspector/isolate-data.h" |
| 6 | 6 |
| 7 #include "src/inspector/test-interface.h" |
| 7 #include "test/inspector/task-runner.h" | 8 #include "test/inspector/task-runner.h" |
| 8 | 9 |
| 9 namespace { | 10 namespace { |
| 10 | 11 |
| 11 const int kIsolateDataIndex = 2; | 12 const int kIsolateDataIndex = 2; |
| 12 const int kContextGroupIdIndex = 3; | 13 const int kContextGroupIdIndex = 3; |
| 13 | 14 |
| 14 v8::internal::Vector<uint16_t> ToVector(v8::Local<v8::String> str) { | 15 v8::internal::Vector<uint16_t> ToVector(v8::Local<v8::String> str) { |
| 15 v8::internal::Vector<uint16_t> buffer = | 16 v8::internal::Vector<uint16_t> buffer = |
| 16 v8::internal::Vector<uint16_t>::New(str->Length()); | 17 v8::internal::Vector<uint16_t>::New(str->Length()); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 31 static_cast<int>(string.length())) | 32 static_cast<int>(string.length())) |
| 32 .ToLocalChecked(); | 33 .ToLocalChecked(); |
| 33 } | 34 } |
| 34 | 35 |
| 35 void Print(v8::Isolate* isolate, const v8_inspector::StringView& string) { | 36 void Print(v8::Isolate* isolate, const v8_inspector::StringView& string) { |
| 36 v8::Local<v8::String> v8_string = ToString(isolate, string); | 37 v8::Local<v8::String> v8_string = ToString(isolate, string); |
| 37 v8::String::Utf8Value utf8_string(v8_string); | 38 v8::String::Utf8Value utf8_string(v8_string); |
| 38 fwrite(*utf8_string, sizeof(**utf8_string), utf8_string.length(), stdout); | 39 fwrite(*utf8_string, sizeof(**utf8_string), utf8_string.length(), stdout); |
| 39 } | 40 } |
| 40 | 41 |
| 41 class ChannelImpl final : public v8_inspector::V8Inspector::Channel { | |
| 42 public: | |
| 43 ChannelImpl(IsolateData::FrontendChannel* frontend_channel, int session_id) | |
| 44 : frontend_channel_(frontend_channel), session_id_(session_id) {} | |
| 45 virtual ~ChannelImpl() = default; | |
| 46 | |
| 47 private: | |
| 48 void sendResponse( | |
| 49 int callId, | |
| 50 std::unique_ptr<v8_inspector::StringBuffer> message) override { | |
| 51 frontend_channel_->SendMessageToFrontend(session_id_, message->string()); | |
| 52 } | |
| 53 void sendNotification( | |
| 54 std::unique_ptr<v8_inspector::StringBuffer> message) override { | |
| 55 frontend_channel_->SendMessageToFrontend(session_id_, message->string()); | |
| 56 } | |
| 57 void flushProtocolNotifications() override {} | |
| 58 | |
| 59 IsolateData::FrontendChannel* frontend_channel_; | |
| 60 int session_id_; | |
| 61 DISALLOW_COPY_AND_ASSIGN(ChannelImpl); | |
| 62 }; | |
| 63 | |
| 64 } // namespace | 42 } // namespace |
| 65 | 43 |
| 66 IsolateData::IsolateData(TaskRunner* task_runner, | 44 IsolateData::IsolateData(TaskRunner* task_runner, |
| 67 IsolateData::SetupGlobalTasks setup_global_tasks, | 45 IsolateData::SetupGlobalTasks setup_global_tasks, |
| 68 v8::StartupData* startup_data, | 46 v8::StartupData* startup_data, bool with_inspector) |
| 69 FrontendChannel* channel) | |
| 70 : task_runner_(task_runner), | 47 : task_runner_(task_runner), |
| 71 setup_global_tasks_(std::move(setup_global_tasks)), | 48 setup_global_tasks_(std::move(setup_global_tasks)) { |
| 72 frontend_channel_(channel) { | |
| 73 v8::Isolate::CreateParams params; | 49 v8::Isolate::CreateParams params; |
| 74 params.array_buffer_allocator = | 50 params.array_buffer_allocator = |
| 75 v8::ArrayBuffer::Allocator::NewDefaultAllocator(); | 51 v8::ArrayBuffer::Allocator::NewDefaultAllocator(); |
| 76 params.snapshot_blob = startup_data; | 52 params.snapshot_blob = startup_data; |
| 77 isolate_ = v8::Isolate::New(params); | 53 isolate_ = v8::Isolate::New(params); |
| 78 isolate_->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped); | 54 isolate_->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped); |
| 79 if (frontend_channel_) { | 55 if (with_inspector) { |
| 80 isolate_->AddMessageListener(&IsolateData::MessageHandler); | 56 isolate_->AddMessageListener(&IsolateData::MessageHandler); |
| 81 inspector_ = v8_inspector::V8Inspector::create(isolate_, this); | 57 inspector_ = v8_inspector::V8Inspector::create(isolate_, this); |
| 82 } | 58 } |
| 83 } | 59 } |
| 84 | 60 |
| 85 IsolateData* IsolateData::FromContext(v8::Local<v8::Context> context) { | 61 IsolateData* IsolateData::FromContext(v8::Local<v8::Context> context) { |
| 86 return static_cast<IsolateData*>( | 62 return static_cast<IsolateData*>( |
| 87 context->GetAlignedPointerFromEmbedderData(kIsolateDataIndex)); | 63 context->GetAlignedPointerFromEmbedderData(kIsolateDataIndex)); |
| 88 } | 64 } |
| 89 | 65 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 134 // static | 110 // static |
| 135 v8::MaybeLocal<v8::Module> IsolateData::ModuleResolveCallback( | 111 v8::MaybeLocal<v8::Module> IsolateData::ModuleResolveCallback( |
| 136 v8::Local<v8::Context> context, v8::Local<v8::String> specifier, | 112 v8::Local<v8::Context> context, v8::Local<v8::String> specifier, |
| 137 v8::Local<v8::Module> referrer) { | 113 v8::Local<v8::Module> referrer) { |
| 138 std::string str = *v8::String::Utf8Value(specifier); | 114 std::string str = *v8::String::Utf8Value(specifier); |
| 139 IsolateData* data = IsolateData::FromContext(context); | 115 IsolateData* data = IsolateData::FromContext(context); |
| 140 return data->modules_[ToVector(specifier)].Get(data->isolate_); | 116 return data->modules_[ToVector(specifier)].Get(data->isolate_); |
| 141 } | 117 } |
| 142 | 118 |
| 143 int IsolateData::ConnectSession(int context_group_id, | 119 int IsolateData::ConnectSession(int context_group_id, |
| 144 const v8_inspector::StringView& state) { | 120 const v8_inspector::StringView& state, |
| 121 v8_inspector::V8Inspector::Channel* channel) { |
| 145 int session_id = ++last_session_id_; | 122 int session_id = ++last_session_id_; |
| 146 channels_[session_id].reset(new ChannelImpl(frontend_channel_, session_id)); | 123 sessions_[session_id] = inspector_->connect(context_group_id, channel, state); |
| 147 sessions_[session_id] = | |
| 148 inspector_->connect(context_group_id, channels_[session_id].get(), state); | |
| 149 context_group_by_session_[sessions_[session_id].get()] = context_group_id; | 124 context_group_by_session_[sessions_[session_id].get()] = context_group_id; |
| 150 return session_id; | 125 return session_id; |
| 151 } | 126 } |
| 152 | 127 |
| 153 std::unique_ptr<v8_inspector::StringBuffer> IsolateData::DisconnectSession( | 128 std::unique_ptr<v8_inspector::StringBuffer> IsolateData::DisconnectSession( |
| 154 int session_id) { | 129 int session_id) { |
| 155 auto it = sessions_.find(session_id); | 130 auto it = sessions_.find(session_id); |
| 156 CHECK(it != sessions_.end()); | 131 CHECK(it != sessions_.end()); |
| 157 context_group_by_session_.erase(it->second.get()); | 132 context_group_by_session_.erase(it->second.get()); |
| 158 std::unique_ptr<v8_inspector::StringBuffer> result = it->second->stateJSON(); | 133 std::unique_ptr<v8_inspector::StringBuffer> result = it->second->stateJSON(); |
| 159 sessions_.erase(it); | 134 sessions_.erase(it); |
| 160 channels_.erase(session_id); | |
| 161 return result; | 135 return result; |
| 162 } | 136 } |
| 163 | 137 |
| 164 void IsolateData::SendMessage(int session_id, | 138 void IsolateData::SendMessage(int session_id, |
| 165 const v8_inspector::StringView& message) { | 139 const v8_inspector::StringView& message) { |
| 166 auto it = sessions_.find(session_id); | 140 auto it = sessions_.find(session_id); |
| 167 if (it != sessions_.end()) it->second->dispatchProtocolMessage(message); | 141 if (it != sessions_.end()) it->second->dispatchProtocolMessage(message); |
| 168 } | 142 } |
| 169 | 143 |
| 170 void IsolateData::BreakProgram(int context_group_id, | 144 void IsolateData::BreakProgram(int context_group_id, |
| (...skipping 15 matching lines...) Expand all Loading... |
| 186 } | 160 } |
| 187 } | 161 } |
| 188 | 162 |
| 189 void IsolateData::CancelPauseOnNextStatement(int context_group_id) { | 163 void IsolateData::CancelPauseOnNextStatement(int context_group_id) { |
| 190 for (int session_id : GetSessionIds(context_group_id)) { | 164 for (int session_id : GetSessionIds(context_group_id)) { |
| 191 auto it = sessions_.find(session_id); | 165 auto it = sessions_.find(session_id); |
| 192 if (it != sessions_.end()) it->second->cancelPauseOnNextStatement(); | 166 if (it != sessions_.end()) it->second->cancelPauseOnNextStatement(); |
| 193 } | 167 } |
| 194 } | 168 } |
| 195 | 169 |
| 170 void IsolateData::AsyncTaskScheduled(const v8_inspector::StringView& name, |
| 171 void* task, bool recurring) { |
| 172 inspector_->asyncTaskScheduled(name, task, recurring); |
| 173 } |
| 174 |
| 175 void IsolateData::AsyncTaskStarted(void* task) { |
| 176 inspector_->asyncTaskStarted(task); |
| 177 } |
| 178 |
| 179 void IsolateData::AsyncTaskFinished(void* task) { |
| 180 inspector_->asyncTaskFinished(task); |
| 181 } |
| 182 |
| 183 void IsolateData::SetMaxAsyncTaskStacksForTest(int limit) { |
| 184 v8_inspector::SetMaxAsyncTaskStacksForTest(inspector_.get(), limit); |
| 185 } |
| 186 |
| 187 void IsolateData::DumpAsyncTaskStacksStateForTest() { |
| 188 v8_inspector::DumpAsyncTaskStacksStateForTest(inspector_.get()); |
| 189 } |
| 190 |
| 196 // static | 191 // static |
| 197 void IsolateData::MessageHandler(v8::Local<v8::Message> message, | 192 void IsolateData::MessageHandler(v8::Local<v8::Message> message, |
| 198 v8::Local<v8::Value> exception) { | 193 v8::Local<v8::Value> exception) { |
| 199 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 194 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 200 v8::Local<v8::Context> context = isolate->GetEnteredContext(); | 195 v8::Local<v8::Context> context = isolate->GetEnteredContext(); |
| 201 if (context.IsEmpty()) return; | 196 if (context.IsEmpty()) return; |
| 202 v8_inspector::V8Inspector* inspector = | 197 v8_inspector::V8Inspector* inspector = |
| 203 IsolateData::FromContext(context)->inspector_.get(); | 198 IsolateData::FromContext(context)->inspector_.get(); |
| 204 | 199 |
| 205 v8::Local<v8::StackTrace> stack = message->GetStackTrace(); | 200 v8::Local<v8::StackTrace> stack = message->GetStackTrace(); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 unsigned lineNumber, unsigned columnNumber, | 301 unsigned lineNumber, unsigned columnNumber, |
| 307 v8_inspector::V8StackTrace* stack) { | 302 v8_inspector::V8StackTrace* stack) { |
| 308 if (!log_console_api_message_calls_) return; | 303 if (!log_console_api_message_calls_) return; |
| 309 Print(isolate_, message); | 304 Print(isolate_, message); |
| 310 fprintf(stdout, " ("); | 305 fprintf(stdout, " ("); |
| 311 Print(isolate_, url); | 306 Print(isolate_, url); |
| 312 fprintf(stdout, ":%d:%d)", lineNumber, columnNumber); | 307 fprintf(stdout, ":%d:%d)", lineNumber, columnNumber); |
| 313 Print(isolate_, stack->toString()->string()); | 308 Print(isolate_, stack->toString()->string()); |
| 314 fprintf(stdout, "\n"); | 309 fprintf(stdout, "\n"); |
| 315 } | 310 } |
| OLD | NEW |