Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Side by Side Diff: test/inspector/inspector-test.cc

Issue 2574803002: [inspector] add async instrumentation for setTimeout in tests (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 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 #if !defined(_WIN32) && !defined(_WIN64) 5 #if !defined(_WIN32) && !defined(_WIN64)
6 #include <unistd.h> // NOLINT 6 #include <unistd.h> // NOLINT
7 #endif // !defined(_WIN32) && !defined(_WIN64) 7 #endif // !defined(_WIN32) && !defined(_WIN64)
8 8
9 #include <locale.h> 9 #include <locale.h>
10 10
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 if (args.Length() != 4 || !args[0]->IsString() || !args[1]->IsString() || 170 if (args.Length() != 4 || !args[0]->IsString() || !args[1]->IsString() ||
171 !args[2]->IsInt32() || !args[3]->IsInt32()) { 171 !args[2]->IsInt32() || !args[3]->IsInt32()) {
172 fprintf(stderr, 172 fprintf(stderr,
173 "Internal error: compileAndRunWithOrigin(source, name, line, " 173 "Internal error: compileAndRunWithOrigin(source, name, line, "
174 "column)."); 174 "column).");
175 Exit(); 175 Exit();
176 } 176 }
177 177
178 backend_runner_->Append(new ExecuteStringTask( 178 backend_runner_->Append(new ExecuteStringTask(
179 ToVector(args[0].As<v8::String>()), args[1].As<v8::String>(), 179 ToVector(args[0].As<v8::String>()), args[1].As<v8::String>(),
180 args[2].As<v8::Int32>(), args[3].As<v8::Int32>())); 180 args[2].As<v8::Int32>(), args[3].As<v8::Int32>(), false));
181 } 181 }
182 }; 182 };
183 183
184 TaskRunner* UtilsExtension::backend_runner_ = nullptr; 184 TaskRunner* UtilsExtension::backend_runner_ = nullptr;
185 185
186 class SetTimeoutTask : public TaskRunner::Task { 186 class SetTimeoutTask : public TaskRunner::Task {
187 public: 187 public:
188 SetTimeoutTask(v8::Isolate* isolate, v8::Local<v8::Function> function) 188 SetTimeoutTask(v8::Isolate* isolate, v8::Local<v8::Function> function)
189 : function_(isolate, function) {} 189 : function_(isolate, function) {}
190 virtual ~SetTimeoutTask() {} 190 virtual ~SetTimeoutTask() {}
191 191
192 bool is_inspector_task() final { return false; } 192 bool is_inspector_task() final { return false; }
193 193
194 void Run(v8::Isolate* isolate, 194 void Run(v8::Isolate* isolate,
195 const v8::Global<v8::Context>& global_context) override { 195 const v8::Global<v8::Context>& global_context) override {
196 v8::MicrotasksScope microtasks_scope(isolate, 196 v8::MicrotasksScope microtasks_scope(isolate,
197 v8::MicrotasksScope::kRunMicrotasks); 197 v8::MicrotasksScope::kRunMicrotasks);
198 v8::HandleScope handle_scope(isolate); 198 v8::HandleScope handle_scope(isolate);
199 v8::Local<v8::Context> context = global_context.Get(isolate); 199 v8::Local<v8::Context> context = global_context.Get(isolate);
200 v8::Context::Scope context_scope(context); 200 v8::Context::Scope context_scope(context);
201 201
202 v8::Local<v8::Function> function = function_.Get(isolate); 202 v8::Local<v8::Function> function = function_.Get(isolate);
203 v8::MaybeLocal<v8::Value> result; 203 v8::MaybeLocal<v8::Value> result;
204 v8_inspector::V8Inspector* inspector = 204 v8_inspector::V8Inspector* inspector =
205 InspectorClientImpl::InspectorFromContext(context); 205 InspectorClientImpl::InspectorFromContext(context);
206 if (inspector) inspector->willExecuteScript(context, function->ScriptId()); 206 if (inspector) {
207 inspector->willExecuteScript(context, function->ScriptId());
208 inspector->asyncTaskStarted(this);
209 }
207 result = function->Call(context, context->Global(), 0, nullptr); 210 result = function->Call(context, context->Global(), 0, nullptr);
208 if (inspector) inspector->didExecuteScript(context); 211 if (inspector) {
212 inspector->asyncTaskFinished(this);
213 inspector->didExecuteScript(context);
214 }
209 } 215 }
210 216
211 private: 217 private:
212 v8::Global<v8::Function> function_; 218 v8::Global<v8::Function> function_;
213 }; 219 };
214 220
215 class SetTimeoutExtension : public v8::Extension { 221 class SetTimeoutExtension : public v8::Extension {
216 public: 222 public:
217 SetTimeoutExtension() 223 SetTimeoutExtension()
218 : v8::Extension("v8_inspector/setTimeout", 224 : v8::Extension("v8_inspector/setTimeout",
219 "native function setTimeout();") {} 225 "native function setTimeout();") {}
220 226
221 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate( 227 virtual v8::Local<v8::FunctionTemplate> GetNativeFunctionTemplate(
222 v8::Isolate* isolate, v8::Local<v8::String> name) { 228 v8::Isolate* isolate, v8::Local<v8::String> name) {
223 return v8::FunctionTemplate::New(isolate, SetTimeoutExtension::SetTimeout); 229 return v8::FunctionTemplate::New(isolate, SetTimeoutExtension::SetTimeout);
224 } 230 }
225 231
226 private: 232 private:
227 static void SetTimeout(const v8::FunctionCallbackInfo<v8::Value>& args) { 233 static void SetTimeout(const v8::FunctionCallbackInfo<v8::Value>& args) {
228 if (args.Length() != 2 || !args[1]->IsNumber() || 234 if (args.Length() != 2 || !args[1]->IsNumber() ||
229 (!args[0]->IsFunction() && !args[0]->IsString()) || 235 (!args[0]->IsFunction() && !args[0]->IsString()) ||
230 args[1].As<v8::Number>()->Value() != 0.0) { 236 args[1].As<v8::Number>()->Value() != 0.0) {
231 fprintf(stderr, 237 fprintf(stderr,
232 "Internal error: only setTimeout(function, 0) is supported."); 238 "Internal error: only setTimeout(function, 0) is supported.");
233 Exit(); 239 Exit();
234 } 240 }
235 v8::Isolate* isolate = args.GetIsolate(); 241 v8::Isolate* isolate = args.GetIsolate();
236 v8::Local<v8::Context> context = isolate->GetCurrentContext(); 242 v8::Local<v8::Context> context = isolate->GetCurrentContext();
243 std::unique_ptr<TaskRunner::Task> task;
237 if (args[0]->IsFunction()) { 244 if (args[0]->IsFunction()) {
238 TaskRunner::FromContext(context)->Append( 245 task.reset(
239 new SetTimeoutTask(isolate, v8::Local<v8::Function>::Cast(args[0]))); 246 new SetTimeoutTask(isolate, v8::Local<v8::Function>::Cast(args[0])));
240 } else { 247 } else {
241 TaskRunner::FromContext(context)->Append(new ExecuteStringTask( 248 task.reset(new ExecuteStringTask(
242 ToVector(args[0].As<v8::String>()), v8::String::Empty(isolate), 249 ToVector(args[0].As<v8::String>()), v8::String::Empty(isolate),
243 v8::Integer::New(isolate, 0), v8::Integer::New(isolate, 0))); 250 v8::Integer::New(isolate, 0), v8::Integer::New(isolate, 0), true));
244 } 251 }
252 const char* set_timeout = "setTimeout";
253 v8_inspector::V8Inspector* inspector =
254 InspectorClientImpl::InspectorFromContext(context);
255 if (inspector) {
256 inspector->asyncTaskScheduled(
dgozman 2016/12/13 17:31:54 Why doesn't ExecuteStringTask do this in construct
kozy 2016/12/13 18:24:26 Done.
257 v8_inspector::StringView(
258 reinterpret_cast<const uint8_t*>(set_timeout),
259 strlen(set_timeout)),
260 task.get(), false);
261 }
262 TaskRunner::FromContext(context)->Append(task.release());
245 } 263 }
246 }; 264 };
247 265
248 class InspectorExtension : public v8::Extension { 266 class InspectorExtension : public v8::Extension {
249 public: 267 public:
250 InspectorExtension() 268 InspectorExtension()
251 : v8::Extension("v8_inspector/inspector", 269 : v8::Extension("v8_inspector/inspector",
252 "native function attachInspector();" 270 "native function attachInspector();"
253 "native function detachInspector();") {} 271 "native function detachInspector();") {}
254 272
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 v8::Local<v8::String> message_string = ToString(isolate, message); 347 v8::Local<v8::String> message_string = ToString(isolate, message);
330 v8::Local<v8::String> suffix = 348 v8::Local<v8::String> suffix =
331 v8::String::NewFromUtf8(isolate, ")", v8::NewStringType::kInternalized) 349 v8::String::NewFromUtf8(isolate, ")", v8::NewStringType::kInternalized)
332 .ToLocalChecked(); 350 .ToLocalChecked();
333 351
334 v8::Local<v8::String> result = v8::String::Concat(prefix, message_string); 352 v8::Local<v8::String> result = v8::String::Concat(prefix, message_string);
335 result = v8::String::Concat(result, suffix); 353 result = v8::String::Concat(result, suffix);
336 354
337 frontend_task_runner_->Append(new ExecuteStringTask( 355 frontend_task_runner_->Append(new ExecuteStringTask(
338 ToVector(result), v8::String::Empty(isolate), 356 ToVector(result), v8::String::Empty(isolate),
339 v8::Integer::New(isolate, 0), v8::Integer::New(isolate, 0))); 357 v8::Integer::New(isolate, 0), v8::Integer::New(isolate, 0), false));
340 } 358 }
341 359
342 private: 360 private:
343 TaskRunner* frontend_task_runner_; 361 TaskRunner* frontend_task_runner_;
344 }; 362 };
345 363
346 } // namespace 364 } // namespace
347 365
348 int main(int argc, char* argv[]) { 366 int main(int argc, char* argv[]) {
349 v8::V8::InitializeICUDefaultLocation(argv[0]); 367 v8::V8::InitializeICUDefaultLocation(argv[0]);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 argv[i]); 417 argv[i]);
400 Exit(); 418 Exit();
401 } 419 }
402 frontend_runner.Append(new ExecuteStringTask(chars)); 420 frontend_runner.Append(new ExecuteStringTask(chars));
403 } 421 }
404 422
405 frontend_runner.Join(); 423 frontend_runner.Join();
406 backend_runner.Join(); 424 backend_runner.Join();
407 return 0; 425 return 0;
408 } 426 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698