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

Side by Side Diff: Source/bindings/core/v8/ScriptDebugServer.cpp

Issue 374903002: DevTools: Async call stacks for Promises and Object.observe. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 5 months 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010-2011 Google Inc. All rights reserved. 2 * Copyright (c) 2010-2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 return nullptr; 345 return nullptr;
346 return JavaScriptCallFrame::create(v8::Debug::GetDebugContext(), v8::Handle< v8::Object>::Cast(currentCallFrameV8)); 346 return JavaScriptCallFrame::create(v8::Debug::GetDebugContext(), v8::Handle< v8::Object>::Cast(currentCallFrameV8));
347 } 347 }
348 348
349 ScriptValue ScriptDebugServer::currentCallFramesInner(ScopeInfoDetails scopeDeta ils) 349 ScriptValue ScriptDebugServer::currentCallFramesInner(ScopeInfoDetails scopeDeta ils)
350 { 350 {
351 if (!m_isolate->InContext()) 351 if (!m_isolate->InContext())
352 return ScriptValue(); 352 return ScriptValue();
353 v8::HandleScope handleScope(m_isolate); 353 v8::HandleScope handleScope(m_isolate);
354 354
355 // Filter out stack traces entirely consisting of V8's internal scripts.
356 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackTrace(m_i solate, 1);
357 if (!stackTrace->GetFrameCount())
358 return ScriptValue();
359
355 RefPtrWillBeRawPtr<JavaScriptCallFrame> currentCallFrame = wrapCallFrames(0, scopeDetails); 360 RefPtrWillBeRawPtr<JavaScriptCallFrame> currentCallFrame = wrapCallFrames(0, scopeDetails);
356 if (!currentCallFrame) 361 if (!currentCallFrame)
357 return ScriptValue(); 362 return ScriptValue();
358 363
359 ScriptState* scriptState = m_pausedScriptState ? m_pausedScriptState.get() : ScriptState::current(m_isolate); 364 ScriptState* scriptState = m_pausedScriptState ? m_pausedScriptState.get() : ScriptState::current(m_isolate);
360 ScriptState::Scope scope(scriptState); 365 ScriptState::Scope scope(scriptState);
361 return ScriptValue(scriptState, toV8(currentCallFrame.release(), scriptState ->context()->Global(), m_isolate)); 366 return ScriptValue(scriptState, toV8(currentCallFrame.release(), scriptState ->context()->Global(), m_isolate));
362 } 367 }
363 368
364 ScriptValue ScriptDebugServer::currentCallFrames() 369 ScriptValue ScriptDebugServer::currentCallFrames()
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
441 callDebuggerMethod(stepOutV8MethodName, 1, argv); 446 callDebuggerMethod(stepOutV8MethodName, 1, argv);
442 } 447 }
443 } 448 }
444 449
445 void ScriptDebugServer::v8DebugEventCallback(const v8::Debug::EventDetails& even tDetails) 450 void ScriptDebugServer::v8DebugEventCallback(const v8::Debug::EventDetails& even tDetails)
446 { 451 {
447 ScriptDebugServer* thisPtr = toScriptDebugServer(eventDetails.GetCallbackDat a()); 452 ScriptDebugServer* thisPtr = toScriptDebugServer(eventDetails.GetCallbackDat a());
448 thisPtr->handleV8DebugEvent(eventDetails); 453 thisPtr->handleV8DebugEvent(eventDetails);
449 } 454 }
450 455
456 static v8::Handle<v8::Value> callInternalGetterFunction(v8::Handle<v8::Object> o bject, const char* functionName, v8::Isolate* isolate)
457 {
458 v8::Handle<v8::Value> getterValue = object->Get(v8AtomicString(isolate, func tionName));
459 ASSERT(!getterValue.IsEmpty() && getterValue->IsFunction());
460 return V8ScriptRunner::callInternalFunction(v8::Handle<v8::Function>::Cast(g etterValue), object, 0, 0, isolate);
461 }
462
451 void ScriptDebugServer::handleV8DebugEvent(const v8::Debug::EventDetails& eventD etails) 463 void ScriptDebugServer::handleV8DebugEvent(const v8::Debug::EventDetails& eventD etails)
452 { 464 {
453 v8::DebugEvent event = eventDetails.GetEvent(); 465 v8::DebugEvent event = eventDetails.GetEvent();
454 466
455 if (event == v8::BreakForCommand) { 467 if (event == v8::BreakForCommand) {
456 ClientDataImpl* data = static_cast<ClientDataImpl*>(eventDetails.GetClie ntData()); 468 ClientDataImpl* data = static_cast<ClientDataImpl*>(eventDetails.GetClie ntData());
457 data->task()->run(); 469 data->task()->run();
458 return; 470 return;
459 } 471 }
460 472
461 if (event != v8::Break && event != v8::Exception && event != v8::AfterCompil e && event != v8::BeforeCompile) 473 if (event != v8::AsyncTaskEvent && event != v8::Break && event != v8::Except ion && event != v8::AfterCompile && event != v8::BeforeCompile)
462 return; 474 return;
463 475
464 v8::Handle<v8::Context> eventContext = eventDetails.GetEventContext(); 476 v8::Handle<v8::Context> eventContext = eventDetails.GetEventContext();
465 ASSERT(!eventContext.IsEmpty()); 477 ASSERT(!eventContext.IsEmpty());
466 478
467 ScriptDebugListener* listener = getDebugListenerForContext(eventContext); 479 ScriptDebugListener* listener = getDebugListenerForContext(eventContext);
468 if (listener) { 480 if (listener) {
469 v8::HandleScope scope(m_isolate); 481 v8::HandleScope scope(m_isolate);
470 v8::Handle<v8::Object> debuggerScript = m_debuggerScript.newLocal(m_isol ate); 482 v8::Handle<v8::Object> debuggerScript = m_debuggerScript.newLocal(m_isol ate);
471 if (event == v8::BeforeCompile) { 483 if (event == v8::BeforeCompile) {
472 preprocessBeforeCompile(eventDetails); 484 preprocessBeforeCompile(eventDetails);
473 } else if (event == v8::AfterCompile) { 485 } else if (event == v8::AfterCompile) {
474 v8::Context::Scope contextScope(v8::Debug::GetDebugContext()); 486 v8::Context::Scope contextScope(v8::Debug::GetDebugContext());
475 v8::Handle<v8::Function> getAfterCompileScript = v8::Local<v8::Funct ion>::Cast(debuggerScript->Get(v8AtomicString(m_isolate, "getAfterCompileScript" ))); 487 v8::Handle<v8::Function> getAfterCompileScript = v8::Local<v8::Funct ion>::Cast(debuggerScript->Get(v8AtomicString(m_isolate, "getAfterCompileScript" )));
476 v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() }; 488 v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() };
477 v8::Handle<v8::Value> value = V8ScriptRunner::callInternalFunction(g etAfterCompileScript, debuggerScript, WTF_ARRAY_LENGTH(argv), argv, m_isolate); 489 v8::Handle<v8::Value> value = V8ScriptRunner::callInternalFunction(g etAfterCompileScript, debuggerScript, WTF_ARRAY_LENGTH(argv), argv, m_isolate);
478 ASSERT(value->IsObject()); 490 ASSERT(value->IsObject());
479 v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(value); 491 v8::Handle<v8::Object> object = v8::Handle<v8::Object>::Cast(value);
480 dispatchDidParseSource(listener, object); 492 dispatchDidParseSource(listener, object);
481 } else if (event == v8::Exception) { 493 } else if (event == v8::Exception) {
482 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackT race(m_isolate, 1); 494 v8::Local<v8::StackTrace> stackTrace = v8::StackTrace::CurrentStackT race(m_isolate, 1);
483 // Stack trace is empty in case of syntax error. Silently continue e xecution in such cases. 495 // Stack trace is empty in case of syntax error. Silently continue e xecution in such cases.
484 if (!stackTrace->GetFrameCount()) 496 if (!stackTrace->GetFrameCount())
485 return; 497 return;
486 v8::Handle<v8::Object> eventData = eventDetails.GetEventData(); 498 v8::Handle<v8::Object> eventData = eventDetails.GetEventData();
487 v8::Handle<v8::Value> exceptionGetterValue = eventData->Get(v8Atomic String(m_isolate, "exception")); 499 v8::Handle<v8::Value> exception = callInternalGetterFunction(eventDa ta, "exception", m_isolate);
488 ASSERT(!exceptionGetterValue.IsEmpty() && exceptionGetterValue->IsFu nction());
489 v8::Handle<v8::Value> exception = V8ScriptRunner::callInternalFuncti on(v8::Handle<v8::Function>::Cast(exceptionGetterValue), eventData, 0, 0, m_isol ate);
490 handleProgramBreak(ScriptState::from(eventContext), eventDetails.Get ExecutionState(), exception, v8::Handle<v8::Array>()); 500 handleProgramBreak(ScriptState::from(eventContext), eventDetails.Get ExecutionState(), exception, v8::Handle<v8::Array>());
491 } else if (event == v8::Break) { 501 } else if (event == v8::Break) {
492 v8::Handle<v8::Function> getBreakpointNumbersFunction = v8::Local<v8 ::Function>::Cast(debuggerScript->Get(v8AtomicString(m_isolate, "getBreakpointNu mbers"))); 502 v8::Handle<v8::Function> getBreakpointNumbersFunction = v8::Local<v8 ::Function>::Cast(debuggerScript->Get(v8AtomicString(m_isolate, "getBreakpointNu mbers")));
493 v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() }; 503 v8::Handle<v8::Value> argv[] = { eventDetails.GetEventData() };
494 v8::Handle<v8::Value> hitBreakpoints = V8ScriptRunner::callInternalF unction(getBreakpointNumbersFunction, debuggerScript, WTF_ARRAY_LENGTH(argv), ar gv, m_isolate); 504 v8::Handle<v8::Value> hitBreakpoints = V8ScriptRunner::callInternalF unction(getBreakpointNumbersFunction, debuggerScript, WTF_ARRAY_LENGTH(argv), ar gv, m_isolate);
495 ASSERT(hitBreakpoints->IsArray()); 505 ASSERT(hitBreakpoints->IsArray());
496 handleProgramBreak(ScriptState::from(eventContext), eventDetails.Get ExecutionState(), v8::Handle<v8::Value>(), hitBreakpoints.As<v8::Array>()); 506 handleProgramBreak(ScriptState::from(eventContext), eventDetails.Get ExecutionState(), v8::Handle<v8::Value>(), hitBreakpoints.As<v8::Array>());
507 } else if (event == v8::AsyncTaskEvent) {
508 handleV8AsyncTaskEvent(listener, ScriptState::from(eventContext), ev entDetails.GetExecutionState(), eventDetails.GetEventData());
497 } 509 }
498 } 510 }
499 } 511 }
500 512
513 void ScriptDebugServer::handleV8AsyncTaskEvent(ScriptDebugListener* listener, Sc riptState* pausedScriptState, v8::Handle<v8::Object> executionState, v8::Handle< v8::Object> eventData)
514 {
515 String type = toCoreStringWithUndefinedOrNullCheck(callInternalGetterFunctio n(eventData, "type", m_isolate));
516 String name = toCoreStringWithUndefinedOrNullCheck(callInternalGetterFunctio n(eventData, "name", m_isolate));
517 int id = callInternalGetterFunction(eventData, "id", m_isolate)->ToInteger() ->Value();
518
519 // FIXME: Remove when not needed.
520 if (name == "Promise.Resolved")
yurys 2014/07/10 12:24:28 Why do we need it in the new code at the first pla
aandrey 2014/07/10 12:25:54 Yeah, I was confused with the names. I committed t
521 name = "Promise.resolve";
522 else if (name == "Promise.Rejected")
523 name = "Promise.reject";
524
525 m_pausedScriptState = pausedScriptState;
526 m_executionState = executionState;
527 listener->didReceiveV8AsyncTaskEvent(pausedScriptState->executionContext(), type, name, id);
528 m_pausedScriptState.clear();
529 m_executionState.Clear();
530 }
531
501 void ScriptDebugServer::dispatchDidParseSource(ScriptDebugListener* listener, v8 ::Handle<v8::Object> object) 532 void ScriptDebugServer::dispatchDidParseSource(ScriptDebugListener* listener, v8 ::Handle<v8::Object> object)
502 { 533 {
503 v8::Handle<v8::Value> id = object->Get(v8AtomicString(m_isolate, "id")); 534 v8::Handle<v8::Value> id = object->Get(v8AtomicString(m_isolate, "id"));
504 ASSERT(!id.IsEmpty() && id->IsInt32()); 535 ASSERT(!id.IsEmpty() && id->IsInt32());
505 String sourceID = String::number(id->Int32Value()); 536 String sourceID = String::number(id->Int32Value());
506 537
507 ScriptDebugListener::Script script; 538 ScriptDebugListener::Script script;
508 script.url = toCoreStringWithUndefinedOrNullCheck(object->Get(v8AtomicString (m_isolate, "name"))); 539 script.url = toCoreStringWithUndefinedOrNullCheck(object->Get(v8AtomicString (m_isolate, "name")));
509 script.source = toCoreStringWithUndefinedOrNullCheck(object->Get(v8AtomicStr ing(m_isolate, "source"))); 540 script.source = toCoreStringWithUndefinedOrNullCheck(object->Get(v8AtomicStr ing(m_isolate, "source")));
510 script.sourceMappingURL = toCoreStringWithUndefinedOrNullCheck(object->Get(v 8AtomicString(m_isolate, "sourceMappingURL"))); 541 script.sourceMappingURL = toCoreStringWithUndefinedOrNullCheck(object->Get(v 8AtomicString(m_isolate, "sourceMappingURL")));
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 { 673 {
643 return PassOwnPtr<ScriptSourceCode>(); 674 return PassOwnPtr<ScriptSourceCode>();
644 } 675 }
645 676
646 String ScriptDebugServer::preprocessEventListener(LocalFrame*, const String& sou rce, const String& url, const String& functionName) 677 String ScriptDebugServer::preprocessEventListener(LocalFrame*, const String& sou rce, const String& url, const String& functionName)
647 { 678 {
648 return source; 679 return source;
649 } 680 }
650 681
651 } // namespace WebCore 682 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/bindings/core/v8/ScriptDebugServer.h ('k') | Source/core/inspector/AsyncCallStackTracker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698