1// Copyright 2016 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_V8_INSPECTOR_SESSION_IMPL_H_
6#define V8_INSPECTOR_V8_INSPECTOR_SESSION_IMPL_H_
7
8#include <memory>
9#include <vector>
10
11#include "src/base/macros.h"
12#include "src/inspector/protocol/Forward.h"
13#include "src/inspector/protocol/Runtime.h"
14#include "src/inspector/protocol/Schema.h"
15
16#include "include/v8-inspector.h"
17
18namespace v8_inspector {
19
20class InjectedScript;
21class RemoteObjectIdBase;
22class V8ConsoleAgentImpl;
23class V8DebuggerAgentImpl;
24class V8InspectorImpl;
25class V8HeapProfilerAgentImpl;
26class V8ProfilerAgentImpl;
27class V8RuntimeAgentImpl;
28class V8SchemaAgentImpl;
29
30using protocol::Response;
31
32class V8InspectorSessionImpl : public V8InspectorSession,
33                               public protocol::FrontendChannel {
34 public:
35  static std::unique_ptr<V8InspectorSessionImpl> create(V8InspectorImpl*,
36                                                        int contextGroupId,
37                                                        int sessionId,
38                                                        V8Inspector::Channel*,
39                                                        StringView state);
40  ~V8InspectorSessionImpl() override;
41  V8InspectorSessionImpl(const V8InspectorSessionImpl&) = delete;
42  V8InspectorSessionImpl& operator=(const V8InspectorSessionImpl&) = delete;
43
44  V8InspectorImpl* inspector() const { return m_inspector; }
45  V8ConsoleAgentImpl* consoleAgent() { return m_consoleAgent.get(); }
46  V8DebuggerAgentImpl* debuggerAgent() { return m_debuggerAgent.get(); }
47  V8SchemaAgentImpl* schemaAgent() { return m_schemaAgent.get(); }
48  V8ProfilerAgentImpl* profilerAgent() { return m_profilerAgent.get(); }
49  V8RuntimeAgentImpl* runtimeAgent() { return m_runtimeAgent.get(); }
50  int contextGroupId() const { return m_contextGroupId; }
51  int sessionId() const { return m_sessionId; }
52
53  std::unique_ptr<V8InspectorSession::CommandLineAPIScope>
54  initializeCommandLineAPIScope(int executionContextId) override;
55
56  Response findInjectedScript(int contextId, InjectedScript*&);
57  Response findInjectedScript(RemoteObjectIdBase*, InjectedScript*&);
58  void reset();
59  void discardInjectedScripts();
60  void reportAllContexts(V8RuntimeAgentImpl*);
61  void setCustomObjectFormatterEnabled(bool);
62  std::unique_ptr<protocol::Runtime::RemoteObject> wrapObject(
63      v8::Local<v8::Context>, v8::Local<v8::Value>, const String16& groupName,
64      bool generatePreview);
65  std::unique_ptr<protocol::Runtime::RemoteObject> wrapTable(
66      v8::Local<v8::Context>, v8::Local<v8::Object> table,
67      v8::MaybeLocal<v8::Array> columns);
68  std::vector<std::unique_ptr<protocol::Schema::Domain>> supportedDomainsImpl();
69  Response unwrapObject(const String16& objectId, v8::Local<v8::Value>*,
70                        v8::Local<v8::Context>*, String16* objectGroup);
71  void releaseObjectGroup(const String16& objectGroup);
72
73  // V8InspectorSession implementation.
74  void dispatchProtocolMessage(StringView message) override;
75  std::vector<uint8_t> state() override;
76  std::vector<std::unique_ptr<protocol::Schema::API::Domain>> supportedDomains()
77      override;
78  void addInspectedObject(
79      std::unique_ptr<V8InspectorSession::Inspectable>) override;
80  void schedulePauseOnNextStatement(StringView breakReason,
81                                    StringView breakDetails) override;
82  void cancelPauseOnNextStatement() override;
83  void breakProgram(StringView breakReason, StringView breakDetails) override;
84  void setSkipAllPauses(bool) override;
85  void resume(bool terminateOnResume = false) override;
86  void stepOver() override;
87  std::vector<std::unique_ptr<protocol::Debugger::API::SearchMatch>>
88  searchInTextByLines(StringView text, StringView query, bool caseSensitive,
89                      bool isRegex) override;
90  void releaseObjectGroup(StringView objectGroup) override;
91  bool unwrapObject(std::unique_ptr<StringBuffer>*, StringView objectId,
92                    v8::Local<v8::Value>*, v8::Local<v8::Context>*,
93                    std::unique_ptr<StringBuffer>* objectGroup) override;
94  std::unique_ptr<protocol::Runtime::API::RemoteObject> wrapObject(
95      v8::Local<v8::Context>, v8::Local<v8::Value>, StringView groupName,
96      bool generatePreview) override;
97
98  V8InspectorSession::Inspectable* inspectedObject(unsigned num);
99  static const unsigned kInspectedObjectBufferSize = 5;
100
101  void triggerPreciseCoverageDeltaUpdate(StringView occasion) override;
102
103 private:
104  V8InspectorSessionImpl(V8InspectorImpl*, int contextGroupId, int sessionId,
105                         V8Inspector::Channel*, StringView state);
106  protocol::DictionaryValue* agentState(const String16& name);
107
108  // protocol::FrontendChannel implementation.
109  void SendProtocolResponse(
110      int callId, std::unique_ptr<protocol::Serializable> message) override;
111  void SendProtocolNotification(
112      std::unique_ptr<protocol::Serializable> message) override;
113  void FallThrough(int callId, v8_crdtp::span<uint8_t> method,
114                   v8_crdtp::span<uint8_t> message) override;
115  void FlushProtocolNotifications() override;
116
117  std::unique_ptr<StringBuffer> serializeForFrontend(
118      std::unique_ptr<protocol::Serializable> message);
119  int m_contextGroupId;
120  int m_sessionId;
121  V8InspectorImpl* m_inspector;
122  V8Inspector::Channel* m_channel;
123  bool m_customObjectFormatterEnabled;
124
125  protocol::UberDispatcher m_dispatcher;
126  std::unique_ptr<protocol::DictionaryValue> m_state;
127
128  std::unique_ptr<V8RuntimeAgentImpl> m_runtimeAgent;
129  std::unique_ptr<V8DebuggerAgentImpl> m_debuggerAgent;
130  std::unique_ptr<V8HeapProfilerAgentImpl> m_heapProfilerAgent;
131  std::unique_ptr<V8ProfilerAgentImpl> m_profilerAgent;
132  std::unique_ptr<V8ConsoleAgentImpl> m_consoleAgent;
133  std::unique_ptr<V8SchemaAgentImpl> m_schemaAgent;
134  std::vector<std::unique_ptr<V8InspectorSession::Inspectable>>
135      m_inspectedObjects;
136  bool use_binary_protocol_ = false;
137};
138
139}  // namespace v8_inspector
140
141#endif  // V8_INSPECTOR_V8_INSPECTOR_SESSION_IMPL_H_
142