void InspectorDebuggerAgent::setBreakpoint(ErrorString* errorString, const RefPtr<InspectorObject>& location, const RefPtr<InspectorObject>* options, TypeBuilder::Debugger::BreakpointId* outBreakpointId, RefPtr<TypeBuilder::Debugger::Location>& actualLocation) { String scriptId; int lineNumber; int columnNumber; if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNumber)) 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; String breakpointId = scriptId + ':' + String::number(lineNumber) + ':' + String::number(columnNumber); if (m_breakpointIdToDebugServerBreakpointIds.find(breakpointId) != m_breakpointIdToDebugServerBreakpointIds.end()) { *errorString = "Breakpoint at specified location already exists."; return; } ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition, breakpointActions, autoContinue); actualLocation = resolveBreakpoint(breakpointId, scriptId, breakpoint); if (actualLocation) *outBreakpointId = breakpointId; else *errorString = "Could not resolve breakpoint"; }
void InspectorDebuggerAgent::didParseSource(JSC::SourceID sourceID, const Script& inScript) { Script script = inScript; if (script.startLine <= 0 && !script.startColumn) script.sourceURL = ContentSearchUtilities::findScriptSourceURL(script.source); script.sourceMappingURL = sourceMapURLForScript(script); bool hasSourceURL = !script.sourceURL.isEmpty(); String scriptURL = hasSourceURL ? script.sourceURL : script.url; bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; String* sourceMapURLParam = script.sourceMappingURL.isNull() ? nullptr : &script.sourceMappingURL; const bool* isContentScript = script.isContentScript ? &script.isContentScript : nullptr; String scriptIDStr = String::number(sourceID); m_frontendDispatcher->scriptParsed(scriptIDStr, scriptURL, script.startLine, script.startColumn, script.endLine, script.endColumn, isContentScript, sourceMapURLParam, hasSourceURLParam); m_scripts.set(sourceID, script); if (scriptURL.isEmpty()) return; for (auto it = m_javaScriptBreakpoints.begin(), end = m_javaScriptBreakpoints.end(); it != end; ++it) { RefPtr<InspectorObject> breakpointObject; if (!it->value->asObject(breakpointObject)) return; bool isRegex; breakpointObject->getBoolean(ASCIILiteral("isRegex"), isRegex); String url; breakpointObject->getString(ASCIILiteral("url"), url); if (!matches(scriptURL, url, isRegex)) continue; ScriptBreakpoint breakpoint; breakpointObject->getInteger(ASCIILiteral("lineNumber"), breakpoint.lineNumber); breakpointObject->getInteger(ASCIILiteral("columnNumber"), breakpoint.columnNumber); breakpointObject->getString(ASCIILiteral("condition"), breakpoint.condition); breakpointObject->getBoolean(ASCIILiteral("autoContinue"), breakpoint.autoContinue); ErrorString errorString; RefPtr<InspectorArray> actions; breakpointObject->getArray(ASCIILiteral("actions"), actions); if (!breakpointActionsFromProtocol(errorString, actions, &breakpoint.actions)) { ASSERT_NOT_REACHED(); continue; } RefPtr<Inspector::Protocol::Debugger::Location> location = resolveBreakpoint(it->key, sourceID, breakpoint); if (location) m_frontendDispatcher->breakpointResolved(it->key, location); } }
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) { String scriptURL = !it->value.sourceURL.isEmpty() ? it->value.sourceURL : it->value.url; if (!matches(scriptURL, url, isRegex)) continue; RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(breakpointId, it->key, breakpoint); if (location) locations->addItem(location); } *outBreakpointId = breakpointId; }
void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString& errorString, int lineNumber, const String* const optionalURL, const String* const optionalURLRegex, const int* const optionalColumnNumber, const 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; unsigned ignoreCount = 0; RefPtr<InspectorArray> actions; if (options) { options->getString(ASCIILiteral("condition"), condition); options->getBoolean(ASCIILiteral("autoContinue"), autoContinue); options->getArray(ASCIILiteral("actions"), actions); options->getInteger(ASCIILiteral("ignoreCount"), ignoreCount); } BreakpointActions breakpointActions; if (!breakpointActionsFromProtocol(errorString, actions, &breakpointActions)) return; m_javaScriptBreakpoints.set(breakpointIdentifier, buildObjectForBreakpointCookie(url, lineNumber, columnNumber, condition, actions, isRegex, autoContinue, ignoreCount)); ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition, breakpointActions, autoContinue, ignoreCount); 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::didParseSource(const String& scriptId, const Script& inScript) { Script script = inScript; if (!script.startLine && !script.startColumn) script.sourceURL = ContentSearchUtils::findScriptSourceURL(script.source); script.sourceMappingURL = sourceMapURLForScript(script); bool hasSourceURL = !script.sourceURL.isEmpty(); String scriptURL = hasSourceURL ? script.sourceURL : script.url; bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : 0; String* sourceMapURLParam = script.sourceMappingURL.isNull() ? 0 : &script.sourceMappingURL; const bool* isContentScript = script.isContentScript ? &script.isContentScript : 0; m_frontend->scriptParsed(scriptId, scriptURL, script.startLine, script.startColumn, script.endLine, script.endColumn, isContentScript, sourceMapURLParam, hasSourceURLParam); m_scripts.set(scriptId, script); if (scriptURL.isEmpty()) return; RefPtr<InspectorObject> breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); for (InspectorObject::iterator it = breakpointsCookie->begin(); it != breakpointsCookie->end(); ++it) { RefPtr<InspectorObject> breakpointObject = it->value->asObject(); bool isRegex; breakpointObject->getBoolean("isRegex", &isRegex); String url; breakpointObject->getString("url", &url); if (!matches(scriptURL, url, isRegex)) continue; ScriptBreakpoint breakpoint; breakpointObject->getNumber("lineNumber", &breakpoint.lineNumber); breakpointObject->getNumber("columnNumber", &breakpoint.columnNumber); breakpointObject->getString("condition", &breakpoint.condition); breakpointObject->getBoolean("autoContinue", &breakpoint.autoContinue); ErrorString errorString; RefPtr<InspectorArray> actions = breakpointObject->getArray("actions"); if (!breakpointActionsFromProtocol(&errorString, actions, &breakpoint.actions)) { ASSERT_NOT_REACHED(); continue; } RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(it->key, scriptId, breakpoint); if (location) m_frontend->breakpointResolved(it->key, location); } }
void InspectorDebuggerAgent::setBreakpoint(ErrorString& errorString, const InspectorObject& location, const InspectorObject* options, Inspector::Protocol::Debugger::BreakpointId* outBreakpointIdentifier, RefPtr<Inspector::Protocol::Debugger::Location>& actualLocation) { JSC::SourceID sourceID; unsigned lineNumber; unsigned columnNumber; if (!parseLocation(errorString, location, sourceID, lineNumber, columnNumber)) return; String condition = emptyString(); bool autoContinue = false; unsigned ignoreCount = 0; RefPtr<InspectorArray> actions; if (options) { options->getString(ASCIILiteral("condition"), condition); options->getBoolean(ASCIILiteral("autoContinue"), autoContinue); options->getArray(ASCIILiteral("actions"), actions); options->getInteger(ASCIILiteral("ignoreCount"), ignoreCount); } BreakpointActions breakpointActions; if (!breakpointActionsFromProtocol(errorString, actions, &breakpointActions)) return; String breakpointIdentifier = String::number(sourceID) + ':' + String::number(lineNumber) + ':' + String::number(columnNumber); if (m_breakpointIdentifierToDebugServerBreakpointIDs.find(breakpointIdentifier) != m_breakpointIdentifierToDebugServerBreakpointIDs.end()) { errorString = ASCIILiteral("Breakpoint at specified location already exists."); return; } ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition, breakpointActions, autoContinue, ignoreCount); actualLocation = resolveBreakpoint(breakpointIdentifier, sourceID, breakpoint); if (!actualLocation) { errorString = ASCIILiteral("Could not resolve breakpoint"); return; } *outBreakpointIdentifier = breakpointIdentifier; }