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 |