| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium 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 "config.h" | 5 #include "config.h" |
| 6 #include "core/inspector/V8DebuggerAgent.h" | 6 #include "core/inspector/V8DebuggerAgent.h" |
| 7 | 7 |
| 8 #include "bindings/core/v8/ScriptCallStackFactory.h" | 8 #include "bindings/core/v8/ScriptCallStackFactory.h" |
| 9 #include "bindings/core/v8/ScriptRegexp.h" | 9 #include "bindings/core/v8/ScriptRegexp.h" |
| 10 #include "bindings/core/v8/ScriptValue.h" | 10 #include "bindings/core/v8/ScriptValue.h" |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 { | 186 { |
| 187 // debugger().addListener may result in reporting all parsed scripts to | 187 // debugger().addListener may result in reporting all parsed scripts to |
| 188 // the agent so it should already be in enabled state by then. | 188 // the agent so it should already be in enabled state by then. |
| 189 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); | 189 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); |
| 190 debugger().addListener(m_contextGroupId, this); | 190 debugger().addListener(m_contextGroupId, this); |
| 191 // FIXME(WK44513): breakpoints activated flag should be synchronized between
all front-ends | 191 // FIXME(WK44513): breakpoints activated flag should be synchronized between
all front-ends |
| 192 debugger().setBreakpointsActivated(true); | 192 debugger().setBreakpointsActivated(true); |
| 193 m_client->debuggerAgentEnabled(); | 193 m_client->debuggerAgentEnabled(); |
| 194 } | 194 } |
| 195 | 195 |
| 196 void V8DebuggerAgent::disable() | |
| 197 { | |
| 198 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, JSONObject::cr
eate()); | |
| 199 m_state->setLong(DebuggerAgentState::pauseOnExceptionsState, V8Debugger::Don
tPauseOnExceptions); | |
| 200 m_state->setString(DebuggerAgentState::skipStackPattern, ""); | |
| 201 m_state->setBoolean(DebuggerAgentState::skipContentScripts, false); | |
| 202 m_state->setLong(DebuggerAgentState::asyncCallStackDepth, 0); | |
| 203 m_state->setBoolean(DebuggerAgentState::promiseTrackerEnabled, false); | |
| 204 | |
| 205 debugger().removeListener(m_contextGroupId); | |
| 206 m_client->debuggerAgentDisabled(); | |
| 207 clear(); | |
| 208 m_skipAllPauses = false; | |
| 209 } | |
| 210 | |
| 211 bool V8DebuggerAgent::enabled() | 196 bool V8DebuggerAgent::enabled() |
| 212 { | 197 { |
| 213 return m_state->getBoolean(DebuggerAgentState::debuggerEnabled); | 198 return m_state->getBoolean(DebuggerAgentState::debuggerEnabled); |
| 214 } | 199 } |
| 215 | 200 |
| 216 void V8DebuggerAgent::enable(ErrorString*) | 201 void V8DebuggerAgent::enable(ErrorString*) |
| 217 { | 202 { |
| 218 if (enabled()) | 203 if (enabled()) |
| 219 return; | 204 return; |
| 220 | 205 |
| 221 enable(); | 206 enable(); |
| 222 | 207 |
| 223 ASSERT(m_frontend); | 208 ASSERT(m_frontend); |
| 224 } | 209 } |
| 225 | 210 |
| 226 void V8DebuggerAgent::disable(ErrorString*) | 211 void V8DebuggerAgent::disable(ErrorString*) |
| 227 { | 212 { |
| 228 if (!enabled()) | 213 if (!enabled()) |
| 229 return; | 214 return; |
| 230 | 215 |
| 231 disable(); | 216 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, JSONObject::cr
eate()); |
| 217 m_state->setLong(DebuggerAgentState::pauseOnExceptionsState, V8Debugger::Don
tPauseOnExceptions); |
| 218 m_state->setString(DebuggerAgentState::skipStackPattern, ""); |
| 219 m_state->setBoolean(DebuggerAgentState::skipContentScripts, false); |
| 220 m_state->setLong(DebuggerAgentState::asyncCallStackDepth, 0); |
| 221 m_state->setBoolean(DebuggerAgentState::promiseTrackerEnabled, false); |
| 222 m_state->setBoolean(DebuggerAgentState::promiseTrackerCaptureStacks, false); |
| 223 |
| 224 debugger().removeListener(m_contextGroupId); |
| 225 m_client->debuggerAgentDisabled(); |
| 226 m_pausedScriptState = nullptr; |
| 227 m_currentCallStack.Reset(); |
| 228 m_scripts.clear(); |
| 229 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 230 internalSetAsyncCallStackDepth(0); |
| 231 m_promiseTracker->setEnabled(false, false); |
| 232 m_continueToLocationBreakpointId = String(); |
| 233 clearBreakDetails(); |
| 234 m_scheduledDebuggerStep = NoStep; |
| 235 m_skipNextDebuggerStepOut = false; |
| 236 m_javaScriptPauseScheduled = false; |
| 237 m_steppingFromFramework = false; |
| 238 m_pausingOnNativeEvent = false; |
| 239 m_skippedStepFrameCount = 0; |
| 240 m_recursionLevelForStepFrame = 0; |
| 241 m_asyncOperationNotifications.clear(); |
| 242 m_compiledScripts.Clear(); |
| 243 clearStepIntoAsync(); |
| 244 m_skipAllPauses = false; |
| 232 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false); | 245 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false); |
| 233 } | 246 } |
| 234 | 247 |
| 235 static PassOwnPtr<ScriptRegexp> compileSkipCallFramePattern(String patternText) | 248 static PassOwnPtr<ScriptRegexp> compileSkipCallFramePattern(String patternText) |
| 236 { | 249 { |
| 237 if (patternText.isEmpty()) | 250 if (patternText.isEmpty()) |
| 238 return nullptr; | 251 return nullptr; |
| 239 OwnPtr<ScriptRegexp> result = adoptPtr(new ScriptRegexp(patternText, TextCas
eSensitive)); | 252 OwnPtr<ScriptRegexp> result = adoptPtr(new ScriptRegexp(patternText, TextCas
eSensitive)); |
| 240 if (!result->isValid()) | 253 if (!result->isValid()) |
| 241 result.clear(); | 254 result.clear(); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 m_frontend->globalObjectCleared(); | 288 m_frontend->globalObjectCleared(); |
| 276 enable(); | 289 enable(); |
| 277 long pauseState = m_state->getLong(DebuggerAgentState::pauseOnExceptions
State, V8Debugger::DontPauseOnExceptions); | 290 long pauseState = m_state->getLong(DebuggerAgentState::pauseOnExceptions
State, V8Debugger::DontPauseOnExceptions); |
| 278 String error; | 291 String error; |
| 279 setPauseOnExceptionsImpl(&error, pauseState); | 292 setPauseOnExceptionsImpl(&error, pauseState); |
| 280 m_cachedSkipStackRegExp = compileSkipCallFramePattern(m_state->getString
(DebuggerAgentState::skipStackPattern)); | 293 m_cachedSkipStackRegExp = compileSkipCallFramePattern(m_state->getString
(DebuggerAgentState::skipStackPattern)); |
| 281 increaseCachedSkipStackGeneration(); | 294 increaseCachedSkipStackGeneration(); |
| 282 m_skipContentScripts = m_state->getBoolean(DebuggerAgentState::skipConte
ntScripts); | 295 m_skipContentScripts = m_state->getBoolean(DebuggerAgentState::skipConte
ntScripts); |
| 283 m_skipAllPauses = m_state->getBoolean(DebuggerAgentState::skipAllPauses)
; | 296 m_skipAllPauses = m_state->getBoolean(DebuggerAgentState::skipAllPauses)
; |
| 284 internalSetAsyncCallStackDepth(m_state->getLong(DebuggerAgentState::asyn
cCallStackDepth)); | 297 internalSetAsyncCallStackDepth(m_state->getLong(DebuggerAgentState::asyn
cCallStackDepth)); |
| 285 promiseTracker().setEnabled(m_state->getBoolean(DebuggerAgentState::prom
iseTrackerEnabled), m_state->getBoolean(DebuggerAgentState::promiseTrackerCaptur
eStacks)); | 298 m_promiseTracker->setEnabled(m_state->getBoolean(DebuggerAgentState::pro
miseTrackerEnabled), m_state->getBoolean(DebuggerAgentState::promiseTrackerCaptu
reStacks)); |
| 286 } | 299 } |
| 287 } | 300 } |
| 288 | 301 |
| 289 void V8DebuggerAgent::setBreakpointsActive(ErrorString* errorString, bool active
) | 302 void V8DebuggerAgent::setBreakpointsActive(ErrorString* errorString, bool active
) |
| 290 { | 303 { |
| 291 if (!checkEnabled(errorString)) | 304 if (!checkEnabled(errorString)) |
| 292 return; | 305 return; |
| 293 debugger().setBreakpointsActivated(active); | 306 debugger().setBreakpointsActivated(active); |
| 294 } | 307 } |
| 295 | 308 |
| (...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 | 754 |
| 742 void V8DebuggerAgent::didReceiveV8AsyncTaskEvent(v8::Local<v8::Context> context,
const String& eventType, const String& eventName, int id) | 755 void V8DebuggerAgent::didReceiveV8AsyncTaskEvent(v8::Local<v8::Context> context,
const String& eventType, const String& eventName, int id) |
| 743 { | 756 { |
| 744 ASSERT(trackingAsyncCalls()); | 757 ASSERT(trackingAsyncCalls()); |
| 745 ScriptState* state = ScriptState::from(context); | 758 ScriptState* state = ScriptState::from(context); |
| 746 m_v8AsyncCallTracker->didReceiveV8AsyncTaskEvent(state, eventType, eventName
, id); | 759 m_v8AsyncCallTracker->didReceiveV8AsyncTaskEvent(state, eventType, eventName
, id); |
| 747 } | 760 } |
| 748 | 761 |
| 749 bool V8DebuggerAgent::v8PromiseEventsEnabled() const | 762 bool V8DebuggerAgent::v8PromiseEventsEnabled() const |
| 750 { | 763 { |
| 751 return promiseTracker().isEnabled(); | 764 return m_promiseTracker->isEnabled(); |
| 752 } | 765 } |
| 753 | 766 |
| 754 void V8DebuggerAgent::didReceiveV8PromiseEvent(v8::Local<v8::Context> context, v
8::Local<v8::Object> promise, v8::Local<v8::Value> parentPromise, int status) | 767 void V8DebuggerAgent::didReceiveV8PromiseEvent(v8::Local<v8::Context> context, v
8::Local<v8::Object> promise, v8::Local<v8::Value> parentPromise, int status) |
| 755 { | 768 { |
| 756 ASSERT(promiseTracker().isEnabled()); | 769 ASSERT(m_promiseTracker->isEnabled()); |
| 757 ScriptState* scriptState = ScriptState::from(context); | 770 ScriptState* scriptState = ScriptState::from(context); |
| 758 promiseTracker().didReceiveV8PromiseEvent(scriptState, promise, parentPromis
e, status); | 771 m_promiseTracker->didReceiveV8PromiseEvent(scriptState, promise, parentPromi
se, status); |
| 759 } | 772 } |
| 760 | 773 |
| 761 void V8DebuggerAgent::pause(ErrorString* errorString) | 774 void V8DebuggerAgent::pause(ErrorString* errorString) |
| 762 { | 775 { |
| 763 if (!checkEnabled(errorString)) | 776 if (!checkEnabled(errorString)) |
| 764 return; | 777 return; |
| 765 if (m_javaScriptPauseScheduled || isPaused()) | 778 if (m_javaScriptPauseScheduled || isPaused()) |
| 766 return; | 779 return; |
| 767 clearBreakDetails(); | 780 clearBreakDetails(); |
| 768 clearStepIntoAsync(); | 781 clearStepIntoAsync(); |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1082 m_state->setLong(DebuggerAgentState::asyncCallStackDepth, depth); | 1095 m_state->setLong(DebuggerAgentState::asyncCallStackDepth, depth); |
| 1083 internalSetAsyncCallStackDepth(depth); | 1096 internalSetAsyncCallStackDepth(depth); |
| 1084 } | 1097 } |
| 1085 | 1098 |
| 1086 void V8DebuggerAgent::enablePromiseTracker(ErrorString* errorString, const bool*
captureStacks) | 1099 void V8DebuggerAgent::enablePromiseTracker(ErrorString* errorString, const bool*
captureStacks) |
| 1087 { | 1100 { |
| 1088 if (!checkEnabled(errorString)) | 1101 if (!checkEnabled(errorString)) |
| 1089 return; | 1102 return; |
| 1090 m_state->setBoolean(DebuggerAgentState::promiseTrackerEnabled, true); | 1103 m_state->setBoolean(DebuggerAgentState::promiseTrackerEnabled, true); |
| 1091 m_state->setBoolean(DebuggerAgentState::promiseTrackerCaptureStacks, asBool(
captureStacks)); | 1104 m_state->setBoolean(DebuggerAgentState::promiseTrackerCaptureStacks, asBool(
captureStacks)); |
| 1092 promiseTracker().setEnabled(true, asBool(captureStacks)); | 1105 m_promiseTracker->setEnabled(true, asBool(captureStacks)); |
| 1093 } | 1106 } |
| 1094 | 1107 |
| 1095 void V8DebuggerAgent::disablePromiseTracker(ErrorString* errorString) | 1108 void V8DebuggerAgent::disablePromiseTracker(ErrorString* errorString) |
| 1096 { | 1109 { |
| 1097 if (!checkEnabled(errorString)) | 1110 if (!checkEnabled(errorString)) |
| 1098 return; | 1111 return; |
| 1099 m_state->setBoolean(DebuggerAgentState::promiseTrackerEnabled, false); | 1112 m_state->setBoolean(DebuggerAgentState::promiseTrackerEnabled, false); |
| 1100 promiseTracker().setEnabled(false, false); | 1113 m_promiseTracker->setEnabled(false, false); |
| 1101 } | 1114 } |
| 1102 | 1115 |
| 1103 void V8DebuggerAgent::getPromiseById(ErrorString* errorString, int promiseId, co
nst String* objectGroup, RefPtr<RemoteObject>& promise) | 1116 void V8DebuggerAgent::getPromiseById(ErrorString* errorString, int promiseId, co
nst String* objectGroup, RefPtr<RemoteObject>& promise) |
| 1104 { | 1117 { |
| 1105 if (!checkEnabled(errorString)) | 1118 if (!checkEnabled(errorString)) |
| 1106 return; | 1119 return; |
| 1107 if (!promiseTracker().isEnabled()) { | 1120 if (!m_promiseTracker->isEnabled()) { |
| 1108 *errorString = "Promise tracking is disabled"; | 1121 *errorString = "Promise tracking is disabled"; |
| 1109 return; | 1122 return; |
| 1110 } | 1123 } |
| 1111 ScriptValue value = promiseTracker().promiseById(promiseId); | 1124 ScriptValue value = m_promiseTracker->promiseById(promiseId); |
| 1112 if (value.isEmpty()) { | 1125 if (value.isEmpty()) { |
| 1113 *errorString = "Promise with specified ID not found."; | 1126 *errorString = "Promise with specified ID not found."; |
| 1114 return; | 1127 return; |
| 1115 } | 1128 } |
| 1116 InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(v
alue.scriptState()); | 1129 InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(v
alue.scriptState()); |
| 1117 promise = injectedScript.wrapObject(value, objectGroup ? *objectGroup : ""); | 1130 promise = injectedScript.wrapObject(value, objectGroup ? *objectGroup : ""); |
| 1118 } | 1131 } |
| 1119 | 1132 |
| 1120 void V8DebuggerAgent::didUpdatePromise(InspectorFrontend::Debugger::EventType::E
num eventType, PassRefPtr<TypeBuilder::Debugger::PromiseDetails> promise) | 1133 void V8DebuggerAgent::didUpdatePromise(InspectorFrontend::Debugger::EventType::E
num eventType, PassRefPtr<TypeBuilder::Debugger::PromiseDetails> promise) |
| 1121 { | 1134 { |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1634 return; | 1647 return; |
| 1635 m_breakReason = breakReason; | 1648 m_breakReason = breakReason; |
| 1636 m_breakAuxData = data; | 1649 m_breakAuxData = data; |
| 1637 m_scheduledDebuggerStep = NoStep; | 1650 m_scheduledDebuggerStep = NoStep; |
| 1638 m_steppingFromFramework = false; | 1651 m_steppingFromFramework = false; |
| 1639 m_pausingOnNativeEvent = false; | 1652 m_pausingOnNativeEvent = false; |
| 1640 clearStepIntoAsync(); | 1653 clearStepIntoAsync(); |
| 1641 debugger().breakProgram(); | 1654 debugger().breakProgram(); |
| 1642 } | 1655 } |
| 1643 | 1656 |
| 1644 void V8DebuggerAgent::clear() | |
| 1645 { | |
| 1646 m_pausedScriptState = nullptr; | |
| 1647 m_currentCallStack.Reset(); | |
| 1648 m_scripts.clear(); | |
| 1649 m_breakpointIdToDebuggerBreakpointIds.clear(); | |
| 1650 internalSetAsyncCallStackDepth(0); | |
| 1651 promiseTracker().clear(); | |
| 1652 m_continueToLocationBreakpointId = String(); | |
| 1653 clearBreakDetails(); | |
| 1654 m_scheduledDebuggerStep = NoStep; | |
| 1655 m_skipNextDebuggerStepOut = false; | |
| 1656 m_javaScriptPauseScheduled = false; | |
| 1657 m_steppingFromFramework = false; | |
| 1658 m_pausingOnNativeEvent = false; | |
| 1659 m_skippedStepFrameCount = 0; | |
| 1660 m_recursionLevelForStepFrame = 0; | |
| 1661 m_asyncOperationNotifications.clear(); | |
| 1662 m_compiledScripts.Clear(); | |
| 1663 clearStepIntoAsync(); | |
| 1664 } | |
| 1665 | |
| 1666 void V8DebuggerAgent::clearStepIntoAsync() | 1657 void V8DebuggerAgent::clearStepIntoAsync() |
| 1667 { | 1658 { |
| 1668 m_startingStepIntoAsync = false; | 1659 m_startingStepIntoAsync = false; |
| 1669 m_pausingOnAsyncOperation = false; | 1660 m_pausingOnAsyncOperation = false; |
| 1670 m_pausingAsyncOperations.clear(); | 1661 m_pausingAsyncOperations.clear(); |
| 1671 } | 1662 } |
| 1672 | 1663 |
| 1673 bool V8DebuggerAgent::assertPaused(ErrorString* errorString) | 1664 bool V8DebuggerAgent::assertPaused(ErrorString* errorString) |
| 1674 { | 1665 { |
| 1675 if (!m_pausedScriptState) { | 1666 if (!m_pausedScriptState) { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1696 { | 1687 { |
| 1697 removeBreakpoint(generateBreakpointId(scriptId, lineNumber, columnNumber, so
urce)); | 1688 removeBreakpoint(generateBreakpointId(scriptId, lineNumber, columnNumber, so
urce)); |
| 1698 } | 1689 } |
| 1699 | 1690 |
| 1700 void V8DebuggerAgent::reset() | 1691 void V8DebuggerAgent::reset() |
| 1701 { | 1692 { |
| 1702 m_scheduledDebuggerStep = NoStep; | 1693 m_scheduledDebuggerStep = NoStep; |
| 1703 m_scripts.clear(); | 1694 m_scripts.clear(); |
| 1704 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1695 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 1705 resetAsyncCallTracker(); | 1696 resetAsyncCallTracker(); |
| 1706 promiseTracker().clear(); | 1697 m_promiseTracker->clear(); |
| 1707 if (m_frontend) | 1698 if (m_frontend) |
| 1708 m_frontend->globalObjectCleared(); | 1699 m_frontend->globalObjectCleared(); |
| 1709 } | 1700 } |
| 1710 | 1701 |
| 1711 PassRefPtr<TypeBuilder::Debugger::ExceptionDetails> V8DebuggerAgent::createExcep
tionDetails(v8::Isolate* isolate, v8::Local<v8::Message> message) | 1702 PassRefPtr<TypeBuilder::Debugger::ExceptionDetails> V8DebuggerAgent::createExcep
tionDetails(v8::Isolate* isolate, v8::Local<v8::Message> message) |
| 1712 { | 1703 { |
| 1713 RefPtr<ExceptionDetails> exceptionDetails = ExceptionDetails::create().setTe
xt(toCoreStringWithUndefinedOrNullCheck(message->Get())); | 1704 RefPtr<ExceptionDetails> exceptionDetails = ExceptionDetails::create().setTe
xt(toCoreStringWithUndefinedOrNullCheck(message->Get())); |
| 1714 exceptionDetails->setLine(message->GetLineNumber()); | 1705 exceptionDetails->setLine(message->GetLineNumber()); |
| 1715 exceptionDetails->setColumn(message->GetStartColumn()); | 1706 exceptionDetails->setColumn(message->GetStartColumn()); |
| 1716 v8::Local<v8::StackTrace> messageStackTrace = message->GetStackTrace(); | 1707 v8::Local<v8::StackTrace> messageStackTrace = message->GetStackTrace(); |
| 1717 if (!messageStackTrace.IsEmpty() && messageStackTrace->GetFrameCount() > 0) | 1708 if (!messageStackTrace.IsEmpty() && messageStackTrace->GetFrameCount() > 0) |
| 1718 exceptionDetails->setStackTrace(createScriptCallStack(isolate, messageSt
ackTrace, messageStackTrace->GetFrameCount())->buildInspectorArray()); | 1709 exceptionDetails->setStackTrace(createScriptCallStack(isolate, messageSt
ackTrace, messageStackTrace->GetFrameCount())->buildInspectorArray()); |
| 1719 return exceptionDetails.release(); | 1710 return exceptionDetails.release(); |
| 1720 } | 1711 } |
| 1721 | 1712 |
| 1722 } // namespace blink | 1713 } // namespace blink |
| OLD | NEW |