1f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
2f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// found in the LICENSE file.
4f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
5f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#ifndef V8_INSPECTOR_V8CONSOLEMESSAGE_H_
6f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define V8_INSPECTOR_V8CONSOLEMESSAGE_H_
7f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
8f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include <deque>
9f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "include/v8.h"
10f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/inspector/protocol/Console.h"
11f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/inspector/protocol/Forward.h"
12f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/inspector/protocol/Runtime.h"
13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
14f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace v8_inspector {
15f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass InspectedContext;
17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8InspectorImpl;
18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8InspectorSessionImpl;
19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8StackTraceImpl;
20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochenum class V8MessageOrigin { kConsole, kException, kRevokedException };
22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
23f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochenum class ConsoleAPIType {
24f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kLog,
25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kDebug,
26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kInfo,
27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kError,
28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kWarning,
29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kDir,
30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kDirXML,
31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kTable,
32f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kTrace,
33f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kStartGroup,
34f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kStartGroupCollapsed,
35f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kEndGroup,
36f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kClear,
37f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kAssert,
38f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kTimeEnd,
39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  kCount
40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch};
41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
42f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8ConsoleMessage {
43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public:
44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ~V8ConsoleMessage();
45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static std::unique_ptr<V8ConsoleMessage> createForConsoleAPI(
47f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      double timestamp, ConsoleAPIType,
48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      const std::vector<v8::Local<v8::Value>>& arguments,
49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      std::unique_ptr<V8StackTraceImpl>, InspectedContext*);
50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static std::unique_ptr<V8ConsoleMessage> createForException(
52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      double timestamp, const String16& detailedMessage, const String16& url,
53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      unsigned lineNumber, unsigned columnNumber,
54f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      std::unique_ptr<V8StackTraceImpl>, int scriptId, v8::Isolate*,
55f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      const String16& message, int contextId, v8::Local<v8::Value> exception,
56f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      unsigned exceptionId);
57f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
58f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  static std::unique_ptr<V8ConsoleMessage> createForRevokedException(
59f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      double timestamp, const String16& message, unsigned revokedExceptionId);
60f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
61f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V8MessageOrigin origin() const;
62f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void reportToFrontend(protocol::Console::Frontend*) const;
63f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void reportToFrontend(protocol::Runtime::Frontend*, V8InspectorSessionImpl*,
64f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                        bool generatePreview) const;
65f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ConsoleAPIType type() const;
66f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void contextDestroyed(int contextId);
67f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
6862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int estimatedSize() const {
6962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return m_v8Size + static_cast<int>(m_message.length() * sizeof(UChar));
7062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
7162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
72f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private:
73f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V8ConsoleMessage(V8MessageOrigin, double timestamp, const String16& message);
74f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
75f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  using Arguments = std::vector<std::unique_ptr<v8::Global<v8::Value>>>;
76f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  std::unique_ptr<protocol::Array<protocol::Runtime::RemoteObject>>
77f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  wrapArguments(V8InspectorSessionImpl*, bool generatePreview) const;
78f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  std::unique_ptr<protocol::Runtime::RemoteObject> wrapException(
79f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      V8InspectorSessionImpl*, bool generatePreview) const;
80f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void setLocation(const String16& url, unsigned lineNumber,
81f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                   unsigned columnNumber, std::unique_ptr<V8StackTraceImpl>,
82f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                   int scriptId);
83f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
84f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V8MessageOrigin m_origin;
85f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  double m_timestamp;
86f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  String16 m_message;
87f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  String16 m_url;
88f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  unsigned m_lineNumber;
89f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  unsigned m_columnNumber;
90f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  std::unique_ptr<V8StackTraceImpl> m_stackTrace;
91f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int m_scriptId;
92f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int m_contextId;
93f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ConsoleAPIType m_type;
94f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  unsigned m_exceptionId;
95f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  unsigned m_revokedExceptionId;
9662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int m_v8Size = 0;
97f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Arguments m_arguments;
98f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  String16 m_detailedMessage;
99f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch};
100f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
101f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass V8ConsoleMessageStorage {
102f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public:
103f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V8ConsoleMessageStorage(V8InspectorImpl*, int contextGroupId);
104f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ~V8ConsoleMessageStorage();
105f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
106f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int contextGroupId() { return m_contextGroupId; }
107f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  const std::deque<std::unique_ptr<V8ConsoleMessage>>& messages() const {
108f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return m_messages;
109f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
110f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
111f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void addMessage(std::unique_ptr<V8ConsoleMessage>);
112f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void contextDestroyed(int contextId);
113f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void clear();
114f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
115f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private:
116f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  V8InspectorImpl* m_inspector;
117f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int m_contextGroupId;
11862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  int m_estimatedSize = 0;
119f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  std::deque<std::unique_ptr<V8ConsoleMessage>> m_messages;
120f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch};
121f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
122f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace v8_inspector
123f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
124f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#endif  // V8_INSPECTOR_V8CONSOLEMESSAGE_H_
125