OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |