| 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 += |
| 380 v8::debug::EstimatedValueSize(isolate, arguments.at(i)); |
| 381 } |
| 377 if (arguments.size()) | 382 if (arguments.size()) |
| 378 message->m_message = V8ValueStringBuilder::toString(arguments[0], context); | 383 message->m_message = V8ValueStringBuilder::toString(arguments[0], context); |
| 379 | 384 |
| 380 V8ConsoleAPIType clientType = V8ConsoleAPIType::kLog; | 385 V8ConsoleAPIType clientType = V8ConsoleAPIType::kLog; |
| 381 if (type == ConsoleAPIType::kDebug || type == ConsoleAPIType::kCount || | 386 if (type == ConsoleAPIType::kDebug || type == ConsoleAPIType::kCount || |
| 382 type == ConsoleAPIType::kTimeEnd) | 387 type == ConsoleAPIType::kTimeEnd) |
| 383 clientType = V8ConsoleAPIType::kDebug; | 388 clientType = V8ConsoleAPIType::kDebug; |
| 384 else if (type == ConsoleAPIType::kError || type == ConsoleAPIType::kAssert) | 389 else if (type == ConsoleAPIType::kError || type == ConsoleAPIType::kAssert) |
| 385 clientType = V8ConsoleAPIType::kError; | 390 clientType = V8ConsoleAPIType::kError; |
| 386 else if (type == ConsoleAPIType::kWarning) | 391 else if (type == ConsoleAPIType::kWarning) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 408 new V8ConsoleMessage(V8MessageOrigin::kException, timestamp, message)); | 413 new V8ConsoleMessage(V8MessageOrigin::kException, timestamp, message)); |
| 409 consoleMessage->setLocation(url, lineNumber, columnNumber, | 414 consoleMessage->setLocation(url, lineNumber, columnNumber, |
| 410 std::move(stackTrace), scriptId); | 415 std::move(stackTrace), scriptId); |
| 411 consoleMessage->m_exceptionId = exceptionId; | 416 consoleMessage->m_exceptionId = exceptionId; |
| 412 consoleMessage->m_detailedMessage = detailedMessage; | 417 consoleMessage->m_detailedMessage = detailedMessage; |
| 413 if (contextId && !exception.IsEmpty()) { | 418 if (contextId && !exception.IsEmpty()) { |
| 414 consoleMessage->m_contextId = contextId; | 419 consoleMessage->m_contextId = contextId; |
| 415 consoleMessage->m_arguments.push_back( | 420 consoleMessage->m_arguments.push_back( |
| 416 std::unique_ptr<v8::Global<v8::Value>>( | 421 std::unique_ptr<v8::Global<v8::Value>>( |
| 417 new v8::Global<v8::Value>(isolate, exception))); | 422 new v8::Global<v8::Value>(isolate, exception))); |
| 423 consoleMessage->m_v8Size += |
| 424 v8::debug::EstimatedValueSize(isolate, exception); |
| 418 } | 425 } |
| 419 return consoleMessage; | 426 return consoleMessage; |
| 420 } | 427 } |
| 421 | 428 |
| 422 // static | 429 // static |
| 423 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForRevokedException( | 430 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForRevokedException( |
| 424 double timestamp, const String16& messageText, | 431 double timestamp, const String16& messageText, |
| 425 unsigned revokedExceptionId) { | 432 unsigned revokedExceptionId) { |
| 426 std::unique_ptr<V8ConsoleMessage> message(new V8ConsoleMessage( | 433 std::unique_ptr<V8ConsoleMessage> message(new V8ConsoleMessage( |
| 427 V8MessageOrigin::kRevokedException, timestamp, messageText)); | 434 V8MessageOrigin::kRevokedException, timestamp, messageText)); |
| 428 message->m_revokedExceptionId = revokedExceptionId; | 435 message->m_revokedExceptionId = revokedExceptionId; |
| 429 return message; | 436 return message; |
| 430 } | 437 } |
| 431 | 438 |
| 432 void V8ConsoleMessage::contextDestroyed(int contextId) { | 439 void V8ConsoleMessage::contextDestroyed(int contextId) { |
| 433 if (contextId != m_contextId) return; | 440 if (contextId != m_contextId) return; |
| 434 m_contextId = 0; | 441 m_contextId = 0; |
| 435 if (m_message.isEmpty()) m_message = "<message collected>"; | 442 if (m_message.isEmpty()) m_message = "<message collected>"; |
| 436 Arguments empty; | 443 Arguments empty; |
| 437 m_arguments.swap(empty); | 444 m_arguments.swap(empty); |
| 445 m_v8Size = 0; |
| 438 } | 446 } |
| 439 | 447 |
| 440 // ------------------------ V8ConsoleMessageStorage ---------------------------- | 448 // ------------------------ V8ConsoleMessageStorage ---------------------------- |
| 441 | 449 |
| 442 V8ConsoleMessageStorage::V8ConsoleMessageStorage(V8InspectorImpl* inspector, | 450 V8ConsoleMessageStorage::V8ConsoleMessageStorage(V8InspectorImpl* inspector, |
| 443 int contextGroupId) | 451 int contextGroupId) |
| 444 : m_inspector(inspector), | 452 : m_inspector(inspector), m_contextGroupId(contextGroupId) {} |
| 445 m_contextGroupId(contextGroupId), | |
| 446 m_expiredCount(0) {} | |
| 447 | 453 |
| 448 V8ConsoleMessageStorage::~V8ConsoleMessageStorage() { clear(); } | 454 V8ConsoleMessageStorage::~V8ConsoleMessageStorage() { clear(); } |
| 449 | 455 |
| 450 void V8ConsoleMessageStorage::addMessage( | 456 void V8ConsoleMessageStorage::addMessage( |
| 451 std::unique_ptr<V8ConsoleMessage> message) { | 457 std::unique_ptr<V8ConsoleMessage> message) { |
| 452 int contextGroupId = m_contextGroupId; | 458 int contextGroupId = m_contextGroupId; |
| 453 V8InspectorImpl* inspector = m_inspector; | 459 V8InspectorImpl* inspector = m_inspector; |
| 454 if (message->type() == ConsoleAPIType::kClear) clear(); | 460 if (message->type() == ConsoleAPIType::kClear) clear(); |
| 455 | 461 |
| 456 V8InspectorSessionImpl* session = | 462 V8InspectorSessionImpl* session = |
| 457 inspector->sessionForContextGroup(contextGroupId); | 463 inspector->sessionForContextGroup(contextGroupId); |
| 458 if (session) { | 464 if (session) { |
| 459 if (message->origin() == V8MessageOrigin::kConsole) | 465 if (message->origin() == V8MessageOrigin::kConsole) |
| 460 session->consoleAgent()->messageAdded(message.get()); | 466 session->consoleAgent()->messageAdded(message.get()); |
| 461 session->runtimeAgent()->messageAdded(message.get()); | 467 session->runtimeAgent()->messageAdded(message.get()); |
| 462 } | 468 } |
| 463 if (!inspector->hasConsoleMessageStorage(contextGroupId)) return; | 469 if (!inspector->hasConsoleMessageStorage(contextGroupId)) return; |
| 464 | 470 |
| 465 DCHECK(m_messages.size() <= maxConsoleMessageCount); | 471 DCHECK(m_messages.size() <= maxConsoleMessageCount); |
| 466 if (m_messages.size() == maxConsoleMessageCount) { | 472 if (m_messages.size() == maxConsoleMessageCount) { |
| 467 ++m_expiredCount; | 473 m_estimatedSize -= m_messages.front()->estimatedSize(); |
| 468 m_messages.pop_front(); | 474 m_messages.pop_front(); |
| 469 } | 475 } |
| 476 while (m_estimatedSize + message->estimatedSize() > maxConsoleMessageV8Size && |
| 477 !m_messages.empty()) { |
| 478 m_estimatedSize -= m_messages.front()->estimatedSize(); |
| 479 m_messages.pop_front(); |
| 480 } |
| 481 |
| 470 m_messages.push_back(std::move(message)); | 482 m_messages.push_back(std::move(message)); |
| 483 m_estimatedSize += m_messages.back()->estimatedSize(); |
| 471 } | 484 } |
| 472 | 485 |
| 473 void V8ConsoleMessageStorage::clear() { | 486 void V8ConsoleMessageStorage::clear() { |
| 474 m_messages.clear(); | 487 m_messages.clear(); |
| 475 m_expiredCount = 0; | 488 m_estimatedSize = 0; |
| 476 if (V8InspectorSessionImpl* session = | 489 if (V8InspectorSessionImpl* session = |
| 477 m_inspector->sessionForContextGroup(m_contextGroupId)) | 490 m_inspector->sessionForContextGroup(m_contextGroupId)) |
| 478 session->releaseObjectGroup("console"); | 491 session->releaseObjectGroup("console"); |
| 479 } | 492 } |
| 480 | 493 |
| 481 void V8ConsoleMessageStorage::contextDestroyed(int contextId) { | 494 void V8ConsoleMessageStorage::contextDestroyed(int contextId) { |
| 482 for (size_t i = 0; i < m_messages.size(); ++i) | 495 m_estimatedSize = 0; |
| 496 for (size_t i = 0; i < m_messages.size(); ++i) { |
| 483 m_messages[i]->contextDestroyed(contextId); | 497 m_messages[i]->contextDestroyed(contextId); |
| 498 m_estimatedSize += m_messages[i]->estimatedSize(); |
| 499 } |
| 484 } | 500 } |
| 485 | 501 |
| 486 } // namespace v8_inspector | 502 } // namespace v8_inspector |
| OLD | NEW |