2009-03-05 Dimitri Glazkov <dglazkov@chromium.org>
[WebKit-https.git] / WebCore / inspector / ConsoleMessage.cpp
1 /*
2  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
4  * Copyright (C) 2009 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 #include "JSInspectedObjectWrapper.h"
35 #include "ScriptString.h"
36 #include "ScriptCallStack.h"
37 #include "ScriptCallFrame.h"
38
39 #include <JavaScriptCore/APICast.h>
40 #include <JavaScriptCore/JSValueRef.h>
41 #include <runtime/JSLock.h>
42
43 using namespace JSC;
44
45 namespace WebCore {
46
47 ConsoleMessage::ConsoleMessage(MessageSource s, MessageLevel l, const String& m, unsigned li, const String& u, unsigned g)
48     : source(s)
49     , level(l)
50     , message(m)
51     , line(li)
52     , url(u)
53     , groupLevel(g)
54     , repeatCount(1)
55 {
56 }
57
58 ConsoleMessage::ConsoleMessage(MessageSource s, MessageLevel l, ScriptCallStack* callStack, unsigned g, bool storeTrace)
59     : source(s)
60     , level(l)
61     , wrappedArguments(callStack->at(0).argumentCount())
62     , frames(storeTrace ? callStack->size() : 0)
63     , groupLevel(g)
64     , repeatCount(1)
65 {
66     const ScriptCallFrame& lastCaller = callStack->at(0);
67     line = lastCaller.lineNumber();
68     url = lastCaller.sourceURL().string();
69
70     // FIXME: For now, just store function names as strings.
71     // As ScriptCallStack start storing line number and source URL for all
72     // frames, refactor to use that, as well.
73     if (storeTrace) {
74         unsigned stackSize = callStack->size();
75         for (unsigned i = 0; i < stackSize; ++i)
76             frames[i] = callStack->at(i).functionName();
77     }
78
79     JSLock lock(false);
80
81     for (unsigned i = 0; i < lastCaller.argumentCount(); ++i)
82         wrappedArguments[i] = JSInspectedObjectWrapper::wrap(callStack->state(), lastCaller.argumentAt(i).jsValue());
83 }
84
85 bool ConsoleMessage::isEqual(ExecState* exec, ConsoleMessage* msg) const
86 {
87     if (msg->wrappedArguments.size() != this->wrappedArguments.size() ||
88         (!exec && msg->wrappedArguments.size()))
89         return false;
90
91     for (size_t i = 0; i < msg->wrappedArguments.size(); ++i) {
92         ASSERT_ARG(exec, exec);
93         if (!JSValueIsEqual(toRef(exec), toRef(msg->wrappedArguments[i].get()), toRef(this->wrappedArguments[i].get()), 0))
94             return false;
95     }
96
97     size_t frameCount = msg->frames.size();
98     if (frameCount != this->frames.size())
99         return false;
100
101     for (size_t i = 0; i < frameCount; ++i) {
102         const ScriptString& myFrameFunctionName = this->frames[i];
103         if (myFrameFunctionName != msg->frames[i])
104             return false;
105     }
106
107     return msg->source == this->source
108     && msg->level == this->level
109     && msg->message == this->message
110     && msg->line == this->line
111     && msg->url == this->url
112     && msg->groupLevel == this->groupLevel;
113 }
114
115 } // namespace WebCore