| 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/IgnoreExceptionsScope.h" | |
| 10 #include "platform/v8_inspector/InjectedScript.h" | 9 #include "platform/v8_inspector/InjectedScript.h" |
| 11 #include "platform/v8_inspector/InspectedContext.h" | 10 #include "platform/v8_inspector/InspectedContext.h" |
| 12 #include "platform/v8_inspector/JavaScriptCallFrame.h" | 11 #include "platform/v8_inspector/JavaScriptCallFrame.h" |
| 13 #include "platform/v8_inspector/MuteConsoleScope.h" | |
| 14 #include "platform/v8_inspector/RemoteObjectId.h" | 12 #include "platform/v8_inspector/RemoteObjectId.h" |
| 15 #include "platform/v8_inspector/ScriptBreakpoint.h" | 13 #include "platform/v8_inspector/ScriptBreakpoint.h" |
| 16 #include "platform/v8_inspector/V8InspectorSessionImpl.h" | 14 #include "platform/v8_inspector/V8InspectorSessionImpl.h" |
| 17 #include "platform/v8_inspector/V8Regex.h" | 15 #include "platform/v8_inspector/V8Regex.h" |
| 18 #include "platform/v8_inspector/V8RuntimeAgentImpl.h" | 16 #include "platform/v8_inspector/V8RuntimeAgentImpl.h" |
| 19 #include "platform/v8_inspector/V8StackTraceImpl.h" | 17 #include "platform/v8_inspector/V8StackTraceImpl.h" |
| 20 #include "platform/v8_inspector/V8StringUtil.h" | 18 #include "platform/v8_inspector/V8StringUtil.h" |
| 21 #include "platform/v8_inspector/public/V8ContentSearchUtil.h" | 19 #include "platform/v8_inspector/public/V8ContentSearchUtil.h" |
| 22 #include "platform/v8_inspector/public/V8Debugger.h" | 20 #include "platform/v8_inspector/public/V8Debugger.h" |
| 23 #include "platform/v8_inspector/public/V8DebuggerClient.h" | 21 #include "platform/v8_inspector/public/V8DebuggerClient.h" |
| (...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 670 if (!scope.object()->IsFunction()) { | 668 if (!scope.object()->IsFunction()) { |
| 671 *errorString = "Value with given id is not a function"; | 669 *errorString = "Value with given id is not a function"; |
| 672 return; | 670 return; |
| 673 } | 671 } |
| 674 v8::Local<v8::Function> function = scope.object().As<v8::Function>(); | 672 v8::Local<v8::Function> function = scope.object().As<v8::Function>(); |
| 675 | 673 |
| 676 v8::Local<v8::Value> scopesValue; | 674 v8::Local<v8::Value> scopesValue; |
| 677 v8::Local<v8::Array> scopes; | 675 v8::Local<v8::Array> scopes; |
| 678 if (m_debugger->functionScopes(function).ToLocal(&scopesValue) && scopesValu
e->IsArray()) { | 676 if (m_debugger->functionScopes(function).ToLocal(&scopesValue) && scopesValu
e->IsArray()) { |
| 679 scopes = scopesValue.As<v8::Array>(); | 677 scopes = scopesValue.As<v8::Array>(); |
| 680 if (!scope.injectedScript()->wrapPropertyInArray(errorString, scopes, to
V8StringInternalized(m_debugger->isolate(), "object"), scope.objectGroupName())) | 678 if (!scope.injectedScript()->wrapPropertyInArray(errorString, scopes, to
V8StringInternalized(m_isolate, "object"), scope.objectGroupName())) |
| 681 return; | 679 return; |
| 682 } | 680 } |
| 683 | 681 |
| 684 OwnPtr<FunctionDetails> functionDetails = FunctionDetails::create() | 682 OwnPtr<FunctionDetails> functionDetails = FunctionDetails::create() |
| 685 .setLocation(buildProtocolLocation(String16::number(function->ScriptId()
), function->GetScriptLineNumber(), function->GetScriptColumnNumber())) | 683 .setLocation(buildProtocolLocation(String16::number(function->ScriptId()
), function->GetScriptLineNumber(), function->GetScriptColumnNumber())) |
| 686 .setFunctionName(toProtocolStringWithTypeCheck(function->GetDebugName())
) | 684 .setFunctionName(toProtocolStringWithTypeCheck(function->GetDebugName())
) |
| 687 .setIsGenerator(function->IsGeneratorFunction()).build(); | 685 .setIsGenerator(function->IsGeneratorFunction()).build(); |
| 688 | 686 |
| 689 if (!scopes.IsEmpty()) { | 687 if (!scopes.IsEmpty()) { |
| 690 protocol::ErrorSupport errorSupport; | 688 protocol::ErrorSupport errorSupport; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 v8::Local<v8::Value> entriesValue = m_debugger->collectionEntries(object); | 739 v8::Local<v8::Value> entriesValue = m_debugger->collectionEntries(object); |
| 742 if (hasInternalError(errorString, entriesValue.IsEmpty())) | 740 if (hasInternalError(errorString, entriesValue.IsEmpty())) |
| 743 return; | 741 return; |
| 744 if (entriesValue->IsUndefined()) { | 742 if (entriesValue->IsUndefined()) { |
| 745 *errorString = "Object with given id is not a collection"; | 743 *errorString = "Object with given id is not a collection"; |
| 746 return; | 744 return; |
| 747 } | 745 } |
| 748 if (hasInternalError(errorString, !entriesValue->IsArray())) | 746 if (hasInternalError(errorString, !entriesValue->IsArray())) |
| 749 return; | 747 return; |
| 750 v8::Local<v8::Array> entriesArray = entriesValue.As<v8::Array>(); | 748 v8::Local<v8::Array> entriesArray = entriesValue.As<v8::Array>(); |
| 751 if (!scope.injectedScript()->wrapPropertyInArray(errorString, entriesArray,
toV8StringInternalized(m_debugger->isolate(), "key"), scope.objectGroupName())) | 749 if (!scope.injectedScript()->wrapPropertyInArray(errorString, entriesArray,
toV8StringInternalized(m_isolate, "key"), scope.objectGroupName())) |
| 752 return; | 750 return; |
| 753 if (!scope.injectedScript()->wrapPropertyInArray(errorString, entriesArray,
toV8StringInternalized(m_debugger->isolate(), "value"), scope.objectGroupName())
) | 751 if (!scope.injectedScript()->wrapPropertyInArray(errorString, entriesArray,
toV8StringInternalized(m_isolate, "value"), scope.objectGroupName())) |
| 754 return; | 752 return; |
| 755 protocol::ErrorSupport errors; | 753 protocol::ErrorSupport errors; |
| 756 OwnPtr<protocol::Array<CollectionEntry>> entries = protocol::Array<Collectio
nEntry>::parse(toProtocolValue(scope.context(), entriesArray).get(), &errors); | 754 OwnPtr<protocol::Array<CollectionEntry>> entries = protocol::Array<Collectio
nEntry>::parse(toProtocolValue(scope.context(), entriesArray).get(), &errors); |
| 757 if (hasInternalError(errorString, !entries)) | 755 if (hasInternalError(errorString, !entries)) |
| 758 return; | 756 return; |
| 759 *outEntries = entries.release(); | 757 *outEntries = entries.release(); |
| 760 } | 758 } |
| 761 | 759 |
| 762 void V8DebuggerAgentImpl::schedulePauseOnNextStatement(const String16& breakReas
on, PassOwnPtr<protocol::DictionaryValue> data) | 760 void V8DebuggerAgentImpl::schedulePauseOnNextStatement(const String16& breakReas
on, PassOwnPtr<protocol::DictionaryValue> data) |
| 763 { | 761 { |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 if (!assertPaused(errorString)) | 914 if (!assertPaused(errorString)) |
| 917 return; | 915 return; |
| 918 InjectedScript::CallFrameScope scope(errorString, m_debugger, m_session->con
textGroupId(), callFrameId); | 916 InjectedScript::CallFrameScope scope(errorString, m_debugger, m_session->con
textGroupId(), callFrameId); |
| 919 if (!scope.initialize()) | 917 if (!scope.initialize()) |
| 920 return; | 918 return; |
| 921 if (scope.frameOrdinal() >= m_pausedCallFrames.size()) { | 919 if (scope.frameOrdinal() >= m_pausedCallFrames.size()) { |
| 922 *errorString = "Could not find call frame with given id"; | 920 *errorString = "Could not find call frame with given id"; |
| 923 return; | 921 return; |
| 924 } | 922 } |
| 925 | 923 |
| 926 if (includeCommandLineAPI.fromMaybe(false)) { | 924 if (includeCommandLineAPI.fromMaybe(false) && !scope.installCommandLineAPI()
) |
| 927 v8::MaybeLocal<v8::Object> commandLineAPI = scope.injectedScript()->comm
andLineAPI(errorString); | 925 return; |
| 928 if (commandLineAPI.IsEmpty()) | 926 if (doNotPauseOnExceptionsAndMuteConsole.fromMaybe(false)) |
| 929 return; | 927 scope.ignoreExceptionsAndMuteConsole(); |
| 930 scope.installGlobalObjectExtension(commandLineAPI); | |
| 931 } | |
| 932 | 928 |
| 933 IgnoreExceptionsScope ignoreExceptionsScope(doNotPauseOnExceptionsAndMuteCon
sole.fromMaybe(false) ? m_debugger : nullptr); | 929 v8::MaybeLocal<v8::Value> maybeResultValue = m_pausedCallFrames[scope.frameO
rdinal()].get()->evaluate(toV8String(m_isolate, expression)); |
| 934 MuteConsoleScope muteConsoleScope(doNotPauseOnExceptionsAndMuteConsole.fromM
aybe(false) ? m_debugger : nullptr); | |
| 935 | |
| 936 v8::MaybeLocal<v8::Value> maybeResultValue = m_pausedCallFrames[scope.frameO
rdinal()].get()->evaluate(toV8String(m_debugger->isolate(), expression)); | |
| 937 | 930 |
| 938 // Re-initialize after running client's code, as it could have destroyed con
text or session. | 931 // Re-initialize after running client's code, as it could have destroyed con
text or session. |
| 939 if (!scope.initialize()) | 932 if (!scope.initialize()) |
| 940 return; | 933 return; |
| 941 scope.injectedScript()->wrapEvaluateResult(errorString, | 934 scope.injectedScript()->wrapEvaluateResult(errorString, |
| 942 maybeResultValue, | 935 maybeResultValue, |
| 943 scope.tryCatch(), | 936 scope.tryCatch(), |
| 944 objectGroup.fromMaybe(""), | 937 objectGroup.fromMaybe(""), |
| 945 returnByValue.fromMaybe(false), | 938 returnByValue.fromMaybe(false), |
| 946 generatePreview.fromMaybe(false), | 939 generatePreview.fromMaybe(false), |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1149 { | 1142 { |
| 1150 if (m_pausedContext.IsEmpty() || !m_pausedCallFrames.size()) | 1143 if (m_pausedContext.IsEmpty() || !m_pausedCallFrames.size()) |
| 1151 return Array<CallFrame>::create(); | 1144 return Array<CallFrame>::create(); |
| 1152 ErrorString ignored; | 1145 ErrorString ignored; |
| 1153 InjectedScript* topFrameInjectedScript = m_session->findInjectedScript(&igno
red, V8Debugger::contextId(m_pausedContext.Get(m_isolate))); | 1146 InjectedScript* topFrameInjectedScript = m_session->findInjectedScript(&igno
red, V8Debugger::contextId(m_pausedContext.Get(m_isolate))); |
| 1154 if (!topFrameInjectedScript) { | 1147 if (!topFrameInjectedScript) { |
| 1155 // Context has been reported as removed while on pause. | 1148 // Context has been reported as removed while on pause. |
| 1156 return Array<CallFrame>::create(); | 1149 return Array<CallFrame>::create(); |
| 1157 } | 1150 } |
| 1158 | 1151 |
| 1159 v8::Isolate* isolate = topFrameInjectedScript->isolate(); | 1152 v8::HandleScope handles(m_isolate); |
| 1160 v8::HandleScope handles(isolate); | |
| 1161 v8::Local<v8::Context> context = topFrameInjectedScript->context()->context(
); | 1153 v8::Local<v8::Context> context = topFrameInjectedScript->context()->context(
); |
| 1162 v8::Context::Scope contextScope(context); | 1154 v8::Context::Scope contextScope(context); |
| 1163 | 1155 |
| 1164 v8::Local<v8::Array> objects = v8::Array::New(isolate); | 1156 v8::Local<v8::Array> objects = v8::Array::New(m_isolate); |
| 1165 for (size_t frameOrdinal = 0; frameOrdinal < m_pausedCallFrames.size(); ++fr
ameOrdinal) { | 1157 for (size_t frameOrdinal = 0; frameOrdinal < m_pausedCallFrames.size(); ++fr
ameOrdinal) { |
| 1166 JavaScriptCallFrame* currentCallFrame = m_pausedCallFrames[frameOrdinal]
.get(); | 1158 JavaScriptCallFrame* currentCallFrame = m_pausedCallFrames[frameOrdinal]
.get(); |
| 1167 | 1159 |
| 1168 v8::Local<v8::Object> details = currentCallFrame->details(); | 1160 v8::Local<v8::Object> details = currentCallFrame->details(); |
| 1169 if (hasInternalError(errorString, details.IsEmpty())) | 1161 if (hasInternalError(errorString, details.IsEmpty())) |
| 1170 return Array<CallFrame>::create(); | 1162 return Array<CallFrame>::create(); |
| 1171 | 1163 |
| 1172 int contextId = currentCallFrame->contextId(); | 1164 int contextId = currentCallFrame->contextId(); |
| 1173 InjectedScript* injectedScript = contextId ? m_session->findInjectedScri
pt(&ignored, contextId) : nullptr; | 1165 InjectedScript* injectedScript = contextId ? m_session->findInjectedScri
pt(&ignored, contextId) : nullptr; |
| 1174 if (!injectedScript) | 1166 if (!injectedScript) |
| 1175 injectedScript = topFrameInjectedScript; | 1167 injectedScript = topFrameInjectedScript; |
| 1176 | 1168 |
| 1177 String16 callFrameId = RemoteCallFrameId::serialize(injectedScript->cont
ext()->contextId(), frameOrdinal); | 1169 String16 callFrameId = RemoteCallFrameId::serialize(injectedScript->cont
ext()->contextId(), frameOrdinal); |
| 1178 if (hasInternalError(errorString, !details->Set(context, toV8StringInter
nalized(isolate, "callFrameId"), toV8String(isolate, callFrameId)).FromMaybe(fal
se))) | 1170 if (hasInternalError(errorString, !details->Set(context, toV8StringInter
nalized(m_isolate, "callFrameId"), toV8String(m_isolate, callFrameId)).FromMaybe
(false))) |
| 1179 return Array<CallFrame>::create(); | 1171 return Array<CallFrame>::create(); |
| 1180 | 1172 |
| 1181 v8::Local<v8::Value> scopeChain; | 1173 v8::Local<v8::Value> scopeChain; |
| 1182 if (hasInternalError(errorString, !details->Get(context, toV8StringInter
nalized(isolate, "scopeChain")).ToLocal(&scopeChain) || !scopeChain->IsArray())) | 1174 if (hasInternalError(errorString, !details->Get(context, toV8StringInter
nalized(m_isolate, "scopeChain")).ToLocal(&scopeChain) || !scopeChain->IsArray()
)) |
| 1183 return Array<CallFrame>::create(); | 1175 return Array<CallFrame>::create(); |
| 1184 v8::Local<v8::Array> scopeChainArray = scopeChain.As<v8::Array>(); | 1176 v8::Local<v8::Array> scopeChainArray = scopeChain.As<v8::Array>(); |
| 1185 if (!injectedScript->wrapPropertyInArray(errorString, scopeChainArray, t
oV8StringInternalized(isolate, "object"), V8DebuggerAgentImpl::backtraceObjectGr
oup)) | 1177 if (!injectedScript->wrapPropertyInArray(errorString, scopeChainArray, t
oV8StringInternalized(m_isolate, "object"), V8DebuggerAgentImpl::backtraceObject
Group)) |
| 1186 return Array<CallFrame>::create(); | 1178 return Array<CallFrame>::create(); |
| 1187 | 1179 |
| 1188 if (!injectedScript->wrapObjectProperty(errorString, details, toV8String
Internalized(isolate, "this"), V8DebuggerAgentImpl::backtraceObjectGroup)) | 1180 if (!injectedScript->wrapObjectProperty(errorString, details, toV8String
Internalized(m_isolate, "this"), V8DebuggerAgentImpl::backtraceObjectGroup)) |
| 1189 return Array<CallFrame>::create(); | 1181 return Array<CallFrame>::create(); |
| 1190 | 1182 |
| 1191 if (details->Has(context, toV8StringInternalized(isolate, "returnValue")
).FromMaybe(false)) { | 1183 if (details->Has(context, toV8StringInternalized(m_isolate, "returnValue
")).FromMaybe(false)) { |
| 1192 if (!injectedScript->wrapObjectProperty(errorString, details, toV8St
ringInternalized(isolate, "returnValue"), V8DebuggerAgentImpl::backtraceObjectGr
oup)) | 1184 if (!injectedScript->wrapObjectProperty(errorString, details, toV8St
ringInternalized(m_isolate, "returnValue"), V8DebuggerAgentImpl::backtraceObject
Group)) |
| 1193 return Array<CallFrame>::create(); | 1185 return Array<CallFrame>::create(); |
| 1194 } | 1186 } |
| 1195 | 1187 |
| 1196 if (hasInternalError(errorString, !objects->Set(context, frameOrdinal, d
etails).FromMaybe(false))) | 1188 if (hasInternalError(errorString, !objects->Set(context, frameOrdinal, d
etails).FromMaybe(false))) |
| 1197 return Array<CallFrame>::create(); | 1189 return Array<CallFrame>::create(); |
| 1198 } | 1190 } |
| 1199 | 1191 |
| 1200 protocol::ErrorSupport errorSupport; | 1192 protocol::ErrorSupport errorSupport; |
| 1201 OwnPtr<Array<CallFrame>> callFrames = Array<CallFrame>::parse(toProtocolValu
e(context, objects).get(), &errorSupport); | 1193 OwnPtr<Array<CallFrame>> callFrames = Array<CallFrame>::parse(toProtocolValu
e(context, objects).get(), &errorSupport); |
| 1202 if (hasInternalError(errorString, !callFrames)) | 1194 if (hasInternalError(errorString, !callFrames)) |
| (...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1422 if (!enabled()) | 1414 if (!enabled()) |
| 1423 return; | 1415 return; |
| 1424 m_scheduledDebuggerStep = NoStep; | 1416 m_scheduledDebuggerStep = NoStep; |
| 1425 m_scripts.clear(); | 1417 m_scripts.clear(); |
| 1426 m_blackboxedPositions.clear(); | 1418 m_blackboxedPositions.clear(); |
| 1427 m_breakpointIdToDebuggerBreakpointIds.clear(); | 1419 m_breakpointIdToDebuggerBreakpointIds.clear(); |
| 1428 allAsyncTasksCanceled(); | 1420 allAsyncTasksCanceled(); |
| 1429 } | 1421 } |
| 1430 | 1422 |
| 1431 } // namespace blink | 1423 } // namespace blink |
| OLD | NEW |