void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString& errorString, int lineNumber, const String* const optionalURL, const String* const optionalURLRegex, const int* const optionalColumnNumber, const RefPtr<InspectorObject>&& options, Inspector::Protocol::Debugger::BreakpointId* outBreakpointIdentifier, RefPtr<Inspector::Protocol::Array<Inspector::Protocol::Debugger::Location>>& locations) { locations = Inspector::Protocol::Array<Inspector::Protocol::Debugger::Location>::create(); if (!optionalURL == !optionalURLRegex) { errorString = ASCIILiteral("Either url or urlRegex must be specified."); return; } String url = optionalURL ? *optionalURL : *optionalURLRegex; int columnNumber = optionalColumnNumber ? *optionalColumnNumber : 0; bool isRegex = optionalURLRegex; String breakpointIdentifier = (isRegex ? "/" + url + "/" : url) + ':' + String::number(lineNumber) + ':' + String::number(columnNumber); if (m_javaScriptBreakpoints.contains(breakpointIdentifier)) { errorString = ASCIILiteral("Breakpoint at specified location already exists."); return; } String condition = emptyString(); bool autoContinue = false; RefPtr<InspectorArray> actions; if (options) { options->getString(ASCIILiteral("condition"), condition); options->getBoolean(ASCIILiteral("autoContinue"), autoContinue); options->getArray(ASCIILiteral("actions"), actions); } BreakpointActions breakpointActions; if (!breakpointActionsFromProtocol(errorString, actions, &breakpointActions)) return; m_javaScriptBreakpoints.set(breakpointIdentifier, buildObjectForBreakpointCookie(url, lineNumber, columnNumber, condition, actions, isRegex, autoContinue)); ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition, breakpointActions, autoContinue); for (ScriptsMap::iterator it = m_scripts.begin(); it != m_scripts.end(); ++it) { String scriptURL = !it->value.sourceURL.isEmpty() ? it->value.sourceURL : it->value.url; if (!matches(scriptURL, url, isRegex)) continue; RefPtr<Inspector::Protocol::Debugger::Location> location = resolveBreakpoint(breakpointIdentifier, it->key, breakpoint); if (location) locations->addItem(WTF::move(location)); } *outBreakpointIdentifier = breakpointIdentifier; }
void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString* errorString, int lineNumber, const String* const optionalURL, const String* const optionalURLRegex, const int* const optionalColumnNumber, const RefPtr<InspectorObject>* options, TypeBuilder::Debugger::BreakpointId* outBreakpointId, RefPtr<TypeBuilder::Array<TypeBuilder::Debugger::Location> >& locations) { locations = Array<TypeBuilder::Debugger::Location>::create(); if (!optionalURL == !optionalURLRegex) { *errorString = "Either url or urlRegex must be specified."; return; } String url = optionalURL ? *optionalURL : *optionalURLRegex; int columnNumber = optionalColumnNumber ? *optionalColumnNumber : 0; bool isRegex = optionalURLRegex; String breakpointId = (isRegex ? "/" + url + "/" : url) + ':' + String::number(lineNumber) + ':' + String::number(columnNumber); RefPtr<InspectorObject> breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); if (breakpointsCookie->find(breakpointId) != breakpointsCookie->end()) { *errorString = "Breakpoint at specified location already exists."; return; } String condition = emptyString(); bool autoContinue = false; RefPtr<InspectorArray> actions; if (options) { (*options)->getString("condition", &condition); (*options)->getBoolean("autoContinue", &autoContinue); actions = (*options)->getArray("actions"); } Vector<ScriptBreakpointAction> breakpointActions; if (!breakpointActionsFromProtocol(errorString, actions, &breakpointActions)) return; breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(url, lineNumber, columnNumber, condition, actions, isRegex, autoContinue)); m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, breakpointsCookie); ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition, breakpointActions, autoContinue); 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); if (location) locations->addItem(location); } *outBreakpointId = breakpointId; }
void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString*, const String& url, int lineNumber, const int* const optionalColumnNumber, const String* const optionalCondition, String* outBreakpointId, RefPtr<InspectorArray>* locations) { int columnNumber = optionalColumnNumber ? *optionalColumnNumber : 0; String condition = optionalCondition ? *optionalCondition : ""; String breakpointId = url + ':' + String::number(lineNumber) + ':' + String::number(columnNumber); RefPtr<InspectorObject> breakpointsCookie = m_inspectorState->getObject(DebuggerAgentState::javaScriptBreakpoints); if (breakpointsCookie->find(breakpointId) != breakpointsCookie->end()) return; breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(url, lineNumber, columnNumber, condition)); m_inspectorState->setObject(DebuggerAgentState::javaScriptBreakpoints, breakpointsCookie); ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); for (ScriptsMap::iterator it = m_scripts.begin(); it != m_scripts.end(); ++it) { if (it->second.url != url) continue; RefPtr<InspectorObject> location = resolveBreakpoint(breakpointId, it->first, breakpoint); if (location) (*locations)->pushObject(location); } *outBreakpointId = breakpointId; }