// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_INSPECTOR_V8DEBUGGERAGENTIMPL_H_ #define V8_INSPECTOR_V8DEBUGGERAGENTIMPL_H_ #include #include "src/base/macros.h" #include "src/debug/interface-types.h" #include "src/inspector/java-script-call-frame.h" #include "src/inspector/protocol/Debugger.h" #include "src/inspector/protocol/Forward.h" namespace v8_inspector { struct ScriptBreakpoint; class JavaScriptCallFrame; class PromiseTracker; class V8Debugger; class V8DebuggerScript; class V8InspectorImpl; class V8InspectorSessionImpl; class V8Regex; class V8StackTraceImpl; using protocol::Maybe; using protocol::Response; class V8DebuggerAgentImpl : public protocol::Debugger::Backend { public: enum BreakpointSource { UserBreakpointSource, DebugCommandBreakpointSource, MonitorCommandBreakpointSource }; V8DebuggerAgentImpl(V8InspectorSessionImpl*, protocol::FrontendChannel*, protocol::DictionaryValue* state); ~V8DebuggerAgentImpl() override; void restore(); // Part of the protocol. Response enable() override; Response disable() override; Response setBreakpointsActive(bool active) override; Response setSkipAllPauses(bool skip) override; Response setBreakpointByUrl( int lineNumber, Maybe optionalURL, Maybe optionalURLRegex, Maybe optionalColumnNumber, Maybe optionalCondition, String16*, std::unique_ptr>* locations) override; Response setBreakpoint( std::unique_ptr, Maybe optionalCondition, String16*, std::unique_ptr* actualLocation) override; Response removeBreakpoint(const String16& breakpointId) override; Response continueToLocation( std::unique_ptr) override; Response searchInContent( const String16& scriptId, const String16& query, Maybe optionalCaseSensitive, Maybe optionalIsRegex, std::unique_ptr>*) override; Response getPossibleBreakpoints( std::unique_ptr start, Maybe end, std::unique_ptr>* locations) override; Response setScriptSource( const String16& inScriptId, const String16& inScriptSource, Maybe dryRun, Maybe>* optOutCallFrames, Maybe* optOutStackChanged, Maybe* optOutAsyncStackTrace, Maybe* optOutCompileError) override; Response restartFrame( const String16& callFrameId, std::unique_ptr>* newCallFrames, Maybe* asyncStackTrace) override; Response getScriptSource(const String16& scriptId, String16* scriptSource) override; Response pause() override; Response resume() override; Response stepOver() override; Response stepInto() override; Response stepOut() override; Response setPauseOnExceptions(const String16& pauseState) override; Response evaluateOnCallFrame( const String16& callFrameId, const String16& expression, Maybe objectGroup, Maybe includeCommandLineAPI, Maybe silent, Maybe returnByValue, Maybe generatePreview, Maybe throwOnSideEffect, std::unique_ptr* result, Maybe*) override; Response setVariableValue( int scopeNumber, const String16& variableName, std::unique_ptr newValue, const String16& callFrame) override; Response setAsyncCallStackDepth(int depth) override; Response setBlackboxPatterns( std::unique_ptr> patterns) override; Response setBlackboxedRanges( const String16& scriptId, std::unique_ptr> positions) override; bool enabled(); void setBreakpointAt(const String16& scriptId, int lineNumber, int columnNumber, BreakpointSource, const String16& condition = String16()); void removeBreakpointAt(const String16& scriptId, int lineNumber, int columnNumber, BreakpointSource); void schedulePauseOnNextStatement( const String16& breakReason, std::unique_ptr data); void cancelPauseOnNextStatement(); void breakProgram(const String16& breakReason, std::unique_ptr data); void breakProgramOnException(const String16& breakReason, std::unique_ptr data); void reset(); // Interface for V8InspectorImpl void didPause(int contextId, v8::Local exception, const std::vector& hitBreakpoints, bool isPromiseRejection, bool isUncaught, bool isOOMBreak); void didContinue(); void didParseSource(std::unique_ptr, bool success); void willExecuteScript(int scriptId); void didExecuteScript(); bool isFunctionBlackboxed(const String16& scriptId, const v8::debug::Location& start, const v8::debug::Location& end); bool skipAllPauses() const { return m_skipAllPauses; } v8::Isolate* isolate() { return m_isolate; } private: void enableImpl(); void schedulePauseOnNextStatementIfSteppingInto(); Response currentCallFrames( std::unique_ptr>*); std::unique_ptr currentAsyncStackTrace(); void changeJavaScriptRecursionLevel(int step); void setPauseOnExceptionsImpl(int); std::unique_ptr resolveBreakpoint( const String16& breakpointId, const ScriptBreakpoint&, BreakpointSource); void removeBreakpointImpl(const String16& breakpointId); void clearBreakDetails(); void internalSetAsyncCallStackDepth(int); void increaseCachedSkipStackGeneration(); Response setBlackboxPattern(const String16& pattern); void resetBlackboxedStateCache(); bool isPaused() const; using ScriptsMap = protocol::HashMap>; using BreakpointIdToDebuggerBreakpointIdsMap = protocol::HashMap>; using DebugServerBreakpointToBreakpointIdAndSourceMap = protocol::HashMap>; using MuteBreakpoins = protocol::HashMap>; enum DebuggerStep { NoStep = 0, StepInto, StepOver, StepOut }; V8InspectorImpl* m_inspector; V8Debugger* m_debugger; V8InspectorSessionImpl* m_session; bool m_enabled; protocol::DictionaryValue* m_state; protocol::Debugger::Frontend m_frontend; v8::Isolate* m_isolate; JavaScriptCallFrames m_pausedCallFrames; ScriptsMap m_scripts; BreakpointIdToDebuggerBreakpointIdsMap m_breakpointIdToDebuggerBreakpointIds; DebugServerBreakpointToBreakpointIdAndSourceMap m_serverBreakpoints; String16 m_continueToLocationBreakpointId; using BreakReason = std::pair>; std::vector m_breakReason; void pushBreakDetails( const String16& breakReason, std::unique_ptr breakAuxData); void popBreakDetails(); DebuggerStep m_scheduledDebuggerStep; bool m_javaScriptPauseScheduled; int m_recursionLevelForStepOut; bool m_skipAllPauses = false; std::unique_ptr m_blackboxPattern; protocol::HashMap>> m_blackboxedPositions; DISALLOW_COPY_AND_ASSIGN(V8DebuggerAgentImpl); }; } // namespace v8_inspector #endif // V8_INSPECTOR_V8DEBUGGERAGENTIMPL_H_