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"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/IdentifiersFactory.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScript.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/InjectedScriptManager.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptArguments.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptCallFrame.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/inspector/ScriptCallStack.h"
445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "wtf/CurrentTime.h"
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source, MessageType type, MessageLevel level, const String& message)
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_source(source)
50926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_type(type)
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_level(level)
52926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_message(message)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_url()
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_line(0)
55591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    , m_column(0)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_repeatCount(1)
5753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    , m_requestId(IdentifiersFactory::requestId(0))
585267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_timestamp(WTF::currentTime())
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
60926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    autogenerateMetadata(canGenerateCallStack);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
63591b958dee2cf159d33a0b931e6231072eaf38d5Ben MurdochConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source, MessageType type, MessageLevel level, const String& message, const String& url, unsigned line, unsigned column, ScriptState* state, unsigned long requestIdentifier)
64926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_source(source)
65926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_type(type)
66926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_level(level)
67926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_message(message)
68926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_url(url)
69926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_line(line)
70591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    , m_column(column)
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_repeatCount(1)
72926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_requestId(IdentifiersFactory::requestId(requestIdentifier))
735267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_timestamp(WTF::currentTime())
74926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
75926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    autogenerateMetadata(canGenerateCallStack, state);
76926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
77926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ConsoleMessage::ConsoleMessage(bool, MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtr<ScriptCallStack> callStack, unsigned long requestIdentifier)
79926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_source(source)
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_type(type)
81926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_level(level)
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_message(message)
83926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_arguments(0)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_line(0)
85591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    , m_column(0)
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_repeatCount(1)
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_requestId(IdentifiersFactory::requestId(requestIdentifier))
885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_timestamp(WTF::currentTime())
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (callStack && callStack->size()) {
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const ScriptCallFrame& frame = callStack->at(0);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_url = frame.sourceURL();
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_line = frame.lineNumber();
94591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_column = frame.columnNumber();
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_callStack = callStack;
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)ConsoleMessage::ConsoleMessage(bool canGenerateCallStack, MessageSource source, MessageType type, MessageLevel level, const String& message, PassRefPtr<ScriptArguments> arguments, ScriptState* state, unsigned long requestIdentifier)
100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_source(source)
101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_type(type)
102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_level(level)
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_message(message)
104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_arguments(arguments)
105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_url()
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_line(0)
107591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    , m_column(0)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_repeatCount(1)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_requestId(IdentifiersFactory::requestId(requestIdentifier))
1105267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    , m_timestamp(WTF::currentTime())
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    autogenerateMetadata(canGenerateCallStack, state);
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ConsoleMessage::~ConsoleMessage()
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void ConsoleMessage::autogenerateMetadata(bool canGenerateCallStack, ScriptState* state)
120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_type == EndGroupMessageType)
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (state)
1251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_callStack = createScriptCallStackForConsole();
126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else if (canGenerateCallStack)
127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_callStack = createScriptCallStack(ScriptCallStack::maxCallStackSizeToCapture, true);
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    else
129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_callStack && m_callStack->size()) {
132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        const ScriptCallFrame& frame = m_callStack->at(0);
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_url = frame.sourceURL();
134926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_line = frame.lineNumber();
135591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        m_column = frame.columnNumber();
136926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return;
137926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
138926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_callStack.clear();
140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static TypeBuilder::Console::ConsoleMessage::Source::Enum messageSourceValue(MessageSource source)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (source) {
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case XMLMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Xml;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case JSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Javascript;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case NetworkMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Network;
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ConsoleAPIMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Console_api;
149926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case StorageMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Storage;
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case AppCacheMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Appcache;
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case RenderingMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Rendering;
152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case CSSMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Css;
153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case SecurityMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Security;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case OtherMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Other;
15553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    case DeprecationMessageSource: return TypeBuilder::Console::ConsoleMessage::Source::Deprecation;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return TypeBuilder::Console::ConsoleMessage::Source::Other;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static TypeBuilder::Console::ConsoleMessage::Type::Enum messageTypeValue(MessageType type)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (type) {
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LogMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Log;
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ClearMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Clear;
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DirMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Dir;
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case DirXMLMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Dirxml;
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case TableMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Table;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TraceMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Trace;
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case StartGroupMessageType: return TypeBuilder::Console::ConsoleMessage::Type::StartGroup;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case StartGroupCollapsedMessageType: return TypeBuilder::Console::ConsoleMessage::Type::StartGroupCollapsed;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case EndGroupMessageType: return TypeBuilder::Console::ConsoleMessage::Type::EndGroup;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case AssertMessageType: return TypeBuilder::Console::ConsoleMessage::Type::Assert;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return TypeBuilder::Console::ConsoleMessage::Type::Log;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static TypeBuilder::Console::ConsoleMessage::Level::Enum messageLevelValue(MessageLevel level)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (level) {
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case DebugMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Debug;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LogMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Log;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case WarningMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Warning;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ErrorMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Error;
184f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    case InfoMessageLevel: return TypeBuilder::Console::ConsoleMessage::Level::Info;
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return TypeBuilder::Console::ConsoleMessage::Level::Log;
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ConsoleMessage::addToFrontend(InspectorFrontend::Console* frontend, InjectedScriptManager* injectedScriptManager, bool generatePreview)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<TypeBuilder::Console::ConsoleMessage> jsonObj = TypeBuilder::Console::ConsoleMessage::create()
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setSource(messageSourceValue(m_source))
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        .setLevel(messageLevelValue(m_level))
1945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        .setText(m_message)
1955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        .setTimestamp(m_timestamp);
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: only send out type for ConsoleAPI source messages.
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jsonObj->setType(messageTypeValue(m_type));
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jsonObj->setLine(static_cast<int>(m_line));
199591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    jsonObj->setColumn(static_cast<int>(m_column));
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jsonObj->setUrl(m_url);
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    jsonObj->setRepeatCount(static_cast<int>(m_repeatCount));
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_source == NetworkMessageSource && !m_requestId.isEmpty())
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        jsonObj->setNetworkRequestId(m_requestId);
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_arguments && m_arguments->argumentCount()) {
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        InjectedScript injectedScript = injectedScriptManager->injectedScriptFor(m_arguments->globalState());
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!injectedScript.hasNoValue()) {
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject> > jsonArgs = TypeBuilder::Array<TypeBuilder::Runtime::RemoteObject>::create();
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (m_type == TableMessageType && generatePreview && m_arguments->argumentCount()) {
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                ScriptValue table = m_arguments->argumentAt(0);
210926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                ScriptValue columns = m_arguments->argumentCount() > 1 ? m_arguments->argumentAt(1) : ScriptValue();
211926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapTable(table, columns);
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (!inspectorValue) {
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    ASSERT_NOT_REACHED();
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    return;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                }
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                jsonArgs->addItem(inspectorValue);
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            } else {
218926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                for (unsigned i = 0; i < m_arguments->argumentCount(); ++i) {
219926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    RefPtr<TypeBuilder::Runtime::RemoteObject> inspectorValue = injectedScript.wrapObject(m_arguments->argumentAt(i), "console", generatePreview);
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    if (!inspectorValue) {
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                        ASSERT_NOT_REACHED();
222926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                        return;
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    }
224926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                    jsonArgs->addItem(inspectorValue);
225926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                }
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            jsonObj->setParameters(jsonArgs);
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_callStack)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        jsonObj->setStackTrace(m_callStack->buildInspectorArray());
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    frontend->messageAdded(jsonObj);
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void ConsoleMessage::incrementCount()
2365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
2375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_timestamp = WTF::currentTime();
2385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    ++m_repeatCount;
2395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
2405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ConsoleMessage::updateRepeatCountInConsole(InspectorFrontend::Console* frontend)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    frontend->messageRepeatCountUpdated(m_repeatCount, m_timestamp);
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ConsoleMessage::isEqual(ConsoleMessage* msg) const
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_arguments) {
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_arguments->isEqual(msg->m_arguments.get()))
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
251926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        // Never treat objects as equal - their properties might change over time.
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        for (size_t i = 0; i < m_arguments->argumentCount(); ++i) {
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (m_arguments->argumentAt(i).isObject())
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)                return false;
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (msg->m_arguments)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_callStack) {
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_callStack->isEqual(msg->m_callStack.get()))
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return false;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (msg->m_callStack)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return msg->m_source == m_source
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && msg->m_type == m_type
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && msg->m_level == m_level
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && msg->m_message == m_message
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && msg->m_line == m_line
270591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        && msg->m_column == m_column
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && msg->m_url == m_url
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && msg->m_requestId == m_requestId;
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void ConsoleMessage::windowCleared(DOMWindow* window)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_arguments)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2795267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (m_arguments->globalState()->domWindow() != window)
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_message)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_message = "<message collected>";
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_arguments.clear();
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned ConsoleMessage::argumentCount()
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_arguments)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_arguments->argumentCount();
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
295