void InspectorDebuggerAgent::didParseSource(const String& sourceId, const Script& script) { // Don't send script content to the front end until it's really needed. m_frontend->scriptParsed(sourceId, script.url, script.startLine, script.startColumn, script.endLine, script.endColumn, script.isContentScript); m_scripts.set(sourceId, script); if (script.url.isEmpty()) return; RefPtr<InspectorObject> breakpointsCookie = m_inspectorState->getObject(DebuggerAgentState::javaScriptBreakpoints); for (InspectorObject::iterator it = breakpointsCookie->begin(); it != breakpointsCookie->end(); ++it) { RefPtr<InspectorObject> breakpointObject = it->second->asObject(); String breakpointURL; breakpointObject->getString("url", &breakpointURL); if (breakpointURL != script.url) continue; ScriptBreakpoint breakpoint; breakpointObject->getNumber("lineNumber", &breakpoint.lineNumber); breakpointObject->getNumber("columnNumber", &breakpoint.columnNumber); breakpointObject->getString("condition", &breakpoint.condition); RefPtr<InspectorObject> location = resolveBreakpoint(it->first, sourceId, breakpoint); if (location) m_frontend->breakpointResolved(it->first, location); } }
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(const String& scriptId, const Script& script) { // Don't send script content to the front end until it's really needed. const bool* isContentScript = script.isContentScript ? &script.isContentScript : 0; String sourceMapURL = sourceMapURLForScript(script); m_frontend->scriptParsed(scriptId, script.url, script.startLine, script.startColumn, script.endLine, script.endColumn, isContentScript, sourceMapURL); m_scripts.set(scriptId, script); if (script.url.isEmpty()) return; RefPtr<InspectorObject> breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); for (InspectorObject::iterator it = breakpointsCookie->begin(); it != breakpointsCookie->end(); ++it) { RefPtr<InspectorObject> breakpointObject = it->second->asObject(); bool isRegex; breakpointObject->getBoolean("isRegex", &isRegex); String url; breakpointObject->getString("url", &url); if (!matches(script.url, url, isRegex)) continue; ScriptBreakpoint breakpoint; breakpointObject->getNumber("lineNumber", &breakpoint.lineNumber); breakpointObject->getNumber("columnNumber", &breakpoint.columnNumber); breakpointObject->getString("condition", &breakpoint.condition); RefPtr<InspectorObject> location = resolveBreakpoint(it->first, scriptId, breakpoint); if (location) m_frontend->breakpointResolved(it->first, location); } }
void InspectorDebuggerAgent::setBreakpointByUrl(ErrorString* errorString, int lineNumber, const String* const optionalURL, const String* const optionalURLRegex, const int* const optionalColumnNumber, const String* const optionalCondition, String* outBreakpointId, RefPtr<InspectorArray>& locations) { if (!optionalURL == !optionalURLRegex) { *errorString = "Either url or urlRegex must be specified."; return; } String url = optionalURL ? *optionalURL : *optionalURLRegex; int columnNumber = optionalColumnNumber ? *optionalColumnNumber : 0; String condition = optionalCondition ? *optionalCondition : ""; 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; } breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(url, lineNumber, columnNumber, condition, isRegex)); m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, breakpointsCookie); ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); for (ScriptsMap::iterator it = m_scripts.begin(); it != m_scripts.end(); ++it) { if (!matches(it->second.url, url, isRegex)) continue; RefPtr<InspectorObject> location = resolveBreakpoint(breakpointId, it->first, breakpoint); if (location) locations->pushObject(location); } *outBreakpointId = breakpointId; }
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::setBreakpointByUrl(ErrorString* errorString, int lineNumber, const String* const optionalURL, const String* const optionalURLRegex, const int* const optionalColumnNumber, const String* const optionalCondition, const bool* isAntiBreakpoint, 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; } bool isAntiBreakpointValue = isAntiBreakpoint && *isAntiBreakpoint; String url = optionalURL ? *optionalURL : *optionalURLRegex; int columnNumber; if (optionalColumnNumber) { columnNumber = *optionalColumnNumber; if (columnNumber < 0) { *errorString = "Incorrect column number"; return; } } else { columnNumber = isAntiBreakpointValue ? -1 : 0; } String condition = optionalCondition ? *optionalCondition : ""; bool isRegex = optionalURLRegex; String breakpointId = (isRegex ? "/" + url + "/" : url) + ':' + String::number(lineNumber) + ':' + String::number(columnNumber); RefPtr<JSONObject> breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); if (breakpointsCookie->find(breakpointId) != breakpointsCookie->end()) { *errorString = "Breakpoint at specified location already exists."; return; } breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(url, lineNumber, columnNumber, condition, isRegex, isAntiBreakpointValue)); m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, breakpointsCookie); if (!isAntiBreakpointValue) { ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); 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, UserBreakpointSource); if (location) locations->addItem(location); } } *outBreakpointId = breakpointId; }
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::didParseSource(const String& scriptId, const Script& script) { // Don't send script content to the front end until it's really needed. const bool* isContentScript = script.isContentScript ? &script.isContentScript : 0; String sourceMapURL = sourceMapURLForScript(script); String* sourceMapURLParam = sourceMapURL.isNull() ? 0 : &sourceMapURL; String sourceURL; if (!script.startLine && !script.startColumn) { bool deprecated; sourceURL = ContentSearchUtils::findSourceURL(script.source, ContentSearchUtils::JavaScriptMagicComment, &deprecated); // FIXME: add deprecated console message here. } bool hasSourceURL = !sourceURL.isEmpty(); String scriptURL = hasSourceURL ? sourceURL : script.url; bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : 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<JSONObject> breakpointsCookie = m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); for (JSONObject::iterator it = breakpointsCookie->begin(); it != breakpointsCookie->end(); ++it) { RefPtr<JSONObject> breakpointObject = it->value->asObject(); bool isAntibreakpoint; breakpointObject->getBoolean(DebuggerAgentState::isAnti, &isAntibreakpoint); if (isAntibreakpoint) continue; bool isRegex; breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); String url; breakpointObject->getString(DebuggerAgentState::url, &url); if (!matches(scriptURL, url, isRegex)) continue; ScriptBreakpoint breakpoint; breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint.lineNumber); breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoint.columnNumber); breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.condition); RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(it->key, scriptId, breakpoint, UserBreakpointSource); if (location) m_frontend->breakpointResolved(it->key, location); } }
void InspectorDebuggerAgent::setBreakpoint(ErrorString* errorString, PassRefPtr<InspectorObject> location, const String* const optionalCondition, String* outBreakpointId, RefPtr<InspectorObject>& actualLocation) { String scriptId; int lineNumber; int columnNumber; if (!parseLocation(errorString, location, &scriptId, &lineNumber, &columnNumber)) return; String condition = optionalCondition ? *optionalCondition : emptyString(); String breakpointId = scriptId + ':' + String::number(lineNumber) + ':' + String::number(columnNumber); if (m_breakpointIdToDebugServerBreakpointIds.find(breakpointId) != m_breakpointIdToDebugServerBreakpointIds.end()) return; ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); actualLocation = resolveBreakpoint(breakpointId, scriptId, breakpoint); if (actualLocation) *outBreakpointId = breakpointId; else *errorString = "Could not resolve breakpoint"; }
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; }
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; }
void InspectorDebuggerAgent::setBreakpoint(ErrorString* errorString, const RefPtr<JSONObject>& location, const String* const optionalCondition, 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 = optionalCondition ? *optionalCondition : emptyString(); 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, UserBreakpointSource); if (actualLocation) *outBreakpointId = breakpointId; else *errorString = "Could not resolve breakpoint"; }
void InspectorDebuggerAgent::setBreakpoint(const String& scriptId, int lineNumber, int columnNumber, BreakpointSource source, const String& condition) { String breakpointId = generateBreakpointId(scriptId, lineNumber, columnNumber, source); ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); resolveBreakpoint(breakpointId, scriptId, breakpoint, source); }