5972a6171d536e1918c5e3f63754e97960bc3763
[WebKit-https.git] / Source / WebCore / bindings / js / JSInjectedScriptHostCustom.cpp
1 /*
2  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3  * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com>
4  * Copyright (C) 2010-2011 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 are
8  * met:
9  *
10  *     * Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  *     * Redistributions in binary form must reproduce the above
13  * copyright notice, this list of conditions and the following disclaimer
14  * in the documentation and/or other materials provided with the
15  * distribution.
16  *     * Neither the name of Google Inc. nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32
33 #include "config.h"
34
35 #if ENABLE(INSPECTOR)
36
37 #include "JSInjectedScriptHost.h"
38
39 #if ENABLE(SQL_DATABASE)
40 #include "Database.h"
41 #include "JSDatabase.h"
42 #endif
43 #include "ExceptionCode.h"
44 #include "InjectedScriptHost.h"
45 #include "InspectorDebuggerAgent.h"
46 #include "InspectorValues.h"
47 #include "JSFloat32Array.h"
48 #include "JSFloat64Array.h"
49 #include "JSHTMLAllCollection.h"
50 #include "JSHTMLCollection.h"
51 #include "JSInt16Array.h"
52 #include "JSInt32Array.h"
53 #include "JSInt8Array.h"
54 #include "JSNode.h"
55 #include "JSNodeList.h"
56 #include "JSStorage.h"
57 #include "ScriptValue.h"
58 #include "Storage.h"
59 #include <parser/SourceCode.h>
60 #include <runtime/DateInstance.h>
61 #include <runtime/Error.h>
62 #include <runtime/JSArray.h>
63 #include <runtime/JSFunction.h>
64 #include <runtime/JSLock.h>
65 #include <runtime/RegExpObject.h>
66
67 using namespace JSC;
68
69 namespace WebCore {
70
71 Node* InjectedScriptHost::scriptValueAsNode(ScriptValue value)
72 {
73     if (!value.isObject() || value.isNull())
74         return 0;
75     return toNode(value.jsValue());
76 }
77
78 ScriptValue InjectedScriptHost::nodeAsScriptValue(ScriptState* state, Node* node)
79 {
80     JSLock lock(SilenceAssertionsOnly);
81     return ScriptValue(state->globalData(), toJS(state, deprecatedGlobalObjectForPrototype(state), node));
82 }
83
84 JSValue JSInjectedScriptHost::inspectedObject(ExecState* exec)
85 {
86     if (exec->argumentCount() < 1)
87         return jsUndefined();
88
89     InjectedScriptHost::InspectableObject* object = impl()->inspectedObject(exec->argument(0).toInt32(exec));
90     if (!object)
91         return jsUndefined();
92
93     JSLock lock(SilenceAssertionsOnly);
94     return object->get(exec).jsValue();
95 }
96
97 JSValue JSInjectedScriptHost::internalConstructorName(ExecState* exec)
98 {
99     if (exec->argumentCount() < 1)
100         return jsUndefined();
101
102     JSObject* thisObject = exec->argument(0).toThisObject(exec);
103     UString result = thisObject->methodTable()->className(thisObject);
104     return jsString(exec, result);
105 }
106
107 JSValue JSInjectedScriptHost::isHTMLAllCollection(ExecState* exec)
108 {
109     if (exec->argumentCount() < 1)
110         return jsUndefined();
111
112     JSValue value = exec->argument(0);
113     return jsBoolean(value.inherits(&JSHTMLAllCollection::s_info));
114 }
115
116 JSValue JSInjectedScriptHost::type(ExecState* exec)
117 {
118     if (exec->argumentCount() < 1)
119         return jsUndefined();
120
121     JSValue value = exec->argument(0);
122     if (value.isString())
123         return jsString(exec, String("string"));
124     if (value.inherits(&JSArray::s_info))
125         return jsString(exec, String("array"));
126     if (value.isBoolean())
127         return jsString(exec, String("boolean"));
128     if (value.isNumber())
129         return jsString(exec, String("number"));
130     if (value.inherits(&DateInstance::s_info))
131         return jsString(exec, String("date"));
132     if (value.inherits(&RegExpObject::s_info))
133         return jsString(exec, String("regexp"));
134     if (value.inherits(&JSNode::s_info))
135         return jsString(exec, String("node"));
136     if (value.inherits(&JSNodeList::s_info))
137         return jsString(exec, String("array"));
138     if (value.inherits(&JSHTMLCollection::s_info))
139         return jsString(exec, String("array"));
140     if (value.inherits(&JSInt8Array::s_info) || value.inherits(&JSInt16Array::s_info) || value.inherits(&JSInt32Array::s_info))
141         return jsString(exec, String("array"));
142     if (value.inherits(&JSFloat32Array::s_info) || value.inherits(&JSFloat64Array::s_info))
143         return jsString(exec, String("array"));
144     return jsUndefined();
145 }
146
147 JSValue JSInjectedScriptHost::functionDetails(ExecState* exec)
148 {
149     if (exec->argumentCount() < 1)
150         return jsUndefined();
151     JSValue value = exec->argument(0);
152     if (!value.asCell()->inherits(&JSFunction::s_info))
153         return jsUndefined();
154     JSFunction* function = asFunction(value);
155
156     const SourceCode* sourceCode = function->sourceCode();
157     if (!sourceCode)
158         return jsUndefined();
159     int lineNumber = sourceCode->firstLine();
160     if (lineNumber)
161         lineNumber -= 1; // In the inspector protocol all positions are 0-based while in SourceCode they are 1-based
162     UString scriptId = UString::number(sourceCode->provider()->asID());
163
164     JSObject* location = constructEmptyObject(exec);
165     location->putDirect(exec->globalData(), Identifier(exec, "lineNumber"), jsNumber(lineNumber));
166     location->putDirect(exec->globalData(), Identifier(exec, "scriptId"), jsString(exec, scriptId));
167
168     JSObject* result = constructEmptyObject(exec);
169     result->putDirect(exec->globalData(), Identifier(exec, "location"), location);
170     UString name = function->name(exec);
171     if (!name.isEmpty())
172         result->putDirect(exec->globalData(), Identifier(exec, "name"), jsString(exec, name));
173     UString displayName = function->displayName(exec);
174     if (!displayName.isEmpty())
175         result->putDirect(exec->globalData(), Identifier(exec, "displayName"), jsString(exec, displayName));
176     return result;
177 }
178
179 JSValue JSInjectedScriptHost::inspect(ExecState* exec)
180 {
181     if (exec->argumentCount() >= 2) {
182         ScriptValue object(exec->globalData(), exec->argument(0));
183         ScriptValue hints(exec->globalData(), exec->argument(1));
184         impl()->inspectImpl(object.toInspectorValue(exec), hints.toInspectorValue(exec));
185     }
186     return jsUndefined();
187 }
188
189 JSValue JSInjectedScriptHost::databaseId(ExecState* exec)
190 {
191     if (exec->argumentCount() < 1)
192         return jsUndefined();
193 #if ENABLE(SQL_DATABASE)
194     Database* database = toDatabase(exec->argument(0));
195     if (database)
196         return jsNumber(impl()->databaseIdImpl(database));
197 #endif
198     return jsUndefined();
199 }
200
201 JSValue JSInjectedScriptHost::storageId(ExecState* exec)
202 {
203     if (exec->argumentCount() < 1)
204         return jsUndefined();
205     Storage* storage = toStorage(exec->argument(0));
206     if (storage)
207         return jsNumber(impl()->storageIdImpl(storage));
208     return jsUndefined();
209 }
210
211 } // namespace WebCore
212
213 #endif // ENABLE(INSPECTOR)