| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium 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 "platform/v8_inspector/V8DebuggerAgentImpl.h" | 5 #include "platform/v8_inspector/V8DebuggerAgentImpl.h" |
| 6 | 6 |
| 7 #include "platform/inspector_protocol/String16.h" | 7 #include "platform/inspector_protocol/String16.h" |
| 8 #include "platform/inspector_protocol/Values.h" | 8 #include "platform/inspector_protocol/Values.h" |
| 9 #include "platform/v8_inspector/InjectedScript.h" | 9 #include "platform/v8_inspector/InjectedScript.h" |
| 10 #include "platform/v8_inspector/InspectedContext.h" | 10 #include "platform/v8_inspector/InspectedContext.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 return scriptId + ":" + String16::number(lineNumber) + ":" + String16::numbe
r(columnNumber) + breakpointIdSuffix(source); | 71 return scriptId + ":" + String16::number(lineNumber) + ":" + String16::numbe
r(columnNumber) + breakpointIdSuffix(source); |
| 72 } | 72 } |
| 73 | 73 |
| 74 static bool positionComparator(const std::pair<int, int>& a, const std::pair<int
, int>& b) | 74 static bool positionComparator(const std::pair<int, int>& a, const std::pair<int
, int>& b) |
| 75 { | 75 { |
| 76 if (a.first != b.first) | 76 if (a.first != b.first) |
| 77 return a.first < b.first; | 77 return a.first < b.first; |
| 78 return a.second < b.second; | 78 return a.second < b.second; |
| 79 } | 79 } |
| 80 | 80 |
| 81 static const LChar hexDigits[17] = "0123456789ABCDEF"; | |
| 82 | |
| 83 static void appendUnsignedAsHex(unsigned number, String16Builder* destination) | |
| 84 { | |
| 85 for (size_t i = 0; i < 8; ++i) { | |
| 86 destination->append(hexDigits[number & 0xF]); | |
| 87 number >>= 4; | |
| 88 } | |
| 89 } | |
| 90 | |
| 91 // Hash algorithm for substrings is described in "Über die Komplexität der Multi
plikation in | |
| 92 // eingeschränkten Branchingprogrammmodellen" by Woelfe. | |
| 93 // http://opendatastructures.org/versions/edition-0.1d/ods-java/node33.html#SECT
ION00832000000000000000 | |
| 94 static String16 calculateHash(const String16& str) | |
| 95 { | |
| 96 static uint64_t prime[] = { 0x3FB75161, 0xAB1F4E4F, 0x82675BC5, 0xCD924D35,
0x81ABE279 }; | |
| 97 static uint64_t random[] = { 0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476,
0xC3D2E1F0 }; | |
| 98 static uint32_t randomOdd[] = { 0xB4663807, 0xCC322BF5, 0xD4F91BBD, 0xA7BEA1
1D, 0x8F462907 }; | |
| 99 | |
| 100 uint64_t hashes[] = { 0, 0, 0, 0, 0 }; | |
| 101 uint64_t zi[] = { 1, 1, 1, 1, 1 }; | |
| 102 | |
| 103 const size_t hashesSize = PROTOCOL_ARRAY_LENGTH(hashes); | |
| 104 | |
| 105 size_t current = 0; | |
| 106 const uint32_t* data = nullptr; | |
| 107 data = reinterpret_cast<const uint32_t*>(str.characters16()); | |
| 108 for (size_t i = 0; i < str.sizeInBytes() / 4; i += 4) { | |
| 109 uint32_t v = data[i]; | |
| 110 uint64_t xi = v * randomOdd[current] & 0x7FFFFFFF; | |
| 111 hashes[current] = (hashes[current] + zi[current] * xi) % prime[current]; | |
| 112 zi[current] = (zi[current] * random[current]) % prime[current]; | |
| 113 current = current == hashesSize - 1 ? 0 : current + 1; | |
| 114 } | |
| 115 if (str.sizeInBytes() % 4) { | |
| 116 uint32_t v = 0; | |
| 117 for (size_t i = str.sizeInBytes() - str.sizeInBytes() % 4; i < str.sizeI
nBytes(); ++i) { | |
| 118 v <<= 8; | |
| 119 v |= reinterpret_cast<const uint8_t*>(data)[i]; | |
| 120 } | |
| 121 uint64_t xi = v * randomOdd[current] & 0x7FFFFFFF; | |
| 122 hashes[current] = (hashes[current] + zi[current] * xi) % prime[current]; | |
| 123 zi[current] = (zi[current] * random[current]) % prime[current]; | |
| 124 current = current == hashesSize - 1 ? 0 : current + 1; | |
| 125 } | |
| 126 | |
| 127 for (size_t i = 0; i < hashesSize; ++i) | |
| 128 hashes[i] = (hashes[i] + zi[i] * (prime[i] - 1)) % prime[i]; | |
| 129 | |
| 130 String16Builder hash; | |
| 131 for (size_t i = 0; i < hashesSize; ++i) | |
| 132 appendUnsignedAsHex(hashes[i], &hash); | |
| 133 return hash.toString(); | |
| 134 } | |
| 135 | |
| 136 static bool hasInternalError(ErrorString* errorString, bool hasError) | 81 static bool hasInternalError(ErrorString* errorString, bool hasError) |
| 137 { | 82 { |
| 138 if (hasError) | 83 if (hasError) |
| 139 *errorString = "Internal error"; | 84 *errorString = "Internal error"; |
| 140 return hasError; | 85 return hasError; |
| 141 } | 86 } |
| 142 | 87 |
| 143 static std::unique_ptr<protocol::Debugger::Location> buildProtocolLocation(const
String16& scriptId, int lineNumber, int columnNumber) | 88 static std::unique_ptr<protocol::Debugger::Location> buildProtocolLocation(const
String16& scriptId, int lineNumber, int columnNumber) |
| 144 { | 89 { |
| 145 return protocol::Debugger::Location::create() | 90 return protocol::Debugger::Location::create() |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 182 } | 127 } |
| 183 | 128 |
| 184 void V8DebuggerAgentImpl::enable() | 129 void V8DebuggerAgentImpl::enable() |
| 185 { | 130 { |
| 186 // debugger().addListener may result in reporting all parsed scripts to | 131 // debugger().addListener may result in reporting all parsed scripts to |
| 187 // the agent so it should already be in enabled state by then. | 132 // the agent so it should already be in enabled state by then. |
| 188 m_enabled = true; | 133 m_enabled = true; |
| 189 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); | 134 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); |
| 190 debugger().debuggerAgentEnabled(); | 135 debugger().debuggerAgentEnabled(); |
| 191 | 136 |
| 192 std::vector<V8DebuggerParsedScript> compiledScripts; | 137 std::vector<std::unique_ptr<V8DebuggerScript>> compiledScripts; |
| 193 debugger().getCompiledScripts(m_session->contextGroupId(), compiledScripts); | 138 debugger().getCompiledScripts(m_session->contextGroupId(), compiledScripts); |
| 194 for (size_t i = 0; i < compiledScripts.size(); i++) | 139 for (size_t i = 0; i < compiledScripts.size(); i++) |
| 195 didParseSource(compiledScripts[i]); | 140 didParseSource(std::move(compiledScripts[i]), true); |
| 196 | 141 |
| 197 // FIXME(WK44513): breakpoints activated flag should be synchronized between
all front-ends | 142 // FIXME(WK44513): breakpoints activated flag should be synchronized between
all front-ends |
| 198 debugger().setBreakpointsActivated(true); | 143 debugger().setBreakpointsActivated(true); |
| 199 m_session->changeInstrumentationCounter(+1); | 144 m_session->changeInstrumentationCounter(+1); |
| 200 } | 145 } |
| 201 | 146 |
| 202 bool V8DebuggerAgentImpl::enabled() | 147 bool V8DebuggerAgentImpl::enabled() |
| 203 { | 148 { |
| 204 return m_enabled; | 149 return m_enabled; |
| 205 } | 150 } |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 351 } | 296 } |
| 352 if (breakpointsCookie->get(breakpointId)) { | 297 if (breakpointsCookie->get(breakpointId)) { |
| 353 *errorString = "Breakpoint at specified location already exists."; | 298 *errorString = "Breakpoint at specified location already exists."; |
| 354 return; | 299 return; |
| 355 } | 300 } |
| 356 | 301 |
| 357 breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(ur
l, lineNumber, columnNumber, condition, isRegex)); | 302 breakpointsCookie->setObject(breakpointId, buildObjectForBreakpointCookie(ur
l, lineNumber, columnNumber, condition, isRegex)); |
| 358 | 303 |
| 359 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); | 304 ScriptBreakpoint breakpoint(lineNumber, columnNumber, condition); |
| 360 for (const auto& script : m_scripts) { | 305 for (const auto& script : m_scripts) { |
| 361 if (!matches(m_debugger, script.second.sourceURL(), url, isRegex)) | 306 if (!matches(m_debugger, script.second->sourceURL(), url, isRegex)) |
| 362 continue; | 307 continue; |
| 363 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoi
nt(breakpointId, script.first, breakpoint, UserBreakpointSource); | 308 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoi
nt(breakpointId, script.first, breakpoint, UserBreakpointSource); |
| 364 if (location) | 309 if (location) |
| 365 (*locations)->addItem(std::move(location)); | 310 (*locations)->addItem(std::move(location)); |
| 366 } | 311 } |
| 367 | 312 |
| 368 *outBreakpointId = breakpointId; | 313 *outBreakpointId = breakpointId; |
| 369 } | 314 } |
| 370 | 315 |
| 371 static bool parseLocation(ErrorString* errorString, std::unique_ptr<protocol::De
bugger::Location> location, String16* scriptId, int* lineNumber, int* columnNumb
er) | 316 static bool parseLocation(ErrorString* errorString, std::unique_ptr<protocol::De
bugger::Location> location, String16* scriptId, int* lineNumber, int* columnNumb
er) |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 486 bool V8DebuggerAgentImpl::isCallFrameWithUnknownScriptOrBlackboxed(JavaScriptCal
lFrame* frame) | 431 bool V8DebuggerAgentImpl::isCallFrameWithUnknownScriptOrBlackboxed(JavaScriptCal
lFrame* frame) |
| 487 { | 432 { |
| 488 if (!frame) | 433 if (!frame) |
| 489 return true; | 434 return true; |
| 490 ScriptsMap::iterator it = m_scripts.find(String16::number(frame->sourceID())
); | 435 ScriptsMap::iterator it = m_scripts.find(String16::number(frame->sourceID())
); |
| 491 if (it == m_scripts.end()) { | 436 if (it == m_scripts.end()) { |
| 492 // Unknown scripts are blackboxed. | 437 // Unknown scripts are blackboxed. |
| 493 return true; | 438 return true; |
| 494 } | 439 } |
| 495 if (m_blackboxPattern) { | 440 if (m_blackboxPattern) { |
| 496 const String16& scriptSourceURL = it->second.sourceURL(); | 441 const String16& scriptSourceURL = it->second->sourceURL(); |
| 497 if (!scriptSourceURL.isEmpty() && m_blackboxPattern->match(scriptSourceU
RL) != -1) | 442 if (!scriptSourceURL.isEmpty() && m_blackboxPattern->match(scriptSourceU
RL) != -1) |
| 498 return true; | 443 return true; |
| 499 } | 444 } |
| 500 auto itBlackboxedPositions = m_blackboxedPositions.find(String16::number(fra
me->sourceID())); | 445 auto itBlackboxedPositions = m_blackboxedPositions.find(String16::number(fra
me->sourceID())); |
| 501 if (itBlackboxedPositions == m_blackboxedPositions.end()) | 446 if (itBlackboxedPositions == m_blackboxedPositions.end()) |
| 502 return false; | 447 return false; |
| 503 | 448 |
| 504 const std::vector<std::pair<int, int>>& ranges = itBlackboxedPositions->seco
nd; | 449 const std::vector<std::pair<int, int>>& ranges = itBlackboxedPositions->seco
nd; |
| 505 auto itRange = std::lower_bound(ranges.cbegin(), ranges.cend(), | 450 auto itRange = std::lower_bound(ranges.cbegin(), ranges.cend(), |
| 506 std::make_pair(frame->line(), frame->column()), positionComparator); | 451 std::make_pair(frame->line(), frame->column()), positionComparator); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 544 | 489 |
| 545 std::unique_ptr<protocol::Debugger::Location> V8DebuggerAgentImpl::resolveBreakp
oint(const String16& breakpointId, const String16& scriptId, const ScriptBreakpo
int& breakpoint, BreakpointSource source) | 490 std::unique_ptr<protocol::Debugger::Location> V8DebuggerAgentImpl::resolveBreakp
oint(const String16& breakpointId, const String16& scriptId, const ScriptBreakpo
int& breakpoint, BreakpointSource source) |
| 546 { | 491 { |
| 547 DCHECK(enabled()); | 492 DCHECK(enabled()); |
| 548 // FIXME: remove these checks once crbug.com/520702 is resolved. | 493 // FIXME: remove these checks once crbug.com/520702 is resolved. |
| 549 CHECK(!breakpointId.isEmpty()); | 494 CHECK(!breakpointId.isEmpty()); |
| 550 CHECK(!scriptId.isEmpty()); | 495 CHECK(!scriptId.isEmpty()); |
| 551 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId); | 496 ScriptsMap::iterator scriptIterator = m_scripts.find(scriptId); |
| 552 if (scriptIterator == m_scripts.end()) | 497 if (scriptIterator == m_scripts.end()) |
| 553 return nullptr; | 498 return nullptr; |
| 554 const V8DebuggerScript& script = scriptIterator->second; | 499 if (breakpoint.lineNumber < scriptIterator->second->startLine() || scriptIte
rator->second->endLine() < breakpoint.lineNumber) |
| 555 if (breakpoint.lineNumber < script.startLine() || script.endLine() < breakpo
int.lineNumber) | |
| 556 return nullptr; | 500 return nullptr; |
| 557 | 501 |
| 558 int actualLineNumber; | 502 int actualLineNumber; |
| 559 int actualColumnNumber; | 503 int actualColumnNumber; |
| 560 String16 debuggerBreakpointId = debugger().setBreakpoint(scriptId, breakpoin
t, &actualLineNumber, &actualColumnNumber, false); | 504 String16 debuggerBreakpointId = debugger().setBreakpoint(scriptId, breakpoin
t, &actualLineNumber, &actualColumnNumber, false); |
| 561 if (debuggerBreakpointId.isEmpty()) | 505 if (debuggerBreakpointId.isEmpty()) |
| 562 return nullptr; | 506 return nullptr; |
| 563 | 507 |
| 564 m_serverBreakpoints[debuggerBreakpointId] = std::make_pair(breakpointId, sou
rce); | 508 m_serverBreakpoints[debuggerBreakpointId] = std::make_pair(breakpointId, sou
rce); |
| 565 CHECK(!breakpointId.isEmpty()); | 509 CHECK(!breakpointId.isEmpty()); |
| 566 | 510 |
| 567 m_breakpointIdToDebuggerBreakpointIds[breakpointId].push_back(debuggerBreakp
ointId); | 511 m_breakpointIdToDebuggerBreakpointIds[breakpointId].push_back(debuggerBreakp
ointId); |
| 568 return buildProtocolLocation(scriptId, actualLineNumber, actualColumnNumber)
; | 512 return buildProtocolLocation(scriptId, actualLineNumber, actualColumnNumber)
; |
| 569 } | 513 } |
| 570 | 514 |
| 571 void V8DebuggerAgentImpl::searchInContent(ErrorString* error, const String16& sc
riptId, const String16& query, | 515 void V8DebuggerAgentImpl::searchInContent(ErrorString* error, const String16& sc
riptId, const String16& query, |
| 572 const Maybe<bool>& optionalCaseSensitive, | 516 const Maybe<bool>& optionalCaseSensitive, |
| 573 const Maybe<bool>& optionalIsRegex, | 517 const Maybe<bool>& optionalIsRegex, |
| 574 std::unique_ptr<Array<protocol::Debugger::SearchMatch>>* results) | 518 std::unique_ptr<Array<protocol::Debugger::SearchMatch>>* results) |
| 575 { | 519 { |
| 520 v8::HandleScope handles(m_isolate); |
| 576 ScriptsMap::iterator it = m_scripts.find(scriptId); | 521 ScriptsMap::iterator it = m_scripts.find(scriptId); |
| 577 if (it != m_scripts.end()) | 522 if (it != m_scripts.end()) |
| 578 *results = V8ContentSearchUtil::searchInTextByLines(m_session, it->secon
d.source(), query, optionalCaseSensitive.fromMaybe(false), optionalIsRegex.fromM
aybe(false)); | 523 *results = V8ContentSearchUtil::searchInTextByLines(m_session, toProtoco
lString(it->second->source(m_isolate)), query, optionalCaseSensitive.fromMaybe(f
alse), optionalIsRegex.fromMaybe(false)); |
| 579 else | 524 else |
| 580 *error = String16("No script for id: " + scriptId); | 525 *error = String16("No script for id: " + scriptId); |
| 581 } | 526 } |
| 582 | 527 |
| 583 void V8DebuggerAgentImpl::setScriptSource(ErrorString* errorString, | 528 void V8DebuggerAgentImpl::setScriptSource(ErrorString* errorString, |
| 584 const String16& scriptId, | 529 const String16& scriptId, |
| 585 const String16& newContent, | 530 const String16& newContent, |
| 586 const Maybe<bool>& preview, | 531 const Maybe<bool>& preview, |
| 587 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames, | 532 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames, |
| 588 Maybe<bool>* stackChanged, | 533 Maybe<bool>* stackChanged, |
| 589 Maybe<StackTrace>* asyncStackTrace, | 534 Maybe<StackTrace>* asyncStackTrace, |
| 590 Maybe<protocol::Debugger::SetScriptSourceError>* optOutCompileError) | 535 Maybe<protocol::Debugger::SetScriptSourceError>* optOutCompileError) |
| 591 { | 536 { |
| 592 if (!checkEnabled(errorString)) | 537 if (!checkEnabled(errorString)) |
| 593 return; | 538 return; |
| 594 if (!debugger().setScriptSource(scriptId, newContent, preview.fromMaybe(fals
e), errorString, optOutCompileError, &m_pausedCallFrames, stackChanged)) | 539 |
| 540 v8::HandleScope handles(m_isolate); |
| 541 v8::Local<v8::String> newSource = toV8String(m_isolate, newContent); |
| 542 if (!debugger().setScriptSource(scriptId, newSource, preview.fromMaybe(false
), errorString, optOutCompileError, &m_pausedCallFrames, stackChanged)) |
| 595 return; | 543 return; |
| 596 | 544 |
| 545 ScriptsMap::iterator it = m_scripts.find(scriptId); |
| 546 if (it != m_scripts.end()) |
| 547 it->second->setSource(m_isolate, newSource); |
| 548 |
| 597 std::unique_ptr<Array<CallFrame>> callFrames = currentCallFrames(errorString
); | 549 std::unique_ptr<Array<CallFrame>> callFrames = currentCallFrames(errorString
); |
| 598 if (!callFrames) | 550 if (!callFrames) |
| 599 return; | 551 return; |
| 600 *newCallFrames = std::move(callFrames); | 552 *newCallFrames = std::move(callFrames); |
| 601 *asyncStackTrace = currentAsyncStackTrace(); | 553 *asyncStackTrace = currentAsyncStackTrace(); |
| 602 | |
| 603 ScriptsMap::iterator it = m_scripts.find(scriptId); | |
| 604 if (it == m_scripts.end()) | |
| 605 return; | |
| 606 it->second.setSource(newContent); | |
| 607 } | 554 } |
| 608 | 555 |
| 609 void V8DebuggerAgentImpl::restartFrame(ErrorString* errorString, | 556 void V8DebuggerAgentImpl::restartFrame(ErrorString* errorString, |
| 610 const String16& callFrameId, | 557 const String16& callFrameId, |
| 611 std::unique_ptr<Array<CallFrame>>* newCallFrames, | 558 std::unique_ptr<Array<CallFrame>>* newCallFrames, |
| 612 Maybe<StackTrace>* asyncStackTrace) | 559 Maybe<StackTrace>* asyncStackTrace) |
| 613 { | 560 { |
| 614 if (!assertPaused(errorString)) | 561 if (!assertPaused(errorString)) |
| 615 return; | 562 return; |
| 616 InjectedScript::CallFrameScope scope(errorString, m_debugger, m_session->con
textGroupId(), callFrameId); | 563 InjectedScript::CallFrameScope scope(errorString, m_debugger, m_session->con
textGroupId(), callFrameId); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 638 | 585 |
| 639 void V8DebuggerAgentImpl::getScriptSource(ErrorString* error, const String16& sc
riptId, String16* scriptSource) | 586 void V8DebuggerAgentImpl::getScriptSource(ErrorString* error, const String16& sc
riptId, String16* scriptSource) |
| 640 { | 587 { |
| 641 if (!checkEnabled(error)) | 588 if (!checkEnabled(error)) |
| 642 return; | 589 return; |
| 643 ScriptsMap::iterator it = m_scripts.find(scriptId); | 590 ScriptsMap::iterator it = m_scripts.find(scriptId); |
| 644 if (it == m_scripts.end()) { | 591 if (it == m_scripts.end()) { |
| 645 *error = "No script for id: " + scriptId; | 592 *error = "No script for id: " + scriptId; |
| 646 return; | 593 return; |
| 647 } | 594 } |
| 648 *scriptSource = it->second.source(); | 595 v8::HandleScope handles(m_isolate); |
| 596 *scriptSource = toProtocolString(it->second->source(m_isolate)); |
| 649 } | 597 } |
| 650 | 598 |
| 651 void V8DebuggerAgentImpl::getFunctionDetails(ErrorString* errorString, const Str
ing16& functionId, std::unique_ptr<FunctionDetails>* details) | 599 void V8DebuggerAgentImpl::getFunctionDetails(ErrorString* errorString, const Str
ing16& functionId, std::unique_ptr<FunctionDetails>* details) |
| 652 { | 600 { |
| 653 if (!checkEnabled(errorString)) | 601 if (!checkEnabled(errorString)) |
| 654 return; | 602 return; |
| 655 InjectedScript::ObjectScope scope(errorString, m_debugger, m_session->contex
tGroupId(), functionId); | 603 InjectedScript::ObjectScope scope(errorString, m_debugger, m_session->contex
tGroupId(), functionId); |
| 656 if (!scope.initialize()) | 604 if (!scope.initialize()) |
| 657 return; | 605 return; |
| 658 if (!scope.object()->IsFunction()) { | 606 if (!scope.object()->IsFunction()) { |
| (...skipping 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1093 } | 1041 } |
| 1094 | 1042 |
| 1095 std::unique_ptr<StackTrace> V8DebuggerAgentImpl::currentAsyncStackTrace() | 1043 std::unique_ptr<StackTrace> V8DebuggerAgentImpl::currentAsyncStackTrace() |
| 1096 { | 1044 { |
| 1097 if (m_pausedContext.IsEmpty()) | 1045 if (m_pausedContext.IsEmpty()) |
| 1098 return nullptr; | 1046 return nullptr; |
| 1099 V8StackTraceImpl* stackTrace = m_debugger->currentAsyncCallChain(); | 1047 V8StackTraceImpl* stackTrace = m_debugger->currentAsyncCallChain(); |
| 1100 return stackTrace ? stackTrace->buildInspectorObjectForTail(m_debugger) : nu
llptr; | 1048 return stackTrace ? stackTrace->buildInspectorObjectForTail(m_debugger) : nu
llptr; |
| 1101 } | 1049 } |
| 1102 | 1050 |
| 1103 void V8DebuggerAgentImpl::didParseSource(const V8DebuggerParsedScript& parsedScr
ipt) | 1051 void V8DebuggerAgentImpl::didParseSource(std::unique_ptr<V8DebuggerScript> scrip
t, bool success) |
| 1104 { | 1052 { |
| 1105 V8DebuggerScript script = parsedScript.script; | 1053 v8::HandleScope handles(m_isolate); |
| 1106 | 1054 String16 scriptSource = toProtocolString(script->source(m_isolate)); |
| 1107 bool isDeprecatedSourceURL = false; | 1055 bool isDeprecatedSourceURL = false; |
| 1108 if (!parsedScript.success) | 1056 if (!success) |
| 1109 script.setSourceURL(V8ContentSearchUtil::findSourceURL(script.source(),
false, &isDeprecatedSourceURL)); | 1057 script->setSourceURL(V8ContentSearchUtil::findSourceURL(scriptSource, fa
lse, &isDeprecatedSourceURL)); |
| 1110 else if (script.hasSourceURL()) | 1058 else if (script->hasSourceURL()) |
| 1111 V8ContentSearchUtil::findSourceURL(script.source(), false, &isDeprecated
SourceURL); | 1059 V8ContentSearchUtil::findSourceURL(scriptSource, false, &isDeprecatedSou
rceURL); |
| 1112 | 1060 |
| 1113 bool isDeprecatedSourceMappingURL = false; | 1061 bool isDeprecatedSourceMappingURL = false; |
| 1114 if (!parsedScript.success) | 1062 if (!success) |
| 1115 script.setSourceMappingURL(V8ContentSearchUtil::findSourceMapURL(script.
source(), false, &isDeprecatedSourceMappingURL)); | 1063 script->setSourceMappingURL(V8ContentSearchUtil::findSourceMapURL(script
Source, false, &isDeprecatedSourceMappingURL)); |
| 1116 else if (!script.sourceMappingURL().isEmpty()) | 1064 else if (!script->sourceMappingURL().isEmpty()) |
| 1117 V8ContentSearchUtil::findSourceMapURL(script.source(), false, &isDepreca
tedSourceMappingURL); | 1065 V8ContentSearchUtil::findSourceMapURL(scriptSource, false, &isDeprecated
SourceMappingURL); |
| 1118 | 1066 |
| 1119 script.setHash(calculateHash(script.source())); | 1067 bool isContentScript = script->isContentScript(); |
| 1120 | 1068 bool isInternalScript = script->isInternalScript(); |
| 1121 int executionContextId = script.executionContextId(); | 1069 bool isLiveEdit = script->isLiveEdit(); |
| 1122 bool isContentScript = script.isContentScript(); | 1070 bool hasSourceURL = script->hasSourceURL(); |
| 1123 bool isInternalScript = script.isInternalScript(); | 1071 String16 scriptId = script->scriptId(); |
| 1124 bool isLiveEdit = script.isLiveEdit(); | 1072 String16 scriptURL = script->sourceURL(); |
| 1125 bool hasSourceURL = script.hasSourceURL(); | |
| 1126 String16 scriptURL = script.sourceURL(); | |
| 1127 String16 sourceMapURL = script.sourceMappingURL(); | |
| 1128 bool deprecatedCommentWasUsed = isDeprecatedSourceURL || isDeprecatedSourceM
appingURL; | 1073 bool deprecatedCommentWasUsed = isDeprecatedSourceURL || isDeprecatedSourceM
appingURL; |
| 1129 | 1074 |
| 1130 const Maybe<String16>& sourceMapURLParam = sourceMapURL; | 1075 const Maybe<String16>& sourceMapURLParam = script->sourceMappingURL(); |
| 1131 const bool* isContentScriptParam = isContentScript ? &isContentScript : null
ptr; | 1076 const bool* isContentScriptParam = isContentScript ? &isContentScript : null
ptr; |
| 1132 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n
ullptr; | 1077 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n
ullptr; |
| 1133 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; | 1078 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; |
| 1134 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; | 1079 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; |
| 1135 const bool* deprecatedCommentWasUsedParam = deprecatedCommentWasUsed ? &depr
ecatedCommentWasUsed : nullptr; | 1080 const bool* deprecatedCommentWasUsedParam = deprecatedCommentWasUsed ? &depr
ecatedCommentWasUsed : nullptr; |
| 1136 if (parsedScript.success) | 1081 if (success) |
| 1137 m_frontend.scriptParsed(parsedScript.scriptId, scriptURL, script.startLi
ne(), script.startColumn(), script.endLine(), script.endColumn(), executionConte
xtId, script.hash(), isContentScriptParam, isInternalScriptParam, isLiveEditPara
m, sourceMapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); | 1082 m_frontend.scriptParsed(scriptId, scriptURL, script->startLine(), script
->startColumn(), script->endLine(), script->endColumn(), script->executionContex
tId(), script->hash(), isContentScriptParam, isInternalScriptParam, isLiveEditPa
ram, sourceMapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); |
| 1138 else | 1083 else |
| 1139 m_frontend.scriptFailedToParse(parsedScript.scriptId, scriptURL, script.
startLine(), script.startColumn(), script.endLine(), script.endColumn(), executi
onContextId, script.hash(), isContentScriptParam, isInternalScriptParam, sourceM
apURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); | 1084 m_frontend.scriptFailedToParse(scriptId, scriptURL, script->startLine(),
script->startColumn(), script->endLine(), script->endColumn(), script->executio
nContextId(), script->hash(), isContentScriptParam, isInternalScriptParam, sourc
eMapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); |
| 1140 | 1085 |
| 1141 m_scripts[parsedScript.scriptId] = script; | 1086 m_scripts[scriptId] = std::move(script); |
| 1142 | 1087 |
| 1143 if (scriptURL.isEmpty() || !parsedScript.success) | 1088 if (scriptURL.isEmpty() || !success) |
| 1144 return; | 1089 return; |
| 1145 | 1090 |
| 1146 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg
entState::javaScriptBreakpoints); | 1091 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg
entState::javaScriptBreakpoints); |
| 1147 if (!breakpointsCookie) | 1092 if (!breakpointsCookie) |
| 1148 return; | 1093 return; |
| 1149 | 1094 |
| 1150 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { | 1095 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { |
| 1151 auto cookie = breakpointsCookie->at(i); | 1096 auto cookie = breakpointsCookie->at(i); |
| 1152 protocol::DictionaryValue* breakpointObject = protocol::DictionaryValue:
:cast(cookie.second); | 1097 protocol::DictionaryValue* breakpointObject = protocol::DictionaryValue:
:cast(cookie.second); |
| 1153 bool isRegex; | 1098 bool isRegex; |
| 1154 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); | 1099 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); |
| 1155 String16 url; | 1100 String16 url; |
| 1156 breakpointObject->getString(DebuggerAgentState::url, &url); | 1101 breakpointObject->getString(DebuggerAgentState::url, &url); |
| 1157 if (!matches(m_debugger, scriptURL, url, isRegex)) | 1102 if (!matches(m_debugger, scriptURL, url, isRegex)) |
| 1158 continue; | 1103 continue; |
| 1159 ScriptBreakpoint breakpoint; | 1104 ScriptBreakpoint breakpoint; |
| 1160 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint.
lineNumber); | 1105 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint.
lineNumber); |
| 1161 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin
t.columnNumber); | 1106 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin
t.columnNumber); |
| 1162 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c
ondition); | 1107 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c
ondition); |
| 1163 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoi
nt(cookie.first, parsedScript.scriptId, breakpoint, UserBreakpointSource); | 1108 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoi
nt(cookie.first, scriptId, breakpoint, UserBreakpointSource); |
| 1164 if (location) | 1109 if (location) |
| 1165 m_frontend.breakpointResolved(cookie.first, std::move(location)); | 1110 m_frontend.breakpointResolved(cookie.first, std::move(location)); |
| 1166 } | 1111 } |
| 1167 } | 1112 } |
| 1168 | 1113 |
| 1169 V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause(v8::Local<v8
::Context> context, v8::Local<v8::Value> exception, const std::vector<String16>&
hitBreakpoints, bool isPromiseRejection) | 1114 V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause(v8::Local<v8
::Context> context, v8::Local<v8::Value> exception, const std::vector<String16>&
hitBreakpoints, bool isPromiseRejection) |
| 1170 { | 1115 { |
| 1171 JavaScriptCallFrames callFrames = debugger().currentCallFrames(1); | 1116 JavaScriptCallFrames callFrames = debugger().currentCallFrames(1); |
| 1172 JavaScriptCallFrame* topCallFrame = !callFrames.empty() ? callFrames.begin()
->get() : nullptr; | 1117 JavaScriptCallFrame* topCallFrame = !callFrames.empty() ? callFrames.begin()
->get() : nullptr; |
| 1173 | 1118 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1297 { | 1242 { |
| 1298 if (!enabled()) | 1243 if (!enabled()) |
| 1299 return; | 1244 return; |
| 1300 m_scheduledDebuggerStep = NoStep; | 1245 m_scheduledDebuggerStep = NoStep; |
| 1301 m_scripts.clear(); | 1246 m_scripts.clear(); |
| 1302 m_blackboxedPositions.clear(); | 1247 m_blackboxedPositions.clear(); |
| 1303 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1248 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 1304 } | 1249 } |
| 1305 | 1250 |
| 1306 } // namespace blink | 1251 } // namespace blink |
| OLD | NEW |