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