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

Side by Side Diff: third_party/WebKit/Source/platform/v8_inspector/V8ConsoleMessage.cpp

Issue 2139543002: [DevTools] Report console API calls through Runtime. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tests pass Created 4 years, 5 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium 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 "platform/v8_inspector/V8ConsoleMessage.h" 5 #include "platform/v8_inspector/V8ConsoleMessage.h"
6 6
7 #include "platform/v8_inspector/InspectedContext.h" 7 #include "platform/v8_inspector/InspectedContext.h"
8 #include "platform/v8_inspector/V8ConsoleAgentImpl.h" 8 #include "platform/v8_inspector/V8ConsoleAgentImpl.h"
9 #include "platform/v8_inspector/V8DebuggerImpl.h" 9 #include "platform/v8_inspector/V8DebuggerImpl.h"
10 #include "platform/v8_inspector/V8InspectorSessionImpl.h" 10 #include "platform/v8_inspector/V8InspectorSessionImpl.h"
(...skipping 21 matching lines...) Expand all
32 case DeprecationMessageSource: return protocol::Console::ConsoleMessage::Sou rceEnum::Deprecation; 32 case DeprecationMessageSource: return protocol::Console::ConsoleMessage::Sou rceEnum::Deprecation;
33 case WorkerMessageSource: return protocol::Console::ConsoleMessage::SourceEn um::Worker; 33 case WorkerMessageSource: return protocol::Console::ConsoleMessage::SourceEn um::Worker;
34 } 34 }
35 return protocol::Console::ConsoleMessage::SourceEnum::Other; 35 return protocol::Console::ConsoleMessage::SourceEnum::Other;
36 } 36 }
37 37
38 38
39 String consoleAPITypeValue(ConsoleAPIType type) 39 String consoleAPITypeValue(ConsoleAPIType type)
40 { 40 {
41 switch (type) { 41 switch (type) {
42 case ConsoleAPIType::kLog: return protocol::Console::ConsoleMessage::TypeEnu m::Log; 42 case ConsoleAPIType::kLog: return protocol::Runtime::ConsoleAPICall::TypeEnu m::Log;
43 case ConsoleAPIType::kClear: return protocol::Console::ConsoleMessage::TypeE num::Clear; 43 case ConsoleAPIType::kDebug: return protocol::Runtime::ConsoleAPICall::TypeE num::Debug;
44 case ConsoleAPIType::kDir: return protocol::Console::ConsoleMessage::TypeEnu m::Dir; 44 case ConsoleAPIType::kInfo: return protocol::Runtime::ConsoleAPICall::TypeEn um::Info;
45 case ConsoleAPIType::kDirXML: return protocol::Console::ConsoleMessage::Type Enum::Dirxml; 45 case ConsoleAPIType::kError: return protocol::Runtime::ConsoleAPICall::TypeE num::Error;
46 case ConsoleAPIType::kTable: return protocol::Console::ConsoleMessage::TypeE num::Table; 46 case ConsoleAPIType::kWarning: return protocol::Runtime::ConsoleAPICall::Typ eEnum::Warning;
47 case ConsoleAPIType::kTrace: return protocol::Console::ConsoleMessage::TypeE num::Trace; 47 case ConsoleAPIType::kClear: return protocol::Runtime::ConsoleAPICall::TypeE num::Clear;
48 case ConsoleAPIType::kStartGroup: return protocol::Console::ConsoleMessage:: TypeEnum::StartGroup; 48 case ConsoleAPIType::kDir: return protocol::Runtime::ConsoleAPICall::TypeEnu m::Dir;
49 case ConsoleAPIType::kStartGroupCollapsed: return protocol::Console::Console Message::TypeEnum::StartGroupCollapsed; 49 case ConsoleAPIType::kDirXML: return protocol::Runtime::ConsoleAPICall::Type Enum::Dirxml;
50 case ConsoleAPIType::kEndGroup: return protocol::Console::ConsoleMessage::Ty peEnum::EndGroup; 50 case ConsoleAPIType::kTable: return protocol::Runtime::ConsoleAPICall::TypeE num::Table;
51 case ConsoleAPIType::kAssert: return protocol::Console::ConsoleMessage::Type Enum::Assert; 51 case ConsoleAPIType::kTrace: return protocol::Runtime::ConsoleAPICall::TypeE num::Trace;
52 case ConsoleAPIType::kTimeEnd: return protocol::Console::ConsoleMessage::Typ eEnum::Log; 52 case ConsoleAPIType::kStartGroup: return protocol::Runtime::ConsoleAPICall:: TypeEnum::StartGroup;
53 case ConsoleAPIType::kCount: return protocol::Console::ConsoleMessage::TypeE num::Log; 53 case ConsoleAPIType::kStartGroupCollapsed: return protocol::Runtime::Console APICall::TypeEnum::StartGroupCollapsed;
54 case ConsoleAPIType::kEndGroup: return protocol::Runtime::ConsoleAPICall::Ty peEnum::EndGroup;
55 case ConsoleAPIType::kAssert: return protocol::Runtime::ConsoleAPICall::Type Enum::Assert;
56 case ConsoleAPIType::kTimeEnd: return protocol::Runtime::ConsoleAPICall::Typ eEnum::Debug;
57 case ConsoleAPIType::kCount: return protocol::Runtime::ConsoleAPICall::TypeE num::Debug;
54 } 58 }
55 return protocol::Console::ConsoleMessage::TypeEnum::Log; 59 return protocol::Runtime::ConsoleAPICall::TypeEnum::Log;
56 } 60 }
57 61
58 String messageLevelValue(MessageLevel level) 62 String messageLevelValue(MessageLevel level)
59 { 63 {
60 switch (level) { 64 switch (level) {
61 case DebugMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum: :Debug; 65 case DebugMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum: :Debug;
62 case LogMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum::L og; 66 case LogMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum::L og;
63 case WarningMessageLevel: return protocol::Console::ConsoleMessage::LevelEnu m::Warning; 67 case WarningMessageLevel: return protocol::Console::ConsoleMessage::LevelEnu m::Warning;
64 case ErrorMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum: :Error; 68 case ErrorMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum: :Error;
65 case InfoMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum:: Info; 69 case InfoMessageLevel: return protocol::Console::ConsoleMessage::LevelEnum:: Info;
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 { 226 {
223 m_url = url; 227 m_url = url;
224 m_lineNumber = lineNumber; 228 m_lineNumber = lineNumber;
225 m_columnNumber = columnNumber; 229 m_columnNumber = columnNumber;
226 m_stackTrace = std::move(stackTrace); 230 m_stackTrace = std::move(stackTrace);
227 m_scriptId = scriptId; 231 m_scriptId = scriptId;
228 } 232 }
229 233
230 void V8ConsoleMessage::reportToFrontend(protocol::Console::Frontend* frontend, V 8InspectorSessionImpl* session, bool generatePreview) const 234 void V8ConsoleMessage::reportToFrontend(protocol::Console::Frontend* frontend, V 8InspectorSessionImpl* session, bool generatePreview) const
231 { 235 {
232 DCHECK_EQ(V8MessageOrigin::kConsole, m_origin); 236 DCHECK_EQ(V8MessageOrigin::kExternalConsole, m_origin);
233 std::unique_ptr<protocol::Console::ConsoleMessage> result = 237 std::unique_ptr<protocol::Console::ConsoleMessage> result =
234 protocol::Console::ConsoleMessage::create() 238 protocol::Console::ConsoleMessage::create()
235 .setSource(messageSourceValue(m_source)) 239 .setSource(messageSourceValue(m_source))
236 .setLevel(messageLevelValue(m_level)) 240 .setLevel(messageLevelValue(m_level))
237 .setText(m_message) 241 .setText(m_message)
238 .setTimestamp(m_timestamp / 1000) // TODO(dgozman): migrate this to mill iseconds. 242 .setTimestamp(m_timestamp / 1000) // TODO(dgozman): migrate this to mill iseconds.
239 .build(); 243 .build();
240 result->setType(consoleAPITypeValue(m_type)); 244 result->setType(consoleAPITypeValue(m_type));
241 result->setLine(static_cast<int>(m_lineNumber)); 245 result->setLine(static_cast<int>(m_lineNumber));
242 result->setColumn(static_cast<int>(m_columnNumber)); 246 result->setColumn(static_cast<int>(m_columnNumber));
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 if (exception) 315 if (exception)
312 frontend->exceptionThrown(m_exceptionId, m_timestamp, std::move(deta ils), std::move(exception), m_contextId); 316 frontend->exceptionThrown(m_exceptionId, m_timestamp, std::move(deta ils), std::move(exception), m_contextId);
313 else 317 else
314 frontend->exceptionThrown(m_exceptionId, m_timestamp, std::move(deta ils)); 318 frontend->exceptionThrown(m_exceptionId, m_timestamp, std::move(deta ils));
315 return; 319 return;
316 } 320 }
317 if (m_origin == V8MessageOrigin::kRevokedException) { 321 if (m_origin == V8MessageOrigin::kRevokedException) {
318 frontend->exceptionRevoked(m_timestamp, m_message, m_revokedExceptionId) ; 322 frontend->exceptionRevoked(m_timestamp, m_message, m_revokedExceptionId) ;
319 return; 323 return;
320 } 324 }
325 if (m_origin == V8MessageOrigin::kConsole) {
326 std::unique_ptr<protocol::Array<protocol::Runtime::RemoteObject>> argume nts = wrapArguments(session, generatePreview);
327 if (!arguments) {
328 arguments = protocol::Array<protocol::Runtime::RemoteObject>::create ();
329 if (!m_message.isEmpty()) {
330 std::unique_ptr<protocol::Runtime::RemoteObject> messageArg = pr otocol::Runtime::RemoteObject::create().setType(protocol::Runtime::RemoteObject: :TypeEnum::String).build();
331 messageArg->setValue(protocol::StringValue::create(m_message));
332 arguments->addItem(std::move(messageArg));
333 }
334 }
335 if (m_stackTrace)
336 frontend->consoleAPICall(m_timestamp, consoleAPITypeValue(m_type), s td::move(arguments), m_contextId, m_stackTrace->buildInspectorObject());
337 else
338 frontend->consoleAPICall(m_timestamp, consoleAPITypeValue(m_type), s td::move(arguments), m_contextId);
339 return;
340 }
321 NOTREACHED(); 341 NOTREACHED();
322 } 342 }
323 343
324 std::unique_ptr<protocol::Runtime::RemoteObject> V8ConsoleMessage::wrapException (V8InspectorSessionImpl* session, bool generatePreview) const 344 std::unique_ptr<protocol::Runtime::RemoteObject> V8ConsoleMessage::wrapException (V8InspectorSessionImpl* session, bool generatePreview) const
325 { 345 {
326 if (!m_arguments.size() || !m_contextId) 346 if (!m_arguments.size() || !m_contextId)
327 return nullptr; 347 return nullptr;
328 DCHECK_EQ(1u, m_arguments.size()); 348 DCHECK_EQ(1u, m_arguments.size());
329 InspectedContext* inspectedContext = session->debugger()->getContext(session ->contextGroupId(), m_contextId); 349 InspectedContext* inspectedContext = session->debugger()->getContext(session ->contextGroupId(), m_contextId);
330 if (!inspectedContext) 350 if (!inspectedContext)
(...skipping 14 matching lines...) Expand all
345 { 365 {
346 return m_arguments.size(); 366 return m_arguments.size();
347 } 367 }
348 368
349 ConsoleAPIType V8ConsoleMessage::type() const 369 ConsoleAPIType V8ConsoleMessage::type() const
350 { 370 {
351 return m_type; 371 return m_type;
352 } 372 }
353 373
354 // static 374 // static
355 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForConsoleAPI(double t imestamp, ConsoleAPIType type, MessageLevel level, const String16& messageText, std::vector<v8::Local<v8::Value>>* arguments, std::unique_ptr<V8StackTrace> stac kTrace, InspectedContext* context) 375 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForConsoleAPI(double t imestamp, ConsoleAPIType type, const std::vector<v8::Local<v8::Value>>& argument s, std::unique_ptr<V8StackTrace> stackTrace, InspectedContext* context)
356 { 376 {
377 std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage( V8MessageOrigin::kConsole, timestamp, ConsoleAPIMessageSource, LogMessageLevel, String16()));
378 message->m_stackTrace = std::move(stackTrace);
379 message->m_type = type;
380 message->m_contextId = context->contextId();
381 for (size_t i = 0; i < arguments.size(); ++i)
382 message->m_arguments.push_back(wrapUnique(new v8::Global<v8::Value>(cont ext->isolate(), arguments.at(i))));
383 if (arguments.size())
384 message->m_message = V8ValueStringBuilder::toString(arguments[0], contex t->isolate());
385
386 MessageLevel level = LogMessageLevel;
387 if (type == ConsoleAPIType::kDebug || type == ConsoleAPIType::kCount || type == ConsoleAPIType::kTimeEnd)
388 level = DebugMessageLevel;
389 if (type == ConsoleAPIType::kError || type == ConsoleAPIType::kAssert)
390 level = ErrorMessageLevel;
391 if (type == ConsoleAPIType::kWarning)
392 level = WarningMessageLevel;
393 if (type == ConsoleAPIType::kInfo)
394 level = InfoMessageLevel;
357 String16 url; 395 String16 url;
358 unsigned lineNumber = 0; 396 unsigned lineNumber = 0;
359 unsigned columnNumber = 0; 397 unsigned columnNumber = 0;
360 if (stackTrace && !stackTrace->isEmpty()) { 398 if (message->m_stackTrace && !message->m_stackTrace->isEmpty()) {
361 url = stackTrace->topSourceURL(); 399 url = message->m_stackTrace->topSourceURL();
362 lineNumber = stackTrace->topLineNumber(); 400 lineNumber = message->m_stackTrace->topLineNumber();
363 columnNumber = stackTrace->topColumnNumber(); 401 columnNumber = message->m_stackTrace->topColumnNumber();
364 } 402 }
403 context->debugger()->client()->consoleAPIMessage(context->contextGroupId(), level, message->m_message, url, lineNumber, columnNumber, message->m_stackTrace. get());
365 404
366 String16 actualMessage = messageText;
367
368 Arguments messageArguments;
369 if (arguments && arguments->size()) {
370 for (size_t i = 0; i < arguments->size(); ++i)
371 messageArguments.push_back(wrapUnique(new v8::Global<v8::Value>(cont ext->isolate(), arguments->at(i))));
372 if (actualMessage.isEmpty())
373 actualMessage = V8ValueStringBuilder::toString(messageArguments.at(0 )->Get(context->isolate()), context->isolate());
374 }
375
376 std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage( V8MessageOrigin::kConsole, timestamp, ConsoleAPIMessageSource, level, actualMess age));
377 message->setLocation(url, lineNumber, columnNumber, std::move(stackTrace), 0 );
378 message->m_type = type;
379 if (messageArguments.size()) {
380 message->m_contextId = context->contextId();
381 message->m_arguments.swap(messageArguments);
382 }
383
384 context->debugger()->client()->messageAddedToConsole(context->contextGroupId (), message->m_source, message->m_level, message->m_message, message->m_url, mes sage->m_lineNumber, message->m_columnNumber, message->m_stackTrace.get());
385 return message; 405 return message;
386 } 406 }
387 407
388 // static 408 // static
389 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForException(double ti mestamp, const String16& messageText, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr<V8StackTrace> stackTrace, int scriptId, v 8::Isolate* isolate, int contextId, v8::Local<v8::Value> exception, unsigned exc eptionId) 409 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForException(double ti mestamp, const String16& messageText, const String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr<V8StackTrace> stackTrace, int scriptId, v 8::Isolate* isolate, int contextId, v8::Local<v8::Value> exception, unsigned exc eptionId)
390 { 410 {
391 std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage( V8MessageOrigin::kException, timestamp, JSMessageSource, ErrorMessageLevel, mess ageText)); 411 std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage( V8MessageOrigin::kException, timestamp, JSMessageSource, ErrorMessageLevel, mess ageText));
392 message->setLocation(url, lineNumber, columnNumber, std::move(stackTrace), s criptId); 412 message->setLocation(url, lineNumber, columnNumber, std::move(stackTrace), s criptId);
393 message->m_exceptionId = exceptionId; 413 message->m_exceptionId = exceptionId;
394 if (contextId && !exception.IsEmpty()) { 414 if (contextId && !exception.IsEmpty()) {
395 message->m_contextId = contextId; 415 message->m_contextId = contextId;
396 message->m_arguments.push_back(wrapUnique(new v8::Global<v8::Value>(isol ate, exception))); 416 message->m_arguments.push_back(wrapUnique(new v8::Global<v8::Value>(isol ate, exception)));
397 } 417 }
398 return message; 418 return message;
399 } 419 }
400 420
401 // static 421 // static
402 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForRevokedException(do uble timestamp, const String16& messageText, unsigned revokedExceptionId) 422 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createForRevokedException(do uble timestamp, const String16& messageText, unsigned revokedExceptionId)
403 { 423 {
404 std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage( V8MessageOrigin::kRevokedException, timestamp, JSMessageSource, ErrorMessageLeve l, messageText)); 424 std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage( V8MessageOrigin::kRevokedException, timestamp, JSMessageSource, ErrorMessageLeve l, messageText));
405 message->m_revokedExceptionId = revokedExceptionId; 425 message->m_revokedExceptionId = revokedExceptionId;
406 return message; 426 return message;
407 } 427 }
408 428
409 // static 429 // static
410 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createExternal(double timest amp, MessageSource source, MessageLevel level, const String16& messageText, cons t String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr<V8S tackTrace> stackTrace, int scriptId, const String16& requestIdentifier, const St ring16& workerId) 430 std::unique_ptr<V8ConsoleMessage> V8ConsoleMessage::createExternal(double timest amp, MessageSource source, MessageLevel level, const String16& messageText, cons t String16& url, unsigned lineNumber, unsigned columnNumber, std::unique_ptr<V8S tackTrace> stackTrace, int scriptId, const String16& requestIdentifier, const St ring16& workerId)
411 { 431 {
412 std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage( V8MessageOrigin::kConsole, timestamp, source, level, messageText)); 432 std::unique_ptr<V8ConsoleMessage> message = wrapUnique(new V8ConsoleMessage( V8MessageOrigin::kExternalConsole, timestamp, source, level, messageText));
413 message->setLocation(url, lineNumber, columnNumber, std::move(stackTrace), s criptId); 433 message->setLocation(url, lineNumber, columnNumber, std::move(stackTrace), s criptId);
414 message->m_requestIdentifier = requestIdentifier; 434 message->m_requestIdentifier = requestIdentifier;
415 message->m_workerId = workerId; 435 message->m_workerId = workerId;
416 return message; 436 return message;
417 } 437 }
418 438
419 void V8ConsoleMessage::contextDestroyed(int contextId) 439 void V8ConsoleMessage::contextDestroyed(int contextId)
420 { 440 {
421 if (contextId != m_contextId) 441 if (contextId != m_contextId)
422 return; 442 return;
(...skipping 18 matching lines...) Expand all
441 clear(); 461 clear();
442 } 462 }
443 463
444 void V8ConsoleMessageStorage::addMessage(std::unique_ptr<V8ConsoleMessage> messa ge) 464 void V8ConsoleMessageStorage::addMessage(std::unique_ptr<V8ConsoleMessage> messa ge)
445 { 465 {
446 if (message->type() == ConsoleAPIType::kClear) 466 if (message->type() == ConsoleAPIType::kClear)
447 clear(); 467 clear();
448 468
449 V8InspectorSessionImpl* session = m_debugger->sessionForContextGroup(m_conte xtGroupId); 469 V8InspectorSessionImpl* session = m_debugger->sessionForContextGroup(m_conte xtGroupId);
450 if (session) { 470 if (session) {
451 if (message->origin() == V8MessageOrigin::kConsole) 471 if (message->origin() == V8MessageOrigin::kExternalConsole)
452 session->consoleAgent()->messageAdded(message.get()); 472 session->consoleAgent()->messageAdded(message.get());
453 else 473 else
454 session->runtimeAgent()->exceptionMessageAdded(message.get()); 474 session->runtimeAgent()->messageAdded(message.get());
455 } 475 }
456 476
457 DCHECK(m_messages.size() <= maxConsoleMessageCount); 477 DCHECK(m_messages.size() <= maxConsoleMessageCount);
458 if (m_messages.size() == maxConsoleMessageCount) { 478 if (m_messages.size() == maxConsoleMessageCount) {
459 ++m_expiredCount; 479 ++m_expiredCount;
460 m_messages.pop_front(); 480 m_messages.pop_front();
461 } 481 }
462 m_messages.push_back(std::move(message)); 482 m_messages.push_back(std::move(message));
463 } 483 }
464 484
465 void V8ConsoleMessageStorage::clear() 485 void V8ConsoleMessageStorage::clear()
466 { 486 {
467 m_messages.clear(); 487 m_messages.clear();
468 m_expiredCount = 0; 488 m_expiredCount = 0;
469 V8InspectorSessionImpl* session = m_debugger->sessionForContextGroup(m_conte xtGroupId); 489 V8InspectorSessionImpl* session = m_debugger->sessionForContextGroup(m_conte xtGroupId);
470 if (session) { 490 if (session) {
471 session->consoleAgent()->reset(); 491 session->consoleAgent()->reset();
472 session->releaseObjectGroup("console"); 492 session->releaseObjectGroup("console");
473 session->client()->consoleCleared(); 493 session->client()->consoleCleared();
474 } 494 }
475 } 495 }
476 496
477 void V8ConsoleMessageStorage::contextDestroyed(int contextId) 497 void V8ConsoleMessageStorage::contextDestroyed(int contextId)
478 { 498 {
479 for (size_t i = 0; i < m_messages.size(); ++i) 499 for (size_t i = 0; i < m_messages.size(); ++i)
480 m_messages[i]->contextDestroyed(contextId); 500 m_messages[i]->contextDestroyed(contextId);
481 } 501 }
482 502
483 } // namespace blink 503 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698