741622f43cca93e2c83d1a00cae9f39afbd88ec7
[WebKit-https.git] / Source / WebCore / bindings / js / JSCommandLineAPIHostCustom.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 #include "JSCommandLineAPIHost.h"
35
36 #include "CommandLineAPIHost.h"
37 #include "Database.h"
38 #include "InspectorDOMAgent.h"
39 #include "JSDatabase.h"
40 #include "JSEventListener.h"
41 #include "JSNode.h"
42 #include "JSStorage.h"
43 #include "Storage.h"
44 #include <bindings/ScriptValue.h>
45 #include <inspector/InspectorValues.h>
46 #include <parser/SourceCode.h>
47 #include <runtime/IdentifierInlines.h>
48 #include <runtime/JSArray.h>
49 #include <runtime/JSFunction.h>
50 #include <runtime/JSLock.h>
51 #include <runtime/ObjectConstructor.h>
52
53
54 using namespace JSC;
55
56 namespace WebCore {
57
58 JSValue JSCommandLineAPIHost::inspectedObject(ExecState* exec)
59 {
60     if (exec->argumentCount() < 1)
61         return jsUndefined();
62
63     CommandLineAPIHost::InspectableObject* object = impl().inspectedObject(exec->uncheckedArgument(0).toInt32(exec));
64     if (!object)
65         return jsUndefined();
66
67     JSLockHolder lock(exec);
68     Deprecated::ScriptValue scriptValue = object->get(exec);
69     if (scriptValue.hasNoValue())
70         return jsUndefined();
71
72     return scriptValue.jsValue();
73 }
74
75 static JSArray* getJSListenerFunctions(ExecState* exec, Document* document, const EventListenerInfo& listenerInfo)
76 {
77     JSArray* result = constructEmptyArray(exec, nullptr);
78     size_t handlersCount = listenerInfo.eventListenerVector.size();
79     for (size_t i = 0, outputIndex = 0; i < handlersCount; ++i) {
80         const JSEventListener* jsListener = JSEventListener::cast(listenerInfo.eventListenerVector[i].listener.get());
81         if (!jsListener) {
82             ASSERT_NOT_REACHED();
83             continue;
84         }
85
86         // Hide listeners from other contexts.
87         if (&jsListener->isolatedWorld() != &currentWorld(exec))
88             continue;
89
90         JSObject* function = jsListener->jsFunction(document);
91         if (!function)
92             continue;
93
94         JSObject* listenerEntry = constructEmptyObject(exec);
95         listenerEntry->putDirect(exec->vm(), Identifier(exec, "listener"), function);
96         listenerEntry->putDirect(exec->vm(), Identifier(exec, "useCapture"), jsBoolean(listenerInfo.eventListenerVector[i].useCapture));
97         result->putDirectIndex(exec, outputIndex++, JSValue(listenerEntry));
98     }
99     return result;
100 }
101
102 JSValue JSCommandLineAPIHost::getEventListeners(ExecState* exec)
103 {
104     if (exec->argumentCount() < 1)
105         return jsUndefined();
106
107     JSValue value = exec->uncheckedArgument(0);
108     if (!value.isObject() || value.isNull())
109         return jsUndefined();
110
111     Node* node = JSNode::toWrapped(value);
112     if (!node)
113         return jsUndefined();
114
115     Vector<EventListenerInfo> listenersArray;
116     impl().getEventListenersImpl(node, listenersArray);
117
118     JSObject* result = constructEmptyObject(exec);
119     for (size_t i = 0; i < listenersArray.size(); ++i) {
120         JSArray* listeners = getJSListenerFunctions(exec, &node->document(), listenersArray[i]);
121         if (!listeners->length())
122             continue;
123         AtomicString eventType = listenersArray[i].eventType;
124         result->putDirect(exec->vm(), Identifier(exec, eventType.impl()), JSValue(listeners));
125     }
126
127     return result;
128 }
129
130 JSValue JSCommandLineAPIHost::inspect(ExecState* exec)
131 {
132     if (exec->argumentCount() >= 2) {
133         Deprecated::ScriptValue object(exec->vm(), exec->uncheckedArgument(0));
134         Deprecated::ScriptValue hints(exec->vm(), exec->uncheckedArgument(1));
135         impl().inspectImpl(object.toInspectorValue(exec), hints.toInspectorValue(exec));
136     }
137
138     return jsUndefined();
139 }
140
141 JSValue JSCommandLineAPIHost::databaseId(ExecState* exec)
142 {
143     if (exec->argumentCount() < 1)
144         return jsUndefined();
145
146     Database* database = JSDatabase::toWrapped(exec->uncheckedArgument(0));
147     if (database)
148         return jsStringWithCache(exec, impl().databaseIdImpl(database));
149
150     return jsUndefined();
151 }
152
153 JSValue JSCommandLineAPIHost::storageId(ExecState* exec)
154 {
155     if (exec->argumentCount() < 1)
156         return jsUndefined();
157
158     Storage* storage = JSStorage::toWrapped(exec->uncheckedArgument(0));
159     if (storage)
160         return jsStringWithCache(exec, impl().storageIdImpl(storage));
161
162     return jsUndefined();
163 }
164
165 } // namespace WebCore