| Index: src/inspector/v8-console-message.cc
|
| diff --git a/src/inspector/v8-console-message.cc b/src/inspector/v8-console-message.cc
|
| index e82c8c8a14533af34e0a2e8ed3e21f7e2e272d38..d4ae7d8fe450bfbb7e1893f063150f665a1b7d2c 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"
|
| @@ -58,6 +59,7 @@ String16 consoleAPITypeValue(ConsoleAPIType type) {
|
| }
|
|
|
| const unsigned maxConsoleMessageCount = 1000;
|
| +const int maxConsoleMessageV8Size = 10 * 1024 * 1024;
|
| const unsigned maxArrayItemsLimit = 10000;
|
| const unsigned maxStackDepthLimit = 32;
|
|
|
| @@ -371,9 +373,12 @@ 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)
|
| + 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);
|
|
|
| @@ -430,6 +435,8 @@ std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForException(
|
| consoleMessage->m_arguments.push_back(
|
| std::unique_ptr<v8::Global<v8::Value>>(
|
| new v8::Global<v8::Value>(isolate, exception)));
|
| + consoleMessage->m_v8Size +=
|
| + v8::debug::EstimatedValueSize(isolate, exception);
|
| }
|
| return consoleMessage;
|
| }
|
| @@ -450,15 +457,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(); }
|
|
|
| @@ -479,23 +485,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
|
|
|