Index: Source/core/inspector/InspectorDebuggerAgent.cpp |
diff --git a/Source/core/inspector/InspectorDebuggerAgent.cpp b/Source/core/inspector/InspectorDebuggerAgent.cpp |
index 9f54a015db229aeab8f65dae12c74cb665b2421f..7e0a7b0c0325657d61ba49114615dc17ac0bd70b 100644 |
--- a/Source/core/inspector/InspectorDebuggerAgent.cpp |
+++ b/Source/core/inspector/InspectorDebuggerAgent.cpp |
@@ -63,6 +63,12 @@ static const char pauseOnExceptionsState[] = "pauseOnExceptionsState"; |
const char* InspectorDebuggerAgent::backtraceObjectGroup = "backtrace"; |
+static String generateBreakpointId(const String& scriptId, int lineNumber, int columnNumber, InspectorDebuggerAgent::BreakpointSource source) |
+{ |
+ return scriptId + ':' + String::number(lineNumber) + ':' + String::number(columnNumber) + |
+ (source == InspectorDebuggerAgent::UserBreakpointSource ? String() : String(":debug")); |
+} |
+ |
InspectorDebuggerAgent::InspectorDebuggerAgent(InstrumentingAgents* instrumentingAgents, InspectorCompositeState* inspectorState, InjectedScriptManager* injectedScriptManager) |
: InspectorBaseAgent<InspectorDebuggerAgent>("Debugger", instrumentingAgents, inspectorState) |
, m_injectedScriptManager(injectedScriptManager) |
@@ -243,7 +249,7 @@ void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString* errorString, int li |
for (ScriptsMap::iterator it = m_scripts.begin(); it != m_scripts.end(); ++it) { |
if (!matches(it->value.url, url, isRegex)) |
continue; |
- RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(breakpointId, it->key, breakpoint); |
+ RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(breakpointId, it->key, breakpoint, UserBreakpointSource); |
if (location) |
locations->addItem(location); |
} |
@@ -273,13 +279,13 @@ void InspectorDebuggerAgent::setBreakpoint(ErrorString* errorString, const RefPt |
String condition = optionalCondition ? *optionalCondition : emptyString(); |
- String breakpointId = scriptId + ':' + String::number(lineNumber) + ':' + String::number(columnNumber); |
+ String breakpointId = generateBreakpointId(scriptId, lineNumber, columnNumber, UserBreakpointSource); |
if (m_breakpointIdToDebugServerBreakpointIds.find(breakpointId) != m_breakpointIdToDebugServerBreakpointIds.end()) { |
*errorString = "Breakpoint at specified location already exists."; |
return; |
} |
ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); |
- actualLocation = resolveBreakpoint(breakpointId, scriptId, breakpoint); |
+ actualLocation = resolveBreakpoint(breakpointId, scriptId, breakpoint, UserBreakpointSource); |
if (actualLocation) |
*outBreakpointId = breakpointId; |
else |
@@ -292,12 +298,18 @@ void InspectorDebuggerAgent::removeBreakpoint(ErrorString*, const String& breakp |
breakpointsCookie->remove(breakpointId); |
m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, breakpointsCookie); |
+ removeBreakpoint(breakpointId); |
+} |
+ |
+void InspectorDebuggerAgent::removeBreakpoint(const String& breakpointId) |
+{ |
BreakpointIdToDebugServerBreakpointIdsMap::iterator debugServerBreakpointIdsIterator = m_breakpointIdToDebugServerBreakpointIds.find(breakpointId); |
if (debugServerBreakpointIdsIterator == m_breakpointIdToDebugServerBreakpointIds.end()) |
return; |
for (size_t i = 0; i < debugServerBreakpointIdsIterator->value.size(); ++i) { |
- scriptDebugServer().removeBreakpoint(debugServerBreakpointIdsIterator->value[i]); |
- m_serverBreakpointIdToBreakpointId.remove(debugServerBreakpointIdsIterator->value[i]); |
+ const String& debugServerBreakpointId = debugServerBreakpointIdsIterator->value[i]; |
+ scriptDebugServer().removeBreakpoint(debugServerBreakpointId); |
+ m_serverBreakpoints.remove(debugServerBreakpointId); |
} |
m_breakpointIdToDebugServerBreakpointIds.remove(debugServerBreakpointIdsIterator); |
} |
@@ -321,7 +333,7 @@ void InspectorDebuggerAgent::continueToLocation(ErrorString* errorString, const |
resume(errorString); |
} |
-PassRefPtr<TypeBuilder::Debugger::Location> InspectorDebuggerAgent::resolveBreakpoint(const String& breakpointId, const String& scriptId, const ScriptBreakpoint& breakpoint) |
+PassRefPtr<TypeBuilder::Debugger::Location> InspectorDebuggerAgent::resolveBreakpoint(const String& breakpointId, const String& scriptId, const ScriptBreakpoint& breakpoint, BreakpointSource source) |
{ |
ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId); |
if (scriptIterator == m_scripts.end()) |
@@ -336,7 +348,7 @@ PassRefPtr<TypeBuilder::Debugger::Location> InspectorDebuggerAgent::resolveBreak |
if (debugServerBreakpointId.isEmpty()) |
return 0; |
- m_serverBreakpointIdToBreakpointId.set(debugServerBreakpointId, breakpointId); |
+ m_serverBreakpoints.set(debugServerBreakpointId, std::make_pair(breakpointId, source)); |
BreakpointIdToDebugServerBreakpointIdsMap::iterator debugServerBreakpointIdsIterator = m_breakpointIdToDebugServerBreakpointIds.find(breakpointId); |
if (debugServerBreakpointIdsIterator == m_breakpointIdToDebugServerBreakpointIds.end()) |
@@ -694,7 +706,7 @@ void InspectorDebuggerAgent::didParseSource(const String& scriptId, const Script |
breakpointObject->getNumber("lineNumber", &breakpoint.lineNumber); |
breakpointObject->getNumber("columnNumber", &breakpoint.columnNumber); |
breakpointObject->getString("condition", &breakpoint.condition); |
- RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(it->key, scriptId, breakpoint); |
+ RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(it->key, scriptId, breakpoint, UserBreakpointSource); |
if (location) |
m_frontend->breakpointResolved(it->key, location); |
} |
@@ -723,9 +735,15 @@ void InspectorDebuggerAgent::didPause(ScriptState* scriptState, const ScriptValu |
RefPtr<Array<String> > hitBreakpointIds = Array<String>::create(); |
for (Vector<String>::const_iterator i = hitBreakpoints.begin(); i != hitBreakpoints.end(); ++i) { |
- DebugServerBreakpointIdToBreakpointIdMap::iterator breakpointIterator = m_serverBreakpointIdToBreakpointId.find(*i); |
- if (breakpointIterator != m_serverBreakpointIdToBreakpointId.end()) |
- hitBreakpointIds->addItem(breakpointIterator->value); |
+ DebugServerBreakpointToBreakpointIdAndSourceMap::iterator breakpointIterator = m_serverBreakpoints.find(*i); |
+ if (breakpointIterator != m_serverBreakpoints.end()) { |
+ const String& localId = breakpointIterator->value.first; |
+ hitBreakpointIds->addItem(localId); |
+ |
+ BreakpointSource source = breakpointIterator->value.second; |
+ if (m_breakReason == InspectorFrontend::Debugger::Reason::Other && source == DebugCommandBreakpointSource) |
+ m_breakReason = InspectorFrontend::Debugger::Reason::DebugCommand; |
+ } |
} |
m_frontend->paused(currentCallFrames(), m_breakReason, m_breakAuxData, hitBreakpointIds); |
@@ -805,6 +823,18 @@ void ScriptDebugListener::Script::reportMemoryUsage(MemoryObjectInfo* memoryObje |
info.addMember(sourceMappingURL, "sourceMappingURL"); |
} |
+void InspectorDebuggerAgent::setBreakpoint(const String& scriptId, int lineNumber, int columnNumber, BreakpointSource source) |
+{ |
+ String breakpointId = generateBreakpointId(scriptId, lineNumber, columnNumber, source); |
+ ScriptBreakpoint breakpoint(lineNumber, columnNumber, String()); |
+ resolveBreakpoint(breakpointId, scriptId, breakpoint, source); |
+} |
+ |
+void InspectorDebuggerAgent::removeBreakpoint(const String& scriptId, int lineNumber, int columnNumber, BreakpointSource source) |
+{ |
+ removeBreakpoint(generateBreakpointId(scriptId, lineNumber, columnNumber, source)); |
+} |
+ |
void InspectorDebuggerAgent::reset() |
{ |
m_scripts.clear(); |