Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/inspector/v8-debugger-agent-impl.h" | 5 #include "src/inspector/v8-debugger-agent-impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "src/debug/debug-interface.h" | 9 #include "src/debug/debug-interface.h" |
| 10 #include "src/inspector/injected-script.h" | 10 #include "src/inspector/injected-script.h" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 43 static const char asyncCallStackDepth[] = "asyncCallStackDepth"; | 43 static const char asyncCallStackDepth[] = "asyncCallStackDepth"; |
| 44 static const char blackboxPattern[] = "blackboxPattern"; | 44 static const char blackboxPattern[] = "blackboxPattern"; |
| 45 static const char debuggerEnabled[] = "debuggerEnabled"; | 45 static const char debuggerEnabled[] = "debuggerEnabled"; |
| 46 | 46 |
| 47 // Breakpoint properties. | 47 // Breakpoint properties. |
| 48 static const char url[] = "url"; | 48 static const char url[] = "url"; |
| 49 static const char isRegex[] = "isRegex"; | 49 static const char isRegex[] = "isRegex"; |
| 50 static const char lineNumber[] = "lineNumber"; | 50 static const char lineNumber[] = "lineNumber"; |
| 51 static const char columnNumber[] = "columnNumber"; | 51 static const char columnNumber[] = "columnNumber"; |
| 52 static const char condition[] = "condition"; | 52 static const char condition[] = "condition"; |
| 53 static const char sourceLineHint[] = "sourceLineHint"; | |
| 54 | |
| 53 static const char skipAllPauses[] = "skipAllPauses"; | 55 static const char skipAllPauses[] = "skipAllPauses"; |
| 54 | 56 |
| 55 } // namespace DebuggerAgentState | 57 } // namespace DebuggerAgentState |
| 56 | 58 |
| 57 static const char kBacktraceObjectGroup[] = "backtrace"; | 59 static const char kBacktraceObjectGroup[] = "backtrace"; |
| 58 static const char kDebuggerNotEnabled[] = "Debugger agent is not enabled"; | 60 static const char kDebuggerNotEnabled[] = "Debugger agent is not enabled"; |
| 59 static const char kDebuggerNotPaused[] = | 61 static const char kDebuggerNotPaused[] = |
| 60 "Can only perform operation while paused."; | 62 "Can only perform operation while paused."; |
| 63 static const int kSourceLineHintToCheck = 32; | |
| 64 static const int kSourceLineHintMaxLength = 128; | |
| 61 | 65 |
| 62 namespace { | 66 namespace { |
| 63 | 67 |
| 64 void TranslateWasmStackTraceLocations(Array<CallFrame>* stackTrace, | 68 void TranslateWasmStackTraceLocations(Array<CallFrame>* stackTrace, |
| 65 WasmTranslation* wasmTranslation) { | 69 WasmTranslation* wasmTranslation) { |
| 66 for (size_t i = 0, e = stackTrace->length(); i != e; ++i) { | 70 for (size_t i = 0, e = stackTrace->length(); i != e; ++i) { |
| 67 protocol::Debugger::Location* location = stackTrace->get(i)->getLocation(); | 71 protocol::Debugger::Location* location = stackTrace->get(i)->getLocation(); |
| 68 String16 scriptId = location->getScriptId(); | 72 String16 scriptId = location->getScriptId(); |
| 69 int lineNumber = location->getLineNumber(); | 73 int lineNumber = location->getLineNumber(); |
| 70 int columnNumber = location->getColumnNumber(-1); | 74 int columnNumber = location->getColumnNumber(-1); |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 234 | 238 |
| 235 Response V8DebuggerAgentImpl::setSkipAllPauses(bool skip) { | 239 Response V8DebuggerAgentImpl::setSkipAllPauses(bool skip) { |
| 236 m_state->setBoolean(DebuggerAgentState::skipAllPauses, skip); | 240 m_state->setBoolean(DebuggerAgentState::skipAllPauses, skip); |
| 237 m_skipAllPauses = skip; | 241 m_skipAllPauses = skip; |
| 238 return Response::OK(); | 242 return Response::OK(); |
| 239 } | 243 } |
| 240 | 244 |
| 241 static std::unique_ptr<protocol::DictionaryValue> | 245 static std::unique_ptr<protocol::DictionaryValue> |
| 242 buildObjectForBreakpointCookie(const String16& url, int lineNumber, | 246 buildObjectForBreakpointCookie(const String16& url, int lineNumber, |
| 243 int columnNumber, const String16& condition, | 247 int columnNumber, const String16& condition, |
| 244 bool isRegex) { | 248 bool isRegex, const String16& sourceLineHint) { |
| 245 std::unique_ptr<protocol::DictionaryValue> breakpointObject = | 249 std::unique_ptr<protocol::DictionaryValue> breakpointObject = |
| 246 protocol::DictionaryValue::create(); | 250 protocol::DictionaryValue::create(); |
| 247 breakpointObject->setString(DebuggerAgentState::url, url); | 251 breakpointObject->setString(DebuggerAgentState::url, url); |
| 248 breakpointObject->setInteger(DebuggerAgentState::lineNumber, lineNumber); | 252 breakpointObject->setInteger(DebuggerAgentState::lineNumber, lineNumber); |
| 249 breakpointObject->setInteger(DebuggerAgentState::columnNumber, columnNumber); | 253 breakpointObject->setInteger(DebuggerAgentState::columnNumber, columnNumber); |
| 250 breakpointObject->setString(DebuggerAgentState::condition, condition); | 254 breakpointObject->setString(DebuggerAgentState::condition, condition); |
| 255 breakpointObject->setString(DebuggerAgentState::sourceLineHint, | |
| 256 sourceLineHint); | |
| 251 breakpointObject->setBoolean(DebuggerAgentState::isRegex, isRegex); | 257 breakpointObject->setBoolean(DebuggerAgentState::isRegex, isRegex); |
| 252 return breakpointObject; | 258 return breakpointObject; |
| 253 } | 259 } |
| 254 | 260 |
| 255 static bool matches(V8InspectorImpl* inspector, const String16& url, | 261 static bool matches(V8InspectorImpl* inspector, const String16& url, |
| 256 const String16& pattern, bool isRegex) { | 262 const String16& pattern, bool isRegex) { |
| 257 if (isRegex) { | 263 if (isRegex) { |
| 258 V8Regex regex(inspector, pattern, true); | 264 V8Regex regex(inspector, pattern, true); |
| 259 return regex.match(url) != -1; | 265 return regex.match(url) != -1; |
| 260 } | 266 } |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 288 if (!breakpointsCookie) { | 294 if (!breakpointsCookie) { |
| 289 std::unique_ptr<protocol::DictionaryValue> newValue = | 295 std::unique_ptr<protocol::DictionaryValue> newValue = |
| 290 protocol::DictionaryValue::create(); | 296 protocol::DictionaryValue::create(); |
| 291 breakpointsCookie = newValue.get(); | 297 breakpointsCookie = newValue.get(); |
| 292 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, | 298 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, |
| 293 std::move(newValue)); | 299 std::move(newValue)); |
| 294 } | 300 } |
| 295 if (breakpointsCookie->get(breakpointId)) | 301 if (breakpointsCookie->get(breakpointId)) |
| 296 return Response::Error("Breakpoint at specified location already exists."); | 302 return Response::Error("Breakpoint at specified location already exists."); |
| 297 | 303 |
| 298 breakpointsCookie->setObject( | |
| 299 breakpointId, buildObjectForBreakpointCookie( | |
| 300 url, lineNumber, columnNumber, condition, isRegex)); | |
| 301 | |
| 302 ScriptBreakpoint breakpoint(String16(), lineNumber, columnNumber, condition); | 304 ScriptBreakpoint breakpoint(String16(), lineNumber, columnNumber, condition); |
| 305 String16 sourceLineHint; | |
| 303 for (const auto& script : m_scripts) { | 306 for (const auto& script : m_scripts) { |
| 304 if (!matches(m_inspector, script.second->sourceURL(), url, isRegex)) | 307 if (!matches(m_inspector, script.second->sourceURL(), url, isRegex)) |
| 305 continue; | 308 continue; |
| 306 breakpoint.script_id = script.first; | 309 breakpoint.script_id = script.first; |
| 307 std::unique_ptr<protocol::Debugger::Location> location = | 310 sourceLineHint = |
| 308 resolveBreakpoint(breakpointId, breakpoint, UserBreakpointSource); | 311 script.second->lineAt(lineNumber, kSourceLineHintMaxLength); |
| 312 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoint( | |
| 313 breakpointId, breakpoint, UserBreakpointSource, String16()); | |
| 309 if (location) (*locations)->addItem(std::move(location)); | 314 if (location) (*locations)->addItem(std::move(location)); |
| 310 } | 315 } |
| 311 | 316 |
| 317 breakpointsCookie->setObject( | |
| 318 breakpointId, | |
| 319 buildObjectForBreakpointCookie(url, lineNumber, columnNumber, condition, | |
| 320 isRegex, sourceLineHint)); | |
| 321 | |
| 312 *outBreakpointId = breakpointId; | 322 *outBreakpointId = breakpointId; |
| 313 return Response::OK(); | 323 return Response::OK(); |
| 314 } | 324 } |
| 315 | 325 |
| 316 Response V8DebuggerAgentImpl::setBreakpoint( | 326 Response V8DebuggerAgentImpl::setBreakpoint( |
| 317 std::unique_ptr<protocol::Debugger::Location> location, | 327 std::unique_ptr<protocol::Debugger::Location> location, |
| 318 Maybe<String16> optionalCondition, String16* outBreakpointId, | 328 Maybe<String16> optionalCondition, String16* outBreakpointId, |
| 319 std::unique_ptr<protocol::Debugger::Location>* actualLocation) { | 329 std::unique_ptr<protocol::Debugger::Location>* actualLocation) { |
| 320 ScriptBreakpoint breakpoint( | 330 ScriptBreakpoint breakpoint( |
| 321 location->getScriptId(), location->getLineNumber(), | 331 location->getScriptId(), location->getLineNumber(), |
| 322 location->getColumnNumber(0), optionalCondition.fromMaybe(String16())); | 332 location->getColumnNumber(0), optionalCondition.fromMaybe(String16())); |
| 323 | 333 |
| 324 String16 breakpointId = | 334 String16 breakpointId = |
| 325 generateBreakpointId(breakpoint, UserBreakpointSource); | 335 generateBreakpointId(breakpoint, UserBreakpointSource); |
| 326 if (m_breakpointIdToDebuggerBreakpointIds.find(breakpointId) != | 336 if (m_breakpointIdToDebuggerBreakpointIds.find(breakpointId) != |
| 327 m_breakpointIdToDebuggerBreakpointIds.end()) { | 337 m_breakpointIdToDebuggerBreakpointIds.end()) { |
| 328 return Response::Error("Breakpoint at specified location already exists."); | 338 return Response::Error("Breakpoint at specified location already exists."); |
| 329 } | 339 } |
| 330 *actualLocation = | 340 *actualLocation = resolveBreakpoint(breakpointId, breakpoint, |
| 331 resolveBreakpoint(breakpointId, breakpoint, UserBreakpointSource); | 341 UserBreakpointSource, String16()); |
| 332 if (!*actualLocation) return Response::Error("Could not resolve breakpoint"); | 342 if (!*actualLocation) return Response::Error("Could not resolve breakpoint"); |
| 333 *outBreakpointId = breakpointId; | 343 *outBreakpointId = breakpointId; |
| 334 return Response::OK(); | 344 return Response::OK(); |
| 335 } | 345 } |
| 336 | 346 |
| 337 Response V8DebuggerAgentImpl::removeBreakpoint(const String16& breakpointId) { | 347 Response V8DebuggerAgentImpl::removeBreakpoint(const String16& breakpointId) { |
| 338 if (!enabled()) return Response::Error(kDebuggerNotEnabled); | 348 if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
| 339 protocol::DictionaryValue* breakpointsCookie = | 349 protocol::DictionaryValue* breakpointsCookie = |
| 340 m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); | 350 m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); |
| 341 if (breakpointsCookie) breakpointsCookie->remove(breakpointId); | 351 if (breakpointsCookie) breakpointsCookie->remove(breakpointId); |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 448 itStartRange, ranges.end(), | 458 itStartRange, ranges.end(), |
| 449 std::make_pair(end.GetLineNumber(), end.GetColumnNumber()), | 459 std::make_pair(end.GetLineNumber(), end.GetColumnNumber()), |
| 450 positionComparator); | 460 positionComparator); |
| 451 // Ranges array contains positions in script where blackbox state is changed. | 461 // Ranges array contains positions in script where blackbox state is changed. |
| 452 // [(0,0) ... ranges[0]) isn't blackboxed, [ranges[0] ... ranges[1]) is | 462 // [(0,0) ... ranges[0]) isn't blackboxed, [ranges[0] ... ranges[1]) is |
| 453 // blackboxed... | 463 // blackboxed... |
| 454 return itStartRange == itEndRange && | 464 return itStartRange == itEndRange && |
| 455 std::distance(ranges.begin(), itStartRange) % 2; | 465 std::distance(ranges.begin(), itStartRange) % 2; |
| 456 } | 466 } |
| 457 | 467 |
| 468 namespace { | |
| 469 bool checkLine(V8DebuggerScript* script, int lineNumber, const String16& hint) { | |
| 470 if (lineNumber < script->startLine() || lineNumber > script->endLine()) | |
| 471 return false; | |
| 472 return script->lineAt(lineNumber, kSourceLineHintMaxLength) == hint; | |
| 473 } | |
| 474 | |
| 475 int ajustLineNumber(V8DebuggerScript* script, int lineNumber, | |
|
alph
2017/02/08 02:02:08
adjust
| |
| 476 const String16& hint) { | |
| 477 if (hint.isEmpty()) return lineNumber; | |
| 478 if (checkLine(script, lineNumber, hint)) return lineNumber; | |
| 479 for (int i = 1; i < kSourceLineHintToCheck / 2; ++i) { | |
| 480 if (checkLine(script, lineNumber + i, hint)) return lineNumber + i; | |
| 481 if (checkLine(script, lineNumber - i, hint)) return lineNumber - i; | |
| 482 } | |
| 483 return lineNumber; | |
| 484 } | |
| 485 } // namespace | |
| 486 | |
| 458 std::unique_ptr<protocol::Debugger::Location> | 487 std::unique_ptr<protocol::Debugger::Location> |
| 459 V8DebuggerAgentImpl::resolveBreakpoint(const String16& breakpointId, | 488 V8DebuggerAgentImpl::resolveBreakpoint(const String16& breakpointId, |
| 460 const ScriptBreakpoint& breakpoint, | 489 const ScriptBreakpoint& breakpoint, |
| 461 BreakpointSource source) { | 490 BreakpointSource source, |
| 491 const String16& sourceLineHint) { | |
| 462 v8::HandleScope handles(m_isolate); | 492 v8::HandleScope handles(m_isolate); |
| 463 DCHECK(enabled()); | 493 DCHECK(enabled()); |
| 464 // FIXME: remove these checks once crbug.com/520702 is resolved. | 494 // FIXME: remove these checks once crbug.com/520702 is resolved. |
| 465 CHECK(!breakpointId.isEmpty()); | 495 CHECK(!breakpointId.isEmpty()); |
| 466 CHECK(!breakpoint.script_id.isEmpty()); | 496 CHECK(!breakpoint.script_id.isEmpty()); |
| 467 ScriptsMap::iterator scriptIterator = m_scripts.find(breakpoint.script_id); | 497 ScriptsMap::iterator scriptIterator = m_scripts.find(breakpoint.script_id); |
| 468 if (scriptIterator == m_scripts.end()) return nullptr; | 498 if (scriptIterator == m_scripts.end()) return nullptr; |
| 469 if (breakpoint.line_number < scriptIterator->second->startLine() || | 499 |
| 470 scriptIterator->second->endLine() < breakpoint.line_number) | 500 V8DebuggerScript* script = scriptIterator->second.get(); |
| 501 ScriptBreakpoint translatedBreakpoint = breakpoint; | |
| 502 translatedBreakpoint.line_number = | |
| 503 ajustLineNumber(script, translatedBreakpoint.line_number, sourceLineHint); | |
| 504 if (translatedBreakpoint.line_number < script->startLine() || | |
| 505 script->endLine() < translatedBreakpoint.line_number) { | |
| 471 return nullptr; | 506 return nullptr; |
| 507 } | |
| 472 | 508 |
| 473 // Translate from protocol location to v8 location for the debugger. | 509 // Translate from protocol location to v8 location for the debugger. |
| 474 ScriptBreakpoint translatedBreakpoint = breakpoint; | |
| 475 m_debugger->wasmTranslation()->TranslateProtocolLocationToWasmScriptLocation( | 510 m_debugger->wasmTranslation()->TranslateProtocolLocationToWasmScriptLocation( |
| 476 &translatedBreakpoint.script_id, &translatedBreakpoint.line_number, | 511 &translatedBreakpoint.script_id, &translatedBreakpoint.line_number, |
| 477 &translatedBreakpoint.column_number); | 512 &translatedBreakpoint.column_number); |
| 478 | 513 |
| 479 int actualLineNumber; | 514 int actualLineNumber; |
| 480 int actualColumnNumber; | 515 int actualColumnNumber; |
| 481 String16 debuggerBreakpointId = m_debugger->setBreakpoint( | 516 String16 debuggerBreakpointId = m_debugger->setBreakpoint( |
| 482 translatedBreakpoint, &actualLineNumber, &actualColumnNumber); | 517 translatedBreakpoint, &actualLineNumber, &actualColumnNumber); |
| 483 if (debuggerBreakpointId.isEmpty()) return nullptr; | 518 if (debuggerBreakpointId.isEmpty()) return nullptr; |
| 484 | 519 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 499 Response V8DebuggerAgentImpl::searchInContent( | 534 Response V8DebuggerAgentImpl::searchInContent( |
| 500 const String16& scriptId, const String16& query, | 535 const String16& scriptId, const String16& query, |
| 501 Maybe<bool> optionalCaseSensitive, Maybe<bool> optionalIsRegex, | 536 Maybe<bool> optionalCaseSensitive, Maybe<bool> optionalIsRegex, |
| 502 std::unique_ptr<Array<protocol::Debugger::SearchMatch>>* results) { | 537 std::unique_ptr<Array<protocol::Debugger::SearchMatch>>* results) { |
| 503 v8::HandleScope handles(m_isolate); | 538 v8::HandleScope handles(m_isolate); |
| 504 ScriptsMap::iterator it = m_scripts.find(scriptId); | 539 ScriptsMap::iterator it = m_scripts.find(scriptId); |
| 505 if (it == m_scripts.end()) | 540 if (it == m_scripts.end()) |
| 506 return Response::Error("No script for id: " + scriptId); | 541 return Response::Error("No script for id: " + scriptId); |
| 507 | 542 |
| 508 std::vector<std::unique_ptr<protocol::Debugger::SearchMatch>> matches = | 543 std::vector<std::unique_ptr<protocol::Debugger::SearchMatch>> matches = |
| 509 searchInTextByLinesImpl(m_session, it->second->source(m_isolate), query, | 544 searchInTextByLinesImpl(m_session, it->second->source(), query, |
| 510 optionalCaseSensitive.fromMaybe(false), | 545 optionalCaseSensitive.fromMaybe(false), |
| 511 optionalIsRegex.fromMaybe(false)); | 546 optionalIsRegex.fromMaybe(false)); |
| 512 *results = protocol::Array<protocol::Debugger::SearchMatch>::create(); | 547 *results = protocol::Array<protocol::Debugger::SearchMatch>::create(); |
| 513 for (size_t i = 0; i < matches.size(); ++i) | 548 for (size_t i = 0; i < matches.size(); ++i) |
| 514 (*results)->addItem(std::move(matches[i])); | 549 (*results)->addItem(std::move(matches[i])); |
| 515 return Response::OK(); | 550 return Response::OK(); |
| 516 } | 551 } |
| 517 | 552 |
| 518 Response V8DebuggerAgentImpl::setScriptSource( | 553 Response V8DebuggerAgentImpl::setScriptSource( |
| 519 const String16& scriptId, const String16& newContent, Maybe<bool> dryRun, | 554 const String16& scriptId, const String16& newContent, Maybe<bool> dryRun, |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 578 return Response::OK(); | 613 return Response::OK(); |
| 579 } | 614 } |
| 580 | 615 |
| 581 Response V8DebuggerAgentImpl::getScriptSource(const String16& scriptId, | 616 Response V8DebuggerAgentImpl::getScriptSource(const String16& scriptId, |
| 582 String16* scriptSource) { | 617 String16* scriptSource) { |
| 583 if (!enabled()) return Response::Error(kDebuggerNotEnabled); | 618 if (!enabled()) return Response::Error(kDebuggerNotEnabled); |
| 584 ScriptsMap::iterator it = m_scripts.find(scriptId); | 619 ScriptsMap::iterator it = m_scripts.find(scriptId); |
| 585 if (it == m_scripts.end()) | 620 if (it == m_scripts.end()) |
| 586 return Response::Error("No script for id: " + scriptId); | 621 return Response::Error("No script for id: " + scriptId); |
| 587 v8::HandleScope handles(m_isolate); | 622 v8::HandleScope handles(m_isolate); |
| 588 *scriptSource = it->second->source(m_isolate); | 623 *scriptSource = it->second->source(); |
| 589 return Response::OK(); | 624 return Response::OK(); |
| 590 } | 625 } |
| 591 | 626 |
| 592 void V8DebuggerAgentImpl::schedulePauseOnNextStatement( | 627 void V8DebuggerAgentImpl::schedulePauseOnNextStatement( |
| 593 const String16& breakReason, | 628 const String16& breakReason, |
| 594 std::unique_ptr<protocol::DictionaryValue> data) { | 629 std::unique_ptr<protocol::DictionaryValue> data) { |
| 595 if (!enabled() || m_scheduledDebuggerStep == StepInto || | 630 if (!enabled() || m_scheduledDebuggerStep == StepInto || |
| 596 m_javaScriptPauseScheduled || isPaused() || | 631 m_javaScriptPauseScheduled || isPaused() || |
| 597 !m_debugger->breakpointsActivated()) | 632 !m_debugger->breakpointsActivated()) |
| 598 return; | 633 return; |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 972 V8StackTraceImpl* stackTrace = m_debugger->currentAsyncCallChain(); | 1007 V8StackTraceImpl* stackTrace = m_debugger->currentAsyncCallChain(); |
| 973 return stackTrace ? stackTrace->buildInspectorObjectForTail(m_debugger) | 1008 return stackTrace ? stackTrace->buildInspectorObjectForTail(m_debugger) |
| 974 : nullptr; | 1009 : nullptr; |
| 975 } | 1010 } |
| 976 | 1011 |
| 977 bool V8DebuggerAgentImpl::isPaused() const { return m_debugger->isPaused(); } | 1012 bool V8DebuggerAgentImpl::isPaused() const { return m_debugger->isPaused(); } |
| 978 | 1013 |
| 979 void V8DebuggerAgentImpl::didParseSource( | 1014 void V8DebuggerAgentImpl::didParseSource( |
| 980 std::unique_ptr<V8DebuggerScript> script, bool success) { | 1015 std::unique_ptr<V8DebuggerScript> script, bool success) { |
| 981 v8::HandleScope handles(m_isolate); | 1016 v8::HandleScope handles(m_isolate); |
| 982 String16 scriptSource = script->source(m_isolate); | 1017 String16 scriptSource = script->source(); |
| 983 if (!success) script->setSourceURL(findSourceURL(scriptSource, false)); | 1018 if (!success) script->setSourceURL(findSourceURL(scriptSource, false)); |
| 984 if (!success) | 1019 if (!success) |
| 985 script->setSourceMappingURL(findSourceMapURL(scriptSource, false)); | 1020 script->setSourceMappingURL(findSourceMapURL(scriptSource, false)); |
| 986 | 1021 |
| 987 int contextId = script->executionContextId(); | 1022 int contextId = script->executionContextId(); |
| 988 int contextGroupId = m_inspector->contextGroupId(contextId); | 1023 int contextGroupId = m_inspector->contextGroupId(contextId); |
| 989 InspectedContext* inspected = | 1024 InspectedContext* inspected = |
| 990 m_inspector->getContext(contextGroupId, contextId); | 1025 m_inspector->getContext(contextGroupId, contextId); |
| 991 std::unique_ptr<protocol::DictionaryValue> executionContextAuxData; | 1026 std::unique_ptr<protocol::DictionaryValue> executionContextAuxData; |
| 992 if (inspected) { | 1027 if (inspected) { |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1015 Maybe<String16> sourceMapURLParam = scriptRef->sourceMappingURL(); | 1050 Maybe<String16> sourceMapURLParam = scriptRef->sourceMappingURL(); |
| 1016 Maybe<protocol::DictionaryValue> executionContextAuxDataParam( | 1051 Maybe<protocol::DictionaryValue> executionContextAuxDataParam( |
| 1017 std::move(executionContextAuxData)); | 1052 std::move(executionContextAuxData)); |
| 1018 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; | 1053 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; |
| 1019 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; | 1054 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; |
| 1020 const bool* isModuleParam = isModule ? &isModule : nullptr; | 1055 const bool* isModuleParam = isModule ? &isModule : nullptr; |
| 1021 if (success) | 1056 if (success) |
| 1022 m_frontend.scriptParsed( | 1057 m_frontend.scriptParsed( |
| 1023 scriptId, scriptURL, scriptRef->startLine(), scriptRef->startColumn(), | 1058 scriptId, scriptURL, scriptRef->startLine(), scriptRef->startColumn(), |
| 1024 scriptRef->endLine(), scriptRef->endColumn(), contextId, | 1059 scriptRef->endLine(), scriptRef->endColumn(), contextId, |
| 1025 scriptRef->hash(m_isolate), std::move(executionContextAuxDataParam), | 1060 scriptRef->hash(), std::move(executionContextAuxDataParam), |
| 1026 isLiveEditParam, std::move(sourceMapURLParam), hasSourceURLParam, | 1061 isLiveEditParam, std::move(sourceMapURLParam), hasSourceURLParam, |
| 1027 isModuleParam); | 1062 isModuleParam); |
| 1028 else | 1063 else |
| 1029 m_frontend.scriptFailedToParse( | 1064 m_frontend.scriptFailedToParse( |
| 1030 scriptId, scriptURL, scriptRef->startLine(), scriptRef->startColumn(), | 1065 scriptId, scriptURL, scriptRef->startLine(), scriptRef->startColumn(), |
| 1031 scriptRef->endLine(), scriptRef->endColumn(), contextId, | 1066 scriptRef->endLine(), scriptRef->endColumn(), contextId, |
| 1032 scriptRef->hash(m_isolate), std::move(executionContextAuxDataParam), | 1067 scriptRef->hash(), std::move(executionContextAuxDataParam), |
| 1033 std::move(sourceMapURLParam), hasSourceURLParam, isModuleParam); | 1068 std::move(sourceMapURLParam), hasSourceURLParam, isModuleParam); |
| 1034 | 1069 |
| 1035 if (scriptURL.isEmpty() || !success) return; | 1070 if (scriptURL.isEmpty() || !success) return; |
| 1036 | 1071 |
| 1037 protocol::DictionaryValue* breakpointsCookie = | 1072 protocol::DictionaryValue* breakpointsCookie = |
| 1038 m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); | 1073 m_state->getObject(DebuggerAgentState::javaScriptBreakpoints); |
| 1039 if (!breakpointsCookie) return; | 1074 if (!breakpointsCookie) return; |
| 1040 | 1075 |
| 1041 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { | 1076 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { |
| 1042 auto cookie = breakpointsCookie->at(i); | 1077 auto cookie = breakpointsCookie->at(i); |
| 1043 protocol::DictionaryValue* breakpointObject = | 1078 protocol::DictionaryValue* breakpointObject = |
| 1044 protocol::DictionaryValue::cast(cookie.second); | 1079 protocol::DictionaryValue::cast(cookie.second); |
| 1045 bool isRegex; | 1080 bool isRegex; |
| 1046 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); | 1081 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); |
| 1047 String16 url; | 1082 String16 url; |
| 1083 String16 sourceLineHint; | |
| 1048 breakpointObject->getString(DebuggerAgentState::url, &url); | 1084 breakpointObject->getString(DebuggerAgentState::url, &url); |
| 1049 if (!matches(m_inspector, scriptURL, url, isRegex)) continue; | 1085 if (!matches(m_inspector, scriptURL, url, isRegex)) continue; |
| 1050 ScriptBreakpoint breakpoint; | 1086 ScriptBreakpoint breakpoint; |
| 1051 breakpoint.script_id = scriptId; | 1087 breakpoint.script_id = scriptId; |
| 1052 breakpointObject->getInteger(DebuggerAgentState::lineNumber, | 1088 breakpointObject->getInteger(DebuggerAgentState::lineNumber, |
| 1053 &breakpoint.line_number); | 1089 &breakpoint.line_number); |
| 1054 breakpointObject->getInteger(DebuggerAgentState::columnNumber, | 1090 breakpointObject->getInteger(DebuggerAgentState::columnNumber, |
| 1055 &breakpoint.column_number); | 1091 &breakpoint.column_number); |
| 1056 breakpointObject->getString(DebuggerAgentState::condition, | 1092 breakpointObject->getString(DebuggerAgentState::condition, |
| 1057 &breakpoint.condition); | 1093 &breakpoint.condition); |
| 1058 std::unique_ptr<protocol::Debugger::Location> location = | 1094 breakpointObject->getString(DebuggerAgentState::sourceLineHint, |
| 1059 resolveBreakpoint(cookie.first, breakpoint, UserBreakpointSource); | 1095 &sourceLineHint); |
| 1096 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoint( | |
| 1097 cookie.first, breakpoint, UserBreakpointSource, sourceLineHint); | |
| 1060 if (location) | 1098 if (location) |
| 1061 m_frontend.breakpointResolved(cookie.first, std::move(location)); | 1099 m_frontend.breakpointResolved(cookie.first, std::move(location)); |
| 1062 } | 1100 } |
| 1063 } | 1101 } |
| 1064 | 1102 |
| 1065 void V8DebuggerAgentImpl::didPause(int contextId, | 1103 void V8DebuggerAgentImpl::didPause(int contextId, |
| 1066 v8::Local<v8::Value> exception, | 1104 v8::Local<v8::Value> exception, |
| 1067 const std::vector<String16>& hitBreakpoints, | 1105 const std::vector<String16>& hitBreakpoints, |
| 1068 bool isPromiseRejection, bool isUncaught, | 1106 bool isPromiseRejection, bool isUncaught, |
| 1069 bool isOOMBreak) { | 1107 bool isOOMBreak) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1156 m_breakReason = protocol::Debugger::Paused::ReasonEnum::Other; | 1194 m_breakReason = protocol::Debugger::Paused::ReasonEnum::Other; |
| 1157 m_breakAuxData = nullptr; | 1195 m_breakAuxData = nullptr; |
| 1158 } | 1196 } |
| 1159 | 1197 |
| 1160 void V8DebuggerAgentImpl::setBreakpointAt(const String16& scriptId, | 1198 void V8DebuggerAgentImpl::setBreakpointAt(const String16& scriptId, |
| 1161 int lineNumber, int columnNumber, | 1199 int lineNumber, int columnNumber, |
| 1162 BreakpointSource source, | 1200 BreakpointSource source, |
| 1163 const String16& condition) { | 1201 const String16& condition) { |
| 1164 ScriptBreakpoint breakpoint(scriptId, lineNumber, columnNumber, condition); | 1202 ScriptBreakpoint breakpoint(scriptId, lineNumber, columnNumber, condition); |
| 1165 String16 breakpointId = generateBreakpointId(breakpoint, source); | 1203 String16 breakpointId = generateBreakpointId(breakpoint, source); |
| 1166 resolveBreakpoint(breakpointId, breakpoint, source); | 1204 resolveBreakpoint(breakpointId, breakpoint, source, String16()); |
| 1167 } | 1205 } |
| 1168 | 1206 |
| 1169 void V8DebuggerAgentImpl::removeBreakpointAt(const String16& scriptId, | 1207 void V8DebuggerAgentImpl::removeBreakpointAt(const String16& scriptId, |
| 1170 int lineNumber, int columnNumber, | 1208 int lineNumber, int columnNumber, |
| 1171 BreakpointSource source) { | 1209 BreakpointSource source) { |
| 1172 removeBreakpointImpl(generateBreakpointId( | 1210 removeBreakpointImpl(generateBreakpointId( |
| 1173 ScriptBreakpoint(scriptId, lineNumber, columnNumber, String16()), | 1211 ScriptBreakpoint(scriptId, lineNumber, columnNumber, String16()), |
| 1174 source)); | 1212 source)); |
| 1175 } | 1213 } |
| 1176 | 1214 |
| 1177 void V8DebuggerAgentImpl::reset() { | 1215 void V8DebuggerAgentImpl::reset() { |
| 1178 if (!enabled()) return; | 1216 if (!enabled()) return; |
| 1179 m_scheduledDebuggerStep = NoStep; | 1217 m_scheduledDebuggerStep = NoStep; |
| 1180 m_blackboxedPositions.clear(); | 1218 m_blackboxedPositions.clear(); |
| 1181 resetBlackboxedStateCache(); | 1219 resetBlackboxedStateCache(); |
| 1182 m_scripts.clear(); | 1220 m_scripts.clear(); |
| 1183 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1221 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 1184 } | 1222 } |
| 1185 | 1223 |
| 1186 } // namespace v8_inspector | 1224 } // namespace v8_inspector |
| OLD | NEW |