| 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 "config.h" | 5 #include "config.h" |
| 6 #include "core/inspector/V8DebuggerAgent.h" | 6 #include "core/inspector/V8DebuggerAgent.h" |
| 7 | 7 |
| 8 #include "bindings/core/v8/ScriptCallStackFactory.h" | 8 #include "bindings/core/v8/ScriptCallStackFactory.h" |
| 9 #include "bindings/core/v8/ScriptRegexp.h" | 9 #include "bindings/core/v8/ScriptRegexp.h" |
| 10 #include "bindings/core/v8/ScriptValue.h" | 10 #include "bindings/core/v8/ScriptValue.h" |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 return V8JavaScriptCallFrame::unwrap(value); | 115 return V8JavaScriptCallFrame::unwrap(value); |
| 116 } | 116 } |
| 117 | 117 |
| 118 static PassRefPtrWillBeRawPtr<ScriptCallStack> toScriptCallStack(v8::Local<v8::O
bject> callFrames) | 118 static PassRefPtrWillBeRawPtr<ScriptCallStack> toScriptCallStack(v8::Local<v8::O
bject> callFrames) |
| 119 { | 119 { |
| 120 RefPtr<JavaScriptCallFrame> jsCallFrame = toJavaScriptCallFrame(callFrames); | 120 RefPtr<JavaScriptCallFrame> jsCallFrame = toJavaScriptCallFrame(callFrames); |
| 121 return jsCallFrame ? toScriptCallStack(jsCallFrame.get()) : nullptr; | 121 return jsCallFrame ? toScriptCallStack(jsCallFrame.get()) : nullptr; |
| 122 } | 122 } |
| 123 | 123 |
| 124 V8DebuggerAgent::V8DebuggerAgent(InjectedScriptManager* injectedScriptManager, V
8Debugger* debugger, V8DebuggerAgent::Client* client, int contextGroupId) | 124 V8DebuggerAgent::V8DebuggerAgent(InjectedScriptManager* injectedScriptManager, V
8Debugger* debugger, V8DebuggerAgent::Client* client, int contextGroupId) |
| 125 : InspectorBaseAgent<V8DebuggerAgent, InspectorFrontend::Debugger>("Debugger
") | 125 : m_injectedScriptManager(injectedScriptManager) |
| 126 , m_injectedScriptManager(injectedScriptManager) | |
| 127 , m_debugger(debugger) | 126 , m_debugger(debugger) |
| 128 , m_client(client) | 127 , m_client(client) |
| 129 , m_contextGroupId(contextGroupId) | 128 , m_contextGroupId(contextGroupId) |
| 129 , m_state(nullptr) |
| 130 , m_frontend(nullptr) |
| 130 , m_isolate(debugger->isolate()) | 131 , m_isolate(debugger->isolate()) |
| 131 , m_pausedScriptState(nullptr) | 132 , m_pausedScriptState(nullptr) |
| 132 , m_breakReason(InspectorFrontend::Debugger::Reason::Other) | 133 , m_breakReason(InspectorFrontend::Debugger::Reason::Other) |
| 133 , m_scheduledDebuggerStep(NoStep) | 134 , m_scheduledDebuggerStep(NoStep) |
| 134 , m_skipNextDebuggerStepOut(false) | 135 , m_skipNextDebuggerStepOut(false) |
| 135 , m_javaScriptPauseScheduled(false) | 136 , m_javaScriptPauseScheduled(false) |
| 136 , m_steppingFromFramework(false) | 137 , m_steppingFromFramework(false) |
| 137 , m_pausingOnNativeEvent(false) | 138 , m_pausingOnNativeEvent(false) |
| 138 , m_pausingOnAsyncOperation(false) | 139 , m_pausingOnAsyncOperation(false) |
| 139 , m_skippedStepFrameCount(0) | 140 , m_skippedStepFrameCount(0) |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 return m_state->getBoolean(DebuggerAgentState::debuggerEnabled); | 201 return m_state->getBoolean(DebuggerAgentState::debuggerEnabled); |
| 201 } | 202 } |
| 202 | 203 |
| 203 void V8DebuggerAgent::enable(ErrorString*) | 204 void V8DebuggerAgent::enable(ErrorString*) |
| 204 { | 205 { |
| 205 if (enabled()) | 206 if (enabled()) |
| 206 return; | 207 return; |
| 207 | 208 |
| 208 enable(); | 209 enable(); |
| 209 | 210 |
| 210 ASSERT(frontend()); | 211 ASSERT(m_frontend); |
| 211 } | 212 } |
| 212 | 213 |
| 213 void V8DebuggerAgent::disable(ErrorString*) | 214 void V8DebuggerAgent::disable(ErrorString*) |
| 214 { | 215 { |
| 215 if (!enabled()) | 216 if (!enabled()) |
| 216 return; | 217 return; |
| 217 | 218 |
| 218 disable(); | 219 disable(); |
| 219 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false); | 220 m_state->setBoolean(DebuggerAgentState::debuggerEnabled, false); |
| 220 } | 221 } |
| (...skipping 20 matching lines...) Expand all Loading... |
| 241 if (depth <= 0) { | 242 if (depth <= 0) { |
| 242 m_maxAsyncCallStackDepth = 0; | 243 m_maxAsyncCallStackDepth = 0; |
| 243 resetAsyncCallTracker(); | 244 resetAsyncCallTracker(); |
| 244 } else { | 245 } else { |
| 245 m_maxAsyncCallStackDepth = depth; | 246 m_maxAsyncCallStackDepth = depth; |
| 246 } | 247 } |
| 247 for (auto& listener: m_asyncCallTrackingListeners) | 248 for (auto& listener: m_asyncCallTrackingListeners) |
| 248 listener->asyncCallTrackingStateChanged(m_maxAsyncCallStackDepth); | 249 listener->asyncCallTrackingStateChanged(m_maxAsyncCallStackDepth); |
| 249 } | 250 } |
| 250 | 251 |
| 252 void V8DebuggerAgent::clearFrontend() |
| 253 { |
| 254 ErrorString error; |
| 255 disable(&error); |
| 256 ASSERT(m_frontend); |
| 257 m_frontend = nullptr; |
| 258 } |
| 259 |
| 251 void V8DebuggerAgent::restore() | 260 void V8DebuggerAgent::restore() |
| 252 { | 261 { |
| 253 if (enabled()) { | 262 if (enabled()) { |
| 254 frontend()->globalObjectCleared(); | 263 m_frontend->globalObjectCleared(); |
| 255 enable(); | 264 enable(); |
| 256 long pauseState = m_state->getLong(DebuggerAgentState::pauseOnExceptions
State, V8Debugger::DontPauseOnExceptions); | 265 long pauseState = m_state->getLong(DebuggerAgentState::pauseOnExceptions
State, V8Debugger::DontPauseOnExceptions); |
| 257 String error; | 266 String error; |
| 258 setPauseOnExceptionsImpl(&error, pauseState); | 267 setPauseOnExceptionsImpl(&error, pauseState); |
| 259 m_cachedSkipStackRegExp = compileSkipCallFramePattern(m_state->getString
(DebuggerAgentState::skipStackPattern)); | 268 m_cachedSkipStackRegExp = compileSkipCallFramePattern(m_state->getString
(DebuggerAgentState::skipStackPattern)); |
| 260 increaseCachedSkipStackGeneration(); | 269 increaseCachedSkipStackGeneration(); |
| 261 m_skipContentScripts = m_state->getBoolean(DebuggerAgentState::skipConte
ntScripts); | 270 m_skipContentScripts = m_state->getBoolean(DebuggerAgentState::skipConte
ntScripts); |
| 262 m_skipAllPauses = m_state->getBoolean(DebuggerAgentState::skipAllPauses)
; | 271 m_skipAllPauses = m_state->getBoolean(DebuggerAgentState::skipAllPauses)
; |
| 263 internalSetAsyncCallStackDepth(m_state->getLong(DebuggerAgentState::asyn
cCallStackDepth)); | 272 internalSetAsyncCallStackDepth(m_state->getLong(DebuggerAgentState::asyn
cCallStackDepth)); |
| 264 promiseTracker().setEnabled(m_state->getBoolean(DebuggerAgentState::prom
iseTrackerEnabled), m_state->getBoolean(DebuggerAgentState::promiseTrackerCaptur
eStacks)); | 273 promiseTracker().setEnabled(m_state->getBoolean(DebuggerAgentState::prom
iseTrackerEnabled), m_state->getBoolean(DebuggerAgentState::promiseTrackerCaptur
eStacks)); |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 704 ASSERT(enabled()); | 713 ASSERT(enabled()); |
| 705 if (m_scheduledDebuggerStep != StepInto || m_javaScriptPauseScheduled || isP
aused()) | 714 if (m_scheduledDebuggerStep != StepInto || m_javaScriptPauseScheduled || isP
aused()) |
| 706 return; | 715 return; |
| 707 clearBreakDetails(); | 716 clearBreakDetails(); |
| 708 m_pausingOnNativeEvent = false; | 717 m_pausingOnNativeEvent = false; |
| 709 m_skippedStepFrameCount = 0; | 718 m_skippedStepFrameCount = 0; |
| 710 m_recursionLevelForStepFrame = 0; | 719 m_recursionLevelForStepFrame = 0; |
| 711 debugger().setPauseOnNextStatement(true); | 720 debugger().setPauseOnNextStatement(true); |
| 712 } | 721 } |
| 713 | 722 |
| 714 void V8DebuggerAgent::didFireTimer() | |
| 715 { | |
| 716 cancelPauseOnNextStatement(); | |
| 717 } | |
| 718 | |
| 719 void V8DebuggerAgent::didHandleEvent() | |
| 720 { | |
| 721 cancelPauseOnNextStatement(); | |
| 722 } | |
| 723 | |
| 724 void V8DebuggerAgent::cancelPauseOnNextStatement() | 723 void V8DebuggerAgent::cancelPauseOnNextStatement() |
| 725 { | 724 { |
| 726 if (m_javaScriptPauseScheduled || isPaused()) | 725 if (m_javaScriptPauseScheduled || isPaused()) |
| 727 return; | 726 return; |
| 728 clearBreakDetails(); | 727 clearBreakDetails(); |
| 729 m_pausingOnNativeEvent = false; | 728 m_pausingOnNativeEvent = false; |
| 730 debugger().setPauseOnNextStatement(false); | 729 debugger().setPauseOnNextStatement(false); |
| 731 } | 730 } |
| 732 | 731 |
| 733 bool V8DebuggerAgent::v8AsyncTaskEventsEnabled() const | 732 bool V8DebuggerAgent::v8AsyncTaskEventsEnabled() const |
| (...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1108 if (value.isEmpty()) { | 1107 if (value.isEmpty()) { |
| 1109 *errorString = "Promise with specified ID not found."; | 1108 *errorString = "Promise with specified ID not found."; |
| 1110 return; | 1109 return; |
| 1111 } | 1110 } |
| 1112 InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(v
alue.scriptState()); | 1111 InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(v
alue.scriptState()); |
| 1113 promise = injectedScript.wrapObject(value, objectGroup ? *objectGroup : ""); | 1112 promise = injectedScript.wrapObject(value, objectGroup ? *objectGroup : ""); |
| 1114 } | 1113 } |
| 1115 | 1114 |
| 1116 void V8DebuggerAgent::didUpdatePromise(InspectorFrontend::Debugger::EventType::E
num eventType, PassRefPtr<TypeBuilder::Debugger::PromiseDetails> promise) | 1115 void V8DebuggerAgent::didUpdatePromise(InspectorFrontend::Debugger::EventType::E
num eventType, PassRefPtr<TypeBuilder::Debugger::PromiseDetails> promise) |
| 1117 { | 1116 { |
| 1118 if (frontend()) | 1117 if (m_frontend) |
| 1119 frontend()->promiseUpdated(eventType, promise); | 1118 m_frontend->promiseUpdated(eventType, promise); |
| 1120 } | 1119 } |
| 1121 | 1120 |
| 1122 int V8DebuggerAgent::traceAsyncOperationStarting(const String& description) | 1121 int V8DebuggerAgent::traceAsyncOperationStarting(const String& description) |
| 1123 { | 1122 { |
| 1124 v8::HandleScope scope(m_isolate); | 1123 v8::HandleScope scope(m_isolate); |
| 1125 v8::Local<v8::Object> callFrames = debugger().currentCallFramesForAsyncStack
(); | 1124 v8::Local<v8::Object> callFrames = debugger().currentCallFramesForAsyncStack
(); |
| 1126 RefPtrWillBeRawPtr<AsyncCallChain> chain = nullptr; | 1125 RefPtrWillBeRawPtr<AsyncCallChain> chain = nullptr; |
| 1127 if (callFrames.IsEmpty()) { | 1126 if (callFrames.IsEmpty()) { |
| 1128 if (m_currentAsyncCallChain) | 1127 if (m_currentAsyncCallChain) |
| 1129 chain = AsyncCallChain::create(nullptr, m_currentAsyncCallChain.get(
), m_maxAsyncCallStackDepth); | 1128 chain = AsyncCallChain::create(nullptr, m_currentAsyncCallChain.get(
), m_maxAsyncCallStackDepth); |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1231 } | 1230 } |
| 1232 m_asyncOperations.remove(operationId); | 1231 m_asyncOperations.remove(operationId); |
| 1233 m_asyncOperationBreakpoints.remove(operationId); | 1232 m_asyncOperationBreakpoints.remove(operationId); |
| 1234 m_pausingAsyncOperations.remove(operationId); | 1233 m_pausingAsyncOperations.remove(operationId); |
| 1235 shouldNotify = !m_asyncOperationNotifications.take(operationId); | 1234 shouldNotify = !m_asyncOperationNotifications.take(operationId); |
| 1236 } | 1235 } |
| 1237 if (m_startingStepIntoAsync) { | 1236 if (m_startingStepIntoAsync) { |
| 1238 if (!m_pausingOnAsyncOperation && m_pausingAsyncOperations.isEmpty()) | 1237 if (!m_pausingOnAsyncOperation && m_pausingAsyncOperations.isEmpty()) |
| 1239 clearStepIntoAsync(); | 1238 clearStepIntoAsync(); |
| 1240 } | 1239 } |
| 1241 if (frontend() && shouldNotify) | 1240 if (m_frontend && shouldNotify) |
| 1242 frontend()->asyncOperationCompleted(operationId); | 1241 m_frontend->asyncOperationCompleted(operationId); |
| 1243 } | 1242 } |
| 1244 | 1243 |
| 1245 void V8DebuggerAgent::flushAsyncOperationEvents(ErrorString*) | 1244 void V8DebuggerAgent::flushAsyncOperationEvents(ErrorString*) |
| 1246 { | 1245 { |
| 1247 if (!frontend()) | 1246 if (!m_frontend) |
| 1248 return; | 1247 return; |
| 1249 | 1248 |
| 1250 for (int operationId : m_asyncOperationNotifications) { | 1249 for (int operationId : m_asyncOperationNotifications) { |
| 1251 RefPtrWillBeRawPtr<AsyncCallChain> chain = m_asyncOperations.get(operati
onId); | 1250 RefPtrWillBeRawPtr<AsyncCallChain> chain = m_asyncOperations.get(operati
onId); |
| 1252 ASSERT(chain); | 1251 ASSERT(chain); |
| 1253 const AsyncCallStackVector& callStacks = chain->callStacks(); | 1252 const AsyncCallStackVector& callStacks = chain->callStacks(); |
| 1254 ASSERT(!callStacks.isEmpty()); | 1253 ASSERT(!callStacks.isEmpty()); |
| 1255 | 1254 |
| 1256 RefPtr<AsyncOperation> operation; | 1255 RefPtr<AsyncOperation> operation; |
| 1257 RefPtr<AsyncStackTrace> lastAsyncStackTrace; | 1256 RefPtr<AsyncStackTrace> lastAsyncStackTrace; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1272 .setCallFrames(scriptCallStack->buildInspectorArray()); | 1271 .setCallFrames(scriptCallStack->buildInspectorArray()); |
| 1273 asyncStackTrace->setDescription(callStack->description()); | 1272 asyncStackTrace->setDescription(callStack->description()); |
| 1274 if (lastAsyncStackTrace) | 1273 if (lastAsyncStackTrace) |
| 1275 lastAsyncStackTrace->setAsyncStackTrace(asyncStackTrace); | 1274 lastAsyncStackTrace->setAsyncStackTrace(asyncStackTrace); |
| 1276 else | 1275 else |
| 1277 operation->setAsyncStackTrace(asyncStackTrace); | 1276 operation->setAsyncStackTrace(asyncStackTrace); |
| 1278 lastAsyncStackTrace = asyncStackTrace.release(); | 1277 lastAsyncStackTrace = asyncStackTrace.release(); |
| 1279 } | 1278 } |
| 1280 | 1279 |
| 1281 if (operation) | 1280 if (operation) |
| 1282 frontend()->asyncOperationStarted(operation.release()); | 1281 m_frontend->asyncOperationStarted(operation.release()); |
| 1283 } | 1282 } |
| 1284 | 1283 |
| 1285 m_asyncOperationNotifications.clear(); | 1284 m_asyncOperationNotifications.clear(); |
| 1286 } | 1285 } |
| 1287 | 1286 |
| 1288 void V8DebuggerAgent::clearCurrentAsyncOperation() | 1287 void V8DebuggerAgent::clearCurrentAsyncOperation() |
| 1289 { | 1288 { |
| 1290 if (m_pendingTraceAsyncOperationCompleted && m_currentAsyncOperationId != un
knownAsyncOperationId) | 1289 if (m_pendingTraceAsyncOperationCompleted && m_currentAsyncOperationId != un
knownAsyncOperationId) |
| 1291 traceAsyncOperationCompleted(m_currentAsyncOperationId); | 1290 traceAsyncOperationCompleted(m_currentAsyncOperationId); |
| 1292 | 1291 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1330 *errorString = "Can only perform operation while tracking async call sta
cks."; | 1329 *errorString = "Can only perform operation while tracking async call sta
cks."; |
| 1331 return; | 1330 return; |
| 1332 } | 1331 } |
| 1333 if (operationId <= 0) { | 1332 if (operationId <= 0) { |
| 1334 *errorString = "Wrong async operation id."; | 1333 *errorString = "Wrong async operation id."; |
| 1335 return; | 1334 return; |
| 1336 } | 1335 } |
| 1337 m_asyncOperationBreakpoints.remove(operationId); | 1336 m_asyncOperationBreakpoints.remove(operationId); |
| 1338 } | 1337 } |
| 1339 | 1338 |
| 1340 void V8DebuggerAgent::scriptExecutionBlockedByCSP(const String& directiveText) | |
| 1341 { | |
| 1342 if (debugger().pauseOnExceptionsState() != V8Debugger::DontPauseOnExceptions
) { | |
| 1343 RefPtr<JSONObject> directive = JSONObject::create(); | |
| 1344 directive->setString("directiveText", directiveText); | |
| 1345 breakProgram(InspectorFrontend::Debugger::Reason::CSPViolation, directiv
e.release()); | |
| 1346 } | |
| 1347 } | |
| 1348 | |
| 1349 void V8DebuggerAgent::addAsyncCallTrackingListener(AsyncCallTrackingListener* li
stener) | 1339 void V8DebuggerAgent::addAsyncCallTrackingListener(AsyncCallTrackingListener* li
stener) |
| 1350 { | 1340 { |
| 1351 m_asyncCallTrackingListeners.add(listener); | 1341 m_asyncCallTrackingListeners.add(listener); |
| 1352 } | 1342 } |
| 1353 | 1343 |
| 1354 void V8DebuggerAgent::removeAsyncCallTrackingListener(AsyncCallTrackingListener*
listener) | 1344 void V8DebuggerAgent::removeAsyncCallTrackingListener(AsyncCallTrackingListener*
listener) |
| 1355 { | 1345 { |
| 1356 ASSERT(m_asyncCallTrackingListeners.contains(listener)); | 1346 ASSERT(m_asyncCallTrackingListeners.contains(listener)); |
| 1357 m_asyncCallTrackingListeners.remove(listener); | 1347 m_asyncCallTrackingListeners.remove(listener); |
| 1358 } | 1348 } |
| 1359 | 1349 |
| 1360 void V8DebuggerAgent::willCallFunction(ExecutionContext*, const DevToolsFunction
Info& info) | 1350 void V8DebuggerAgent::willCallFunction(int scriptId) |
| 1361 { | 1351 { |
| 1362 changeJavaScriptRecursionLevel(+1); | 1352 changeJavaScriptRecursionLevel(+1); |
| 1363 // Fast return. | 1353 // Fast return. |
| 1364 if (m_scheduledDebuggerStep != StepInto) | 1354 if (m_scheduledDebuggerStep != StepInto) |
| 1365 return; | 1355 return; |
| 1366 // Skip unknown scripts (e.g. InjectedScript). | 1356 // Skip unknown scripts (e.g. InjectedScript). |
| 1367 if (!m_scripts.contains(String::number(info.scriptId()))) | 1357 if (!m_scripts.contains(String::number(scriptId))) |
| 1368 return; | 1358 return; |
| 1369 schedulePauseOnNextStatementIfSteppingInto(); | 1359 schedulePauseOnNextStatementIfSteppingInto(); |
| 1370 } | 1360 } |
| 1371 | 1361 |
| 1372 void V8DebuggerAgent::didCallFunction() | 1362 void V8DebuggerAgent::didCallFunction() |
| 1373 { | 1363 { |
| 1374 changeJavaScriptRecursionLevel(-1); | 1364 changeJavaScriptRecursionLevel(-1); |
| 1375 } | 1365 } |
| 1376 | 1366 |
| 1377 void V8DebuggerAgent::willEvaluateScript(const String&, int) | 1367 void V8DebuggerAgent::willEvaluateScript() |
| 1378 { | 1368 { |
| 1379 changeJavaScriptRecursionLevel(+1); | 1369 changeJavaScriptRecursionLevel(+1); |
| 1380 schedulePauseOnNextStatementIfSteppingInto(); | 1370 schedulePauseOnNextStatementIfSteppingInto(); |
| 1381 } | 1371 } |
| 1382 | 1372 |
| 1383 void V8DebuggerAgent::didEvaluateScript() | 1373 void V8DebuggerAgent::didEvaluateScript() |
| 1384 { | 1374 { |
| 1385 changeJavaScriptRecursionLevel(-1); | 1375 changeJavaScriptRecursionLevel(-1); |
| 1386 } | 1376 } |
| 1387 | 1377 |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1516 bool isInternalScript = script.isInternalScript(); | 1506 bool isInternalScript = script.isInternalScript(); |
| 1517 bool hasSourceURL = script.hasSourceURL(); | 1507 bool hasSourceURL = script.hasSourceURL(); |
| 1518 String scriptURL = script.sourceURL(); | 1508 String scriptURL = script.sourceURL(); |
| 1519 String sourceMapURL = sourceMapURLForScript(script, parsedScript.compileResu
lt); | 1509 String sourceMapURL = sourceMapURLForScript(script, parsedScript.compileResu
lt); |
| 1520 | 1510 |
| 1521 const String* sourceMapURLParam = sourceMapURL.isNull() ? nullptr : &sourceM
apURL; | 1511 const String* sourceMapURLParam = sourceMapURL.isNull() ? nullptr : &sourceM
apURL; |
| 1522 const bool* isContentScriptParam = isContentScript ? &isContentScript : null
ptr; | 1512 const bool* isContentScriptParam = isContentScript ? &isContentScript : null
ptr; |
| 1523 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n
ullptr; | 1513 const bool* isInternalScriptParam = isInternalScript ? &isInternalScript : n
ullptr; |
| 1524 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; | 1514 const bool* hasSourceURLParam = hasSourceURL ? &hasSourceURL : nullptr; |
| 1525 if (!hasSyntaxError) | 1515 if (!hasSyntaxError) |
| 1526 frontend()->scriptParsed(parsedScript.scriptId, scriptURL, script.startL
ine(), script.startColumn(), script.endLine(), script.endColumn(), isContentScri
ptParam, isInternalScriptParam, sourceMapURLParam, hasSourceURLParam); | 1516 m_frontend->scriptParsed(parsedScript.scriptId, scriptURL, script.startL
ine(), script.startColumn(), script.endLine(), script.endColumn(), isContentScri
ptParam, isInternalScriptParam, sourceMapURLParam, hasSourceURLParam); |
| 1527 else | 1517 else |
| 1528 frontend()->scriptFailedToParse(parsedScript.scriptId, scriptURL, script
.startLine(), script.startColumn(), script.endLine(), script.endColumn(), isCont
entScriptParam, isInternalScriptParam, sourceMapURLParam, hasSourceURLParam); | 1518 m_frontend->scriptFailedToParse(parsedScript.scriptId, scriptURL, script
.startLine(), script.startColumn(), script.endLine(), script.endColumn(), isCont
entScriptParam, isInternalScriptParam, sourceMapURLParam, hasSourceURLParam); |
| 1529 | 1519 |
| 1530 m_scripts.set(parsedScript.scriptId, script); | 1520 m_scripts.set(parsedScript.scriptId, script); |
| 1531 | 1521 |
| 1532 if (scriptURL.isEmpty() || hasSyntaxError) | 1522 if (scriptURL.isEmpty() || hasSyntaxError) |
| 1533 return; | 1523 return; |
| 1534 | 1524 |
| 1535 RefPtr<JSONObject> breakpointsCookie = m_state->getObject(DebuggerAgentState
::javaScriptBreakpoints); | 1525 RefPtr<JSONObject> breakpointsCookie = m_state->getObject(DebuggerAgentState
::javaScriptBreakpoints); |
| 1536 for (auto& cookie : *breakpointsCookie) { | 1526 for (auto& cookie : *breakpointsCookie) { |
| 1537 RefPtr<JSONObject> breakpointObject = cookie.value->asObject(); | 1527 RefPtr<JSONObject> breakpointObject = cookie.value->asObject(); |
| 1538 bool isRegex; | 1528 bool isRegex; |
| 1539 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); | 1529 breakpointObject->getBoolean(DebuggerAgentState::isRegex, &isRegex); |
| 1540 String url; | 1530 String url; |
| 1541 breakpointObject->getString(DebuggerAgentState::url, &url); | 1531 breakpointObject->getString(DebuggerAgentState::url, &url); |
| 1542 if (!matches(scriptURL, url, isRegex)) | 1532 if (!matches(scriptURL, url, isRegex)) |
| 1543 continue; | 1533 continue; |
| 1544 ScriptBreakpoint breakpoint; | 1534 ScriptBreakpoint breakpoint; |
| 1545 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint.
lineNumber); | 1535 breakpointObject->getNumber(DebuggerAgentState::lineNumber, &breakpoint.
lineNumber); |
| 1546 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin
t.columnNumber); | 1536 breakpointObject->getNumber(DebuggerAgentState::columnNumber, &breakpoin
t.columnNumber); |
| 1547 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c
ondition); | 1537 breakpointObject->getString(DebuggerAgentState::condition, &breakpoint.c
ondition); |
| 1548 RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(coo
kie.key, parsedScript.scriptId, breakpoint, UserBreakpointSource); | 1538 RefPtr<TypeBuilder::Debugger::Location> location = resolveBreakpoint(coo
kie.key, parsedScript.scriptId, breakpoint, UserBreakpointSource); |
| 1549 if (location) | 1539 if (location) |
| 1550 frontend()->breakpointResolved(cookie.key, location); | 1540 m_frontend->breakpointResolved(cookie.key, location); |
| 1551 } | 1541 } |
| 1552 } | 1542 } |
| 1553 | 1543 |
| 1554 V8DebuggerListener::SkipPauseRequest V8DebuggerAgent::didPause(v8::Local<v8::Con
text> context, v8::Local<v8::Object> callFrames, v8::Local<v8::Value> v8exceptio
n, const Vector<String>& hitBreakpoints, bool isPromiseRejection) | 1544 V8DebuggerListener::SkipPauseRequest V8DebuggerAgent::didPause(v8::Local<v8::Con
text> context, v8::Local<v8::Object> callFrames, v8::Local<v8::Value> v8exceptio
n, const Vector<String>& hitBreakpoints, bool isPromiseRejection) |
| 1555 { | 1545 { |
| 1556 ScriptState* scriptState = ScriptState::from(context); | 1546 ScriptState* scriptState = ScriptState::from(context); |
| 1557 ScriptValue exception(scriptState, v8exception); | 1547 ScriptValue exception(scriptState, v8exception); |
| 1558 | 1548 |
| 1559 V8DebuggerListener::SkipPauseRequest result; | 1549 V8DebuggerListener::SkipPauseRequest result; |
| 1560 if (m_skipAllPauses) | 1550 if (m_skipAllPauses) |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1604 | 1594 |
| 1605 BreakpointSource source = breakpointIterator->value.second; | 1595 BreakpointSource source = breakpointIterator->value.second; |
| 1606 if (m_breakReason == InspectorFrontend::Debugger::Reason::Other && s
ource == DebugCommandBreakpointSource) | 1596 if (m_breakReason == InspectorFrontend::Debugger::Reason::Other && s
ource == DebugCommandBreakpointSource) |
| 1607 m_breakReason = InspectorFrontend::Debugger::Reason::DebugComman
d; | 1597 m_breakReason = InspectorFrontend::Debugger::Reason::DebugComman
d; |
| 1608 } | 1598 } |
| 1609 } | 1599 } |
| 1610 | 1600 |
| 1611 if (!m_asyncOperationNotifications.isEmpty()) | 1601 if (!m_asyncOperationNotifications.isEmpty()) |
| 1612 flushAsyncOperationEvents(nullptr); | 1602 flushAsyncOperationEvents(nullptr); |
| 1613 | 1603 |
| 1614 frontend()->paused(currentCallFrames(), m_breakReason, m_breakAuxData, hitBr
eakpointIds, currentAsyncStackTrace()); | 1604 m_frontend->paused(currentCallFrames(), m_breakReason, m_breakAuxData, hitBr
eakpointIds, currentAsyncStackTrace()); |
| 1615 m_scheduledDebuggerStep = NoStep; | 1605 m_scheduledDebuggerStep = NoStep; |
| 1616 m_javaScriptPauseScheduled = false; | 1606 m_javaScriptPauseScheduled = false; |
| 1617 m_steppingFromFramework = false; | 1607 m_steppingFromFramework = false; |
| 1618 m_pausingOnNativeEvent = false; | 1608 m_pausingOnNativeEvent = false; |
| 1619 m_skippedStepFrameCount = 0; | 1609 m_skippedStepFrameCount = 0; |
| 1620 m_recursionLevelForStepFrame = 0; | 1610 m_recursionLevelForStepFrame = 0; |
| 1621 clearStepIntoAsync(); | 1611 clearStepIntoAsync(); |
| 1622 | 1612 |
| 1623 if (!m_continueToLocationBreakpointId.isEmpty()) { | 1613 if (!m_continueToLocationBreakpointId.isEmpty()) { |
| 1624 debugger().removeBreakpoint(m_continueToLocationBreakpointId); | 1614 debugger().removeBreakpoint(m_continueToLocationBreakpointId); |
| 1625 m_continueToLocationBreakpointId = ""; | 1615 m_continueToLocationBreakpointId = ""; |
| 1626 } | 1616 } |
| 1627 return result; | 1617 return result; |
| 1628 } | 1618 } |
| 1629 | 1619 |
| 1630 void V8DebuggerAgent::didContinue() | 1620 void V8DebuggerAgent::didContinue() |
| 1631 { | 1621 { |
| 1632 m_pausedScriptState = nullptr; | 1622 m_pausedScriptState = nullptr; |
| 1633 m_currentCallStack.Reset(); | 1623 m_currentCallStack.Reset(); |
| 1634 clearBreakDetails(); | 1624 clearBreakDetails(); |
| 1635 frontend()->resumed(); | 1625 m_frontend->resumed(); |
| 1636 } | 1626 } |
| 1637 | 1627 |
| 1638 bool V8DebuggerAgent::canBreakProgram() | 1628 bool V8DebuggerAgent::canBreakProgram() |
| 1639 { | 1629 { |
| 1640 return debugger().canBreakProgram(); | 1630 return debugger().canBreakProgram(); |
| 1641 } | 1631 } |
| 1642 | 1632 |
| 1643 void V8DebuggerAgent::breakProgram(InspectorFrontend::Debugger::Reason::Enum bre
akReason, PassRefPtr<JSONObject> data) | 1633 void V8DebuggerAgent::breakProgram(InspectorFrontend::Debugger::Reason::Enum bre
akReason, PassRefPtr<JSONObject> data) |
| 1644 { | 1634 { |
| 1645 ASSERT(enabled()); | 1635 ASSERT(enabled()); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1710 removeBreakpoint(generateBreakpointId(scriptId, lineNumber, columnNumber, so
urce)); | 1700 removeBreakpoint(generateBreakpointId(scriptId, lineNumber, columnNumber, so
urce)); |
| 1711 } | 1701 } |
| 1712 | 1702 |
| 1713 void V8DebuggerAgent::reset() | 1703 void V8DebuggerAgent::reset() |
| 1714 { | 1704 { |
| 1715 m_scheduledDebuggerStep = NoStep; | 1705 m_scheduledDebuggerStep = NoStep; |
| 1716 m_scripts.clear(); | 1706 m_scripts.clear(); |
| 1717 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1707 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 1718 resetAsyncCallTracker(); | 1708 resetAsyncCallTracker(); |
| 1719 promiseTracker().clear(); | 1709 promiseTracker().clear(); |
| 1720 if (frontend()) | 1710 if (m_frontend) |
| 1721 frontend()->globalObjectCleared(); | 1711 m_frontend->globalObjectCleared(); |
| 1722 } | 1712 } |
| 1723 | 1713 |
| 1724 void V8DebuggerAgent::resetModifiedSources() | 1714 void V8DebuggerAgent::resetModifiedSources() |
| 1725 { | 1715 { |
| 1726 m_editedScripts.clear(); | 1716 m_editedScripts.clear(); |
| 1727 } | 1717 } |
| 1728 | 1718 |
| 1729 DEFINE_TRACE(V8DebuggerAgent) | |
| 1730 { | |
| 1731 #if ENABLE(OILPAN) | |
| 1732 visitor->trace(m_injectedScriptManager); | |
| 1733 visitor->trace(m_v8AsyncCallTracker); | |
| 1734 visitor->trace(m_promiseTracker); | |
| 1735 visitor->trace(m_asyncOperations); | |
| 1736 visitor->trace(m_currentAsyncCallChain); | |
| 1737 visitor->trace(m_asyncCallTrackingListeners); | |
| 1738 #endif | |
| 1739 InspectorBaseAgent::trace(visitor); | |
| 1740 } | |
| 1741 | |
| 1742 PassRefPtr<TypeBuilder::Debugger::ExceptionDetails> V8DebuggerAgent::createExcep
tionDetails(v8::Isolate* isolate, v8::Local<v8::Message> message) | 1719 PassRefPtr<TypeBuilder::Debugger::ExceptionDetails> V8DebuggerAgent::createExcep
tionDetails(v8::Isolate* isolate, v8::Local<v8::Message> message) |
| 1743 { | 1720 { |
| 1744 RefPtr<ExceptionDetails> exceptionDetails = ExceptionDetails::create().setTe
xt(toCoreStringWithUndefinedOrNullCheck(message->Get())); | 1721 RefPtr<ExceptionDetails> exceptionDetails = ExceptionDetails::create().setTe
xt(toCoreStringWithUndefinedOrNullCheck(message->Get())); |
| 1745 exceptionDetails->setLine(message->GetLineNumber()); | 1722 exceptionDetails->setLine(message->GetLineNumber()); |
| 1746 exceptionDetails->setColumn(message->GetStartColumn()); | 1723 exceptionDetails->setColumn(message->GetStartColumn()); |
| 1747 v8::Local<v8::StackTrace> messageStackTrace = message->GetStackTrace(); | 1724 v8::Local<v8::StackTrace> messageStackTrace = message->GetStackTrace(); |
| 1748 if (!messageStackTrace.IsEmpty() && messageStackTrace->GetFrameCount() > 0) | 1725 if (!messageStackTrace.IsEmpty() && messageStackTrace->GetFrameCount() > 0) |
| 1749 exceptionDetails->setStackTrace(createScriptCallStack(isolate, messageSt
ackTrace, messageStackTrace->GetFrameCount())->buildInspectorArray()); | 1726 exceptionDetails->setStackTrace(createScriptCallStack(isolate, messageSt
ackTrace, messageStackTrace->GetFrameCount())->buildInspectorArray()); |
| 1750 return exceptionDetails.release(); | 1727 return exceptionDetails.release(); |
| 1751 } | 1728 } |
| 1752 | 1729 |
| 1753 } // namespace blink | 1730 } // namespace blink |
| OLD | NEW |