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 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 return; | 578 return; |
579 if (!debugger().setScriptSource(scriptId, newContent, asBool(preview), error
, errorData, &m_currentCallStack, stackChanged)) | 579 if (!debugger().setScriptSource(scriptId, newContent, asBool(preview), error
, errorData, &m_currentCallStack, stackChanged)) |
580 return; | 580 return; |
581 | 581 |
582 newCallFrames = currentCallFrames(); | 582 newCallFrames = currentCallFrames(); |
583 asyncStackTrace = currentAsyncStackTrace(); | 583 asyncStackTrace = currentAsyncStackTrace(); |
584 | 584 |
585 ScriptsMap::iterator it = m_scripts.find(scriptId); | 585 ScriptsMap::iterator it = m_scripts.find(scriptId); |
586 if (it == m_scripts.end()) | 586 if (it == m_scripts.end()) |
587 return; | 587 return; |
588 String url = it->value.url(); | 588 it->value.setSource(newContent); |
589 if (url.isEmpty()) | |
590 return; | |
591 m_editedScripts.set(url, newContent); | |
592 } | 589 } |
593 | 590 |
594 void V8DebuggerAgent::restartFrame(ErrorString* errorString, const String& callF
rameId, RefPtr<Array<CallFrame>>& newCallFrames, RefPtr<StackTrace>& asyncStackT
race) | 591 void V8DebuggerAgent::restartFrame(ErrorString* errorString, const String& callF
rameId, RefPtr<Array<CallFrame>>& newCallFrames, RefPtr<StackTrace>& asyncStackT
race) |
595 { | 592 { |
596 if (!isPaused() || m_currentCallStack.IsEmpty()) { | 593 if (!isPaused() || m_currentCallStack.IsEmpty()) { |
597 *errorString = "Attempt to access callframe when debugger is not on paus
e"; | 594 *errorString = "Attempt to access callframe when debugger is not on paus
e"; |
598 return; | 595 return; |
599 } | 596 } |
600 OwnPtr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(callFrameId); | 597 OwnPtr<RemoteCallFrameId> remoteId = RemoteCallFrameId::parse(callFrameId); |
601 if (!remoteId) { | 598 if (!remoteId) { |
(...skipping 16 matching lines...) Expand all Loading... |
618 | 615 |
619 void V8DebuggerAgent::getScriptSource(ErrorString* error, const String& scriptId
, String* scriptSource) | 616 void V8DebuggerAgent::getScriptSource(ErrorString* error, const String& scriptId
, String* scriptSource) |
620 { | 617 { |
621 if (!checkEnabled(error)) | 618 if (!checkEnabled(error)) |
622 return; | 619 return; |
623 ScriptsMap::iterator it = m_scripts.find(scriptId); | 620 ScriptsMap::iterator it = m_scripts.find(scriptId); |
624 if (it == m_scripts.end()) { | 621 if (it == m_scripts.end()) { |
625 *error = "No script for id: " + scriptId; | 622 *error = "No script for id: " + scriptId; |
626 return; | 623 return; |
627 } | 624 } |
628 | |
629 String url = it->value.url(); | |
630 if (!url.isEmpty() && getEditedScript(url, scriptSource)) | |
631 return; | |
632 *scriptSource = it->value.source(); | 625 *scriptSource = it->value.source(); |
633 } | 626 } |
634 | 627 |
635 void V8DebuggerAgent::getFunctionDetails(ErrorString* errorString, const String&
functionId, RefPtr<FunctionDetails>& details) | 628 void V8DebuggerAgent::getFunctionDetails(ErrorString* errorString, const String&
functionId, RefPtr<FunctionDetails>& details) |
636 { | 629 { |
637 if (!checkEnabled(errorString)) | 630 if (!checkEnabled(errorString)) |
638 return; | 631 return; |
639 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(functionId); | 632 OwnPtr<RemoteObjectId> remoteId = RemoteObjectId::parse(functionId); |
640 if (!remoteId) { | 633 if (!remoteId) { |
641 *errorString = "Invalid object id"; | 634 *errorString = "Invalid object id"; |
(...skipping 773 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1415 // from the old StepFrame. | 1408 // from the old StepFrame. |
1416 m_skippedStepFrameCount = 0; | 1409 m_skippedStepFrameCount = 0; |
1417 if (m_scheduledDebuggerStep == NoStep) | 1410 if (m_scheduledDebuggerStep == NoStep) |
1418 debugger().clearStepping(); | 1411 debugger().clearStepping(); |
1419 else if (m_scheduledDebuggerStep == StepOut) | 1412 else if (m_scheduledDebuggerStep == StepOut) |
1420 m_skipNextDebuggerStepOut = true; | 1413 m_skipNextDebuggerStepOut = true; |
1421 } | 1414 } |
1422 } | 1415 } |
1423 } | 1416 } |
1424 | 1417 |
1425 bool V8DebuggerAgent::getEditedScript(const String& url, String* content) | |
1426 { | |
1427 if (!m_editedScripts.contains(url)) | |
1428 return false; | |
1429 *content = m_editedScripts.get(url); | |
1430 return true; | |
1431 } | |
1432 | |
1433 PassRefPtr<Array<CallFrame>> V8DebuggerAgent::currentCallFrames() | 1418 PassRefPtr<Array<CallFrame>> V8DebuggerAgent::currentCallFrames() |
1434 { | 1419 { |
1435 if (!m_pausedScriptState || m_currentCallStack.IsEmpty()) | 1420 if (!m_pausedScriptState || m_currentCallStack.IsEmpty()) |
1436 return Array<CallFrame>::create(); | 1421 return Array<CallFrame>::create(); |
1437 InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(m
_pausedScriptState.get()); | 1422 InjectedScript injectedScript = m_injectedScriptManager->injectedScriptFor(m
_pausedScriptState.get()); |
1438 if (injectedScript.isEmpty()) { | 1423 if (injectedScript.isEmpty()) { |
1439 ASSERT_NOT_REACHED(); | 1424 ASSERT_NOT_REACHED(); |
1440 return Array<CallFrame>::create(); | 1425 return Array<CallFrame>::create(); |
1441 } | 1426 } |
1442 | 1427 |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1718 { | 1703 { |
1719 m_scheduledDebuggerStep = NoStep; | 1704 m_scheduledDebuggerStep = NoStep; |
1720 m_scripts.clear(); | 1705 m_scripts.clear(); |
1721 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1706 m_breakpointIdToDebuggerBreakpointIds.clear(); |
1722 resetAsyncCallTracker(); | 1707 resetAsyncCallTracker(); |
1723 promiseTracker().clear(); | 1708 promiseTracker().clear(); |
1724 if (frontend()) | 1709 if (frontend()) |
1725 frontend()->globalObjectCleared(); | 1710 frontend()->globalObjectCleared(); |
1726 } | 1711 } |
1727 | 1712 |
1728 void V8DebuggerAgent::resetModifiedSources() | |
1729 { | |
1730 m_editedScripts.clear(); | |
1731 } | |
1732 | |
1733 DEFINE_TRACE(V8DebuggerAgent) | 1713 DEFINE_TRACE(V8DebuggerAgent) |
1734 { | 1714 { |
1735 #if ENABLE(OILPAN) | 1715 #if ENABLE(OILPAN) |
1736 visitor->trace(m_injectedScriptManager); | 1716 visitor->trace(m_injectedScriptManager); |
1737 visitor->trace(m_v8AsyncCallTracker); | 1717 visitor->trace(m_v8AsyncCallTracker); |
1738 visitor->trace(m_promiseTracker); | 1718 visitor->trace(m_promiseTracker); |
1739 visitor->trace(m_asyncOperations); | 1719 visitor->trace(m_asyncOperations); |
1740 visitor->trace(m_currentAsyncCallChain); | 1720 visitor->trace(m_currentAsyncCallChain); |
1741 visitor->trace(m_asyncCallTrackingListeners); | 1721 visitor->trace(m_asyncCallTrackingListeners); |
1742 #endif | 1722 #endif |
1743 InspectorBaseAgent::trace(visitor); | 1723 InspectorBaseAgent::trace(visitor); |
1744 } | 1724 } |
1745 | 1725 |
1746 PassRefPtr<TypeBuilder::Debugger::ExceptionDetails> V8DebuggerAgent::createExcep
tionDetails(v8::Isolate* isolate, v8::Local<v8::Message> message) | 1726 PassRefPtr<TypeBuilder::Debugger::ExceptionDetails> V8DebuggerAgent::createExcep
tionDetails(v8::Isolate* isolate, v8::Local<v8::Message> message) |
1747 { | 1727 { |
1748 RefPtr<ExceptionDetails> exceptionDetails = ExceptionDetails::create().setTe
xt(toCoreStringWithUndefinedOrNullCheck(message->Get())); | 1728 RefPtr<ExceptionDetails> exceptionDetails = ExceptionDetails::create().setTe
xt(toCoreStringWithUndefinedOrNullCheck(message->Get())); |
1749 exceptionDetails->setLine(message->GetLineNumber()); | 1729 exceptionDetails->setLine(message->GetLineNumber()); |
1750 exceptionDetails->setColumn(message->GetStartColumn()); | 1730 exceptionDetails->setColumn(message->GetStartColumn()); |
1751 v8::Local<v8::StackTrace> messageStackTrace = message->GetStackTrace(); | 1731 v8::Local<v8::StackTrace> messageStackTrace = message->GetStackTrace(); |
1752 if (!messageStackTrace.IsEmpty() && messageStackTrace->GetFrameCount() > 0) | 1732 if (!messageStackTrace.IsEmpty() && messageStackTrace->GetFrameCount() > 0) |
1753 exceptionDetails->setStackTrace(createScriptCallStack(isolate, messageSt
ackTrace, messageStackTrace->GetFrameCount())->buildInspectorArray()); | 1733 exceptionDetails->setStackTrace(createScriptCallStack(isolate, messageSt
ackTrace, messageStackTrace->GetFrameCount())->buildInspectorArray()); |
1754 return exceptionDetails.release(); | 1734 return exceptionDetails.release(); |
1755 } | 1735 } |
1756 | 1736 |
1757 } // namespace blink | 1737 } // namespace blink |
OLD | NEW |