1c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)/*
2c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * Copyright (C) 2007 Apple Inc. All rights reserved.
3c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *
4c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * Redistribution and use in source and binary forms, with or without
5c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * modification, are permitted provided that the following conditions
6c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * are met:
7c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *
8c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
9c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
10c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
11c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
12c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *     documentation and/or other materials provided with the distribution.
13c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *     its contributors may be used to endorse or promote products derived
15c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *     from this software without specific prior written permission.
16c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) *
17c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles) */
28c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
29c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "config.h"
301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/Console.h"
31c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
32197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptCallStackFactory.h"
33c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "core/inspector/InspectorConsoleInstrumentation.h"
34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/inspector/InspectorTraceEvents.h"
35c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "core/inspector/ScriptArguments.h"
361e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/TraceEvent.h"
37c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/text/CString.h"
38c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/text/WTFString.h"
39c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
40c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
41c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
42c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)ConsoleBase::~ConsoleBase()
43c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
44c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
45c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
465d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::debug(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
47c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
48f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(LogMessageType, DebugMessageLevel, scriptState, arguments);
49c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
50c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::error(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
52c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
53f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(LogMessageType, ErrorMessageLevel, scriptState, arguments);
54c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
55c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::info(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
57c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
58f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(LogMessageType, InfoMessageLevel, scriptState, arguments);
59c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
60c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
615d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::log(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
62c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
63f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(LogMessageType, LogMessageLevel, scriptState, arguments);
64c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
65c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::warn(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
67c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
68f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(LogMessageType, WarningMessageLevel, scriptState, arguments);
69c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
70c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::dir(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
72c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
73f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(DirMessageType, LogMessageLevel, scriptState, arguments);
74c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
75c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
765d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::dirxml(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
77c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
78f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(DirXMLMessageType, LogMessageLevel, scriptState, arguments);
79c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
80c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::table(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
82c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
83f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(TableMessageType, LogMessageLevel, scriptState, arguments);
84c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
85c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::clear(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
87c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
889e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    internalAddMessage(ClearMessageType, LogMessageLevel, scriptState, arguments, true);
89c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
90c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
915d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::trace(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
92c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
93f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(TraceMessageType, LogMessageLevel, scriptState, arguments, true, true);
94c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
95c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
965d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::assertCondition(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments, bool condition)
97c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
98c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    if (condition)
99c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return;
100c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
101f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    internalAddMessage(AssertMessageType, ErrorMessageLevel, scriptState, arguments, true);
102c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
103c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1045d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::count(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
105c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<ScriptCallStack> callStack(createScriptCallStackForConsole(1));
1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    const ScriptCallFrame& lastCaller = callStack->at(0);
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Follow Firebug's behavior of counting with null and undefined title in
1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // the same bucket as no argument
1107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    String title;
1117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    arguments->getFirstArgumentAsString(title);
1127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    String identifier = title.isEmpty() ? String(lastCaller.sourceURL() + ':' + String::number(lastCaller.lineNumber()))
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        : String(title + '@');
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    HashCountedSet<String>::AddResult result = m_counts.add(identifier);
1167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    String message = title + ": " + String::number(result.storedValue->value);
1177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(ConsoleAPIMessageSource, DebugMessageLevel, message);
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    consoleMessage->setType(CountMessageType);
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    consoleMessage->setScriptState(scriptState);
1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    consoleMessage->setCallStack(callStack.release());
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    reportMessageToConsole(consoleMessage.release());
123c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
124c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
1259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void ConsoleBase::markTimeline(const String& title)
126c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
127197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    timeStamp(title);
128c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
129c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
130e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void ConsoleBase::profile(const String& title)
131c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
132e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    InspectorInstrumentation::consoleProfile(context(), title);
133c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
134c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
135e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)void ConsoleBase::profileEnd(const String& title)
136c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
137e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    InspectorInstrumentation::consoleProfileEnd(context(), title);
138c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
139c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
140c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)void ConsoleBase::time(const String& title)
141c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
1429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    InspectorInstrumentation::consoleTime(context(), title);
143197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT_COPY_ASYNC_BEGIN0("blink.console", title.utf8().data(), this);
1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (title.isNull())
1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
1477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_times.add(title, monotonicallyIncreasingTime());
149c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
150c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
151f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid ConsoleBase::timeEnd(ScriptState* scriptState, const String& title)
152c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
153197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT_COPY_ASYNC_END0("blink.console", title.utf8().data(), this);
154f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    InspectorInstrumentation::consoleTimeEnd(context(), title, scriptState);
1557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Follow Firebug's behavior of requiring a title that is not null or
1577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // undefined for timing functions
1587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (title.isNull())
1597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
1607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    HashMap<String, double>::iterator it = m_times.find(title);
1627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (it == m_times.end())
1637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return;
1647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double startTime = it->value;
1667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_times.remove(it);
1677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    double elapsed = monotonicallyIncreasingTime() - startTime;
1697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    String message = title + String::format(": %.3fms", elapsed * 1000);
1707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(ConsoleAPIMessageSource, DebugMessageLevel, message);
1727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    consoleMessage->setType(TimeEndMessageType);
1737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    consoleMessage->setScriptState(scriptState);
1747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    consoleMessage->setCallStack(createScriptCallStackForConsole(1));
1757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    reportMessageToConsole(consoleMessage.release());
1769bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1789bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void ConsoleBase::timeStamp(const String& title)
1799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
180197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"), "TimeStamp", "data", InspectorTimeStampEvent::data(context(), title));
181197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
1829bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    InspectorInstrumentation::consoleTimeStamp(context(), title);
1839bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic String formatTimelineTitle(const String& title)
1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{
1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    return String::format("Timeline '%s'", title.utf8().data());
1887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}
1897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
190f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid ConsoleBase::timeline(ScriptState* scriptState, const String& title)
1919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
193f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    InspectorInstrumentation::consoleTimeline(context(), title, scriptState);
1947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    TRACE_EVENT_COPY_ASYNC_BEGIN0("blink.console", formatTimelineTitle(title).utf8().data(), this);
196c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
197c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
198f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid ConsoleBase::timelineEnd(ScriptState* scriptState, const String& title)
199c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
2007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // FIXME(361045): remove InspectorInstrumentation calls once DevTools Timeline migrates to tracing.
201f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    InspectorInstrumentation::consoleTimelineEnd(context(), title, scriptState);
2027242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
2037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    TRACE_EVENT_COPY_ASYNC_END0("blink.console", formatTimelineTitle(title).utf8().data(), this);
204c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
205c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
2065d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::group(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
207c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
2089e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    internalAddMessage(StartGroupMessageType, LogMessageLevel, scriptState, arguments, true);
209c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
210c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
2115d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::groupCollapsed(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments)
212c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
2139e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    internalAddMessage(StartGroupCollapsedMessageType, LogMessageLevel, scriptState, arguments, true);
214c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
215c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
216c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)void ConsoleBase::groupEnd()
217c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
2189e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    internalAddMessage(EndGroupMessageType, LogMessageLevel, nullptr, nullptr, true);
219c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
220c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
2215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void ConsoleBase::internalAddMessage(MessageType type, MessageLevel level, ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> scriptArguments, bool acceptNoArguments, bool printTrace)
222c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles){
2235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<ScriptArguments> arguments = scriptArguments;
2249e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (!acceptNoArguments && (!arguments || !arguments->argumentCount()))
225c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)        return;
226c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
2279e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    String message;
2289e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    bool gotStringMessage = arguments ? arguments->getFirstArgumentAsString(message) : false;
2299e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
2309e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    RefPtrWillBeRawPtr<ConsoleMessage> consoleMessage = ConsoleMessage::create(ConsoleAPIMessageSource, level, gotStringMessage? message : String());
2319e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    consoleMessage->setType(type);
2329e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    consoleMessage->setScriptState(scriptState);
2339e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    consoleMessage->setScriptArguments(arguments);
2349e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)
235c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    size_t stackSize = printTrace ? ScriptCallStack::maxCallStackSizeToCapture : 1;
2367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    consoleMessage->setCallStack(createScriptCallStackForConsole(stackSize));
2379e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    reportMessageToConsole(consoleMessage.release());
238c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)}
239c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
240c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
241