OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2010 Apple Inc. All rights reserved. |
3 * Copyright (C) 2013 Google Inc. All rights reserved. | 3 * Copyright (C) 2013 Google Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * | 8 * |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 29 matching lines...) Expand all Loading... |
40 #include "core/fetch/Resource.h" | 40 #include "core/fetch/Resource.h" |
41 #include "core/inspector/ContentSearchUtils.h" | 41 #include "core/inspector/ContentSearchUtils.h" |
42 #include "core/inspector/InjectedScriptManager.h" | 42 #include "core/inspector/InjectedScriptManager.h" |
43 #include "core/inspector/InspectorPageAgent.h" | 43 #include "core/inspector/InspectorPageAgent.h" |
44 #include "core/inspector/InspectorState.h" | 44 #include "core/inspector/InspectorState.h" |
45 #include "core/inspector/InstrumentingAgents.h" | 45 #include "core/inspector/InstrumentingAgents.h" |
46 #include "core/inspector/ScriptArguments.h" | 46 #include "core/inspector/ScriptArguments.h" |
47 #include "core/inspector/ScriptCallFrame.h" | 47 #include "core/inspector/ScriptCallFrame.h" |
48 #include "core/inspector/ScriptCallStack.h" | 48 #include "core/inspector/ScriptCallStack.h" |
49 #include "platform/JSONValues.h" | 49 #include "platform/JSONValues.h" |
| 50 #include "wtf/Vector.h" |
50 #include "wtf/text/WTFString.h" | 51 #include "wtf/text/WTFString.h" |
51 | 52 |
52 using WebCore::TypeBuilder::Array; | 53 using WebCore::TypeBuilder::Array; |
53 using WebCore::TypeBuilder::Debugger::BreakpointId; | 54 using WebCore::TypeBuilder::Debugger::BreakpointId; |
54 using WebCore::TypeBuilder::Debugger::CallFrame; | 55 using WebCore::TypeBuilder::Debugger::CallFrame; |
55 using WebCore::TypeBuilder::Debugger::ExceptionDetails; | 56 using WebCore::TypeBuilder::Debugger::ExceptionDetails; |
56 using WebCore::TypeBuilder::Debugger::FunctionDetails; | 57 using WebCore::TypeBuilder::Debugger::FunctionDetails; |
57 using WebCore::TypeBuilder::Debugger::ScriptId; | 58 using WebCore::TypeBuilder::Debugger::ScriptId; |
58 using WebCore::TypeBuilder::Debugger::StackTrace; | 59 using WebCore::TypeBuilder::Debugger::StackTrace; |
59 using WebCore::TypeBuilder::Runtime::RemoteObject; | 60 using WebCore::TypeBuilder::Runtime::RemoteObject; |
(...skipping 967 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1027 | 1028 |
1028 void InspectorDebuggerAgent::scriptExecutionBlockedByCSP(const String& directive
Text) | 1029 void InspectorDebuggerAgent::scriptExecutionBlockedByCSP(const String& directive
Text) |
1029 { | 1030 { |
1030 if (scriptDebugServer().pauseOnExceptionsState() != ScriptDebugServer::DontP
auseOnExceptions) { | 1031 if (scriptDebugServer().pauseOnExceptionsState() != ScriptDebugServer::DontP
auseOnExceptions) { |
1031 RefPtr<JSONObject> directive = JSONObject::create(); | 1032 RefPtr<JSONObject> directive = JSONObject::create(); |
1032 directive->setString("directiveText", directiveText); | 1033 directive->setString("directiveText", directiveText); |
1033 breakProgram(InspectorFrontend::Debugger::Reason::CSPViolation, directiv
e.release()); | 1034 breakProgram(InspectorFrontend::Debugger::Reason::CSPViolation, directiv
e.release()); |
1034 } | 1035 } |
1035 } | 1036 } |
1036 | 1037 |
| 1038 double lookupTimestamp(PassRefPtr<CallFrame> frame) |
| 1039 { |
| 1040 double timestamp = 0; |
| 1041 bool ALLOW_UNUSED hasTimestamp = frame->asObject()->getNumber("timestamp", &
timestamp); |
| 1042 ASSERT(hasTimestamp); |
| 1043 return timestamp; |
| 1044 } |
| 1045 |
| 1046 static inline bool compareCallFrameTimestamps(PassRefPtr<CallFrame> frame1, Pass
RefPtr<CallFrame> frame2) |
| 1047 { |
| 1048 return lookupTimestamp(frame1) > lookupTimestamp(frame2); |
| 1049 } |
| 1050 |
| 1051 void addFramesToVector(PassRefPtr<Array<CallFrame> > trace, Vector<RefPtr<CallFr
ame> > & v) |
| 1052 { |
| 1053 RefPtr<JSONArray> traceArray = trace->asArray(); |
| 1054 for (JSONArray::iterator it = traceArray->begin(); it != traceArray->end();
++it) { |
| 1055 v.append(CallFrame::runtimeCast(*it)); |
| 1056 } |
| 1057 } |
| 1058 |
| 1059 PassRefPtr<Array<CallFrame> > mergeStackTraces(PassRefPtr<Array<CallFrame> > tra
ce1, PassRefPtr<Array<CallFrame> > trace2) |
| 1060 { |
| 1061 Vector<RefPtr<CallFrame> > mergedFrames; |
| 1062 addFramesToVector(trace1, mergedFrames); |
| 1063 addFramesToVector(trace2, mergedFrames); |
| 1064 std::stable_sort(mergedFrames.begin(), mergedFrames.end(), compareCallFrameT
imestamps); |
| 1065 |
| 1066 RefPtr<Array<CallFrame> > ret = Array<CallFrame>::create(); |
| 1067 for (size_t i = 0; i < mergedFrames.size(); ++i) |
| 1068 ret->addItem(mergedFrames[i]); |
| 1069 return ret; |
| 1070 } |
| 1071 |
1037 PassRefPtr<Array<CallFrame> > InspectorDebuggerAgent::currentCallFrames() | 1072 PassRefPtr<Array<CallFrame> > InspectorDebuggerAgent::currentCallFrames() |
1038 { | 1073 { |
1039 if (!m_pausedScriptState || m_currentCallStack.isNull()) | 1074 if (!m_pausedScriptState || m_currentCallStack.isNull()) |
1040 return Array<TypeBuilder::Debugger::CallFrame>::create(); | 1075 return Array<TypeBuilder::Debugger::CallFrame>::create(); |
| 1076 if (m_currentCallStack.isMixedLanguageStackTrace()) { |
| 1077 return mergeStackTraces( |
| 1078 m_injectedScriptManager->injectedScriptFor(m_currentCallStack.dartSc
riptState()).wrapCallFrames(m_currentCallStack, 0), |
| 1079 // FIXMEDART: passing in -1 as hack to force AsyncStack mode |
| 1080 // evaluation as V8 cannot handle regular evaluation of a call |
| 1081 // frame if not stopped at a v8 breakpoint due to an assert |
| 1082 // in the V8 code base that should probably be removed. |
| 1083 // Async call frame evaluation works almost as well as regular |
| 1084 // call frame evaluation with the only difference being that |
| 1085 // local variable modifications have no impact. |
| 1086 m_injectedScriptManager->injectedScriptFor(m_currentCallStack.v8Scri
ptState()).wrapCallFrames(m_currentCallStack, m_pausedScriptState->isJavaScript(
) ? 0 : -1)); |
| 1087 } |
| 1088 |
1041 InjectedScript& injectedScript = m_injectedScriptManager->injectedScriptFor(
m_pausedScriptState.get()); | 1089 InjectedScript& injectedScript = m_injectedScriptManager->injectedScriptFor(
m_pausedScriptState.get()); |
1042 if (injectedScript.isEmpty()) { | 1090 if (injectedScript.isEmpty()) { |
1043 ASSERT_NOT_REACHED(); | 1091 ASSERT_NOT_REACHED(); |
1044 return Array<CallFrame>::create(); | 1092 return Array<CallFrame>::create(); |
1045 } | 1093 } |
1046 return injectedScript.wrapCallFrames(m_currentCallStack, 0); | 1094 return injectedScript.wrapCallFrames(m_currentCallStack, 0); |
1047 } | 1095 } |
1048 | 1096 |
1049 PassRefPtr<WebCore::TypeBuilder::Debugger::StackTrace> InspectorDebuggerAgent::c
urrentAsyncStackTrace() | 1097 PassRefPtr<WebCore::TypeBuilder::Debugger::StackTrace> InspectorDebuggerAgent::c
urrentAsyncStackTrace() |
1050 { | 1098 { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1140 if (location) | 1188 if (location) |
1141 m_frontend->breakpointResolved(it->key, location); | 1189 m_frontend->breakpointResolved(it->key, location); |
1142 } | 1190 } |
1143 } | 1191 } |
1144 | 1192 |
1145 void InspectorDebuggerAgent::failedToParseSource(const String& url, const String
& data, int firstLine, int errorLine, const String& errorMessage) | 1193 void InspectorDebuggerAgent::failedToParseSource(const String& url, const String
& data, int firstLine, int errorLine, const String& errorMessage) |
1146 { | 1194 { |
1147 m_frontend->scriptFailedToParse(url, data, firstLine, errorLine, errorMessag
e); | 1195 m_frontend->scriptFailedToParse(url, data, firstLine, errorLine, errorMessag
e); |
1148 } | 1196 } |
1149 | 1197 |
1150 ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::didPause(ScriptSta
te* scriptState, const StackTrace& callFrames, const ScriptValue& exception, con
st Vector<String>& hitBreakpoints) | 1198 ScriptDebugListener::SkipPauseRequest InspectorDebuggerAgent::didPause(ScriptSta
te* scriptState, const ScriptValue& exception, const Vector<String>& hitBreakpoi
nts) |
1151 { | 1199 { |
| 1200 const StackTrace& callFrames = scriptDebugServer().currentCallFrames(); |
1152 ScriptDebugListener::SkipPauseRequest result; | 1201 ScriptDebugListener::SkipPauseRequest result; |
1153 if (m_javaScriptPauseScheduled) | 1202 if (m_javaScriptPauseScheduled) |
1154 result = ScriptDebugListener::NoSkip; // Don't skip explicit pause reque
sts from front-end. | 1203 result = ScriptDebugListener::NoSkip; // Don't skip explicit pause reque
sts from front-end. |
1155 else if (m_skipAllPauses) | 1204 else if (m_skipAllPauses) |
1156 result = ScriptDebugListener::Continue; | 1205 result = ScriptDebugListener::Continue; |
1157 else if (!hitBreakpoints.isEmpty()) | 1206 else if (!hitBreakpoints.isEmpty()) |
1158 result = ScriptDebugListener::NoSkip; // Don't skip explicit breakpoints
even if set in frameworks. | 1207 result = ScriptDebugListener::NoSkip; // Don't skip explicit breakpoints
even if set in frameworks. |
1159 else if (!exception.isEmpty()) | 1208 else if (!exception.isEmpty()) |
1160 result = shouldSkipExceptionPause(); | 1209 result = shouldSkipExceptionPause(); |
1161 else if (m_debuggerStepScheduled || m_pausingOnNativeEvent) | 1210 else if (m_debuggerStepScheduled || m_pausingOnNativeEvent) |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1279 { | 1328 { |
1280 m_scripts.clear(); | 1329 m_scripts.clear(); |
1281 m_breakpointIdToDebugServerBreakpointIds.clear(); | 1330 m_breakpointIdToDebugServerBreakpointIds.clear(); |
1282 m_asyncCallStackTracker.clear(); | 1331 m_asyncCallStackTracker.clear(); |
1283 if (m_frontend) | 1332 if (m_frontend) |
1284 m_frontend->globalObjectCleared(); | 1333 m_frontend->globalObjectCleared(); |
1285 } | 1334 } |
1286 | 1335 |
1287 } // namespace WebCore | 1336 } // namespace WebCore |
1288 | 1337 |
OLD | NEW |