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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 } | 183 } |
184 | 184 |
185 void V8DebuggerAgentImpl::enable() | 185 void V8DebuggerAgentImpl::enable() |
186 { | 186 { |
187 // debugger().addListener may result in reporting all parsed scripts to | 187 // debugger().addListener may result in reporting all parsed scripts to |
188 // the agent so it should already be in enabled state by then. | 188 // the agent so it should already be in enabled state by then. |
189 m_enabled = true; | 189 m_enabled = true; |
190 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); | 190 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, true); |
191 debugger().debuggerAgentEnabled(); | 191 debugger().debuggerAgentEnabled(); |
192 | 192 |
193 protocol::Vector<V8DebuggerParsedScript> compiledScripts; | 193 std::vector<std::unique_ptr<V8DebuggerScript>> compiledScripts; |
194 debugger().getCompiledScripts(m_session->contextGroupId(), compiledScripts); | 194 debugger().getCompiledScripts(m_session->contextGroupId(), compiledScripts); |
195 for (size_t i = 0; i < compiledScripts.size(); i++) | 195 for (size_t i = 0; i < compiledScripts.size(); i++) |
196 didParseSource(compiledScripts[i]); | 196 didParseSource(std::move(compiledScripts[i]), true); |
197 | 197 |
198 // FIXME(WK44513): breakpoints activated flag should be synchronized between
all front-ends | 198 // FIXME(WK44513): breakpoints activated flag should be synchronized between
all front-ends |
199 debugger().setBreakpointsActivated(true); | 199 debugger().setBreakpointsActivated(true); |
200 m_session->changeInstrumentationCounter(+1); | 200 m_session->changeInstrumentationCounter(+1); |
201 } | 201 } |
202 | 202 |
203 bool V8DebuggerAgentImpl::enabled() | 203 bool V8DebuggerAgentImpl::enabled() |
204 { | 204 { |
205 return m_enabled; | 205 return m_enabled; |
206 } | 206 } |
(...skipping 361 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
568 debuggerBreakpointIdsIterator->second->append(debuggerBreakpointId); | 568 debuggerBreakpointIdsIterator->second->append(debuggerBreakpointId); |
569 | 569 |
570 return buildProtocolLocation(scriptId, actualLineNumber, actualColumnNumber)
; | 570 return buildProtocolLocation(scriptId, actualLineNumber, actualColumnNumber)
; |
571 } | 571 } |
572 | 572 |
573 void V8DebuggerAgentImpl::searchInContent(ErrorString* error, const String16& sc
riptId, const String16& query, | 573 void V8DebuggerAgentImpl::searchInContent(ErrorString* error, const String16& sc
riptId, const String16& query, |
574 const Maybe<bool>& optionalCaseSensitive, | 574 const Maybe<bool>& optionalCaseSensitive, |
575 const Maybe<bool>& optionalIsRegex, | 575 const Maybe<bool>& optionalIsRegex, |
576 std::unique_ptr<Array<protocol::Debugger::SearchMatch>>* results) | 576 std::unique_ptr<Array<protocol::Debugger::SearchMatch>>* results) |
577 { | 577 { |
| 578 v8::HandleScope handles(m_isolate); |
578 ScriptsMap::iterator it = m_scripts.find(scriptId); | 579 ScriptsMap::iterator it = m_scripts.find(scriptId); |
579 if (it != m_scripts.end()) | 580 if (it != m_scripts.end()) |
580 *results = V8ContentSearchUtil::searchInTextByLines(m_session, it->secon
d->source(), query, optionalCaseSensitive.fromMaybe(false), optionalIsRegex.from
Maybe(false)); | 581 *results = V8ContentSearchUtil::searchInTextByLines(m_session, toProtoco
lString(it->second->source(m_isolate)), query, optionalCaseSensitive.fromMaybe(f
alse), optionalIsRegex.fromMaybe(false)); |
581 else | 582 else |
582 *error = String16("No script for id: " + scriptId); | 583 *error = String16("No script for id: " + scriptId); |
583 } | 584 } |
584 | 585 |
585 void V8DebuggerAgentImpl::setScriptSource(ErrorString* errorString, | 586 void V8DebuggerAgentImpl::setScriptSource(ErrorString* errorString, |
586 const String16& scriptId, | 587 const String16& scriptId, |
587 const String16& newContent, | 588 const String16& newContent, |
588 const Maybe<bool>& preview, | 589 const Maybe<bool>& preview, |
589 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames, | 590 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* newCallFrames, |
590 Maybe<bool>* stackChanged, | 591 Maybe<bool>* stackChanged, |
591 Maybe<StackTrace>* asyncStackTrace, | 592 Maybe<StackTrace>* asyncStackTrace, |
592 Maybe<protocol::Debugger::SetScriptSourceError>* optOutCompileError) | 593 Maybe<protocol::Debugger::SetScriptSourceError>* optOutCompileError) |
593 { | 594 { |
594 if (!checkEnabled(errorString)) | 595 if (!checkEnabled(errorString)) |
595 return; | 596 return; |
596 if (!debugger().setScriptSource(scriptId, newContent, preview.fromMaybe(fals
e), errorString, optOutCompileError, &m_pausedCallFrames, stackChanged)) | 597 |
| 598 v8::HandleScope handles(m_isolate); |
| 599 v8::Local<v8::String> newSource = toV8String(m_isolate, newContent); |
| 600 if (!debugger().setScriptSource(scriptId, newSource, preview.fromMaybe(false
), errorString, optOutCompileError, &m_pausedCallFrames, stackChanged)) |
597 return; | 601 return; |
598 | 602 |
| 603 ScriptsMap::iterator it = m_scripts.find(scriptId); |
| 604 if (it != m_scripts.end()) |
| 605 it->second->setSource(m_isolate, newSource); |
| 606 |
599 std::unique_ptr<Array<CallFrame>> callFrames = currentCallFrames(errorString
); | 607 std::unique_ptr<Array<CallFrame>> callFrames = currentCallFrames(errorString
); |
600 if (!callFrames) | 608 if (!callFrames) |
601 return; | 609 return; |
602 *newCallFrames = std::move(callFrames); | 610 *newCallFrames = std::move(callFrames); |
603 *asyncStackTrace = currentAsyncStackTrace(); | 611 *asyncStackTrace = currentAsyncStackTrace(); |
604 | |
605 ScriptsMap::iterator it = m_scripts.find(scriptId); | |
606 if (it == m_scripts.end()) | |
607 return; | |
608 it->second->setSource(newContent); | |
609 } | 612 } |
610 | 613 |
611 void V8DebuggerAgentImpl::restartFrame(ErrorString* errorString, | 614 void V8DebuggerAgentImpl::restartFrame(ErrorString* errorString, |
612 const String16& callFrameId, | 615 const String16& callFrameId, |
613 std::unique_ptr<Array<CallFrame>>* newCallFrames, | 616 std::unique_ptr<Array<CallFrame>>* newCallFrames, |
614 Maybe<StackTrace>* asyncStackTrace) | 617 Maybe<StackTrace>* asyncStackTrace) |
615 { | 618 { |
616 if (!assertPaused(errorString)) | 619 if (!assertPaused(errorString)) |
617 return; | 620 return; |
618 InjectedScript::CallFrameScope scope(errorString, m_debugger, m_session->con
textGroupId(), callFrameId); | 621 InjectedScript::CallFrameScope scope(errorString, m_debugger, m_session->con
textGroupId(), callFrameId); |
(...skipping 20 matching lines...) Expand all Loading... |
639 | 642 |
640 void V8DebuggerAgentImpl::getScriptSource(ErrorString* error, const String16& sc
riptId, String16* scriptSource) | 643 void V8DebuggerAgentImpl::getScriptSource(ErrorString* error, const String16& sc
riptId, String16* scriptSource) |
641 { | 644 { |
642 if (!checkEnabled(error)) | 645 if (!checkEnabled(error)) |
643 return; | 646 return; |
644 ScriptsMap::iterator it = m_scripts.find(scriptId); | 647 ScriptsMap::iterator it = m_scripts.find(scriptId); |
645 if (it == m_scripts.end()) { | 648 if (it == m_scripts.end()) { |
646 *error = "No script for id: " + scriptId; | 649 *error = "No script for id: " + scriptId; |
647 return; | 650 return; |
648 } | 651 } |
649 *scriptSource = it->second->source(); | 652 v8::HandleScope handles(m_isolate); |
| 653 *scriptSource = toProtocolString(it->second->source(m_isolate)); |
650 } | 654 } |
651 | 655 |
652 void V8DebuggerAgentImpl::getFunctionDetails(ErrorString* errorString, const Str
ing16& functionId, std::unique_ptr<FunctionDetails>* details) | 656 void V8DebuggerAgentImpl::getFunctionDetails(ErrorString* errorString, const Str
ing16& functionId, std::unique_ptr<FunctionDetails>* details) |
653 { | 657 { |
654 if (!checkEnabled(errorString)) | 658 if (!checkEnabled(errorString)) |
655 return; | 659 return; |
656 InjectedScript::ObjectScope scope(errorString, m_debugger, m_session->contex
tGroupId(), functionId); | 660 InjectedScript::ObjectScope scope(errorString, m_debugger, m_session->contex
tGroupId(), functionId); |
657 if (!scope.initialize()) | 661 if (!scope.initialize()) |
658 return; | 662 return; |
659 if (!scope.object()->IsFunction()) { | 663 if (!scope.object()->IsFunction()) { |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1126 } | 1130 } |
1127 | 1131 |
1128 std::unique_ptr<StackTrace> V8DebuggerAgentImpl::currentAsyncStackTrace() | 1132 std::unique_ptr<StackTrace> V8DebuggerAgentImpl::currentAsyncStackTrace() |
1129 { | 1133 { |
1130 if (m_pausedContext.IsEmpty()) | 1134 if (m_pausedContext.IsEmpty()) |
1131 return nullptr; | 1135 return nullptr; |
1132 V8StackTraceImpl* stackTrace = m_debugger->currentAsyncCallChain(); | 1136 V8StackTraceImpl* stackTrace = m_debugger->currentAsyncCallChain(); |
1133 return stackTrace ? stackTrace->buildInspectorObjectForTail(m_debugger) : nu
llptr; | 1137 return stackTrace ? stackTrace->buildInspectorObjectForTail(m_debugger) : nu
llptr; |
1134 } | 1138 } |
1135 | 1139 |
1136 void V8DebuggerAgentImpl::didParseSource(const V8DebuggerParsedScript& parsedScr
ipt) | 1140 void V8DebuggerAgentImpl::didParseSource(std::unique_ptr<V8DebuggerScript> scrip
t, bool success) |
1137 { | 1141 { |
1138 V8DebuggerScript script = parsedScript.script; | 1142 v8::HandleScope handles(m_isolate); |
1139 | 1143 String16 scriptSource = toProtocolString(script->source(m_isolate)); |
1140 bool isDeprecatedSourceURL = false; | 1144 bool isDeprecatedSourceURL = false; |
1141 if (!parsedScript.success) | 1145 if (!success) |
1142 script.setSourceURL(V8ContentSearchUtil::findSourceURL(script.source(),
false, &isDeprecatedSourceURL)); | 1146 script->setSourceURL(V8ContentSearchUtil::findSourceURL(scriptSource, fa
lse, &isDeprecatedSourceURL)); |
1143 else if (script.hasSourceURL()) | 1147 else if (script->hasSourceURL()) |
1144 V8ContentSearchUtil::findSourceURL(script.source(), false, &isDeprecated
SourceURL); | 1148 V8ContentSearchUtil::findSourceURL(scriptSource, false, &isDeprecatedSou
rceURL); |
1145 | 1149 |
1146 bool isDeprecatedSourceMappingURL = false; | 1150 bool isDeprecatedSourceMappingURL = false; |
1147 if (!parsedScript.success) | 1151 if (!success) |
1148 script.setSourceMappingURL(V8ContentSearchUtil::findSourceMapURL(script.
source(), false, &isDeprecatedSourceMappingURL)); | 1152 script->setSourceMappingURL(V8ContentSearchUtil::findSourceMapURL(script
Source, false, &isDeprecatedSourceMappingURL)); |
1149 else if (!script.sourceMappingURL().isEmpty()) | 1153 else if (!script->sourceMappingURL().isEmpty()) |
1150 V8ContentSearchUtil::findSourceMapURL(script.source(), false, &isDepreca
tedSourceMappingURL); | 1154 V8ContentSearchUtil::findSourceMapURL(scriptSource, false, &isDeprecated
SourceMappingURL); |
1151 | 1155 |
1152 script.setHash(calculateHash(script.source())); | 1156 script->setHash(calculateHash(scriptSource)); |
1153 | 1157 |
1154 int executionContextId = script.executionContextId(); | 1158 int executionContextId = script->executionContextId(); |
1155 bool isContentScript = script.isContentScript(); | 1159 bool isContentScript = script->isContentScript(); |
1156 bool isInternalScript = script.isInternalScript(); | 1160 bool isInternalScript = script->isInternalScript(); |
1157 bool isLiveEdit = script.isLiveEdit(); | 1161 bool isLiveEdit = script->isLiveEdit(); |
1158 bool hasSourceURL = script.hasSourceURL(); | 1162 bool hasSourceURL = script->hasSourceURL(); |
1159 String16 scriptURL = script.sourceURL(); | 1163 String16 scriptId = script->scriptId(); |
1160 String16 sourceMapURL = script.sourceMappingURL(); | 1164 String16 scriptURL = script->sourceURL(); |
| 1165 String16 sourceMapURL = script->sourceMappingURL(); |
1161 bool deprecatedCommentWasUsed = isDeprecatedSourceURL || isDeprecatedSourceM
appingURL; | 1166 bool deprecatedCommentWasUsed = isDeprecatedSourceURL || isDeprecatedSourceM
appingURL; |
1162 | 1167 |
1163 const Maybe<String16>& sourceMapURLParam = sourceMapURL; | 1168 const Maybe<String16>& sourceMapURLParam = sourceMapURL; |
1164 const bool* isContentScriptParam = isContentScript ? &isContentScript : null
ptr; | 1169 const bool* isContentScriptParam = isContentScript ? &isContentScript : null
ptr; |
1165 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n
ullptr; | 1170 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n
ullptr; |
1166 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; | 1171 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; |
1167 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; | 1172 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; |
1168 const bool* deprecatedCommentWasUsedParam = deprecatedCommentWasUsed ? &depr
ecatedCommentWasUsed : nullptr; | 1173 const bool* deprecatedCommentWasUsedParam = deprecatedCommentWasUsed ? &depr
ecatedCommentWasUsed : nullptr; |
1169 if (parsedScript.success) | 1174 if (success) |
1170 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); | 1175 m_frontend.scriptParsed(scriptId, scriptURL, script->startLine(), script
->startColumn(), script->endLine(), script->endColumn(), executionContextId, scr
ipt->hash(), isContentScriptParam, isInternalScriptParam, isLiveEditParam, sourc
eMapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); |
1171 else | 1176 else |
1172 m_frontend.scriptFailedToParse(parsedScript.scriptId, scriptURL, script.
startLine(), script.startColumn(), script.endLine(), script.endColumn(), executi
onContextId, script.hash(), isContentScriptParam, isInternalScriptParam, sourceM
apURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); | 1177 m_frontend.scriptFailedToParse(scriptId, scriptURL, script->startLine(),
script->startColumn(), script->endLine(), script->endColumn(), executionContext
Id, script->hash(), isContentScriptParam, isInternalScriptParam, sourceMapURLPar
am, hasSourceURLParam, deprecatedCommentWasUsedParam); |
1173 | 1178 |
1174 m_scripts.set(parsedScript.scriptId, script); | 1179 m_scripts.set(scriptId, std::move(script)); |
1175 | 1180 |
1176 if (scriptURL.isEmpty() || !parsedScript.success) | 1181 if (scriptURL.isEmpty() || !success) |
1177 return; | 1182 return; |
1178 | 1183 |
1179 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg
entState::javaScriptBreakpoints); | 1184 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg
entState::javaScriptBreakpoints); |
1180 if (!breakpointsCookie) | 1185 if (!breakpointsCookie) |
1181 return; | 1186 return; |
1182 | 1187 |
1183 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { | 1188 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { |
1184 auto cookie = breakpointsCookie->at(i); | 1189 auto cookie = breakpointsCookie->at(i); |
1185 protocol::DictionaryValue* breakpointObject = protocol::DictionaryValue:
:cast(cookie.second); | 1190 protocol::DictionaryValue* breakpointObject = protocol::DictionaryValue:
:cast(cookie.second); |
1186 bool isRegex; | 1191 bool isRegex; |
1187 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); | 1192 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); |
1188 String16 url; | 1193 String16 url; |
1189 breakpointObject->getString(DebuggerAgentState::url, &url); | 1194 breakpointObject->getString(DebuggerAgentState::url, &url); |
1190 if (!matches(m_debugger, scriptURL, url, isRegex)) | 1195 if (!matches(m_debugger, scriptURL, url, isRegex)) |
1191 continue; | 1196 continue; |
1192 ScriptBreakpoint breakpoint; | 1197 ScriptBreakpoint breakpoint; |
1193 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint.
lineNumber); | 1198 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint.
lineNumber); |
1194 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin
t.columnNumber); | 1199 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin
t.columnNumber); |
1195 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c
ondition); | 1200 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c
ondition); |
1196 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoi
nt(cookie.first, parsedScript.scriptId, breakpoint, UserBreakpointSource); | 1201 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoi
nt(cookie.first, scriptId, breakpoint, UserBreakpointSource); |
1197 if (location) | 1202 if (location) |
1198 m_frontend.breakpointResolved(cookie.first, std::move(location)); | 1203 m_frontend.breakpointResolved(cookie.first, std::move(location)); |
1199 } | 1204 } |
1200 } | 1205 } |
1201 | 1206 |
1202 V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause(v8::Local<v8
::Context> context, v8::Local<v8::Value> exception, const protocol::Vector<Strin
g16>& hitBreakpoints, bool isPromiseRejection) | 1207 V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause(v8::Local<v8
::Context> context, v8::Local<v8::Value> exception, const protocol::Vector<Strin
g16>& hitBreakpoints, bool isPromiseRejection) |
1203 { | 1208 { |
1204 JavaScriptCallFrames callFrames = debugger().currentCallFrames(1); | 1209 JavaScriptCallFrames callFrames = debugger().currentCallFrames(1); |
1205 JavaScriptCallFrame* topCallFrame = callFrames.size() > 0 ? callFrames[0] :
nullptr; | 1210 JavaScriptCallFrame* topCallFrame = callFrames.size() > 0 ? callFrames[0] :
nullptr; |
1206 | 1211 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1329 { | 1334 { |
1330 if (!enabled()) | 1335 if (!enabled()) |
1331 return; | 1336 return; |
1332 m_scheduledDebuggerStep = NoStep; | 1337 m_scheduledDebuggerStep = NoStep; |
1333 m_scripts.clear(); | 1338 m_scripts.clear(); |
1334 m_blackboxedPositions.clear(); | 1339 m_blackboxedPositions.clear(); |
1335 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1340 m_breakpointIdToDebuggerBreakpointIds.clear(); |
1336 } | 1341 } |
1337 | 1342 |
1338 } // namespace blink | 1343 } // namespace blink |
OLD | NEW |