1 /*
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
4 * Copyright (C) 2009, 2010 Google Inc. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
16 * its contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include "config.h"
32 #include "ConsoleMessage.h"
33
34 #if ENABLE(INSPECTOR)
35
36 #include "Console.h"
37 #include "InjectedScript.h"
38 #include "InjectedScriptManager.h"
39 #include "InspectorFrontend.h"
40 #include "InspectorValues.h"
41 #include "ScriptArguments.h"
42 #include "ScriptCallStack.h"
43 #include "ScriptValue.h"
44
45 namespace WebCore {
46
ConsoleMessage(MessageSource s,MessageType t,MessageLevel l,const String & m,unsigned li,const String & u)47 ConsoleMessage::ConsoleMessage(MessageSource s, MessageType t, MessageLevel l, const String& m, unsigned li, const String& u)
48 : m_source(s)
49 , m_type(t)
50 , m_level(l)
51 , m_message(m)
52 , m_line(li)
53 , m_url(u)
54 , m_repeatCount(1)
55 , m_requestId(0)
56 {
57 }
58
ConsoleMessage(MessageSource s,MessageType t,MessageLevel l,const String & m,PassRefPtr<ScriptArguments> arguments,PassRefPtr<ScriptCallStack> callStack)59 ConsoleMessage::ConsoleMessage(MessageSource s, MessageType t, MessageLevel l, const String& m, PassRefPtr<ScriptArguments> arguments, PassRefPtr<ScriptCallStack> callStack)
60 : m_source(s)
61 , m_type(t)
62 , m_level(l)
63 , m_message(m)
64 , m_arguments(arguments)
65 , m_callStack(callStack)
66 , m_line(0)
67 , m_url()
68 , m_repeatCount(1)
69 , m_requestId(0)
70 {
71 }
72
ConsoleMessage(MessageSource s,MessageType t,MessageLevel l,const String & m,const String & responseUrl,unsigned long identifier)73 ConsoleMessage::ConsoleMessage(MessageSource s, MessageType t, MessageLevel l, const String& m, const String& responseUrl, unsigned long identifier)
74 : m_source(s)
75 , m_type(t)
76 , m_level(l)
77 , m_message(m)
78 , m_line(0)
79 , m_url(responseUrl)
80 , m_repeatCount(1)
81 , m_requestId(identifier)
82 {
83 }
84
~ConsoleMessage()85 ConsoleMessage::~ConsoleMessage()
86 {
87 }
88
89 // Keep in sync with inspector/front-end/ConsoleView.js
messageSourceValue(MessageSource source)90 static String messageSourceValue(MessageSource source)
91 {
92 switch (source) {
93 case HTMLMessageSource: return "html";
94 case WMLMessageSource: return "wml";
95 case XMLMessageSource: return "xml";
96 case JSMessageSource: return "javascript";
97 case CSSMessageSource: return "css";
98 case OtherMessageSource: return "other";
99 }
100 return "other";
101 }
102
messageTypeValue(MessageType type)103 static String messageTypeValue(MessageType type)
104 {
105 switch (type) {
106 case LogMessageType: return "log";
107 case ObjectMessageType: return "other";
108 case TraceMessageType: return "trace";
109 case StartGroupMessageType: return "startGroup";
110 case StartGroupCollapsedMessageType: return "startGroupCollapsed";
111 case EndGroupMessageType: return "endGroup";
112 case AssertMessageType: return "assert";
113 case UncaughtExceptionMessageType: return "uncaughtException";
114 case NetworkErrorMessageType: return "networkError";
115 }
116 return "other";
117 }
118
messageLevelValue(MessageLevel level)119 static String messageLevelValue(MessageLevel level)
120 {
121 switch (level) {
122 case TipMessageLevel: return "tip";
123 case LogMessageLevel: return "log";
124 case WarningMessageLevel: return "warning";
125 case ErrorMessageLevel: return "error";
126 case DebugMessageLevel: return "debug";
127 }
128 return "log";
129 }
130
addToFrontend(InspectorFrontend::Console * frontend,InjectedScriptManager * injectedScriptManager)131 void ConsoleMessage::addToFrontend(InspectorFrontend::Console* frontend, InjectedScriptManager* injectedScriptManager)
132 {
133 RefPtr<InspectorObject> jsonObj = InspectorObject::create();
134 jsonObj->setString("source", messageSourceValue(m_source));
135 jsonObj->setString("type", messageTypeValue(m_type));
136 jsonObj->setString("level", messageLevelValue(m_level));
137 jsonObj->setNumber("line", static_cast<int>(m_line));
138 jsonObj->setString("url", m_url);
139 jsonObj->setNumber("repeatCount", static_cast<int>(m_repeatCount));
140 jsonObj->setString("text", m_message);
141 if (m_type == NetworkErrorMessageType)
142 jsonObj->setNumber("networkIdentifier", m_requestId);
143 if (m_arguments && m_arguments->argumentCount()) {
144 InjectedScript injectedScript = injectedScriptManager->injectedScriptFor(m_arguments->globalState());
145 if (!injectedScript.hasNoValue()) {
146 RefPtr<InspectorArray> jsonArgs = InspectorArray::create();
147 for (unsigned i = 0; i < m_arguments->argumentCount(); ++i) {
148 RefPtr<InspectorValue> inspectorValue = injectedScript.wrapObject(m_arguments->argumentAt(i), "console");
149 if (!inspectorValue) {
150 ASSERT_NOT_REACHED();
151 return;
152 }
153 jsonArgs->pushValue(inspectorValue);
154 }
155 jsonObj->setArray("parameters", jsonArgs);
156 }
157 }
158 if (m_callStack)
159 jsonObj->setArray("stackTrace", m_callStack->buildInspectorArray());
160 frontend->messageAdded(jsonObj);
161 }
162
updateRepeatCountInConsole(InspectorFrontend::Console * frontend)163 void ConsoleMessage::updateRepeatCountInConsole(InspectorFrontend::Console* frontend)
164 {
165 frontend->messageRepeatCountUpdated(m_repeatCount);
166 }
167
isEqual(ConsoleMessage * msg) const168 bool ConsoleMessage::isEqual(ConsoleMessage* msg) const
169 {
170 if (m_arguments) {
171 if (!m_arguments->isEqual(msg->m_arguments.get()))
172 return false;
173 } else if (msg->m_arguments)
174 return false;
175
176 if (m_callStack) {
177 if (!m_callStack->isEqual(msg->m_callStack.get()))
178 return false;
179 } else if (msg->m_callStack)
180 return false;
181
182 return msg->m_source == m_source
183 && msg->m_type == m_type
184 && msg->m_level == m_level
185 && msg->m_message == m_message
186 && msg->m_line == m_line
187 && msg->m_url == m_url
188 && msg->m_requestId == m_requestId;
189 }
190
191 } // namespace WebCore
192
193 #endif // ENABLE(INSPECTOR)
194