71
static bool getFirstArgumentAsString(const ScriptCallFrame& callFrame, String& result, bool checkForNullOrUndefined = false)
77
static bool getFirstArgumentAsString(ScriptState* scriptState, const ScriptCallFrame& callFrame, String& result, bool checkForNullOrUndefined = false)
73
79
if (!callFrame.argumentCount())
77
83
if (checkForNullOrUndefined && (value.isNull() || value.isUndefined()))
80
return value.getString(result);
86
result = value.toString(scriptState);
83
90
static void printMessageSourceAndLevelPrefix(MessageSource source, MessageLevel level)
85
92
const char* sourceString;
87
case HTMLMessageSource:
88
sourceString = "HTML";
90
case WMLMessageSource:
93
case XMLMessageSource:
99
case CSSMessageSource:
100
sourceString = "CSS";
103
ASSERT_NOT_REACHED();
105
case OtherMessageSource:
106
sourceString = "OTHER";
94
case HTMLMessageSource:
95
sourceString = "HTML";
97
case WMLMessageSource:
100
case XMLMessageSource:
101
sourceString = "XML";
103
case JSMessageSource:
106
case CSSMessageSource:
107
sourceString = "CSS";
109
case OtherMessageSource:
110
sourceString = "OTHER";
113
ASSERT_NOT_REACHED();
114
sourceString = "UNKNOWN";
110
118
const char* levelString;
112
case TipMessageLevel:
116
ASSERT_NOT_REACHED();
118
case LogMessageLevel:
121
case WarningMessageLevel:
122
levelString = "WARN";
124
case ErrorMessageLevel:
125
levelString = "ERROR";
120
case TipMessageLevel:
123
case LogMessageLevel:
126
case WarningMessageLevel:
127
levelString = "WARN";
129
case ErrorMessageLevel:
130
levelString = "ERROR";
132
case DebugMessageLevel:
133
levelString = "DEBUG";
136
ASSERT_NOT_REACHED();
137
levelString = "UNKNOWN";
129
141
printf("%s %s:", sourceString, levelString);
132
void Console::addMessage(MessageSource source, MessageLevel level, const String& message, unsigned lineNumber, const String& sourceURL)
144
void Console::addMessage(MessageSource source, MessageType type, MessageLevel level, const String& message, unsigned lineNumber, const String& sourceURL)
134
146
Page* page = this->page();
138
if (source == JSMessageSource || source == WMLMessageSource)
139
page->chrome()->client()->addMessageToConsole(message, lineNumber, sourceURL);
150
if (source == JSMessageSource)
151
page->chrome()->client()->addMessageToConsole(source, type, level, message, lineNumber, sourceURL);
141
page->inspectorController()->addMessageToConsole(source, level, message, lineNumber, sourceURL);
153
#if ENABLE(INSPECTOR)
154
page->inspectorController()->addMessageToConsole(source, type, level, message, lineNumber, sourceURL);
143
157
if (!Console::shouldPrintExceptions())
149
163
printf(" %s\n", message.utf8().data());
152
void Console::addMessage(MessageLevel level, ScriptCallStack* callStack, bool acceptNoArguments) {
166
void Console::addMessage(MessageType type, MessageLevel level, ScriptCallStack* callStack, bool acceptNoArguments)
153
168
Page* page = this->page();
163
if (getFirstArgumentAsString(lastCaller, message))
164
page->chrome()->client()->addMessageToConsole(message, lastCaller.lineNumber(), lastCaller.sourceURL().prettyURL());
178
if (getFirstArgumentAsString(callStack->state(), lastCaller, message))
179
page->chrome()->client()->addMessageToConsole(JSMessageSource, type, level, message, lastCaller.lineNumber(), lastCaller.sourceURL().prettyURL());
166
page->inspectorController()->addMessageToConsole(JSMessageSource, level, callStack);
181
#if ENABLE(INSPECTOR)
182
page->inspectorController()->addMessageToConsole(JSMessageSource, type, level, callStack);
168
185
if (!Console::shouldPrintExceptions())
188
205
void Console::error(ScriptCallStack* callStack)
190
addMessage(ErrorMessageLevel, callStack);
207
addMessage(LogMessageType, ErrorMessageLevel, callStack);
193
210
void Console::info(ScriptCallStack* callStack)
198
215
void Console::log(ScriptCallStack* callStack)
200
addMessage(LogMessageLevel, callStack);
217
addMessage(LogMessageType, LogMessageLevel, callStack);
203
220
void Console::dir(ScriptCallStack* callStack)
205
addMessage(ObjectMessageLevel, callStack);
222
addMessage(ObjectMessageType, LogMessageLevel, callStack);
208
225
void Console::dirxml(ScriptCallStack* callStack)
210
addMessage(NodeMessageLevel, callStack);
227
// The standard behavior of our console.log will print the DOM tree for nodes.
213
231
void Console::trace(ScriptCallStack* callStack)
215
addMessage(TraceMessageLevel, callStack, true);
233
addMessage(TraceMessageType, LogMessageLevel, callStack, true);
217
235
if (!shouldPrintExceptions())
232
250
// FIXME: <https://bugs.webkit.org/show_bug.cgi?id=19135> It would be nice to prefix assertion failures with a message like "Assertion failed: ".
233
addMessage(ErrorMessageLevel, callStack, true);
251
addMessage(LogMessageType, ErrorMessageLevel, callStack, true);
236
254
void Console::count(ScriptCallStack* callStack)
256
#if ENABLE(INSPECTOR)
238
257
Page* page = this->page();
243
262
// Follow Firebug's behavior of counting with null and undefined title in
244
263
// the same bucket as no argument
246
getFirstArgumentAsString(lastCaller, title);
265
getFirstArgumentAsString(callStack->state(), lastCaller, title);
248
267
page->inspectorController()->count(title, lastCaller.lineNumber(), lastCaller.sourceURL().string());
269
UNUSED_PARAM(callStack);
274
String Console::lastWMLErrorMessage() const
276
Page* page = this->page();
280
const Vector<ConsoleMessage*>& consoleMessages = page->inspectorController()->consoleMessages();
281
if (consoleMessages.isEmpty())
284
Vector<ConsoleMessage*>::const_iterator it = consoleMessages.begin();
285
const Vector<ConsoleMessage*>::const_iterator end = consoleMessages.end();
287
for (; it != end; ++it) {
288
ConsoleMessage* message = *it;
289
if (message->source() != WMLMessageSource)
292
return message->message();
299
#if ENABLE(JAVASCRIPT_DEBUGGER)
253
301
void Console::profile(const JSC::UString& title, ScriptCallStack* callStack)
307
#if ENABLE(INSPECTOR)
308
InspectorController* controller = page->inspectorController();
262
309
// FIXME: log a console message when profiling is disabled.
263
if (!page->inspectorController()->profilerEnabled())
310
if (!controller->profilerEnabled())
266
JSC::Profiler::profiler()->startProfiling(callStack->state(), title);
314
JSC::UString resolvedTitle = title;
315
if (title.isNull()) // no title so give it the next user initiated profile title.
316
#if ENABLE(INSPECTOR)
317
resolvedTitle = controller->getCurrentUserInitiatedProfileName(true);
322
JSC::Profiler::profiler()->startProfiling(callStack->state(), resolvedTitle);
324
#if ENABLE(INSPECTOR)
325
const ScriptCallFrame& lastCaller = callStack->at(0);
326
controller->addStartProfilingMessageToConsole(resolvedTitle, lastCaller.lineNumber(), lastCaller.sourceURL());
269
330
void Console::profileEnd(const JSC::UString& title, ScriptCallStack* callStack)
275
if (!page->inspectorController()->profilerEnabled())
339
#if ENABLE(INSPECTOR)
340
InspectorController* controller = page->inspectorController();
341
if (!controller->profilerEnabled())
278
345
RefPtr<JSC::Profile> profile = JSC::Profiler::profiler()->stopProfiling(callStack->state(), title);
282
349
m_profiles.append(profile);
284
if (Page* page = this->page()) {
285
const ScriptCallFrame& lastCaller = callStack->at(0);
286
page->inspectorController()->addProfile(profile, lastCaller.lineNumber(), lastCaller.sourceURL());
351
#if ENABLE(INSPECTOR)
352
const ScriptCallFrame& lastCaller = callStack->at(0);
353
controller->addProfile(profile, lastCaller.lineNumber(), lastCaller.sourceURL());
292
359
void Console::time(const String& title)
361
#if ENABLE(INSPECTOR)
294
362
Page* page = this->page();
299
367
// undefined for timing functions
300
368
if (title.isNull())
303
371
page->inspectorController()->startTiming(title);
306
377
void Console::timeEnd(const String& title, ScriptCallStack* callStack)
379
#if ENABLE(INSPECTOR)
308
380
Page* page = this->page();
321
393
String message = title + String::format(": %.0fms", elapsed);
323
395
const ScriptCallFrame& lastCaller = callStack->at(0);
324
page->inspectorController()->addMessageToConsole(JSMessageSource, LogMessageLevel, message, lastCaller.lineNumber(), lastCaller.sourceURL().string());
396
page->inspectorController()->addMessageToConsole(JSMessageSource, LogMessageType, LogMessageLevel, message, lastCaller.lineNumber(), lastCaller.sourceURL().string());
399
UNUSED_PARAM(callStack);
327
403
void Console::group(ScriptCallStack* callStack)
405
#if ENABLE(INSPECTOR)
329
406
Page* page = this->page();
333
410
page->inspectorController()->startGroup(JSMessageSource, callStack);
412
UNUSED_PARAM(callStack);
336
416
void Console::groupEnd()
418
#if ENABLE(INSPECTOR)
338
419
Page* page = this->page();
342
423
page->inspectorController()->endGroup(JSMessageSource, 0, String());
345
427
void Console::warn(ScriptCallStack* callStack)
347
addMessage(WarningMessageLevel, callStack);
429
addMessage(LogMessageType, WarningMessageLevel, callStack);
350
432
static bool printExceptions = false;