1 // Copyright 2015 the V8 project authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef V8_INSPECTOR_V8DEBUGGERAGENTIMPL_H_ 6 #define V8_INSPECTOR_V8DEBUGGERAGENTIMPL_H_ 7 8 #include <vector> 9 10 #include "src/base/macros.h" 11 #include "src/debug/interface-types.h" 12 #include "src/inspector/java-script-call-frame.h" 13 #include "src/inspector/protocol/Debugger.h" 14 #include "src/inspector/protocol/Forward.h" 15 16 namespace v8_inspector { 17 18 struct ScriptBreakpoint; 19 class JavaScriptCallFrame; 20 class PromiseTracker; 21 class V8Debugger; 22 class V8DebuggerScript; 23 class V8InspectorImpl; 24 class V8InspectorSessionImpl; 25 class V8Regex; 26 class V8StackTraceImpl; 27 28 using protocol::Maybe; 29 using protocol::Response; 30 31 class V8DebuggerAgentImpl : public protocol::Debugger::Backend { 32 public: 33 enum BreakpointSource { 34 UserBreakpointSource, 35 DebugCommandBreakpointSource, 36 MonitorCommandBreakpointSource 37 }; 38 39 V8DebuggerAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, 40 protocol::DictionaryValue* state); 41 ~V8DebuggerAgentImpl() override; 42 void restore(); 43 44 // Part of the protocol. 45 Response enable() override; 46 Response disable() override; 47 Response setBreakpointsActive(bool active) override; 48 Response setSkipAllPauses(bool skip) override; 49 Response setBreakpointByUrl( 50 int lineNumber, Maybe<String16> optionalURL, 51 Maybe<String16> optionalURLRegex, Maybe<int> optionalColumnNumber, 52 Maybe<String16> optionalCondition, String16*, 53 std::unique_ptr<protocol::Array<protocol::Debugger::Location>>* locations) 54 override; 55 Response setBreakpoint( 56 std::unique_ptr<protocol::Debugger::Location>, 57 Maybe<String16> optionalCondition, String16*, 58 std::unique_ptr<protocol::Debugger::Location>* actualLocation) override; 59 Response removeBreakpoint(const String16& breakpointId) override; 60 Response continueToLocation( 61 std::unique_ptr<protocol::Debugger::Location>) override; 62 Response searchInContent( 63 const String16& scriptId, const String16& query, 64 Maybe<bool> optionalCaseSensitive, Maybe<bool> optionalIsRegex, 65 std::unique_ptr<protocol::Array<protocol::Debugger::SearchMatch>>*) 66 override; 67 Response getPossibleBreakpoints( 68 std::unique_ptr<protocol::Debugger::Location> start, 69 Maybe<protocol::Debugger::Location> end, 70 std::unique_ptr<protocol::Array<protocol::Debugger::Location>>* locations) 71 override; 72 Response setScriptSource( 73 const String16& inScriptId, const String16& inScriptSource, 74 Maybe<bool> dryRun, 75 Maybe<protocol::Array<protocol::Debugger::CallFrame>>* optOutCallFrames, 76 Maybe<bool>* optOutStackChanged, 77 Maybe<protocol::Runtime::StackTrace>* optOutAsyncStackTrace, 78 Maybe<protocol::Runtime::ExceptionDetails>* optOutCompileError) override; 79 Response restartFrame( 80 const String16& callFrameId, 81 std::unique_ptr<protocol::Array<protocol::Debugger::CallFrame>>* 82 newCallFrames, 83 Maybe<protocol::Runtime::StackTrace>* asyncStackTrace) override; 84 Response getScriptSource(const String16& scriptId, 85 String16* scriptSource) override; 86 Response pause() override; 87 Response resume() override; 88 Response stepOver() override; 89 Response stepInto() override; 90 Response stepOut() override; 91 Response setPauseOnExceptions(const String16& pauseState) override; 92 Response evaluateOnCallFrame( 93 const String16& callFrameId, const String16& expression, 94 Maybe<String16> objectGroup, Maybe<bool> includeCommandLineAPI, 95 Maybe<bool> silent, Maybe<bool> returnByValue, 96 Maybe<bool> generatePreview, Maybe<bool> throwOnSideEffect, 97 std::unique_ptr<protocol::Runtime::RemoteObject>* result, 98 Maybe<protocol::Runtime::ExceptionDetails>*) override; 99 Response setVariableValue( 100 int scopeNumber, const String16& variableName, 101 std::unique_ptr<protocol::Runtime::CallArgument> newValue, 102 const String16& callFrame) override; 103 Response setAsyncCallStackDepth(int depth) override; 104 Response setBlackboxPatterns( 105 std::unique_ptr<protocol::Array<String16>> patterns) override; 106 Response setBlackboxedRanges( 107 const String16& scriptId, 108 std::unique_ptr<protocol::Array<protocol::Debugger::ScriptPosition>> 109 positions) override; 110 111 bool enabled(); 112 113 void setBreakpointAt(const String16& scriptId, int lineNumber, 114 int columnNumber, BreakpointSource, 115 const String16& condition = String16()); 116 void removeBreakpointAt(const String16& scriptId, int lineNumber, 117 int columnNumber, BreakpointSource); 118 void schedulePauseOnNextStatement( 119 const String16& breakReason, 120 std::unique_ptr<protocol::DictionaryValue> data); 121 void cancelPauseOnNextStatement(); 122 void breakProgram(const String16& breakReason, 123 std::unique_ptr<protocol::DictionaryValue> data); 124 void breakProgramOnException(const String16& breakReason, 125 std::unique_ptr<protocol::DictionaryValue> data); 126 127 void reset(); 128 129 // Interface for V8InspectorImpl 130 void didPause(int contextId, v8::Local<v8::Value> exception, 131 const std::vector<String16>& hitBreakpoints, 132 bool isPromiseRejection, bool isUncaught, bool isOOMBreak); 133 void didContinue(); 134 void didParseSource(std::unique_ptr<V8DebuggerScript>, bool success); 135 void willExecuteScript(int scriptId); 136 void didExecuteScript(); 137 138 bool isFunctionBlackboxed(const String16& scriptId, 139 const v8::debug::Location& start, 140 const v8::debug::Location& end); 141 skipAllPauses()142 bool skipAllPauses() const { return m_skipAllPauses; } 143 isolate()144 v8::Isolate* isolate() { return m_isolate; } 145 146 private: 147 void enableImpl(); 148 149 void schedulePauseOnNextStatementIfSteppingInto(); 150 151 Response currentCallFrames( 152 std::unique_ptr<protocol::Array<protocol::Debugger::CallFrame>>*); 153 std::unique_ptr<protocol::Runtime::StackTrace> currentAsyncStackTrace(); 154 155 void changeJavaScriptRecursionLevel(int step); 156 157 void setPauseOnExceptionsImpl(int); 158 159 std::unique_ptr<protocol::Debugger::Location> resolveBreakpoint( 160 const String16& breakpointId, const ScriptBreakpoint&, BreakpointSource); 161 void removeBreakpointImpl(const String16& breakpointId); 162 void clearBreakDetails(); 163 164 void internalSetAsyncCallStackDepth(int); 165 void increaseCachedSkipStackGeneration(); 166 167 Response setBlackboxPattern(const String16& pattern); 168 void resetBlackboxedStateCache(); 169 170 bool isPaused() const; 171 172 using ScriptsMap = 173 protocol::HashMap<String16, std::unique_ptr<V8DebuggerScript>>; 174 using BreakpointIdToDebuggerBreakpointIdsMap = 175 protocol::HashMap<String16, std::vector<String16>>; 176 using DebugServerBreakpointToBreakpointIdAndSourceMap = 177 protocol::HashMap<String16, std::pair<String16, BreakpointSource>>; 178 using MuteBreakpoins = protocol::HashMap<String16, std::pair<String16, int>>; 179 180 enum DebuggerStep { NoStep = 0, StepInto, StepOver, StepOut }; 181 182 V8InspectorImpl* m_inspector; 183 V8Debugger* m_debugger; 184 V8InspectorSessionImpl* m_session; 185 bool m_enabled; 186 protocol::DictionaryValue* m_state; 187 protocol::Debugger::Frontend m_frontend; 188 v8::Isolate* m_isolate; 189 JavaScriptCallFrames m_pausedCallFrames; 190 ScriptsMap m_scripts; 191 BreakpointIdToDebuggerBreakpointIdsMap m_breakpointIdToDebuggerBreakpointIds; 192 DebugServerBreakpointToBreakpointIdAndSourceMap m_serverBreakpoints; 193 String16 m_continueToLocationBreakpointId; 194 195 using BreakReason = 196 std::pair<String16, std::unique_ptr<protocol::DictionaryValue>>; 197 std::vector<BreakReason> m_breakReason; 198 199 void pushBreakDetails( 200 const String16& breakReason, 201 std::unique_ptr<protocol::DictionaryValue> breakAuxData); 202 void popBreakDetails(); 203 204 DebuggerStep m_scheduledDebuggerStep; 205 bool m_javaScriptPauseScheduled; 206 207 int m_recursionLevelForStepOut; 208 bool m_skipAllPauses = false; 209 210 std::unique_ptr<V8Regex> m_blackboxPattern; 211 protocol::HashMap<String16, std::vector<std::pair<int, int>>> 212 m_blackboxedPositions; 213 214 DISALLOW_COPY_AND_ASSIGN(V8DebuggerAgentImpl); 215 }; 216 217 } // namespace v8_inspector 218 219 #endif // V8_INSPECTOR_V8DEBUGGERAGENTIMPL_H_ 220