| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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 #include "src/inspector/v8-debugger-agent-impl.h" | 5 #include "src/inspector/v8-debugger-agent-impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "src/debug/debug-interface.h" | 9 #include "src/debug/debug-interface.h" |
| 10 #include "src/inspector/injected-script.h" | 10 #include "src/inspector/injected-script.h" |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 191 | 191 |
| 192 V8DebuggerAgentImpl::V8DebuggerAgentImpl( | 192 V8DebuggerAgentImpl::V8DebuggerAgentImpl( |
| 193 V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, | 193 V8InspectorSessionImpl* session, protocol::FrontendChannel* frontendChannel, |
| 194 protocol::DictionaryValue* state) | 194 protocol::DictionaryValue* state) |
| 195 : m_inspector(session->inspector()), | 195 : m_inspector(session->inspector()), |
| 196 m_debugger(m_inspector->debugger()), | 196 m_debugger(m_inspector->debugger()), |
| 197 m_session(session), | 197 m_session(session), |
| 198 m_enabled(false), | 198 m_enabled(false), |
| 199 m_state(state), | 199 m_state(state), |
| 200 m_frontend(frontendChannel), | 200 m_frontend(frontendChannel), |
| 201 m_isolate(m_inspector->isolate()), | 201 m_isolate(m_inspector->isolate()) {} |
| 202 m_javaScriptPauseScheduled(false) {} | |
| 203 | 202 |
| 204 V8DebuggerAgentImpl::~V8DebuggerAgentImpl() {} | 203 V8DebuggerAgentImpl::~V8DebuggerAgentImpl() {} |
| 205 | 204 |
| 206 void V8DebuggerAgentImpl::enableImpl() { | 205 void V8DebuggerAgentImpl::enableImpl() { |
| 207 m_enabled = true; | 206 m_enabled = true; |
| 208 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); | 207 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); |
| 209 m_debugger->enable(); | 208 m_debugger->enable(); |
| 210 | 209 |
| 211 std::vector<std::unique_ptr<V8DebuggerScript>> compiledScripts; | 210 std::vector<std::unique_ptr<V8DebuggerScript>> compiledScripts; |
| 212 m_debugger->getCompiledScripts(m_session->contextGroupId(), compiledScripts); | 211 m_debugger->getCompiledScripts(m_session->contextGroupId(), compiledScripts); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 JavaScriptCallFrames emptyCallFrames; | 243 JavaScriptCallFrames emptyCallFrames; |
| 245 m_pausedCallFrames.swap(emptyCallFrames); | 244 m_pausedCallFrames.swap(emptyCallFrames); |
| 246 m_blackboxedPositions.clear(); | 245 m_blackboxedPositions.clear(); |
| 247 m_blackboxPattern.reset(); | 246 m_blackboxPattern.reset(); |
| 248 resetBlackboxedStateCache(); | 247 resetBlackboxedStateCache(); |
| 249 m_scripts.clear(); | 248 m_scripts.clear(); |
| 250 m_breakpointIdToDebuggerBreakpointIds.clear(); | 249 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 251 m_debugger->setAsyncCallStackDepth(this, 0); | 250 m_debugger->setAsyncCallStackDepth(this, 0); |
| 252 m_continueToLocationBreakpointId = String16(); | 251 m_continueToLocationBreakpointId = String16(); |
| 253 clearBreakDetails(); | 252 clearBreakDetails(); |
| 254 m_javaScriptPauseScheduled = false; | |
| 255 m_skipAllPauses = false; | 253 m_skipAllPauses = false; |
| 256 m_state->setBoolean(DebuggerAgentState::skipAllPauses, false); | 254 m_state->setBoolean(DebuggerAgentState::skipAllPauses, false); |
| 257 m_state->remove(DebuggerAgentState::blackboxPattern); | 255 m_state->remove(DebuggerAgentState::blackboxPattern); |
| 258 m_enabled = false; | 256 m_enabled = false; |
| 259 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false); | 257 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false); |
| 260 return Response::OK(); | 258 return Response::OK(); |
| 261 } | 259 } |
| 262 | 260 |
| 263 void V8DebuggerAgentImpl::restore() { | 261 void V8DebuggerAgentImpl::restore() { |
| 264 DCHECK(!m_enabled); | 262 DCHECK(!m_enabled); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 284 String16 blackboxPattern; | 282 String16 blackboxPattern; |
| 285 if (m_state->getString(DebuggerAgentState::blackboxPattern, | 283 if (m_state->getString(DebuggerAgentState::blackboxPattern, |
| 286 &blackboxPattern)) { | 284 &blackboxPattern)) { |
| 287 setBlackboxPattern(blackboxPattern); | 285 setBlackboxPattern(blackboxPattern); |
| 288 } | 286 } |
| 289 } | 287 } |
| 290 | 288 |
| 291 Response V8DebuggerAgentImpl::setBreakpointsActive(bool active) { | 289 Response V8DebuggerAgentImpl::setBreakpointsActive(bool active) { |
| 292 if (!enabled()) return Response::Error(kDebuggerNotEnabled); | 290 if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
| 293 m_debugger->setBreakpointsActivated(active); | 291 m_debugger->setBreakpointsActivated(active); |
| 292 if (!active && !m_breakReason.empty()) { |
| 293 clearBreakDetails(); |
| 294 m_debugger->setPauseOnNextStatement(false, m_session->contextGroupId()); |
| 295 } |
| 294 return Response::OK(); | 296 return Response::OK(); |
| 295 } | 297 } |
| 296 | 298 |
| 297 Response V8DebuggerAgentImpl::setSkipAllPauses(bool skip) { | 299 Response V8DebuggerAgentImpl::setSkipAllPauses(bool skip) { |
| 298 m_state->setBoolean(DebuggerAgentState::skipAllPauses, skip); | 300 m_state->setBoolean(DebuggerAgentState::skipAllPauses, skip); |
| 299 m_skipAllPauses = skip; | 301 m_skipAllPauses = skip; |
| 300 return Response::OK(); | 302 return Response::OK(); |
| 301 } | 303 } |
| 302 | 304 |
| 303 static std::unique_ptr<protocol::DictionaryValue> | 305 static std::unique_ptr<protocol::DictionaryValue> |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 } | 680 } |
| 679 | 681 |
| 680 void V8DebuggerAgentImpl::clearBreakDetails() { | 682 void V8DebuggerAgentImpl::clearBreakDetails() { |
| 681 std::vector<BreakReason> emptyBreakReason; | 683 std::vector<BreakReason> emptyBreakReason; |
| 682 m_breakReason.swap(emptyBreakReason); | 684 m_breakReason.swap(emptyBreakReason); |
| 683 } | 685 } |
| 684 | 686 |
| 685 void V8DebuggerAgentImpl::schedulePauseOnNextStatement( | 687 void V8DebuggerAgentImpl::schedulePauseOnNextStatement( |
| 686 const String16& breakReason, | 688 const String16& breakReason, |
| 687 std::unique_ptr<protocol::DictionaryValue> data) { | 689 std::unique_ptr<protocol::DictionaryValue> data) { |
| 688 if (!enabled() || m_javaScriptPauseScheduled || isPaused() || | 690 if (!enabled() || isPaused() || !m_debugger->breakpointsActivated()) return; |
| 689 !m_debugger->breakpointsActivated()) | |
| 690 return; | |
| 691 if (m_breakReason.empty()) { | 691 if (m_breakReason.empty()) { |
| 692 m_debugger->setPauseOnNextStatement(true, m_session->contextGroupId()); | 692 m_debugger->setPauseOnNextStatement(true, m_session->contextGroupId()); |
| 693 } | 693 } |
| 694 pushBreakDetails(breakReason, std::move(data)); | 694 pushBreakDetails(breakReason, std::move(data)); |
| 695 } | 695 } |
| 696 | 696 |
| 697 void V8DebuggerAgentImpl::cancelPauseOnNextStatement() { | 697 void V8DebuggerAgentImpl::cancelPauseOnNextStatement() { |
| 698 if (m_javaScriptPauseScheduled || isPaused()) return; | 698 if (!enabled() || isPaused() || !m_debugger->breakpointsActivated()) return; |
| 699 if (m_breakReason.size() == 1) { |
| 700 m_debugger->setPauseOnNextStatement(false, m_session->contextGroupId()); |
| 701 } |
| 699 popBreakDetails(); | 702 popBreakDetails(); |
| 700 if (m_breakReason.empty()) | |
| 701 m_debugger->setPauseOnNextStatement(false, m_session->contextGroupId()); | |
| 702 } | 703 } |
| 703 | 704 |
| 704 Response V8DebuggerAgentImpl::pause() { | 705 Response V8DebuggerAgentImpl::pause() { |
| 705 if (!enabled()) return Response::Error(kDebuggerNotEnabled); | 706 if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
| 706 if (m_javaScriptPauseScheduled || isPaused()) return Response::OK(); | 707 if (isPaused()) return Response::OK(); |
| 707 clearBreakDetails(); | 708 if (m_breakReason.empty()) { |
| 708 m_javaScriptPauseScheduled = true; | 709 m_debugger->setPauseOnNextStatement(true, m_session->contextGroupId()); |
| 709 m_debugger->setPauseOnNextStatement(true, m_session->contextGroupId()); | 710 } |
| 711 pushBreakDetails(protocol::Debugger::Paused::ReasonEnum::Other, nullptr); |
| 710 return Response::OK(); | 712 return Response::OK(); |
| 711 } | 713 } |
| 712 | 714 |
| 713 Response V8DebuggerAgentImpl::resume() { | 715 Response V8DebuggerAgentImpl::resume() { |
| 714 if (!isPaused()) return Response::Error(kDebuggerNotPaused); | 716 if (!isPaused()) return Response::Error(kDebuggerNotPaused); |
| 715 m_session->releaseObjectGroup(kBacktraceObjectGroup); | 717 m_session->releaseObjectGroup(kBacktraceObjectGroup); |
| 716 m_debugger->continueProgram(); | 718 m_debugger->continueProgram(); |
| 717 return Response::OK(); | 719 return Response::OK(); |
| 718 } | 720 } |
| 719 | 721 |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1233 Response::Error("No async tasks were scheduled before pause.")); | 1235 Response::Error("No async tasks were scheduled before pause.")); |
| 1234 m_stepIntoAsyncCallback.reset(); | 1236 m_stepIntoAsyncCallback.reset(); |
| 1235 } | 1237 } |
| 1236 | 1238 |
| 1237 std::unique_ptr<Array<CallFrame>> protocolCallFrames; | 1239 std::unique_ptr<Array<CallFrame>> protocolCallFrames; |
| 1238 Response response = currentCallFrames(&protocolCallFrames); | 1240 Response response = currentCallFrames(&protocolCallFrames); |
| 1239 if (!response.isSuccess()) protocolCallFrames = Array<CallFrame>::create(); | 1241 if (!response.isSuccess()) protocolCallFrames = Array<CallFrame>::create(); |
| 1240 m_frontend.paused(std::move(protocolCallFrames), breakReason, | 1242 m_frontend.paused(std::move(protocolCallFrames), breakReason, |
| 1241 std::move(breakAuxData), std::move(hitBreakpointIds), | 1243 std::move(breakAuxData), std::move(hitBreakpointIds), |
| 1242 currentAsyncStackTrace()); | 1244 currentAsyncStackTrace()); |
| 1243 m_javaScriptPauseScheduled = false; | |
| 1244 | 1245 |
| 1245 if (!m_continueToLocationBreakpointId.isEmpty()) { | 1246 if (!m_continueToLocationBreakpointId.isEmpty()) { |
| 1246 m_debugger->removeBreakpoint(m_continueToLocationBreakpointId); | 1247 m_debugger->removeBreakpoint(m_continueToLocationBreakpointId); |
| 1247 m_continueToLocationBreakpointId = ""; | 1248 m_continueToLocationBreakpointId = ""; |
| 1248 } | 1249 } |
| 1249 } | 1250 } |
| 1250 | 1251 |
| 1251 void V8DebuggerAgentImpl::didContinue() { | 1252 void V8DebuggerAgentImpl::didContinue() { |
| 1252 JavaScriptCallFrames emptyCallFrames; | 1253 JavaScriptCallFrames emptyCallFrames; |
| 1253 m_pausedCallFrames.swap(emptyCallFrames); | 1254 m_pausedCallFrames.swap(emptyCallFrames); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1298 | 1299 |
| 1299 void V8DebuggerAgentImpl::reset() { | 1300 void V8DebuggerAgentImpl::reset() { |
| 1300 if (!enabled()) return; | 1301 if (!enabled()) return; |
| 1301 m_blackboxedPositions.clear(); | 1302 m_blackboxedPositions.clear(); |
| 1302 resetBlackboxedStateCache(); | 1303 resetBlackboxedStateCache(); |
| 1303 m_scripts.clear(); | 1304 m_scripts.clear(); |
| 1304 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1305 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 1305 } | 1306 } |
| 1306 | 1307 |
| 1307 } // namespace v8_inspector | 1308 } // namespace v8_inspector |
| OLD | NEW |