• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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