OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |