OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2010 Apple Inc. All rights reserved. |
3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
99 return scriptId + ':' + String::number(lineNumber) + ':' + String::number(co
lumnNumber) + breakpointIdSuffix(source); | 99 return scriptId + ':' + String::number(lineNumber) + ':' + String::number(co
lumnNumber) + breakpointIdSuffix(source); |
100 } | 100 } |
101 | 101 |
102 InspectorDebuggerAgent::InspectorDebuggerAgent(InjectedScriptManager* injectedSc
riptManager) | 102 InspectorDebuggerAgent::InspectorDebuggerAgent(InjectedScriptManager* injectedSc
riptManager) |
103 : InspectorBaseAgent<InspectorDebuggerAgent>("Debugger") | 103 : InspectorBaseAgent<InspectorDebuggerAgent>("Debugger") |
104 , m_injectedScriptManager(injectedScriptManager) | 104 , m_injectedScriptManager(injectedScriptManager) |
105 , m_frontend(0) | 105 , m_frontend(0) |
106 , m_pausedScriptState(nullptr) | 106 , m_pausedScriptState(nullptr) |
107 , m_javaScriptPauseScheduled(false) | 107 , m_javaScriptPauseScheduled(false) |
108 , m_debuggerStepScheduled(false) | 108 , m_debuggerStepScheduled(false) |
109 , m_steppingFromFramework(false) | |
110 , m_pausingOnNativeEvent(false) | 109 , m_pausingOnNativeEvent(false) |
111 , m_listener(0) | 110 , m_listener(0) |
112 , m_skippedStepInCount(0) | 111 , m_skippedStepInCount(0) |
113 , m_skipAllPauses(false) | 112 , m_skipAllPauses(false) |
114 { | 113 { |
115 } | 114 } |
116 | 115 |
117 InspectorDebuggerAgent::~InspectorDebuggerAgent() | 116 InspectorDebuggerAgent::~InspectorDebuggerAgent() |
118 { | 117 { |
119 ASSERT(!m_instrumentingAgents->inspectorDebuggerAgent()); | 118 ASSERT(!m_instrumentingAgents->inspectorDebuggerAgent()); |
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 { | 467 { |
469 String scriptIdString = String::number(frame->sourceID()); | 468 String scriptIdString = String::number(frame->sourceID()); |
470 ScriptsMap::iterator it = m_scripts.find(scriptIdString); | 469 ScriptsMap::iterator it = m_scripts.find(scriptIdString); |
471 if (it == m_scripts.end()) | 470 if (it == m_scripts.end()) |
472 return String(); | 471 return String(); |
473 return it->value.url; | 472 return it->value.url; |
474 } | 473 } |
475 | 474 |
476 ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::shouldSkipExceptio
nPause() | 475 ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::shouldSkipExceptio
nPause() |
477 { | 476 { |
478 if (m_steppingFromFramework) | |
479 return ScriptDebugListener::NoSkip; | |
480 | |
481 // FIXME: Fast return: if (!m_cachedSkipStackRegExp && !has_any_anti_breakpo
int) return ScriptDebugListener::NoSkip; | 477 // FIXME: Fast return: if (!m_cachedSkipStackRegExp && !has_any_anti_breakpo
int) return ScriptDebugListener::NoSkip; |
482 | 478 |
483 RefPtrWillBeRawPtr<JavaScriptCallFrame> topFrame = scriptDebugServer().topCa
llFrameNoScopes(); | 479 RefPtrWillBeRawPtr<JavaScriptCallFrame> topFrame = scriptDebugServer().topCa
llFrameNoScopes(); |
484 if (!topFrame) | 480 if (!topFrame) |
485 return ScriptDebugListener::NoSkip; | 481 return ScriptDebugListener::NoSkip; |
486 | 482 |
487 String topFrameScriptUrl = scriptURL(topFrame.get()); | 483 String topFrameScriptUrl = scriptURL(topFrame.get()); |
488 if (m_cachedSkipStackRegExp && !topFrameScriptUrl.isEmpty() && m_cachedSkipS
tackRegExp->match(topFrameScriptUrl) != -1) | 484 if (m_cachedSkipStackRegExp && !topFrameScriptUrl.isEmpty() && m_cachedSkipS
tackRegExp->match(topFrameScriptUrl) != -1) |
489 return ScriptDebugListener::Continue; | 485 return ScriptDebugListener::Continue; |
490 | 486 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 continue; | 519 continue; |
524 | 520 |
525 return ScriptDebugListener::Continue; | 521 return ScriptDebugListener::Continue; |
526 } | 522 } |
527 | 523 |
528 return ScriptDebugListener::NoSkip; | 524 return ScriptDebugListener::NoSkip; |
529 } | 525 } |
530 | 526 |
531 ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::shouldSkipStepPaus
e() | 527 ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::shouldSkipStepPaus
e() |
532 { | 528 { |
533 if (!m_cachedSkipStackRegExp || m_steppingFromFramework) | 529 if (!m_cachedSkipStackRegExp) |
534 return ScriptDebugListener::NoSkip; | 530 return ScriptDebugListener::NoSkip; |
535 | 531 |
536 RefPtrWillBeRawPtr<JavaScriptCallFrame> topFrame = scriptDebugServer().topCa
llFrameNoScopes(); | 532 RefPtrWillBeRawPtr<JavaScriptCallFrame> topFrame = scriptDebugServer().topCa
llFrameNoScopes(); |
537 String scriptUrl = scriptURL(topFrame.get()); | 533 String scriptUrl = scriptURL(topFrame.get()); |
538 if (scriptUrl.isEmpty() || m_cachedSkipStackRegExp->match(scriptUrl) == -1) | 534 if (scriptUrl.isEmpty() || m_cachedSkipStackRegExp->match(scriptUrl) == -1) |
539 return ScriptDebugListener::NoSkip; | 535 return ScriptDebugListener::NoSkip; |
540 | 536 |
541 if (m_skippedStepInCount == 0) { | 537 if (m_skippedStepInCount == 0) { |
542 m_minFrameCountForSkip = scriptDebugServer().frameCount(); | 538 m_minFrameCountForSkip = scriptDebugServer().frameCount(); |
543 m_skippedStepInCount = 1; | 539 m_skippedStepInCount = 1; |
544 return ScriptDebugListener::StepInto; | 540 return ScriptDebugListener::StepInto; |
545 } | 541 } |
546 | 542 |
547 if (m_skippedStepInCount < maxSkipStepInCount && topFrame->isAtReturn() && s
criptDebugServer().frameCount() <= m_minFrameCountForSkip) | 543 if (m_skippedStepInCount < maxSkipStepInCount && topFrame->isAtReturn() && s
criptDebugServer().frameCount() <= m_minFrameCountForSkip) |
548 m_skippedStepInCount = maxSkipStepInCount; | 544 m_skippedStepInCount = maxSkipStepInCount; |
549 | 545 |
550 if (m_skippedStepInCount >= maxSkipStepInCount) { | 546 if (m_skippedStepInCount >= maxSkipStepInCount) { |
551 if (m_pausingOnNativeEvent) { | 547 if (m_pausingOnNativeEvent) { |
552 m_pausingOnNativeEvent = false; | 548 m_pausingOnNativeEvent = false; |
553 m_skippedStepInCount = 0; | 549 m_skippedStepInCount = 0; |
554 return ScriptDebugListener::Continue; | 550 return ScriptDebugListener::Continue; |
555 } | 551 } |
556 return ScriptDebugListener::StepOut; | 552 return ScriptDebugListener::StepOut; |
557 } | 553 } |
558 | 554 |
559 ++m_skippedStepInCount; | 555 ++m_skippedStepInCount; |
560 return ScriptDebugListener::StepInto; | 556 return ScriptDebugListener::StepInto; |
561 } | 557 } |
562 | 558 |
563 bool InspectorDebuggerAgent::isTopCallFrameInFramework() | |
564 { | |
565 if (!m_cachedSkipStackRegExp) | |
566 return false; | |
567 | |
568 RefPtrWillBeRawPtr<JavaScriptCallFrame> topFrame = scriptDebugServer().topCa
llFrameNoScopes(); | |
569 String scriptUrl = scriptURL(topFrame.get()); | |
570 return !scriptUrl.isEmpty() && m_cachedSkipStackRegExp->match(scriptUrl) !=
-1; | |
571 } | |
572 | |
573 PassRefPtr<TypeBuilder::Debugger::Location> InspectorDebuggerAgent::resolveBreak
point(const String& breakpointId, const String& scriptId, const ScriptBreakpoint
& breakpoint, BreakpointSource source) | 559 PassRefPtr<TypeBuilder::Debugger::Location> InspectorDebuggerAgent::resolveBreak
point(const String& breakpointId, const String& scriptId, const ScriptBreakpoint
& breakpoint, BreakpointSource source) |
574 { | 560 { |
575 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId); | 561 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId); |
576 if (scriptIterator == m_scripts.end()) | 562 if (scriptIterator == m_scripts.end()) |
577 return nullptr; | 563 return nullptr; |
578 Script& script = scriptIterator->value; | 564 Script& script = scriptIterator->value; |
579 if (breakpoint.lineNumber < script.startLine || script.endLine < breakpoint.
lineNumber) | 565 if (breakpoint.lineNumber < script.startLine || script.endLine < breakpoint.
lineNumber) |
580 return nullptr; | 566 return nullptr; |
581 | 567 |
582 int actualLineNumber; | 568 int actualLineNumber; |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
790 clearBreakDetails(); | 776 clearBreakDetails(); |
791 m_javaScriptPauseScheduled = true; | 777 m_javaScriptPauseScheduled = true; |
792 scriptDebugServer().setPauseOnNextStatement(true); | 778 scriptDebugServer().setPauseOnNextStatement(true); |
793 } | 779 } |
794 | 780 |
795 void InspectorDebuggerAgent::resume(ErrorString* errorString) | 781 void InspectorDebuggerAgent::resume(ErrorString* errorString) |
796 { | 782 { |
797 if (!assertPaused(errorString)) | 783 if (!assertPaused(errorString)) |
798 return; | 784 return; |
799 m_debuggerStepScheduled = false; | 785 m_debuggerStepScheduled = false; |
800 m_steppingFromFramework = false; | |
801 m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtrac
eObjectGroup); | 786 m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtrac
eObjectGroup); |
802 scriptDebugServer().continueProgram(); | 787 scriptDebugServer().continueProgram(); |
803 } | 788 } |
804 | 789 |
805 void InspectorDebuggerAgent::stepOver(ErrorString* errorString) | 790 void InspectorDebuggerAgent::stepOver(ErrorString* errorString) |
806 { | 791 { |
807 if (!assertPaused(errorString)) | 792 if (!assertPaused(errorString)) |
808 return; | 793 return; |
809 m_debuggerStepScheduled = true; | 794 m_debuggerStepScheduled = true; |
810 m_steppingFromFramework = isTopCallFrameInFramework(); | |
811 m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtrac
eObjectGroup); | 795 m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtrac
eObjectGroup); |
812 scriptDebugServer().stepOverStatement(); | 796 scriptDebugServer().stepOverStatement(); |
813 } | 797 } |
814 | 798 |
815 void InspectorDebuggerAgent::stepInto(ErrorString* errorString) | 799 void InspectorDebuggerAgent::stepInto(ErrorString* errorString) |
816 { | 800 { |
817 if (!assertPaused(errorString)) | 801 if (!assertPaused(errorString)) |
818 return; | 802 return; |
819 m_debuggerStepScheduled = true; | 803 m_debuggerStepScheduled = true; |
820 m_steppingFromFramework = isTopCallFrameInFramework(); | |
821 m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtrac
eObjectGroup); | 804 m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtrac
eObjectGroup); |
822 scriptDebugServer().stepIntoStatement(); | 805 scriptDebugServer().stepIntoStatement(); |
823 if (m_listener) | 806 if (m_listener) |
824 m_listener->stepInto(); | 807 m_listener->stepInto(); |
825 } | 808 } |
826 | 809 |
827 void InspectorDebuggerAgent::stepOut(ErrorString* errorString) | 810 void InspectorDebuggerAgent::stepOut(ErrorString* errorString) |
828 { | 811 { |
829 if (!assertPaused(errorString)) | 812 if (!assertPaused(errorString)) |
830 return; | 813 return; |
831 m_debuggerStepScheduled = true; | 814 m_debuggerStepScheduled = true; |
832 m_steppingFromFramework = isTopCallFrameInFramework(); | |
833 m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtrac
eObjectGroup); | 815 m_injectedScriptManager->releaseObjectGroup(InspectorDebuggerAgent::backtrac
eObjectGroup); |
834 scriptDebugServer().stepOutOfFunction(); | 816 scriptDebugServer().stepOutOfFunction(); |
835 } | 817 } |
836 | 818 |
837 void InspectorDebuggerAgent::setPauseOnExceptions(ErrorString* errorString, cons
t String& stringPauseState) | 819 void InspectorDebuggerAgent::setPauseOnExceptions(ErrorString* errorString, cons
t String& stringPauseState) |
838 { | 820 { |
839 ScriptDebugServer::PauseOnExceptionsState pauseState; | 821 ScriptDebugServer::PauseOnExceptionsState pauseState; |
840 if (stringPauseState == "none") | 822 if (stringPauseState == "none") |
841 pauseState = ScriptDebugServer::DontPauseOnExceptions; | 823 pauseState = ScriptDebugServer::DontPauseOnExceptions; |
842 else if (stringPauseState == "all") | 824 else if (stringPauseState == "all") |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1183 | 1165 |
1184 BreakpointSource source = breakpointIterator->value.second; | 1166 BreakpointSource source = breakpointIterator->value.second; |
1185 if (m_breakReason == InspectorFrontend::Debugger::Reason::Other && s
ource == DebugCommandBreakpointSource) | 1167 if (m_breakReason == InspectorFrontend::Debugger::Reason::Other && s
ource == DebugCommandBreakpointSource) |
1186 m_breakReason = InspectorFrontend::Debugger::Reason::DebugComman
d; | 1168 m_breakReason = InspectorFrontend::Debugger::Reason::DebugComman
d; |
1187 } | 1169 } |
1188 } | 1170 } |
1189 | 1171 |
1190 m_frontend->paused(currentCallFrames(), m_breakReason, m_breakAuxData, hitBr
eakpointIds, currentAsyncStackTrace()); | 1172 m_frontend->paused(currentCallFrames(), m_breakReason, m_breakAuxData, hitBr
eakpointIds, currentAsyncStackTrace()); |
1191 m_javaScriptPauseScheduled = false; | 1173 m_javaScriptPauseScheduled = false; |
1192 m_debuggerStepScheduled = false; | 1174 m_debuggerStepScheduled = false; |
1193 m_steppingFromFramework = false; | |
1194 m_pausingOnNativeEvent = false; | 1175 m_pausingOnNativeEvent = false; |
1195 m_skippedStepInCount = 0; | 1176 m_skippedStepInCount = 0; |
1196 | 1177 |
1197 if (!m_continueToLocationBreakpointId.isEmpty()) { | 1178 if (!m_continueToLocationBreakpointId.isEmpty()) { |
1198 scriptDebugServer().removeBreakpoint(m_continueToLocationBreakpointId); | 1179 scriptDebugServer().removeBreakpoint(m_continueToLocationBreakpointId); |
1199 m_continueToLocationBreakpointId = ""; | 1180 m_continueToLocationBreakpointId = ""; |
1200 } | 1181 } |
1201 if (m_listener) | 1182 if (m_listener) |
1202 m_listener->didPause(); | 1183 m_listener->didPause(); |
1203 return result; | 1184 return result; |
(...skipping 12 matching lines...) Expand all Loading... |
1216 return scriptDebugServer().canBreakProgram(); | 1197 return scriptDebugServer().canBreakProgram(); |
1217 } | 1198 } |
1218 | 1199 |
1219 void InspectorDebuggerAgent::breakProgram(InspectorFrontend::Debugger::Reason::E
num breakReason, PassRefPtr<JSONObject> data) | 1200 void InspectorDebuggerAgent::breakProgram(InspectorFrontend::Debugger::Reason::E
num breakReason, PassRefPtr<JSONObject> data) |
1220 { | 1201 { |
1221 if (m_skipAllPauses) | 1202 if (m_skipAllPauses) |
1222 return; | 1203 return; |
1223 m_breakReason = breakReason; | 1204 m_breakReason = breakReason; |
1224 m_breakAuxData = data; | 1205 m_breakAuxData = data; |
1225 m_debuggerStepScheduled = false; | 1206 m_debuggerStepScheduled = false; |
1226 m_steppingFromFramework = false; | |
1227 m_pausingOnNativeEvent = false; | 1207 m_pausingOnNativeEvent = false; |
1228 scriptDebugServer().breakProgram(); | 1208 scriptDebugServer().breakProgram(); |
1229 } | 1209 } |
1230 | 1210 |
1231 void InspectorDebuggerAgent::clear() | 1211 void InspectorDebuggerAgent::clear() |
1232 { | 1212 { |
1233 m_pausedScriptState = nullptr; | 1213 m_pausedScriptState = nullptr; |
1234 m_currentCallStack = ScriptValue(); | 1214 m_currentCallStack = ScriptValue(); |
1235 m_scripts.clear(); | 1215 m_scripts.clear(); |
1236 m_breakpointIdToDebugServerBreakpointIds.clear(); | 1216 m_breakpointIdToDebugServerBreakpointIds.clear(); |
1237 m_asyncCallStackTracker.clear(); | 1217 m_asyncCallStackTracker.clear(); |
1238 m_continueToLocationBreakpointId = String(); | 1218 m_continueToLocationBreakpointId = String(); |
1239 clearBreakDetails(); | 1219 clearBreakDetails(); |
1240 m_javaScriptPauseScheduled = false; | 1220 m_javaScriptPauseScheduled = false; |
1241 m_debuggerStepScheduled = false; | 1221 m_debuggerStepScheduled = false; |
1242 m_steppingFromFramework = false; | |
1243 m_pausingOnNativeEvent = false; | 1222 m_pausingOnNativeEvent = false; |
1244 ErrorString error; | 1223 ErrorString error; |
1245 setOverlayMessage(&error, 0); | 1224 setOverlayMessage(&error, 0); |
1246 } | 1225 } |
1247 | 1226 |
1248 bool InspectorDebuggerAgent::assertPaused(ErrorString* errorString) | 1227 bool InspectorDebuggerAgent::assertPaused(ErrorString* errorString) |
1249 { | 1228 { |
1250 if (!m_pausedScriptState) { | 1229 if (!m_pausedScriptState) { |
1251 *errorString = "Can only perform operation while paused."; | 1230 *errorString = "Can only perform operation while paused."; |
1252 return false; | 1231 return false; |
(...skipping 23 matching lines...) Expand all Loading... |
1276 { | 1255 { |
1277 m_scripts.clear(); | 1256 m_scripts.clear(); |
1278 m_breakpointIdToDebugServerBreakpointIds.clear(); | 1257 m_breakpointIdToDebugServerBreakpointIds.clear(); |
1279 m_asyncCallStackTracker.clear(); | 1258 m_asyncCallStackTracker.clear(); |
1280 if (m_frontend) | 1259 if (m_frontend) |
1281 m_frontend->globalObjectCleared(); | 1260 m_frontend->globalObjectCleared(); |
1282 } | 1261 } |
1283 | 1262 |
1284 } // namespace WebCore | 1263 } // namespace WebCore |
1285 | 1264 |
OLD | NEW |