Chromium Code Reviews| Index: src/inspector/v8-console-message.cc |
| diff --git a/src/inspector/v8-console-message.cc b/src/inspector/v8-console-message.cc |
| index e37738ebe43954f5591dc0d9d3b0268ad2f61108..98b0bbeac9b2625ed6242404f01c40ddb3bab6bf 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,11 @@ 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::ValueSize(isolate, arguments.at(i)); |
| + } |
| if (arguments.size()) |
| message->m_message = V8ValueStringBuilder::toString(arguments[0], context); |
| @@ -415,6 +419,7 @@ 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::ValueSize(isolate, exception); |
| } |
| return consoleMessage; |
| } |
| @@ -435,15 +440,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(); } |
| @@ -464,23 +468,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 && |
|
alph
2017/01/25 23:45:43
shouldn't you also count current message size?
kozy
2017/01/26 02:41:38
m_estimatedSize is current storage size, messages-
|
| + m_messages.size()) { |
|
alph
2017/01/25 23:45:43
nit: !m_messages.empty()
kozy
2017/01/26 02:41:38
Done.
|
| + 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 |