diff options
Diffstat (limited to 'src/inspector/v8-console-message.cc')
-rw-r--r-- | src/inspector/v8-console-message.cc | 80 |
1 files changed, 50 insertions, 30 deletions
diff --git a/src/inspector/v8-console-message.cc b/src/inspector/v8-console-message.cc index 63f1d49f..73f74e4f 100644 --- a/src/inspector/v8-console-message.cc +++ b/src/inspector/v8-console-message.cc @@ -4,6 +4,7 @@ #include "src/inspector/v8-console-message.h" +#include "src/debug/debug-interface.h" #include "src/inspector/inspected-context.h" #include "src/inspector/protocol/Protocol.h" #include "src/inspector/string-util.h" @@ -50,14 +51,15 @@ String16 consoleAPITypeValue(ConsoleAPIType type) { case ConsoleAPIType::kAssert: return protocol::Runtime::ConsoleAPICalled::TypeEnum::Assert; case ConsoleAPIType::kTimeEnd: - return protocol::Runtime::ConsoleAPICalled::TypeEnum::Debug; + return protocol::Runtime::ConsoleAPICalled::TypeEnum::TimeEnd; case ConsoleAPIType::kCount: - return protocol::Runtime::ConsoleAPICalled::TypeEnum::Debug; + return protocol::Runtime::ConsoleAPICalled::TypeEnum::Count; } return protocol::Runtime::ConsoleAPICalled::TypeEnum::Log; } const unsigned maxConsoleMessageCount = 1000; +const int maxConsoleMessageV8Size = 10 * 1024 * 1024; const unsigned maxArrayItemsLimit = 10000; const unsigned maxStackDepthLimit = 32; @@ -361,7 +363,7 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForConsoleAPI( V8InspectorImpl* inspector = inspectedContext->inspector(); v8::Local<v8::Context> context = inspectedContext->context(); - std::unique_ptr<V8ConsoleMessage> message = wrapUnique( + std::unique_ptr<V8ConsoleMessage> message( new V8ConsoleMessage(V8MessageOrigin::kConsole, timestamp, String16())); if (stackTrace && !stackTrace->isEmpty()) { message->m_url = toString16(stackTrace->topSourceURL()); @@ -371,28 +373,34 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForConsoleAPI( message->m_stackTrace = std::move(stackTrace); message->m_type = type; message->m_contextId = contextId; - for (size_t i = 0; i < arguments.size(); ++i) - message->m_arguments.push_back( - wrapUnique(new v8::Global<v8::Value>(isolate, arguments.at(i)))); + for (size_t i = 0; i < arguments.size(); ++i) { + message->m_arguments.push_back(std::unique_ptr<v8::Global<v8::Value>>( + new v8::Global<v8::Value>(isolate, arguments.at(i)))); + message->m_v8Size += + v8::debug::EstimatedValueSize(isolate, arguments.at(i)); + } if (arguments.size()) message->m_message = V8ValueStringBuilder::toString(arguments[0], context); - V8ConsoleAPIType clientType = V8ConsoleAPIType::kLog; + v8::Isolate::MessageErrorLevel clientLevel = v8::Isolate::kMessageInfo; if (type == ConsoleAPIType::kDebug || type == ConsoleAPIType::kCount || - type == ConsoleAPIType::kTimeEnd) - clientType = V8ConsoleAPIType::kDebug; - else if (type == ConsoleAPIType::kError || type == ConsoleAPIType::kAssert) - clientType = V8ConsoleAPIType::kError; - else if (type == ConsoleAPIType::kWarning) - clientType = V8ConsoleAPIType::kWarning; - else if (type == ConsoleAPIType::kInfo) - clientType = V8ConsoleAPIType::kInfo; - else if (type == ConsoleAPIType::kClear) - clientType = V8ConsoleAPIType::kClear; - inspector->client()->consoleAPIMessage( - contextGroupId, clientType, toStringView(message->m_message), - toStringView(message->m_url), message->m_lineNumber, - message->m_columnNumber, message->m_stackTrace.get()); + type == ConsoleAPIType::kTimeEnd) { + clientLevel = v8::Isolate::kMessageDebug; + } else if (type == ConsoleAPIType::kError || + type == ConsoleAPIType::kAssert) { + clientLevel = v8::Isolate::kMessageError; + } else if (type == ConsoleAPIType::kWarning) { + clientLevel = v8::Isolate::kMessageWarning; + } else if (type == ConsoleAPIType::kInfo || type == ConsoleAPIType::kLog) { + clientLevel = v8::Isolate::kMessageInfo; + } + + if (type != ConsoleAPIType::kClear) { + inspector->client()->consoleAPIMessage( + contextGroupId, clientLevel, toStringView(message->m_message), + toStringView(message->m_url), message->m_lineNumber, + message->m_columnNumber, message->m_stackTrace.get()); + } return message; } @@ -404,7 +412,7 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForException( std::unique_ptr<V8StackTraceImpl> stackTrace, int scriptId, v8::Isolate* isolate, const String16& message, int contextId, v8::Local<v8::Value> exception, unsigned exceptionId) { - std::unique_ptr<V8ConsoleMessage> consoleMessage = wrapUnique( + std::unique_ptr<V8ConsoleMessage> consoleMessage( new V8ConsoleMessage(V8MessageOrigin::kException, timestamp, message)); consoleMessage->setLocation(url, lineNumber, columnNumber, std::move(stackTrace), scriptId); @@ -413,7 +421,10 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForException( if (contextId && !exception.IsEmpty()) { consoleMessage->m_contextId = contextId; consoleMessage->m_arguments.push_back( - wrapUnique(new v8::Global<v8::Value>(isolate, exception))); + std::unique_ptr<v8::Global<v8::Value>>( + new v8::Global<v8::Value>(isolate, exception))); + consoleMessage->m_v8Size += + v8::debug::EstimatedValueSize(isolate, exception); } return consoleMessage; } @@ -422,7 +433,7 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForException( std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForRevokedException( double timestamp, const String16& messageText, unsigned revokedExceptionId) { - std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage( + std::unique_ptr<V8ConsoleMessage> message(new V8ConsoleMessage( V8MessageOrigin::kRevokedException, timestamp, messageText)); message->m_revokedExceptionId = revokedExceptionId; return message; @@ -434,15 +445,14 @@ void V8ConsoleMessage::contextDestroyed(int contextId) { if (m_message.isEmpty()) m_message = "<message collected>"; Arguments empty; m_arguments.swap(empty); + m_v8Size = 0; } // ------------------------ V8ConsoleMessageStorage ---------------------------- V8ConsoleMessageStorage::V8ConsoleMessageStorage(V8InspectorImpl* inspector, int contextGroupId) - : m_inspector(inspector), - m_contextGroupId(contextGroupId), - m_expiredCount(0) {} + : m_inspector(inspector), m_contextGroupId(contextGroupId) {} V8ConsoleMessageStorage::~V8ConsoleMessageStorage() { clear(); } @@ -463,23 +473,33 @@ void V8ConsoleMessageStorage::addMessage( DCHECK(m_messages.size() <= maxConsoleMessageCount); if (m_messages.size() == maxConsoleMessageCount) { - ++m_expiredCount; + m_estimatedSize -= m_messages.front()->estimatedSize(); + m_messages.pop_front(); + } + while (m_estimatedSize + message->estimatedSize() > maxConsoleMessageV8Size && + !m_messages.empty()) { + m_estimatedSize -= m_messages.front()->estimatedSize(); m_messages.pop_front(); } + m_messages.push_back(std::move(message)); + m_estimatedSize += m_messages.back()->estimatedSize(); } void V8ConsoleMessageStorage::clear() { m_messages.clear(); - m_expiredCount = 0; + m_estimatedSize = 0; if (V8InspectorSessionImpl* session = m_inspector->sessionForContextGroup(m_contextGroupId)) session->releaseObjectGroup("console"); } void V8ConsoleMessageStorage::contextDestroyed(int contextId) { - for (size_t i = 0; i < m_messages.size(); ++i) + m_estimatedSize = 0; + for (size_t i = 0; i < m_messages.size(); ++i) { m_messages[i]->contextDestroyed(contextId); + m_estimatedSize += m_messages[i]->estimatedSize(); + } } } // namespace v8_inspector |