1 /* 2 * Copyright (C) 2007 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "config.h" 30 #include "core/frame/Console.h" 31 32 #include "bindings/v8/ScriptCallStackFactory.h" 33 #include "core/dom/Document.h" 34 #include "core/inspector/InspectorConsoleInstrumentation.h" 35 #include "core/inspector/ScriptArguments.h" 36 #include "platform/TraceEvent.h" 37 #include "wtf/text/CString.h" 38 #include "wtf/text/WTFString.h" 39 40 namespace WebCore { 41 42 ConsoleBase::~ConsoleBase() 43 { 44 } 45 46 void ConsoleBase::debug(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 47 { 48 internalAddMessage(LogMessageType, DebugMessageLevel, scriptState, arguments); 49 } 50 51 void ConsoleBase::error(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 52 { 53 internalAddMessage(LogMessageType, ErrorMessageLevel, scriptState, arguments); 54 } 55 56 void ConsoleBase::info(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 57 { 58 internalAddMessage(LogMessageType, InfoMessageLevel, scriptState, arguments); 59 } 60 61 void ConsoleBase::log(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 62 { 63 internalAddMessage(LogMessageType, LogMessageLevel, scriptState, arguments); 64 } 65 66 void ConsoleBase::warn(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 67 { 68 internalAddMessage(LogMessageType, WarningMessageLevel, scriptState, arguments); 69 } 70 71 void ConsoleBase::dir(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 72 { 73 internalAddMessage(DirMessageType, LogMessageLevel, scriptState, arguments); 74 } 75 76 void ConsoleBase::dirxml(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 77 { 78 internalAddMessage(DirXMLMessageType, LogMessageLevel, scriptState, arguments); 79 } 80 81 void ConsoleBase::table(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 82 { 83 internalAddMessage(TableMessageType, LogMessageLevel, scriptState, arguments); 84 } 85 86 void ConsoleBase::clear(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 87 { 88 InspectorInstrumentation::addMessageToConsole(context(), ConsoleAPIMessageSource, ClearMessageType, LogMessageLevel, String(), scriptState, arguments); 89 } 90 91 void ConsoleBase::trace(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 92 { 93 internalAddMessage(TraceMessageType, LogMessageLevel, scriptState, arguments, true, true); 94 } 95 96 void ConsoleBase::assertCondition(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments, bool condition) 97 { 98 if (condition) 99 return; 100 101 internalAddMessage(AssertMessageType, ErrorMessageLevel, scriptState, arguments, true); 102 } 103 104 void ConsoleBase::count(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 105 { 106 InspectorInstrumentation::consoleCount(context(), scriptState, arguments); 107 } 108 109 void ConsoleBase::markTimeline(const String& title) 110 { 111 InspectorInstrumentation::consoleTimeStamp(context(), title); 112 } 113 114 void ConsoleBase::profile(ScriptState* scriptState, const String& title) 115 { 116 InspectorInstrumentation::consoleProfile(context(), title, scriptState); 117 } 118 119 void ConsoleBase::profileEnd(ScriptState* scriptState, const String& title) 120 { 121 InspectorInstrumentation::consoleProfileEnd(context(), title, scriptState); 122 } 123 124 void ConsoleBase::time(const String& title) 125 { 126 InspectorInstrumentation::consoleTime(context(), title); 127 TRACE_EVENT_COPY_ASYNC_BEGIN0("webkit.console", title.utf8().data(), this); 128 } 129 130 void ConsoleBase::timeEnd(ScriptState* scriptState, const String& title) 131 { 132 TRACE_EVENT_COPY_ASYNC_END0("webkit.console", title.utf8().data(), this); 133 InspectorInstrumentation::consoleTimeEnd(context(), title, scriptState); 134 } 135 136 void ConsoleBase::timeStamp(const String& title) 137 { 138 InspectorInstrumentation::consoleTimeStamp(context(), title); 139 } 140 141 void ConsoleBase::timeline(ScriptState* scriptState, const String& title) 142 { 143 InspectorInstrumentation::consoleTimeline(context(), title, scriptState); 144 } 145 146 void ConsoleBase::timelineEnd(ScriptState* scriptState, const String& title) 147 { 148 InspectorInstrumentation::consoleTimelineEnd(context(), title, scriptState); 149 } 150 151 void ConsoleBase::group(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 152 { 153 InspectorInstrumentation::addMessageToConsole(context(), ConsoleAPIMessageSource, StartGroupMessageType, LogMessageLevel, String(), scriptState, arguments); 154 } 155 156 void ConsoleBase::groupCollapsed(ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> arguments) 157 { 158 InspectorInstrumentation::addMessageToConsole(context(), ConsoleAPIMessageSource, StartGroupCollapsedMessageType, LogMessageLevel, String(), scriptState, arguments); 159 } 160 161 void ConsoleBase::groupEnd() 162 { 163 InspectorInstrumentation::addMessageToConsole(context(), ConsoleAPIMessageSource, EndGroupMessageType, LogMessageLevel, String(), nullptr); 164 } 165 166 void ConsoleBase::internalAddMessage(MessageType type, MessageLevel level, ScriptState* scriptState, PassRefPtrWillBeRawPtr<ScriptArguments> scriptArguments, bool acceptNoArguments, bool printTrace) 167 { 168 if (!context()) 169 return; 170 171 RefPtrWillBeRawPtr<ScriptArguments> arguments = scriptArguments; 172 if (!acceptNoArguments && !arguments->argumentCount()) 173 return; 174 175 size_t stackSize = printTrace ? ScriptCallStack::maxCallStackSizeToCapture : 1; 176 RefPtrWillBeRawPtr<ScriptCallStack> callStack(createScriptCallStackForConsole(scriptState, stackSize)); 177 178 String message; 179 bool gotStringMessage = arguments->getFirstArgumentAsString(message); 180 InspectorInstrumentation::addMessageToConsole(context(), ConsoleAPIMessageSource, type, level, message, scriptState, arguments); 181 if (gotStringMessage) 182 reportMessageToClient(level, message, callStack); 183 } 184 185 } // namespace WebCore 186