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 "src/inspector/test-interface.h" |
8 #include "test/inspector/task-runner.h" | 8 #include "test/inspector/task-runner.h" |
9 | 9 |
10 namespace { | 10 namespace { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
47 : task_runner_(task_runner), | 47 : task_runner_(task_runner), |
48 setup_global_tasks_(std::move(setup_global_tasks)) { | 48 setup_global_tasks_(std::move(setup_global_tasks)) { |
49 v8::Isolate::CreateParams params; | 49 v8::Isolate::CreateParams params; |
50 params.array_buffer_allocator = | 50 params.array_buffer_allocator = |
51 v8::ArrayBuffer::Allocator::NewDefaultAllocator(); | 51 v8::ArrayBuffer::Allocator::NewDefaultAllocator(); |
52 params.snapshot_blob = startup_data; | 52 params.snapshot_blob = startup_data; |
53 isolate_ = v8::Isolate::New(params); | 53 isolate_ = v8::Isolate::New(params); |
54 isolate_->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped); | 54 isolate_->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped); |
55 if (with_inspector) { | 55 if (with_inspector) { |
56 isolate_->AddMessageListener(&IsolateData::MessageHandler); | 56 isolate_->AddMessageListener(&IsolateData::MessageHandler); |
| 57 isolate_->SetPromiseRejectCallback(&IsolateData::PromiseRejectHandler); |
57 inspector_ = v8_inspector::V8Inspector::create(isolate_, this); | 58 inspector_ = v8_inspector::V8Inspector::create(isolate_, this); |
58 } | 59 } |
59 } | 60 } |
60 | 61 |
61 IsolateData* IsolateData::FromContext(v8::Local<v8::Context> context) { | 62 IsolateData* IsolateData::FromContext(v8::Local<v8::Context> context) { |
62 return static_cast<IsolateData*>( | 63 return static_cast<IsolateData*>( |
63 context->GetAlignedPointerFromEmbedderData(kIsolateDataIndex)); | 64 context->GetAlignedPointerFromEmbedderData(kIsolateDataIndex)); |
64 } | 65 } |
65 | 66 |
66 int IsolateData::CreateContextGroup() { | 67 int IsolateData::CreateContextGroup() { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 | 185 |
185 void IsolateData::SetMaxAsyncTaskStacksForTest(int limit) { | 186 void IsolateData::SetMaxAsyncTaskStacksForTest(int limit) { |
186 v8_inspector::SetMaxAsyncTaskStacksForTest(inspector_.get(), limit); | 187 v8_inspector::SetMaxAsyncTaskStacksForTest(inspector_.get(), limit); |
187 } | 188 } |
188 | 189 |
189 void IsolateData::DumpAsyncTaskStacksStateForTest() { | 190 void IsolateData::DumpAsyncTaskStacksStateForTest() { |
190 v8_inspector::DumpAsyncTaskStacksStateForTest(inspector_.get()); | 191 v8_inspector::DumpAsyncTaskStacksStateForTest(inspector_.get()); |
191 } | 192 } |
192 | 193 |
193 // static | 194 // static |
194 void IsolateData::MessageHandler(v8::Local<v8::Message> message, | 195 int IsolateData::HandleMessage(v8::Local<v8::Message> message, |
195 v8::Local<v8::Value> exception) { | 196 v8::Local<v8::Value> exception) { |
196 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 197 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
197 v8::Local<v8::Context> context = isolate->GetEnteredContext(); | 198 v8::Local<v8::Context> context = isolate->GetEnteredContext(); |
198 if (context.IsEmpty()) return; | 199 if (context.IsEmpty()) return 0; |
199 v8_inspector::V8Inspector* inspector = | 200 v8_inspector::V8Inspector* inspector = |
200 IsolateData::FromContext(context)->inspector_.get(); | 201 IsolateData::FromContext(context)->inspector_.get(); |
201 | 202 |
202 v8::Local<v8::StackTrace> stack = message->GetStackTrace(); | 203 v8::Local<v8::StackTrace> stack = message->GetStackTrace(); |
203 int script_id = | 204 int script_id = |
204 static_cast<int>(message->GetScriptOrigin().ScriptID()->Value()); | 205 static_cast<int>(message->GetScriptOrigin().ScriptID()->Value()); |
205 if (!stack.IsEmpty() && stack->GetFrameCount() > 0) { | 206 if (!stack.IsEmpty() && stack->GetFrameCount() > 0) { |
206 int top_script_id = stack->GetFrame(0)->GetScriptId(); | 207 int top_script_id = stack->GetFrame(0)->GetScriptId(); |
207 if (top_script_id == script_id) script_id = 0; | 208 if (top_script_id == script_id) script_id = 0; |
208 } | 209 } |
209 int line_number = message->GetLineNumber(context).FromMaybe(0); | 210 int line_number = message->GetLineNumber(context).FromMaybe(0); |
210 int column_number = 0; | 211 int column_number = 0; |
211 if (message->GetStartColumn(context).IsJust()) | 212 if (message->GetStartColumn(context).IsJust()) |
212 column_number = message->GetStartColumn(context).FromJust() + 1; | 213 column_number = message->GetStartColumn(context).FromJust() + 1; |
213 | 214 |
214 v8_inspector::StringView detailed_message; | 215 v8_inspector::StringView detailed_message; |
215 v8::internal::Vector<uint16_t> message_text_string = ToVector(message->Get()); | 216 v8::internal::Vector<uint16_t> message_text_string = ToVector(message->Get()); |
216 v8_inspector::StringView message_text(message_text_string.start(), | 217 v8_inspector::StringView message_text(message_text_string.start(), |
217 message_text_string.length()); | 218 message_text_string.length()); |
218 v8::internal::Vector<uint16_t> url_string; | 219 v8::internal::Vector<uint16_t> url_string; |
219 if (message->GetScriptOrigin().ResourceName()->IsString()) { | 220 if (message->GetScriptOrigin().ResourceName()->IsString()) { |
220 url_string = | 221 url_string = |
221 ToVector(message->GetScriptOrigin().ResourceName().As<v8::String>()); | 222 ToVector(message->GetScriptOrigin().ResourceName().As<v8::String>()); |
222 } | 223 } |
223 v8_inspector::StringView url(url_string.start(), url_string.length()); | 224 v8_inspector::StringView url(url_string.start(), url_string.length()); |
224 | 225 |
225 inspector->exceptionThrown(context, message_text, exception, detailed_message, | 226 return inspector->exceptionThrown( |
226 url, line_number, column_number, | 227 context, message_text, exception, detailed_message, url, line_number, |
227 inspector->createStackTrace(stack), script_id); | 228 column_number, inspector->createStackTrace(stack), script_id); |
| 229 } |
| 230 |
| 231 // static |
| 232 void IsolateData::MessageHandler(v8::Local<v8::Message> message, |
| 233 v8::Local<v8::Value> exception) { |
| 234 HandleMessage(message, exception); |
| 235 } |
| 236 |
| 237 // static |
| 238 void IsolateData::PromiseRejectHandler(v8::PromiseRejectMessage data) { |
| 239 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 240 v8::Local<v8::Context> context = isolate->GetEnteredContext(); |
| 241 if (context.IsEmpty()) return; |
| 242 v8::Local<v8::Promise> promise = data.GetPromise(); |
| 243 v8::Local<v8::Private> id_private = v8::Private::ForApi( |
| 244 isolate, |
| 245 v8::String::NewFromUtf8(isolate, "id", v8::NewStringType::kNormal) |
| 246 .ToLocalChecked()); |
| 247 |
| 248 if (data.GetEvent() == v8::kPromiseHandlerAddedAfterReject) { |
| 249 v8::Local<v8::Value> id; |
| 250 if (!promise->GetPrivate(context, id_private).ToLocal(&id)) return; |
| 251 if (!id->IsInt32()) return; |
| 252 v8_inspector::V8Inspector* inspector = |
| 253 IsolateData::FromContext(context)->inspector_.get(); |
| 254 const char* reason_str = "Handler added to rejected promise"; |
| 255 inspector->exceptionRevoked( |
| 256 context, id.As<v8::Int32>()->Value(), |
| 257 v8_inspector::StringView(reinterpret_cast<const uint8_t*>(reason_str), |
| 258 strlen(reason_str))); |
| 259 return; |
| 260 } |
| 261 |
| 262 v8::Local<v8::Value> exception = data.GetValue(); |
| 263 int exception_id = HandleMessage( |
| 264 v8::Exception::CreateMessage(isolate, exception), exception); |
| 265 if (exception_id) { |
| 266 promise |
| 267 ->SetPrivate(isolate->GetCurrentContext(), id_private, |
| 268 v8::Int32::New(isolate, exception_id)) |
| 269 .ToChecked(); |
| 270 } |
228 } | 271 } |
229 | 272 |
230 void IsolateData::FireContextCreated(v8::Local<v8::Context> context, | 273 void IsolateData::FireContextCreated(v8::Local<v8::Context> context, |
231 int context_group_id) { | 274 int context_group_id) { |
232 v8_inspector::V8ContextInfo info(context, context_group_id, | 275 v8_inspector::V8ContextInfo info(context, context_group_id, |
233 v8_inspector::StringView()); | 276 v8_inspector::StringView()); |
234 info.hasMemoryOnConsole = true; | 277 info.hasMemoryOnConsole = true; |
235 inspector_->contextCreated(info); | 278 inspector_->contextCreated(info); |
236 } | 279 } |
237 | 280 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 unsigned lineNumber, unsigned columnNumber, | 346 unsigned lineNumber, unsigned columnNumber, |
304 v8_inspector::V8StackTrace* stack) { | 347 v8_inspector::V8StackTrace* stack) { |
305 if (!log_console_api_message_calls_) return; | 348 if (!log_console_api_message_calls_) return; |
306 Print(isolate_, message); | 349 Print(isolate_, message); |
307 fprintf(stdout, " ("); | 350 fprintf(stdout, " ("); |
308 Print(isolate_, url); | 351 Print(isolate_, url); |
309 fprintf(stdout, ":%d:%d)", lineNumber, columnNumber); | 352 fprintf(stdout, ":%d:%d)", lineNumber, columnNumber); |
310 Print(isolate_, stack->toString()->string()); | 353 Print(isolate_, stack->toString()->string()); |
311 fprintf(stdout, "\n"); | 354 fprintf(stdout, "\n"); |
312 } | 355 } |
OLD | NEW |