15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009, 2010 Google Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1.  Redistributions of source code must retain the above copyright
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2.  Redistributions in binary form must reproduce the above copyright
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     notice, this list of conditions and the following disclaimer in the
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     documentation and/or other materials provided with the distribution.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     its contributors may be used to endorse or promote products derived
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     from this software without specific prior written permission.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ConsoleMessage.h"
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptCallStackFactory.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "bindings/v8/ScriptValue.h"
38aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch#include "core/dom/ExecutionContext.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/IdentifiersFactory.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScript.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScriptManager.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptArguments.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptCallFrame.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptCallStack.h"
455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/CurrentTime.h"
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source, MessageType type, MessageLevel level, const String& message)
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_source(source)
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_type(type)
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_level(level)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_message(message)
54f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_scriptState(0)
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_url()
56926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_line(0)
57591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    , m_column(0)
5853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    , m_requestId(IdentifiersFactory::requestId(0))
595267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_timestamp(WTF::currentTime())
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
61926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    autogenerateMetadata(canGenerateCallStack);
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
64f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source, MessageType type, MessageLevel level, const String& message, const String& url, unsigned line, unsigned column, ScriptState* scriptState, unsigned long requestIdentifier)
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_source(source)
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_type(type)
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_level(level)
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_message(message)
69f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_scriptState(scriptState)
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_url(url)
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_line(line)
72591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    , m_column(column)
73926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_requestId(IdentifiersFactory::requestId(requestIdentifier))
745267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_timestamp(WTF::currentTime())
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
76f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    autogenerateMetadata(canGenerateCallStack, scriptState);
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)ConsoleMessage::ConsoleMessage(bool, MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtrWillBeRawPtr<ScriptCallStack> callStack, unsigned long requestIdentifier)
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_source(source)
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_type(type)
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_level(level)
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_message(message)
84f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_scriptState(0)
85d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    , m_arguments(nullptr)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_line(0)
87591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    , m_column(0)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_requestId(IdentifiersFactory::requestId(requestIdentifier))
895267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_timestamp(WTF::currentTime())
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (callStack && callStack->size()) {
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const ScriptCallFrame& frame = callStack->at(0);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_url = frame.sourceURL();
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_line = frame.lineNumber();
95591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_column = frame.columnNumber();
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_callStack = callStack;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtrWillBeRawPtr<ScriptArguments> arguments, ScriptState* scriptState, unsigned long requestIdentifier)
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_source(source)
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_type(type)
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_level(level)
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_message(message)
105f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    , m_scriptState(scriptState)
106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_arguments(arguments)
107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_url()
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_line(0)
109591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    , m_column(0)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_requestId(IdentifiersFactory::requestId(requestIdentifier))
1115267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_timestamp(WTF::currentTime())
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
113f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    autogenerateMetadata(canGenerateCallStack, scriptState);
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ConsoleMessage::~ConsoleMessage()
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
120f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid ConsoleMessage::autogenerateMetadata(bool canGenerateCallStack, ScriptState* scriptState)
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_type == EndGroupMessageType)
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
125f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (scriptState)
126d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_callStack = createScriptCallStackForConsole(scriptState);
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (canGenerateCallStack)
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_callStack = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCapture, true);
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_callStack && m_callStack->size()) {
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const ScriptCallFrame& frame = m_callStack->at(0);
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_url = frame.sourceURL();
135926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_line = frame.lineNumber();
136591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_column = frame.columnNumber();
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_callStack.clear();
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static TypeBuilder::Console::ConsoleMessage::Source::Enum messageSourceValue(MessageSource source)
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (source) {
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case XMLMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Xml;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case JSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Javascript;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NetworkMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Network;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ConsoleAPIMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Console_api;
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case StorageMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Storage;
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case AppCacheMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Appcache;
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case RenderingMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Rendering;
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Css;
154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case SecurityMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Security;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case OtherMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Other;
15653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case DeprecationMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Deprecation;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return TypeBuilder::Console::ConsoleMessage::Source::Other;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static TypeBuilder::Console::ConsoleMessage::Type::Enum messageTypeValue(MessageType type)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (type) {
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LogMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Log;
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ClearMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Clear;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DirMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Dir;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DirXMLMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Dirxml;
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case TableMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Table;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TraceMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Trace;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case StartGroupMessageType: return TypeBuilder::Console::ConsoleMessage::Type::StartGroup;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case StartGroupCollapsedMessageType: return TypeBuilder::Console::ConsoleMessage::Type::StartGroupCollapsed;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case EndGroupMessageType: return TypeBuilder::Console::ConsoleMessage::Type::EndGroup;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case AssertMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Assert;
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return TypeBuilder::Console::ConsoleMessage::Type::Log;
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static TypeBuilder::Console::ConsoleMessage::Level::Enum messageLevelValue(MessageLevel level)
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (level) {
181926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DebugMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Debug;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LogMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Log;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WarningMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Warning;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ErrorMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Error;
185f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case InfoMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Info;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return TypeBuilder::Console::ConsoleMessage::Level::Log;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ConsoleMessage::addToFrontend(InspectorFrontend::Console* frontend, InjectedScriptManager* injectedScriptManager, bool generatePreview)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = TypeBuilder::Console::ConsoleMessage::create()
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setSource(messageSourceValue(m_source))
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setLevel(messageLevelValue(m_level))
1955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        .setText(m_message)
1965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        .setTimestamp(m_timestamp);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: only send out type for ConsoleAPI source messages.
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jsonObj->setType(messageTypeValue(m_type));
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jsonObj->setLine(static_cast<int>(m_line));
200591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    jsonObj->setColumn(static_cast<int>(m_column));
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jsonObj->setUrl(m_url);
202a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    ScriptState* scriptState = m_scriptState.get();
203a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (scriptState && scriptState->executionContext()->isDocument())
204a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        jsonObj->setExecutionContextId(injectedScriptManager->injectedScriptIdFor(scriptState));
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_source == NetworkMessageSource && !m_requestId.isEmpty())
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        jsonObj->setNetworkRequestId(m_requestId);
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_arguments && m_arguments->argumentCount()) {
208f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        InjectedScript injectedScript = injectedScriptManager->injectedScriptFor(m_arguments->scriptState());
20910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch        if (!injectedScript.isEmpty()) {
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > jsonArgs = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create();
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (m_type == TableMessageType && generatePreview && m_arguments->argumentCount()) {
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                ScriptValue table = m_arguments->argumentAt(0);
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                ScriptValue columns = m_arguments->argumentCount() > 1 ? m_arguments->argumentAt(1) : ScriptValue();
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapTable(table, columns);
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (!inspectorValue) {
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    ASSERT_NOT_REACHED();
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    return;
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                jsonArgs->addItem(inspectorValue);
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            } else {
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                for (unsigned i = 0; i < m_arguments->argumentCount(); ++i) {
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapObject(m_arguments->argumentAt(i), "console", generatePreview);
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    if (!inspectorValue) {
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                        ASSERT_NOT_REACHED();
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                        return;
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    }
227926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    jsonArgs->addItem(inspectorValue);
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                }
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            jsonObj->setParameters(jsonArgs);
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_callStack)
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        jsonObj->setStackTrace(m_callStack->buildInspectorArray());
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frontend->messageAdded(jsonObj);
236f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    frontend->flush();
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
23976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)void ConsoleMessage::windowCleared(LocalDOMWindow* window)
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
241a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    if (m_scriptState.get() && m_scriptState.get()->domWindow() == window)
242a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch        m_scriptState.clear();
243aafa69cb17c9d6606c07663ade5f81388a2c5986Ben Murdoch
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_arguments)
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
246f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    if (m_arguments->scriptState()->domWindow() != window)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_message)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_message = "<message collected>";
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_arguments.clear();
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned ConsoleMessage::argumentCount()
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_arguments)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_arguments->argumentCount();
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
262