| 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 "platform/v8_inspector/V8DebuggerAgentImpl.h" | 5 #include "platform/v8_inspector/V8DebuggerAgentImpl.h" |
| 6 | 6 |
| 7 #include "platform/inspector_protocol/String16.h" | 7 #include "platform/inspector_protocol/String16.h" |
| 8 #include "platform/inspector_protocol/Values.h" | 8 #include "platform/inspector_protocol/Values.h" |
| 9 #include "platform/v8_inspector/InjectedScript.h" | 9 #include "platform/v8_inspector/InjectedScript.h" |
| 10 #include "platform/v8_inspector/InspectedContext.h" | 10 #include "platform/v8_inspector/InspectedContext.h" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 static const char isRegex[] = "isRegex"; | 52 static const char isRegex[] = "isRegex"; |
| 53 static const char lineNumber[] = "lineNumber"; | 53 static const char lineNumber[] = "lineNumber"; |
| 54 static const char columnNumber[] = "columnNumber"; | 54 static const char columnNumber[] = "columnNumber"; |
| 55 static const char condition[] = "condition"; | 55 static const char condition[] = "condition"; |
| 56 static const char skipAllPauses[] = "skipAllPauses"; | 56 static const char skipAllPauses[] = "skipAllPauses"; |
| 57 | 57 |
| 58 } // namespace DebuggerAgentState; | 58 } // namespace DebuggerAgentState; |
| 59 | 59 |
| 60 static const int maxSkipStepFrameCount = 128; | 60 static const int maxSkipStepFrameCount = 128; |
| 61 | 61 |
| 62 const char V8DebuggerAgent::backtraceObjectGroup[] = "backtrace"; | |
| 63 | |
| 64 static String16 breakpointIdSuffix(V8DebuggerAgentImpl::BreakpointSource source) | 62 static String16 breakpointIdSuffix(V8DebuggerAgentImpl::BreakpointSource source) |
| 65 { | 63 { |
| 66 switch (source) { | 64 switch (source) { |
| 67 case V8DebuggerAgentImpl::UserBreakpointSource: | 65 case V8DebuggerAgentImpl::UserBreakpointSource: |
| 68 break; | 66 break; |
| 69 case V8DebuggerAgentImpl::DebugCommandBreakpointSource: | 67 case V8DebuggerAgentImpl::DebugCommandBreakpointSource: |
| 70 return ":debug"; | 68 return ":debug"; |
| 71 case V8DebuggerAgentImpl::MonitorCommandBreakpointSource: | 69 case V8DebuggerAgentImpl::MonitorCommandBreakpointSource: |
| 72 return ":monitor"; | 70 return ":monitor"; |
| 73 } | 71 } |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 return buildProtocolLocation(scriptId, actualLineNumber, actualColumnNumber)
; | 589 return buildProtocolLocation(scriptId, actualLineNumber, actualColumnNumber)
; |
| 592 } | 590 } |
| 593 | 591 |
| 594 void V8DebuggerAgentImpl::searchInContent(ErrorString* error, const String16& sc
riptId, const String16& query, | 592 void V8DebuggerAgentImpl::searchInContent(ErrorString* error, const String16& sc
riptId, const String16& query, |
| 595 const Maybe<bool>& optionalCaseSensitive, | 593 const Maybe<bool>& optionalCaseSensitive, |
| 596 const Maybe<bool>& optionalIsRegex, | 594 const Maybe<bool>& optionalIsRegex, |
| 597 OwnPtr<Array<protocol::Debugger::SearchMatch>>* results) | 595 OwnPtr<Array<protocol::Debugger::SearchMatch>>* results) |
| 598 { | 596 { |
| 599 ScriptsMap::iterator it = m_scripts.find(scriptId); | 597 ScriptsMap::iterator it = m_scripts.find(scriptId); |
| 600 if (it != m_scripts.end()) | 598 if (it != m_scripts.end()) |
| 601 *results = V8ContentSearchUtil::searchInTextByLines(m_debugger, it->seco
nd->source(), query, optionalCaseSensitive.fromMaybe(false), optionalIsRegex.fro
mMaybe(false)); | 599 *results = V8ContentSearchUtil::searchInTextByLines(m_session, it->secon
d->source(), query, optionalCaseSensitive.fromMaybe(false), optionalIsRegex.from
Maybe(false)); |
| 602 else | 600 else |
| 603 *error = String16("No script for id: " + scriptId); | 601 *error = String16("No script for id: " + scriptId); |
| 604 } | 602 } |
| 605 | 603 |
| 606 void V8DebuggerAgentImpl::setScriptSource(ErrorString* errorString, | 604 void V8DebuggerAgentImpl::setScriptSource(ErrorString* errorString, |
| 607 const String16& scriptId, | 605 const String16& scriptId, |
| 608 const String16& newContent, | 606 const String16& newContent, |
| 609 const Maybe<bool>& preview, | 607 const Maybe<bool>& preview, |
| 610 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames, | 608 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames, |
| 611 Maybe<bool>* stackChanged, | 609 Maybe<bool>* stackChanged, |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 m_steppingFromFramework = false; | 832 m_steppingFromFramework = false; |
| 835 debugger().setPauseOnNextStatement(true); | 833 debugger().setPauseOnNextStatement(true); |
| 836 } | 834 } |
| 837 | 835 |
| 838 void V8DebuggerAgentImpl::resume(ErrorString* errorString) | 836 void V8DebuggerAgentImpl::resume(ErrorString* errorString) |
| 839 { | 837 { |
| 840 if (!assertPaused(errorString)) | 838 if (!assertPaused(errorString)) |
| 841 return; | 839 return; |
| 842 m_scheduledDebuggerStep = NoStep; | 840 m_scheduledDebuggerStep = NoStep; |
| 843 m_steppingFromFramework = false; | 841 m_steppingFromFramework = false; |
| 844 m_session->releaseObjectGroup(V8DebuggerAgentImpl::backtraceObjectGroup); | 842 m_session->releaseObjectGroup(V8InspectorSession::backtraceObjectGroup); |
| 845 debugger().continueProgram(); | 843 debugger().continueProgram(); |
| 846 } | 844 } |
| 847 | 845 |
| 848 void V8DebuggerAgentImpl::stepOver(ErrorString* errorString) | 846 void V8DebuggerAgentImpl::stepOver(ErrorString* errorString) |
| 849 { | 847 { |
| 850 if (!assertPaused(errorString)) | 848 if (!assertPaused(errorString)) |
| 851 return; | 849 return; |
| 852 // StepOver at function return point should fallback to StepInto. | 850 // StepOver at function return point should fallback to StepInto. |
| 853 JavaScriptCallFrame* frame = m_pausedCallFrames.size() ? m_pausedCallFrames[
0].get() : nullptr; | 851 JavaScriptCallFrame* frame = m_pausedCallFrames.size() ? m_pausedCallFrames[
0].get() : nullptr; |
| 854 if (frame && frame->isAtReturn()) { | 852 if (frame && frame->isAtReturn()) { |
| 855 stepInto(errorString); | 853 stepInto(errorString); |
| 856 return; | 854 return; |
| 857 } | 855 } |
| 858 m_scheduledDebuggerStep = StepOver; | 856 m_scheduledDebuggerStep = StepOver; |
| 859 m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); | 857 m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); |
| 860 m_session->releaseObjectGroup(V8DebuggerAgentImpl::backtraceObjectGroup); | 858 m_session->releaseObjectGroup(V8InspectorSession::backtraceObjectGroup); |
| 861 debugger().stepOverStatement(); | 859 debugger().stepOverStatement(); |
| 862 } | 860 } |
| 863 | 861 |
| 864 void V8DebuggerAgentImpl::stepInto(ErrorString* errorString) | 862 void V8DebuggerAgentImpl::stepInto(ErrorString* errorString) |
| 865 { | 863 { |
| 866 if (!assertPaused(errorString)) | 864 if (!assertPaused(errorString)) |
| 867 return; | 865 return; |
| 868 m_scheduledDebuggerStep = StepInto; | 866 m_scheduledDebuggerStep = StepInto; |
| 869 m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); | 867 m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); |
| 870 m_session->releaseObjectGroup(V8DebuggerAgentImpl::backtraceObjectGroup); | 868 m_session->releaseObjectGroup(V8InspectorSession::backtraceObjectGroup); |
| 871 debugger().stepIntoStatement(); | 869 debugger().stepIntoStatement(); |
| 872 } | 870 } |
| 873 | 871 |
| 874 void V8DebuggerAgentImpl::stepOut(ErrorString* errorString) | 872 void V8DebuggerAgentImpl::stepOut(ErrorString* errorString) |
| 875 { | 873 { |
| 876 if (!assertPaused(errorString)) | 874 if (!assertPaused(errorString)) |
| 877 return; | 875 return; |
| 878 m_scheduledDebuggerStep = StepOut; | 876 m_scheduledDebuggerStep = StepOut; |
| 879 m_skipNextDebuggerStepOut = false; | 877 m_skipNextDebuggerStepOut = false; |
| 880 m_recursionLevelForStepOut = 1; | 878 m_recursionLevelForStepOut = 1; |
| 881 m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); | 879 m_steppingFromFramework = isTopPausedCallFrameBlackboxed(); |
| 882 m_session->releaseObjectGroup(V8DebuggerAgentImpl::backtraceObjectGroup); | 880 m_session->releaseObjectGroup(V8InspectorSession::backtraceObjectGroup); |
| 883 debugger().stepOutOfFunction(); | 881 debugger().stepOutOfFunction(); |
| 884 } | 882 } |
| 885 | 883 |
| 886 void V8DebuggerAgentImpl::setPauseOnExceptions(ErrorString* errorString, const S
tring16& stringPauseState) | 884 void V8DebuggerAgentImpl::setPauseOnExceptions(ErrorString* errorString, const S
tring16& stringPauseState) |
| 887 { | 885 { |
| 888 if (!checkEnabled(errorString)) | 886 if (!checkEnabled(errorString)) |
| 889 return; | 887 return; |
| 890 V8DebuggerImpl::PauseOnExceptionsState pauseState; | 888 V8DebuggerImpl::PauseOnExceptionsState pauseState; |
| 891 if (stringPauseState == "none") { | 889 if (stringPauseState == "none") { |
| 892 pauseState = V8DebuggerImpl::DontPauseOnExceptions; | 890 pauseState = V8DebuggerImpl::DontPauseOnExceptions; |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1208 injectedScript = topFrameInjectedScript; | 1206 injectedScript = topFrameInjectedScript; |
| 1209 | 1207 |
| 1210 String16 callFrameId = RemoteCallFrameId::serialize(injectedScript->cont
ext()->contextId(), frameOrdinal); | 1208 String16 callFrameId = RemoteCallFrameId::serialize(injectedScript->cont
ext()->contextId(), frameOrdinal); |
| 1211 if (hasInternalError(errorString, !details->Set(context, toV8StringInter
nalized(m_isolate, "callFrameId"), toV8String(m_isolate, callFrameId)).FromMaybe
(false))) | 1209 if (hasInternalError(errorString, !details->Set(context, toV8StringInter
nalized(m_isolate, "callFrameId"), toV8String(m_isolate, callFrameId)).FromMaybe
(false))) |
| 1212 return Array<CallFrame>::create(); | 1210 return Array<CallFrame>::create(); |
| 1213 | 1211 |
| 1214 v8::Local<v8::Value> scopeChain; | 1212 v8::Local<v8::Value> scopeChain; |
| 1215 if (hasInternalError(errorString, !details->Get(context, toV8StringInter
nalized(m_isolate, "scopeChain")).ToLocal(&scopeChain) || !scopeChain->IsArray()
)) | 1213 if (hasInternalError(errorString, !details->Get(context, toV8StringInter
nalized(m_isolate, "scopeChain")).ToLocal(&scopeChain) || !scopeChain->IsArray()
)) |
| 1216 return Array<CallFrame>::create(); | 1214 return Array<CallFrame>::create(); |
| 1217 v8::Local<v8::Array> scopeChainArray = scopeChain.As<v8::Array>(); | 1215 v8::Local<v8::Array> scopeChainArray = scopeChain.As<v8::Array>(); |
| 1218 if (!injectedScript->wrapPropertyInArray(errorString, scopeChainArray, t
oV8StringInternalized(m_isolate, "object"), V8DebuggerAgentImpl::backtraceObject
Group)) | 1216 if (!injectedScript->wrapPropertyInArray(errorString, scopeChainArray, t
oV8StringInternalized(m_isolate, "object"), V8InspectorSession::backtraceObjectG
roup)) |
| 1219 return Array<CallFrame>::create(); | 1217 return Array<CallFrame>::create(); |
| 1220 | 1218 |
| 1221 if (!injectedScript->wrapObjectProperty(errorString, details, toV8String
Internalized(m_isolate, "this"), V8DebuggerAgentImpl::backtraceObjectGroup)) | 1219 if (!injectedScript->wrapObjectProperty(errorString, details, toV8String
Internalized(m_isolate, "this"), V8InspectorSession::backtraceObjectGroup)) |
| 1222 return Array<CallFrame>::create(); | 1220 return Array<CallFrame>::create(); |
| 1223 | 1221 |
| 1224 if (details->Has(context, toV8StringInternalized(m_isolate, "returnValue
")).FromMaybe(false)) { | 1222 if (details->Has(context, toV8StringInternalized(m_isolate, "returnValue
")).FromMaybe(false)) { |
| 1225 if (!injectedScript->wrapObjectProperty(errorString, details, toV8St
ringInternalized(m_isolate, "returnValue"), V8DebuggerAgentImpl::backtraceObject
Group)) | 1223 if (!injectedScript->wrapObjectProperty(errorString, details, toV8St
ringInternalized(m_isolate, "returnValue"), V8InspectorSession::backtraceObjectG
roup)) |
| 1226 return Array<CallFrame>::create(); | 1224 return Array<CallFrame>::create(); |
| 1227 } | 1225 } |
| 1228 | 1226 |
| 1229 if (hasInternalError(errorString, !objects->Set(context, frameOrdinal, d
etails).FromMaybe(false))) | 1227 if (hasInternalError(errorString, !objects->Set(context, frameOrdinal, d
etails).FromMaybe(false))) |
| 1230 return Array<CallFrame>::create(); | 1228 return Array<CallFrame>::create(); |
| 1231 } | 1229 } |
| 1232 | 1230 |
| 1233 protocol::ErrorSupport errorSupport; | 1231 protocol::ErrorSupport errorSupport; |
| 1234 OwnPtr<Array<CallFrame>> callFrames = Array<CallFrame>::parse(toProtocolValu
e(context, objects).get(), &errorSupport); | 1232 OwnPtr<Array<CallFrame>> callFrames = Array<CallFrame>::parse(toProtocolValu
e(context, objects).get(), &errorSupport); |
| 1235 if (hasInternalError(errorString, !callFrames)) | 1233 if (hasInternalError(errorString, !callFrames)) |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1346 m_pausedCallFrames.swap(debugger().currentCallFrames()); | 1344 m_pausedCallFrames.swap(debugger().currentCallFrames()); |
| 1347 m_pausedContext.Reset(m_isolate, context); | 1345 m_pausedContext.Reset(m_isolate, context); |
| 1348 v8::HandleScope handles(m_isolate); | 1346 v8::HandleScope handles(m_isolate); |
| 1349 | 1347 |
| 1350 if (!exception.IsEmpty()) { | 1348 if (!exception.IsEmpty()) { |
| 1351 ErrorString ignored; | 1349 ErrorString ignored; |
| 1352 InjectedScript* injectedScript = m_session->findInjectedScript(&ignored,
V8Debugger::contextId(context)); | 1350 InjectedScript* injectedScript = m_session->findInjectedScript(&ignored,
V8Debugger::contextId(context)); |
| 1353 if (injectedScript) { | 1351 if (injectedScript) { |
| 1354 m_breakReason = isPromiseRejection ? protocol::Debugger::Paused::Rea
sonEnum::PromiseRejection : protocol::Debugger::Paused::ReasonEnum::Exception; | 1352 m_breakReason = isPromiseRejection ? protocol::Debugger::Paused::Rea
sonEnum::PromiseRejection : protocol::Debugger::Paused::ReasonEnum::Exception; |
| 1355 ErrorString errorString; | 1353 ErrorString errorString; |
| 1356 auto obj = injectedScript->wrapObject(&errorString, exception, V8Deb
uggerAgentImpl::backtraceObjectGroup); | 1354 auto obj = injectedScript->wrapObject(&errorString, exception, V8Ins
pectorSession::backtraceObjectGroup); |
| 1357 m_breakAuxData = obj ? obj->serialize() : nullptr; | 1355 m_breakAuxData = obj ? obj->serialize() : nullptr; |
| 1358 // m_breakAuxData might be null after this. | 1356 // m_breakAuxData might be null after this. |
| 1359 } | 1357 } |
| 1360 } | 1358 } |
| 1361 | 1359 |
| 1362 OwnPtr<Array<String16>> hitBreakpointIds = Array<String16>::create(); | 1360 OwnPtr<Array<String16>> hitBreakpointIds = Array<String16>::create(); |
| 1363 | 1361 |
| 1364 for (const auto& point : hitBreakpoints) { | 1362 for (const auto& point : hitBreakpoints) { |
| 1365 DebugServerBreakpointToBreakpointIdAndSourceMap::iterator breakpointIter
ator = m_serverBreakpoints.find(point); | 1363 DebugServerBreakpointToBreakpointIdAndSourceMap::iterator breakpointIter
ator = m_serverBreakpoints.find(point); |
| 1366 if (breakpointIterator != m_serverBreakpoints.end()) { | 1364 if (breakpointIterator != m_serverBreakpoints.end()) { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1449 if (!enabled()) | 1447 if (!enabled()) |
| 1450 return; | 1448 return; |
| 1451 m_scheduledDebuggerStep = NoStep; | 1449 m_scheduledDebuggerStep = NoStep; |
| 1452 m_scripts.clear(); | 1450 m_scripts.clear(); |
| 1453 m_blackboxedPositions.clear(); | 1451 m_blackboxedPositions.clear(); |
| 1454 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1452 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 1455 allAsyncTasksCanceled(); | 1453 allAsyncTasksCanceled(); |
| 1456 } | 1454 } |
| 1457 | 1455 |
| 1458 } // namespace blink | 1456 } // namespace blink |
| OLD | NEW |