Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(335)

Side by Side Diff: src/inspector/v8-console-message.cc

Issue 2653293003: [inspector] introduced memory size limit for console message storage (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/inspector/v8-console-message.h ('k') | test/inspector/runtime/console-messages-limits.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/inspector/v8-console-message.h" 5 #include "src/inspector/v8-console-message.h"
6 6
7 #include "src/debug/debug-interface.h"
7 #include "src/inspector/inspected-context.h" 8 #include "src/inspector/inspected-context.h"
8 #include "src/inspector/protocol/Protocol.h" 9 #include "src/inspector/protocol/Protocol.h"
9 #include "src/inspector/string-util.h" 10 #include "src/inspector/string-util.h"
10 #include "src/inspector/v8-console-agent-impl.h" 11 #include "src/inspector/v8-console-agent-impl.h"
11 #include "src/inspector/v8-inspector-impl.h" 12 #include "src/inspector/v8-inspector-impl.h"
12 #include "src/inspector/v8-inspector-session-impl.h" 13 #include "src/inspector/v8-inspector-session-impl.h"
13 #include "src/inspector/v8-runtime-agent-impl.h" 14 #include "src/inspector/v8-runtime-agent-impl.h"
14 #include "src/inspector/v8-stack-trace-impl.h" 15 #include "src/inspector/v8-stack-trace-impl.h"
15 16
16 #include "include/v8-inspector.h" 17 #include "include/v8-inspector.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 return protocol::Runtime::ConsoleAPICalled::TypeEnum::Assert; 52 return protocol::Runtime::ConsoleAPICalled::TypeEnum::Assert;
52 case ConsoleAPIType::kTimeEnd: 53 case ConsoleAPIType::kTimeEnd:
53 return protocol::Runtime::ConsoleAPICalled::TypeEnum::Debug; 54 return protocol::Runtime::ConsoleAPICalled::TypeEnum::Debug;
54 case ConsoleAPIType::kCount: 55 case ConsoleAPIType::kCount:
55 return protocol::Runtime::ConsoleAPICalled::TypeEnum::Debug; 56 return protocol::Runtime::ConsoleAPICalled::TypeEnum::Debug;
56 } 57 }
57 return protocol::Runtime::ConsoleAPICalled::TypeEnum::Log; 58 return protocol::Runtime::ConsoleAPICalled::TypeEnum::Log;
58 } 59 }
59 60
60 const unsigned maxConsoleMessageCount = 1000; 61 const unsigned maxConsoleMessageCount = 1000;
62 const int maxConsoleMessageV8Size = 10 * 1024 * 1024;
61 const unsigned maxArrayItemsLimit = 10000; 63 const unsigned maxArrayItemsLimit = 10000;
62 const unsigned maxStackDepthLimit = 32; 64 const unsigned maxStackDepthLimit = 32;
63 65
64 class V8ValueStringBuilder { 66 class V8ValueStringBuilder {
65 public: 67 public:
66 static String16 toString(v8::Local<v8::Value> value, 68 static String16 toString(v8::Local<v8::Value> value,
67 v8::Local<v8::Context> context) { 69 v8::Local<v8::Context> context) {
68 V8ValueStringBuilder builder(context); 70 V8ValueStringBuilder builder(context);
69 if (!builder.append(value)) return String16(); 71 if (!builder.append(value)) return String16();
70 return builder.toString(); 72 return builder.toString();
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
364 std::unique_ptr<V8ConsoleMessage> message( 366 std::unique_ptr<V8ConsoleMessage> message(
365 new V8ConsoleMessage(V8MessageOrigin::kConsole, timestamp, String16())); 367 new V8ConsoleMessage(V8MessageOrigin::kConsole, timestamp, String16()));
366 if (stackTrace && !stackTrace->isEmpty()) { 368 if (stackTrace && !stackTrace->isEmpty()) {
367 message->m_url = toString16(stackTrace->topSourceURL()); 369 message->m_url = toString16(stackTrace->topSourceURL());
368 message->m_lineNumber = stackTrace->topLineNumber(); 370 message->m_lineNumber = stackTrace->topLineNumber();
369 message->m_columnNumber = stackTrace->topColumnNumber(); 371 message->m_columnNumber = stackTrace->topColumnNumber();
370 } 372 }
371 message->m_stackTrace = std::move(stackTrace); 373 message->m_stackTrace = std::move(stackTrace);
372 message->m_type = type; 374 message->m_type = type;
373 message->m_contextId = contextId; 375 message->m_contextId = contextId;
374 for (size_t i = 0; i < arguments.size(); ++i) 376 for (size_t i = 0; i < arguments.size(); ++i) {
375 message->m_arguments.push_back(std::unique_ptr<v8::Global<v8::Value>>( 377 message->m_arguments.push_back(std::unique_ptr<v8::Global<v8::Value>>(
376 new v8::Global<v8::Value>(isolate, arguments.at(i)))); 378 new v8::Global<v8::Value>(isolate, arguments.at(i))));
379 message->m_v8Size += v8::debug::ValueSize(isolate, arguments.at(i));
380 }
377 if (arguments.size()) 381 if (arguments.size())
378 message->m_message = V8ValueStringBuilder::toString(arguments[0], context); 382 message->m_message = V8ValueStringBuilder::toString(arguments[0], context);
379 383
380 V8ConsoleAPIType clientType = V8ConsoleAPIType::kLog; 384 V8ConsoleAPIType clientType = V8ConsoleAPIType::kLog;
381 if (type == ConsoleAPIType::kDebug || type == ConsoleAPIType::kCount || 385 if (type == ConsoleAPIType::kDebug || type == ConsoleAPIType::kCount ||
382 type == ConsoleAPIType::kTimeEnd) 386 type == ConsoleAPIType::kTimeEnd)
383 clientType = V8ConsoleAPIType::kDebug; 387 clientType = V8ConsoleAPIType::kDebug;
384 else if (type == ConsoleAPIType::kError || type == ConsoleAPIType::kAssert) 388 else if (type == ConsoleAPIType::kError || type == ConsoleAPIType::kAssert)
385 clientType = V8ConsoleAPIType::kError; 389 clientType = V8ConsoleAPIType::kError;
386 else if (type == ConsoleAPIType::kWarning) 390 else if (type == ConsoleAPIType::kWarning)
(...skipping 21 matching lines...) Expand all
408 new V8ConsoleMessage(V8MessageOrigin::kException, timestamp, message)); 412 new V8ConsoleMessage(V8MessageOrigin::kException, timestamp, message));
409 consoleMessage->setLocation(url, lineNumber, columnNumber, 413 consoleMessage->setLocation(url, lineNumber, columnNumber,
410 std::move(stackTrace), scriptId); 414 std::move(stackTrace), scriptId);
411 consoleMessage->m_exceptionId = exceptionId; 415 consoleMessage->m_exceptionId = exceptionId;
412 consoleMessage->m_detailedMessage = detailedMessage; 416 consoleMessage->m_detailedMessage = detailedMessage;
413 if (contextId && !exception.IsEmpty()) { 417 if (contextId && !exception.IsEmpty()) {
414 consoleMessage->m_contextId = contextId; 418 consoleMessage->m_contextId = contextId;
415 consoleMessage->m_arguments.push_back( 419 consoleMessage->m_arguments.push_back(
416 std::unique_ptr<v8::Global<v8::Value>>( 420 std::unique_ptr<v8::Global<v8::Value>>(
417 new v8::Global<v8::Value>(isolate, exception))); 421 new v8::Global<v8::Value>(isolate, exception)));
422 consoleMessage->m_v8Size += v8::debug::ValueSize(isolate, exception);
418 } 423 }
419 return consoleMessage; 424 return consoleMessage;
420 } 425 }
421 426
422 // static 427 // static
423 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForRevokedException( 428 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForRevokedException(
424 double timestamp, const String16& messageText, 429 double timestamp, const String16& messageText,
425 unsigned revokedExceptionId) { 430 unsigned revokedExceptionId) {
426 std::unique_ptr<V8ConsoleMessage> message(new V8ConsoleMessage( 431 std::unique_ptr<V8ConsoleMessage> message(new V8ConsoleMessage(
427 V8MessageOrigin::kRevokedException, timestamp, messageText)); 432 V8MessageOrigin::kRevokedException, timestamp, messageText));
428 message->m_revokedExceptionId = revokedExceptionId; 433 message->m_revokedExceptionId = revokedExceptionId;
429 return message; 434 return message;
430 } 435 }
431 436
432 void V8ConsoleMessage::contextDestroyed(int contextId) { 437 void V8ConsoleMessage::contextDestroyed(int contextId) {
433 if (contextId != m_contextId) return; 438 if (contextId != m_contextId) return;
434 m_contextId = 0; 439 m_contextId = 0;
435 if (m_message.isEmpty()) m_message = "<message collected>"; 440 if (m_message.isEmpty()) m_message = "<message collected>";
436 Arguments empty; 441 Arguments empty;
437 m_arguments.swap(empty); 442 m_arguments.swap(empty);
443 m_v8Size = 0;
438 } 444 }
439 445
440 // ------------------------ V8ConsoleMessageStorage ---------------------------- 446 // ------------------------ V8ConsoleMessageStorage ----------------------------
441 447
442 V8ConsoleMessageStorage::V8ConsoleMessageStorage(V8InspectorImpl* inspector, 448 V8ConsoleMessageStorage::V8ConsoleMessageStorage(V8InspectorImpl* inspector,
443 int contextGroupId) 449 int contextGroupId)
444 : m_inspector(inspector), 450 : m_inspector(inspector), m_contextGroupId(contextGroupId) {}
445 m_contextGroupId(contextGroupId),
446 m_expiredCount(0) {}
447 451
448 V8ConsoleMessageStorage::~V8ConsoleMessageStorage() { clear(); } 452 V8ConsoleMessageStorage::~V8ConsoleMessageStorage() { clear(); }
449 453
450 void V8ConsoleMessageStorage::addMessage( 454 void V8ConsoleMessageStorage::addMessage(
451 std::unique_ptr<V8ConsoleMessage> message) { 455 std::unique_ptr<V8ConsoleMessage> message) {
452 int contextGroupId = m_contextGroupId; 456 int contextGroupId = m_contextGroupId;
453 V8InspectorImpl* inspector = m_inspector; 457 V8InspectorImpl* inspector = m_inspector;
454 if (message->type() == ConsoleAPIType::kClear) clear(); 458 if (message->type() == ConsoleAPIType::kClear) clear();
455 459
456 V8InspectorSessionImpl* session = 460 V8InspectorSessionImpl* session =
457 inspector->sessionForContextGroup(contextGroupId); 461 inspector->sessionForContextGroup(contextGroupId);
458 if (session) { 462 if (session) {
459 if (message->origin() == V8MessageOrigin::kConsole) 463 if (message->origin() == V8MessageOrigin::kConsole)
460 session->consoleAgent()->messageAdded(message.get()); 464 session->consoleAgent()->messageAdded(message.get());
461 session->runtimeAgent()->messageAdded(message.get()); 465 session->runtimeAgent()->messageAdded(message.get());
462 } 466 }
463 if (!inspector->hasConsoleMessageStorage(contextGroupId)) return; 467 if (!inspector->hasConsoleMessageStorage(contextGroupId)) return;
464 468
465 DCHECK(m_messages.size() <= maxConsoleMessageCount); 469 DCHECK(m_messages.size() <= maxConsoleMessageCount);
466 if (m_messages.size() == maxConsoleMessageCount) { 470 if (m_messages.size() == maxConsoleMessageCount) {
467 ++m_expiredCount; 471 m_estimatedSize -= m_messages.front()->estimatedSize();
468 m_messages.pop_front(); 472 m_messages.pop_front();
469 } 473 }
474 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-
475 m_messages.size()) {
alph 2017/01/25 23:45:43 nit: !m_messages.empty()
kozy 2017/01/26 02:41:38 Done.
476 m_estimatedSize -= m_messages.front()->estimatedSize();
477 m_messages.pop_front();
478 }
479
470 m_messages.push_back(std::move(message)); 480 m_messages.push_back(std::move(message));
481 m_estimatedSize += m_messages.back()->estimatedSize();
471 } 482 }
472 483
473 void V8ConsoleMessageStorage::clear() { 484 void V8ConsoleMessageStorage::clear() {
474 m_messages.clear(); 485 m_messages.clear();
475 m_expiredCount = 0; 486 m_estimatedSize = 0;
476 if (V8InspectorSessionImpl* session = 487 if (V8InspectorSessionImpl* session =
477 m_inspector->sessionForContextGroup(m_contextGroupId)) 488 m_inspector->sessionForContextGroup(m_contextGroupId))
478 session->releaseObjectGroup("console"); 489 session->releaseObjectGroup("console");
479 } 490 }
480 491
481 void V8ConsoleMessageStorage::contextDestroyed(int contextId) { 492 void V8ConsoleMessageStorage::contextDestroyed(int contextId) {
482 for (size_t i = 0; i < m_messages.size(); ++i) 493 m_estimatedSize = 0;
494 for (size_t i = 0; i < m_messages.size(); ++i) {
483 m_messages[i]->contextDestroyed(contextId); 495 m_messages[i]->contextDestroyed(contextId);
496 m_estimatedSize += m_messages[i]->estimatedSize();
497 }
484 } 498 }
485 499
486 } // namespace v8_inspector 500 } // namespace v8_inspector
OLDNEW
« no previous file with comments | « src/inspector/v8-console-message.h ('k') | test/inspector/runtime/console-messages-limits.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698