| 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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 } | 148 } |
| 149 | 149 |
| 150 static std::unique_ptr<protocol::Debugger::Location> buildProtocolLocation(const
String16& scriptId, int lineNumber, int columnNumber) | 150 static std::unique_ptr<protocol::Debugger::Location> buildProtocolLocation(const
String16& scriptId, int lineNumber, int columnNumber) |
| 151 { | 151 { |
| 152 return protocol::Debugger::Location::create() | 152 return protocol::Debugger::Location::create() |
| 153 .setScriptId(scriptId) | 153 .setScriptId(scriptId) |
| 154 .setLineNumber(lineNumber) | 154 .setLineNumber(lineNumber) |
| 155 .setColumnNumber(columnNumber).build(); | 155 .setColumnNumber(columnNumber).build(); |
| 156 } | 156 } |
| 157 | 157 |
| 158 V8DebuggerAgentImpl::V8DebuggerAgentImpl(V8InspectorSessionImpl* session, protoc
ol::Debugger::Frontend* frontend, protocol::DictionaryValue* state) | 158 V8DebuggerAgentImpl::V8DebuggerAgentImpl(V8InspectorSessionImpl* session, protoc
ol::FrontendChannel* frontendChannel, protocol::DictionaryValue* state) |
| 159 : m_debugger(session->debugger()) | 159 : m_debugger(session->debugger()) |
| 160 , m_session(session) | 160 , m_session(session) |
| 161 , m_enabled(false) | 161 , m_enabled(false) |
| 162 , m_state(state) | 162 , m_state(state) |
| 163 , m_frontend(frontend) | 163 , m_frontend(frontendChannel) |
| 164 , m_isolate(m_debugger->isolate()) | 164 , m_isolate(m_debugger->isolate()) |
| 165 , m_breakReason(protocol::Debugger::Paused::ReasonEnum::Other) | 165 , m_breakReason(protocol::Debugger::Paused::ReasonEnum::Other) |
| 166 , m_scheduledDebuggerStep(NoStep) | 166 , m_scheduledDebuggerStep(NoStep) |
| 167 , m_skipNextDebuggerStepOut(false) | 167 , m_skipNextDebuggerStepOut(false) |
| 168 , m_javaScriptPauseScheduled(false) | 168 , m_javaScriptPauseScheduled(false) |
| 169 , m_steppingFromFramework(false) | 169 , m_steppingFromFramework(false) |
| 170 , m_pausingOnNativeEvent(false) | 170 , m_pausingOnNativeEvent(false) |
| 171 , m_skippedStepFrameCount(0) | 171 , m_skippedStepFrameCount(0) |
| 172 , m_recursionLevelForStepOut(0) | 172 , m_recursionLevelForStepOut(0) |
| 173 , m_recursionLevelForStepFrame(0) | 173 , m_recursionLevelForStepFrame(0) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 { | 216 { |
| 217 if (enabled()) | 217 if (enabled()) |
| 218 return; | 218 return; |
| 219 | 219 |
| 220 if (!m_session->client()->canExecuteScripts()) { | 220 if (!m_session->client()->canExecuteScripts()) { |
| 221 *errorString = "Script execution is prohibited"; | 221 *errorString = "Script execution is prohibited"; |
| 222 return; | 222 return; |
| 223 } | 223 } |
| 224 | 224 |
| 225 enable(); | 225 enable(); |
| 226 DCHECK(m_frontend); | |
| 227 } | 226 } |
| 228 | 227 |
| 229 void V8DebuggerAgentImpl::disable(ErrorString*) | 228 void V8DebuggerAgentImpl::disable(ErrorString*) |
| 230 { | 229 { |
| 231 if (!enabled()) | 230 if (!enabled()) |
| 232 return; | 231 return; |
| 233 m_session->changeInstrumentationCounter(-1); | 232 m_session->changeInstrumentationCounter(-1); |
| 234 | 233 |
| 235 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, protocol::Dict
ionaryValue::create()); | 234 m_state->setObject(DebuggerAgentState::javaScriptBreakpoints, protocol::Dict
ionaryValue::create()); |
| 236 m_state->setNumber(DebuggerAgentState::pauseOnExceptionsState, V8DebuggerImp
l::DontPauseOnExceptions); | 235 m_state->setNumber(DebuggerAgentState::pauseOnExceptionsState, V8DebuggerImp
l::DontPauseOnExceptions); |
| (...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1268 String16 sourceMapURL = script.sourceMappingURL(); | 1267 String16 sourceMapURL = script.sourceMappingURL(); |
| 1269 bool deprecatedCommentWasUsed = isDeprecatedSourceURL || isDeprecatedSourceM
appingURL; | 1268 bool deprecatedCommentWasUsed = isDeprecatedSourceURL || isDeprecatedSourceM
appingURL; |
| 1270 | 1269 |
| 1271 const Maybe<String16>& sourceMapURLParam = sourceMapURL; | 1270 const Maybe<String16>& sourceMapURLParam = sourceMapURL; |
| 1272 const bool* isContentScriptParam = isContentScript ? &isContentScript : null
ptr; | 1271 const bool* isContentScriptParam = isContentScript ? &isContentScript : null
ptr; |
| 1273 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n
ullptr; | 1272 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n
ullptr; |
| 1274 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; | 1273 const bool* isLiveEditParam = isLiveEdit ? &isLiveEdit : nullptr; |
| 1275 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; | 1274 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; |
| 1276 const bool* deprecatedCommentWasUsedParam = deprecatedCommentWasUsed ? &depr
ecatedCommentWasUsed : nullptr; | 1275 const bool* deprecatedCommentWasUsedParam = deprecatedCommentWasUsed ? &depr
ecatedCommentWasUsed : nullptr; |
| 1277 if (parsedScript.success) | 1276 if (parsedScript.success) |
| 1278 m_frontend->scriptParsed(parsedScript.scriptId, scriptURL, script.startL
ine(), script.startColumn(), script.endLine(), script.endColumn(), executionCont
extId, script.hash(), isContentScriptParam, isInternalScriptParam, isLiveEditPar
am, sourceMapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); | 1277 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); |
| 1279 else | 1278 else |
| 1280 m_frontend->scriptFailedToParse(parsedScript.scriptId, scriptURL, script
.startLine(), script.startColumn(), script.endLine(), script.endColumn(), execut
ionContextId, script.hash(), isContentScriptParam, isInternalScriptParam, source
MapURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); | 1279 m_frontend.scriptFailedToParse(parsedScript.scriptId, scriptURL, script.
startLine(), script.startColumn(), script.endLine(), script.endColumn(), executi
onContextId, script.hash(), isContentScriptParam, isInternalScriptParam, sourceM
apURLParam, hasSourceURLParam, deprecatedCommentWasUsedParam); |
| 1281 | 1280 |
| 1282 m_scripts.set(parsedScript.scriptId, script); | 1281 m_scripts.set(parsedScript.scriptId, script); |
| 1283 | 1282 |
| 1284 if (scriptURL.isEmpty() || !parsedScript.success) | 1283 if (scriptURL.isEmpty() || !parsedScript.success) |
| 1285 return; | 1284 return; |
| 1286 | 1285 |
| 1287 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg
entState::javaScriptBreakpoints); | 1286 protocol::DictionaryValue* breakpointsCookie = m_state->getObject(DebuggerAg
entState::javaScriptBreakpoints); |
| 1288 if (!breakpointsCookie) | 1287 if (!breakpointsCookie) |
| 1289 return; | 1288 return; |
| 1290 | 1289 |
| 1291 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { | 1290 for (size_t i = 0; i < breakpointsCookie->size(); ++i) { |
| 1292 auto cookie = breakpointsCookie->at(i); | 1291 auto cookie = breakpointsCookie->at(i); |
| 1293 protocol::DictionaryValue* breakpointObject = protocol::DictionaryValue:
:cast(cookie.second); | 1292 protocol::DictionaryValue* breakpointObject = protocol::DictionaryValue:
:cast(cookie.second); |
| 1294 bool isRegex; | 1293 bool isRegex; |
| 1295 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); | 1294 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); |
| 1296 String16 url; | 1295 String16 url; |
| 1297 breakpointObject->getString(DebuggerAgentState::url, &url); | 1296 breakpointObject->getString(DebuggerAgentState::url, &url); |
| 1298 if (!matches(m_debugger, scriptURL, url, isRegex)) | 1297 if (!matches(m_debugger, scriptURL, url, isRegex)) |
| 1299 continue; | 1298 continue; |
| 1300 ScriptBreakpoint breakpoint; | 1299 ScriptBreakpoint breakpoint; |
| 1301 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint.
lineNumber); | 1300 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint.
lineNumber); |
| 1302 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin
t.columnNumber); | 1301 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin
t.columnNumber); |
| 1303 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c
ondition); | 1302 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c
ondition); |
| 1304 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoi
nt(cookie.first, parsedScript.scriptId, breakpoint, UserBreakpointSource); | 1303 std::unique_ptr<protocol::Debugger::Location> location = resolveBreakpoi
nt(cookie.first, parsedScript.scriptId, breakpoint, UserBreakpointSource); |
| 1305 if (location) | 1304 if (location) |
| 1306 m_frontend->breakpointResolved(cookie.first, std::move(location)); | 1305 m_frontend.breakpointResolved(cookie.first, std::move(location)); |
| 1307 } | 1306 } |
| 1308 } | 1307 } |
| 1309 | 1308 |
| 1310 V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause(v8::Local<v8
::Context> context, v8::Local<v8::Value> exception, const protocol::Vector<Strin
g16>& hitBreakpoints, bool isPromiseRejection) | 1309 V8DebuggerAgentImpl::SkipPauseRequest V8DebuggerAgentImpl::didPause(v8::Local<v8
::Context> context, v8::Local<v8::Value> exception, const protocol::Vector<Strin
g16>& hitBreakpoints, bool isPromiseRejection) |
| 1311 { | 1310 { |
| 1312 JavaScriptCallFrames callFrames = debugger().currentCallFrames(1); | 1311 JavaScriptCallFrames callFrames = debugger().currentCallFrames(1); |
| 1313 JavaScriptCallFrame* topCallFrame = callFrames.size() > 0 ? callFrames[0] :
nullptr; | 1312 JavaScriptCallFrame* topCallFrame = callFrames.size() > 0 ? callFrames[0] :
nullptr; |
| 1314 | 1313 |
| 1315 V8DebuggerAgentImpl::SkipPauseRequest result; | 1314 V8DebuggerAgentImpl::SkipPauseRequest result; |
| 1316 if (m_skipAllPauses) | 1315 if (m_skipAllPauses) |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1356 const String16& localId = breakpointIterator->second->first; | 1355 const String16& localId = breakpointIterator->second->first; |
| 1357 hitBreakpointIds->addItem(localId); | 1356 hitBreakpointIds->addItem(localId); |
| 1358 | 1357 |
| 1359 BreakpointSource source = breakpointIterator->second->second; | 1358 BreakpointSource source = breakpointIterator->second->second; |
| 1360 if (m_breakReason == protocol::Debugger::Paused::ReasonEnum::Other &
& source == DebugCommandBreakpointSource) | 1359 if (m_breakReason == protocol::Debugger::Paused::ReasonEnum::Other &
& source == DebugCommandBreakpointSource) |
| 1361 m_breakReason = protocol::Debugger::Paused::ReasonEnum::DebugCom
mand; | 1360 m_breakReason = protocol::Debugger::Paused::ReasonEnum::DebugCom
mand; |
| 1362 } | 1361 } |
| 1363 } | 1362 } |
| 1364 | 1363 |
| 1365 ErrorString errorString; | 1364 ErrorString errorString; |
| 1366 m_frontend->paused(currentCallFrames(&errorString), m_breakReason, std::move
(m_breakAuxData), std::move(hitBreakpointIds), currentAsyncStackTrace()); | 1365 m_frontend.paused(currentCallFrames(&errorString), m_breakReason, std::move(
m_breakAuxData), std::move(hitBreakpointIds), currentAsyncStackTrace()); |
| 1367 m_scheduledDebuggerStep = NoStep; | 1366 m_scheduledDebuggerStep = NoStep; |
| 1368 m_javaScriptPauseScheduled = false; | 1367 m_javaScriptPauseScheduled = false; |
| 1369 m_steppingFromFramework = false; | 1368 m_steppingFromFramework = false; |
| 1370 m_pausingOnNativeEvent = false; | 1369 m_pausingOnNativeEvent = false; |
| 1371 m_skippedStepFrameCount = 0; | 1370 m_skippedStepFrameCount = 0; |
| 1372 m_recursionLevelForStepFrame = 0; | 1371 m_recursionLevelForStepFrame = 0; |
| 1373 | 1372 |
| 1374 if (!m_continueToLocationBreakpointId.isEmpty()) { | 1373 if (!m_continueToLocationBreakpointId.isEmpty()) { |
| 1375 debugger().removeBreakpoint(m_continueToLocationBreakpointId); | 1374 debugger().removeBreakpoint(m_continueToLocationBreakpointId); |
| 1376 m_continueToLocationBreakpointId = ""; | 1375 m_continueToLocationBreakpointId = ""; |
| 1377 } | 1376 } |
| 1378 return result; | 1377 return result; |
| 1379 } | 1378 } |
| 1380 | 1379 |
| 1381 void V8DebuggerAgentImpl::didContinue() | 1380 void V8DebuggerAgentImpl::didContinue() |
| 1382 { | 1381 { |
| 1383 m_pausedContext.Reset(); | 1382 m_pausedContext.Reset(); |
| 1384 JavaScriptCallFrames emptyCallFrames; | 1383 JavaScriptCallFrames emptyCallFrames; |
| 1385 m_pausedCallFrames.swap(emptyCallFrames); | 1384 m_pausedCallFrames.swap(emptyCallFrames); |
| 1386 clearBreakDetails(); | 1385 clearBreakDetails(); |
| 1387 m_frontend->resumed(); | 1386 m_frontend.resumed(); |
| 1388 } | 1387 } |
| 1389 | 1388 |
| 1390 void V8DebuggerAgentImpl::breakProgram(const String16& breakReason, std::unique_
ptr<protocol::DictionaryValue> data) | 1389 void V8DebuggerAgentImpl::breakProgram(const String16& breakReason, std::unique_
ptr<protocol::DictionaryValue> data) |
| 1391 { | 1390 { |
| 1392 if (!enabled() || m_skipAllPauses || !m_pausedContext.IsEmpty() || isCurrent
CallStackEmptyOrBlackboxed() || !debugger().breakpointsActivated()) | 1391 if (!enabled() || m_skipAllPauses || !m_pausedContext.IsEmpty() || isCurrent
CallStackEmptyOrBlackboxed() || !debugger().breakpointsActivated()) |
| 1393 return; | 1392 return; |
| 1394 m_breakReason = breakReason; | 1393 m_breakReason = breakReason; |
| 1395 m_breakAuxData = std::move(data); | 1394 m_breakAuxData = std::move(data); |
| 1396 m_scheduledDebuggerStep = NoStep; | 1395 m_scheduledDebuggerStep = NoStep; |
| 1397 m_steppingFromFramework = false; | 1396 m_steppingFromFramework = false; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1438 if (!enabled()) | 1437 if (!enabled()) |
| 1439 return; | 1438 return; |
| 1440 m_scheduledDebuggerStep = NoStep; | 1439 m_scheduledDebuggerStep = NoStep; |
| 1441 m_scripts.clear(); | 1440 m_scripts.clear(); |
| 1442 m_blackboxedPositions.clear(); | 1441 m_blackboxedPositions.clear(); |
| 1443 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1442 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 1444 allAsyncTasksCanceled(); | 1443 allAsyncTasksCanceled(); |
| 1445 } | 1444 } |
| 1446 | 1445 |
| 1447 } // namespace blink | 1446 } // namespace blink |
| OLD | NEW |