1/*
2 This file is part of the WebKit open source project.
3 This file has been generated by generate-bindings.pl. DO NOT MODIFY!
4
5 This library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public
7 License as published by the Free Software Foundation; either
8 version 2 of the License, or (at your option) any later version.
9
10 This library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public License
16 along with this library; see the file COPYING.LIB. If not, write to
17 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
19*/
20
21#include "config.h"
22#include "JSNode.h"
23
24#include "CustomElementReactionQueue.h"
25#include "DOMJITIDLTypeFilter.h"
26#include "JSDOMAttribute.h"
27#include "JSDOMBinding.h"
28#include "JSDOMConstructorNotConstructable.h"
29#include "JSDOMConvertBoolean.h"
30#include "JSDOMConvertInterface.h"
31#include "JSDOMConvertNullable.h"
32#include "JSDOMConvertNumbers.h"
33#include "JSDOMConvertStrings.h"
34#include "JSDOMExceptionHandling.h"
35#include "JSDOMGlobalObject.h"
36#include "JSDOMOperation.h"
37#include "JSDOMWrapperCache.h"
38#include "JSDocument.h"
39#include "JSElement.h"
40#include "JSNode.h"
41#include "JSNodeList.h"
42#include "RuntimeEnabledFeatures.h"
43#include "ScriptExecutionContext.h"
44#include <JavaScriptCore/HeapSnapshotBuilder.h>
45#include <JavaScriptCore/JSCInlines.h>
46#include <wtf/GetPtr.h>
47#include <wtf/PointerPreparations.h>
48#include <wtf/URL.h>
49
50
51namespace WebCore {
52using namespace JSC;
53
54template<> Node::GetRootNodeOptions convertDictionary<Node::GetRootNodeOptions>(ExecState& state, JSValue value)
55{
56 VM& vm = state.vm();
57 auto throwScope = DECLARE_THROW_SCOPE(vm);
58 bool isNullOrUndefined = value.isUndefinedOrNull();
59 auto* object = isNullOrUndefined ? nullptr : value.getObject();
60 if (UNLIKELY(!isNullOrUndefined && !object)) {
61 throwTypeError(&state, throwScope);
62 return { };
63 }
64 Node::GetRootNodeOptions result;
65 JSValue composedValue;
66 if (isNullOrUndefined)
67 composedValue = jsUndefined();
68 else {
69 composedValue = object->get(&state, Identifier::fromString(&state, "composed"));
70 RETURN_IF_EXCEPTION(throwScope, { });
71 }
72 if (!composedValue.isUndefined()) {
73 result.composed = convert<IDLBoolean>(state, composedValue);
74 RETURN_IF_EXCEPTION(throwScope, { });
75 } else
76 result.composed = false;
77 return result;
78}
79
80// Functions
81
82JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionGetRootNode(JSC::ExecState*);
83JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionHasChildNodes(JSC::ExecState*);
84JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionNormalize(JSC::ExecState*);
85JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionCloneNode(JSC::ExecState*);
86JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionIsEqualNode(JSC::ExecState*);
87JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionIsSameNode(JSC::ExecState*);
88JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionCompareDocumentPosition(JSC::ExecState*);
89JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionContains(JSC::ExecState*);
90JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionLookupPrefix(JSC::ExecState*);
91JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionLookupNamespaceURI(JSC::ExecState*);
92JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionIsDefaultNamespace(JSC::ExecState*);
93JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionInsertBefore(JSC::ExecState*);
94JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionAppendChild(JSC::ExecState*);
95JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionReplaceChild(JSC::ExecState*);
96JSC::EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionRemoveChild(JSC::ExecState*);
97
98// Attributes
99
100JSC::EncodedJSValue jsNodeConstructor(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
101bool setJSNodeConstructor(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
102JSC::EncodedJSValue jsNodeNodeType(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
103JSC::EncodedJSValue jsNodeNodeName(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
104JSC::EncodedJSValue jsNodeBaseURI(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
105JSC::EncodedJSValue jsNodeIsConnected(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
106JSC::EncodedJSValue jsNodeOwnerDocument(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
107JSC::EncodedJSValue jsNodeParentNode(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
108JSC::EncodedJSValue jsNodeParentElement(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
109JSC::EncodedJSValue jsNodeChildNodes(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
110JSC::EncodedJSValue jsNodeFirstChild(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
111JSC::EncodedJSValue jsNodeLastChild(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
112JSC::EncodedJSValue jsNodePreviousSibling(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
113JSC::EncodedJSValue jsNodeNextSibling(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
114JSC::EncodedJSValue jsNodeNodeValue(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
115bool setJSNodeNodeValue(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
116JSC::EncodedJSValue jsNodeTextContent(JSC::ExecState*, JSC::EncodedJSValue, JSC::PropertyName);
117bool setJSNodeTextContent(JSC::ExecState*, JSC::EncodedJSValue, JSC::EncodedJSValue);
118
119static const JSC::DOMJIT::GetterSetter DOMJITAttributeForNodeNodeType {
120 jsNodeNodeType,
121#if ENABLE(JIT)
122 &compileNodeNodeTypeAttribute,
123#else
124 nullptr,
125#endif
126 DOMJIT::IDLResultTypeFilter<IDLUnsignedShort>::value
127};
128
129static const JSC::DOMJIT::GetterSetter DOMJITAttributeForNodeOwnerDocument {
130 jsNodeOwnerDocument,
131#if ENABLE(JIT)
132 &compileNodeOwnerDocumentAttribute,
133#else
134 nullptr,
135#endif
136 DOMJIT::IDLResultTypeFilter<IDLNullable<IDLInterface<Document>>>::value
137};
138
139static const JSC::DOMJIT::GetterSetter DOMJITAttributeForNodeParentNode {
140 jsNodeParentNode,
141#if ENABLE(JIT)
142 &compileNodeParentNodeAttribute,
143#else
144 nullptr,
145#endif
146 DOMJIT::IDLResultTypeFilter<IDLNullable<IDLInterface<Node>>>::value
147};
148
149static const JSC::DOMJIT::GetterSetter DOMJITAttributeForNodeFirstChild {
150 jsNodeFirstChild,
151#if ENABLE(JIT)
152 &compileNodeFirstChildAttribute,
153#else
154 nullptr,
155#endif
156 DOMJIT::IDLResultTypeFilter<IDLNullable<IDLInterface<Node>>>::value
157};
158
159static const JSC::DOMJIT::GetterSetter DOMJITAttributeForNodeLastChild {
160 jsNodeLastChild,
161#if ENABLE(JIT)
162 &compileNodeLastChildAttribute,
163#else
164 nullptr,
165#endif
166 DOMJIT::IDLResultTypeFilter<IDLNullable<IDLInterface<Node>>>::value
167};
168
169static const JSC::DOMJIT::GetterSetter DOMJITAttributeForNodePreviousSibling {
170 jsNodePreviousSibling,
171#if ENABLE(JIT)
172 &compileNodePreviousSiblingAttribute,
173#else
174 nullptr,
175#endif
176 DOMJIT::IDLResultTypeFilter<IDLNullable<IDLInterface<Node>>>::value
177};
178
179static const JSC::DOMJIT::GetterSetter DOMJITAttributeForNodeNextSibling {
180 jsNodeNextSibling,
181#if ENABLE(JIT)
182 &compileNodeNextSiblingAttribute,
183#else
184 nullptr,
185#endif
186 DOMJIT::IDLResultTypeFilter<IDLNullable<IDLInterface<Node>>>::value
187};
188
189class JSNodePrototype : public JSC::JSNonFinalObject {
190public:
191 using Base = JSC::JSNonFinalObject;
192 static JSNodePrototype* create(JSC::VM& vm, JSDOMGlobalObject* globalObject, JSC::Structure* structure)
193 {
194 JSNodePrototype* ptr = new (NotNull, JSC::allocateCell<JSNodePrototype>(vm.heap)) JSNodePrototype(vm, globalObject, structure);
195 ptr->finishCreation(vm);
196 return ptr;
197 }
198
199 DECLARE_INFO;
200 static JSC::Structure* createStructure(JSC::VM& vm, JSC::JSGlobalObject* globalObject, JSC::JSValue prototype)
201 {
202 return JSC::Structure::create(vm, globalObject, prototype, JSC::TypeInfo(JSC::ObjectType, StructureFlags), info());
203 }
204
205private:
206 JSNodePrototype(JSC::VM& vm, JSC::JSGlobalObject*, JSC::Structure* structure)
207 : JSC::JSNonFinalObject(vm, structure)
208 {
209 }
210
211 void finishCreation(JSC::VM&);
212};
213
214using JSNodeConstructor = JSDOMConstructorNotConstructable<JSNode>;
215
216/* Hash table for constructor */
217
218static const HashTableValue JSNodeConstructorTableValues[] =
219{
220 { "ELEMENT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(1) } },
221 { "ATTRIBUTE_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(2) } },
222 { "TEXT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(3) } },
223 { "CDATA_SECTION_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(4) } },
224 { "ENTITY_REFERENCE_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(5) } },
225 { "ENTITY_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(6) } },
226 { "PROCESSING_INSTRUCTION_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(7) } },
227 { "COMMENT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(8) } },
228 { "DOCUMENT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(9) } },
229 { "DOCUMENT_TYPE_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(10) } },
230 { "DOCUMENT_FRAGMENT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(11) } },
231 { "NOTATION_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(12) } },
232 { "DOCUMENT_POSITION_DISCONNECTED", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x01) } },
233 { "DOCUMENT_POSITION_PRECEDING", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x02) } },
234 { "DOCUMENT_POSITION_FOLLOWING", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x04) } },
235 { "DOCUMENT_POSITION_CONTAINS", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x08) } },
236 { "DOCUMENT_POSITION_CONTAINED_BY", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x10) } },
237 { "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x20) } },
238};
239
240static_assert(Node::ELEMENT_NODE == 1, "ELEMENT_NODE in Node does not match value from IDL");
241static_assert(Node::ATTRIBUTE_NODE == 2, "ATTRIBUTE_NODE in Node does not match value from IDL");
242static_assert(Node::TEXT_NODE == 3, "TEXT_NODE in Node does not match value from IDL");
243static_assert(Node::CDATA_SECTION_NODE == 4, "CDATA_SECTION_NODE in Node does not match value from IDL");
244static_assert(Node::ENTITY_REFERENCE_NODE == 5, "ENTITY_REFERENCE_NODE in Node does not match value from IDL");
245static_assert(Node::ENTITY_NODE == 6, "ENTITY_NODE in Node does not match value from IDL");
246static_assert(Node::PROCESSING_INSTRUCTION_NODE == 7, "PROCESSING_INSTRUCTION_NODE in Node does not match value from IDL");
247static_assert(Node::COMMENT_NODE == 8, "COMMENT_NODE in Node does not match value from IDL");
248static_assert(Node::DOCUMENT_NODE == 9, "DOCUMENT_NODE in Node does not match value from IDL");
249static_assert(Node::DOCUMENT_TYPE_NODE == 10, "DOCUMENT_TYPE_NODE in Node does not match value from IDL");
250static_assert(Node::DOCUMENT_FRAGMENT_NODE == 11, "DOCUMENT_FRAGMENT_NODE in Node does not match value from IDL");
251static_assert(Node::NOTATION_NODE == 12, "NOTATION_NODE in Node does not match value from IDL");
252static_assert(Node::DOCUMENT_POSITION_DISCONNECTED == 0x01, "DOCUMENT_POSITION_DISCONNECTED in Node does not match value from IDL");
253static_assert(Node::DOCUMENT_POSITION_PRECEDING == 0x02, "DOCUMENT_POSITION_PRECEDING in Node does not match value from IDL");
254static_assert(Node::DOCUMENT_POSITION_FOLLOWING == 0x04, "DOCUMENT_POSITION_FOLLOWING in Node does not match value from IDL");
255static_assert(Node::DOCUMENT_POSITION_CONTAINS == 0x08, "DOCUMENT_POSITION_CONTAINS in Node does not match value from IDL");
256static_assert(Node::DOCUMENT_POSITION_CONTAINED_BY == 0x10, "DOCUMENT_POSITION_CONTAINED_BY in Node does not match value from IDL");
257static_assert(Node::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC == 0x20, "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC in Node does not match value from IDL");
258
259template<> JSValue JSNodeConstructor::prototypeForStructure(JSC::VM& vm, const JSDOMGlobalObject& globalObject)
260{
261 return JSEventTarget::getConstructor(vm, &globalObject);
262}
263
264template<> void JSNodeConstructor::initializeProperties(VM& vm, JSDOMGlobalObject& globalObject)
265{
266 putDirect(vm, vm.propertyNames->prototype, JSNode::prototype(vm, globalObject), JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);
267 putDirect(vm, vm.propertyNames->name, jsNontrivialString(&vm, String("Node"_s)), JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);
268 putDirect(vm, vm.propertyNames->length, jsNumber(0), JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::DontEnum);
269 reifyStaticProperties(vm, JSNode::info(), JSNodeConstructorTableValues, *this);
270}
271
272template<> const ClassInfo JSNodeConstructor::s_info = { "Node", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSNodeConstructor) };
273
274/* Hash table for prototype */
275
276static const HashTableValue JSNodePrototypeTableValues[] =
277{
278 { "constructor", static_cast<unsigned>(JSC::PropertyAttribute::DontEnum), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNodeConstructor), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSNodeConstructor) } },
279 { "nodeType", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMJITAttribute), NoIntrinsic, { (intptr_t)static_cast<const JSC::DOMJIT::GetterSetter*>(&DOMJITAttributeForNodeNodeType), (intptr_t) (0) } },
280 { "nodeName", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNodeNodeName), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
281 { "baseURI", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNodeBaseURI), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
282 { "isConnected", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNodeIsConnected), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
283 { "ownerDocument", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMJITAttribute), NoIntrinsic, { (intptr_t)static_cast<const JSC::DOMJIT::GetterSetter*>(&DOMJITAttributeForNodeOwnerDocument), (intptr_t) (0) } },
284 { "parentNode", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMJITAttribute), NoIntrinsic, { (intptr_t)static_cast<const JSC::DOMJIT::GetterSetter*>(&DOMJITAttributeForNodeParentNode), (intptr_t) (0) } },
285 { "parentElement", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNodeParentElement), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
286 { "childNodes", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNodeChildNodes), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(0) } },
287 { "firstChild", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMJITAttribute), NoIntrinsic, { (intptr_t)static_cast<const JSC::DOMJIT::GetterSetter*>(&DOMJITAttributeForNodeFirstChild), (intptr_t) (0) } },
288 { "lastChild", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMJITAttribute), NoIntrinsic, { (intptr_t)static_cast<const JSC::DOMJIT::GetterSetter*>(&DOMJITAttributeForNodeLastChild), (intptr_t) (0) } },
289 { "previousSibling", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMJITAttribute), NoIntrinsic, { (intptr_t)static_cast<const JSC::DOMJIT::GetterSetter*>(&DOMJITAttributeForNodePreviousSibling), (intptr_t) (0) } },
290 { "nextSibling", static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMJITAttribute), NoIntrinsic, { (intptr_t)static_cast<const JSC::DOMJIT::GetterSetter*>(&DOMJITAttributeForNodeNextSibling), (intptr_t) (0) } },
291 { "nodeValue", static_cast<unsigned>(JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNodeNodeValue), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSNodeNodeValue) } },
292 { "textContent", static_cast<unsigned>(JSC::PropertyAttribute::CustomAccessor | JSC::PropertyAttribute::DOMAttribute), NoIntrinsic, { (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsNodeTextContent), (intptr_t) static_cast<PutPropertySlot::PutValueFunc>(setJSNodeTextContent) } },
293 { "getRootNode", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionGetRootNode), (intptr_t) (0) } },
294 { "hasChildNodes", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionHasChildNodes), (intptr_t) (0) } },
295 { "normalize", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionNormalize), (intptr_t) (0) } },
296 { "cloneNode", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionCloneNode), (intptr_t) (0) } },
297 { "isEqualNode", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionIsEqualNode), (intptr_t) (1) } },
298 { "isSameNode", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionIsSameNode), (intptr_t) (1) } },
299 { "compareDocumentPosition", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionCompareDocumentPosition), (intptr_t) (1) } },
300 { "contains", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionContains), (intptr_t) (1) } },
301 { "lookupPrefix", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionLookupPrefix), (intptr_t) (1) } },
302 { "lookupNamespaceURI", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionLookupNamespaceURI), (intptr_t) (1) } },
303 { "isDefaultNamespace", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionIsDefaultNamespace), (intptr_t) (1) } },
304 { "insertBefore", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionInsertBefore), (intptr_t) (2) } },
305 { "appendChild", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionAppendChild), (intptr_t) (1) } },
306 { "replaceChild", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionReplaceChild), (intptr_t) (2) } },
307 { "removeChild", static_cast<unsigned>(JSC::PropertyAttribute::Function), NoIntrinsic, { (intptr_t)static_cast<RawNativeFunction>(jsNodePrototypeFunctionRemoveChild), (intptr_t) (1) } },
308 { "ELEMENT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(1) } },
309 { "ATTRIBUTE_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(2) } },
310 { "TEXT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(3) } },
311 { "CDATA_SECTION_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(4) } },
312 { "ENTITY_REFERENCE_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(5) } },
313 { "ENTITY_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(6) } },
314 { "PROCESSING_INSTRUCTION_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(7) } },
315 { "COMMENT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(8) } },
316 { "DOCUMENT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(9) } },
317 { "DOCUMENT_TYPE_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(10) } },
318 { "DOCUMENT_FRAGMENT_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(11) } },
319 { "NOTATION_NODE", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(12) } },
320 { "DOCUMENT_POSITION_DISCONNECTED", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x01) } },
321 { "DOCUMENT_POSITION_PRECEDING", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x02) } },
322 { "DOCUMENT_POSITION_FOLLOWING", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x04) } },
323 { "DOCUMENT_POSITION_CONTAINS", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x08) } },
324 { "DOCUMENT_POSITION_CONTAINED_BY", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x10) } },
325 { "DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC", JSC::PropertyAttribute::DontDelete | JSC::PropertyAttribute::ReadOnly | JSC::PropertyAttribute::ConstantInteger, NoIntrinsic, { (long long)(0x20) } },
326};
327
328const ClassInfo JSNodePrototype::s_info = { "NodePrototype", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSNodePrototype) };
329
330void JSNodePrototype::finishCreation(VM& vm)
331{
332 Base::finishCreation(vm);
333 reifyStaticProperties(vm, JSNode::info(), JSNodePrototypeTableValues, *this);
334 bool hasDisabledRuntimeProperties = false;
335 if (!RuntimeEnabledFeatures::sharedFeatures().shadowDOMEnabled()) {
336 hasDisabledRuntimeProperties = true;
337 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("getRootNode"), strlen("getRootNode"));
338 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
339 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
340 }
341 if (!RuntimeEnabledFeatures::sharedFeatures().shadowDOMEnabled()) {
342 hasDisabledRuntimeProperties = true;
343 auto propertyName = Identifier::fromString(&vm, reinterpret_cast<const LChar*>("isConnected"), strlen("isConnected"));
344 VM::DeletePropertyModeScope scope(vm, VM::DeletePropertyMode::IgnoreConfigurable);
345 JSObject::deleteProperty(this, globalObject()->globalExec(), propertyName);
346 }
347 if (hasDisabledRuntimeProperties && structure()->isDictionary())
348 flattenDictionaryObject(vm);
349}
350
351const ClassInfo JSNode::s_info = { "Node", &Base::s_info, nullptr
352#if ENABLE(JIT)
353, &checkSubClassSnippetForJSNode
354#else
355, nullptr
356#endif
357, CREATE_METHOD_TABLE(JSNode) };
358
359JSNode::JSNode(Structure* structure, JSDOMGlobalObject& globalObject, Ref<Node>&& impl)
360 : JSEventTarget(structure, globalObject, WTFMove(impl))
361{
362}
363
364void JSNode::finishCreation(VM& vm)
365{
366 Base::finishCreation(vm);
367 ASSERT(inherits(vm, info()));
368
369}
370
371JSObject* JSNode::createPrototype(VM& vm, JSDOMGlobalObject& globalObject)
372{
373 return JSNodePrototype::create(vm, &globalObject, JSNodePrototype::createStructure(vm, &globalObject, JSEventTarget::prototype(vm, globalObject)));
374}
375
376JSObject* JSNode::prototype(VM& vm, JSDOMGlobalObject& globalObject)
377{
378 return getDOMPrototype<JSNode>(vm, globalObject);
379}
380
381JSValue JSNode::getConstructor(VM& vm, const JSGlobalObject* globalObject)
382{
383 return getDOMConstructor<JSNodeConstructor>(vm, *jsCast<const JSDOMGlobalObject*>(globalObject));
384}
385
386template<> inline JSNode* IDLAttribute<JSNode>::cast(ExecState& state, EncodedJSValue thisValue)
387{
388 return jsDynamicCast<JSNode*>(state.vm(), JSValue::decode(thisValue));
389}
390
391template<> inline JSNode* IDLOperation<JSNode>::cast(ExecState& state)
392{
393 return jsDynamicCast<JSNode*>(state.vm(), state.thisValue());
394}
395
396EncodedJSValue jsNodeConstructor(ExecState* state, EncodedJSValue thisValue, PropertyName)
397{
398 VM& vm = state->vm();
399 auto throwScope = DECLARE_THROW_SCOPE(vm);
400 auto* prototype = jsDynamicCast<JSNodePrototype*>(vm, JSValue::decode(thisValue));
401 if (UNLIKELY(!prototype))
402 return throwVMTypeError(state, throwScope);
403 return JSValue::encode(JSNode::getConstructor(state->vm(), prototype->globalObject()));
404}
405
406bool setJSNodeConstructor(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
407{
408 VM& vm = state->vm();
409 auto throwScope = DECLARE_THROW_SCOPE(vm);
410 auto* prototype = jsDynamicCast<JSNodePrototype*>(vm, JSValue::decode(thisValue));
411 if (UNLIKELY(!prototype)) {
412 throwVMTypeError(state, throwScope);
413 return false;
414 }
415 // Shadowing a built-in constructor
416 return prototype->putDirect(vm, vm.propertyNames->constructor, JSValue::decode(encodedValue));
417}
418
419static inline JSValue jsNodeNodeTypeGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
420{
421 UNUSED_PARAM(throwScope);
422 UNUSED_PARAM(state);
423 return thisObject.nodeType(state);
424}
425
426EncodedJSValue jsNodeNodeType(ExecState* state, EncodedJSValue thisValue, PropertyName)
427{
428 return IDLAttribute<JSNode>::get<jsNodeNodeTypeGetter>(*state, thisValue, "nodeType");
429}
430
431static inline JSValue jsNodeNodeNameGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
432{
433 UNUSED_PARAM(throwScope);
434 UNUSED_PARAM(state);
435 auto& impl = thisObject.wrapped();
436 JSValue result = toJS<IDLDOMString>(state, throwScope, impl.nodeName());
437 return result;
438}
439
440EncodedJSValue jsNodeNodeName(ExecState* state, EncodedJSValue thisValue, PropertyName)
441{
442 return IDLAttribute<JSNode>::get<jsNodeNodeNameGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "nodeName");
443}
444
445static inline JSValue jsNodeBaseURIGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
446{
447 UNUSED_PARAM(throwScope);
448 UNUSED_PARAM(state);
449 auto& impl = thisObject.wrapped();
450 JSValue result = toJS<IDLUSVString>(state, throwScope, impl.baseURI());
451 return result;
452}
453
454EncodedJSValue jsNodeBaseURI(ExecState* state, EncodedJSValue thisValue, PropertyName)
455{
456 return IDLAttribute<JSNode>::get<jsNodeBaseURIGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "baseURI");
457}
458
459static inline JSValue jsNodeIsConnectedGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
460{
461 UNUSED_PARAM(throwScope);
462 UNUSED_PARAM(state);
463 auto& impl = thisObject.wrapped();
464 JSValue result = toJS<IDLBoolean>(state, throwScope, impl.isConnected());
465 return result;
466}
467
468EncodedJSValue jsNodeIsConnected(ExecState* state, EncodedJSValue thisValue, PropertyName)
469{
470 return IDLAttribute<JSNode>::get<jsNodeIsConnectedGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "isConnected");
471}
472
473static inline JSValue jsNodeOwnerDocumentGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
474{
475 UNUSED_PARAM(throwScope);
476 UNUSED_PARAM(state);
477 auto& impl = thisObject.wrapped();
478 JSValue result = toJS<IDLNullable<IDLInterface<Document>>>(state, *thisObject.globalObject(), throwScope, impl.ownerDocument());
479 return result;
480}
481
482EncodedJSValue jsNodeOwnerDocument(ExecState* state, EncodedJSValue thisValue, PropertyName)
483{
484 return IDLAttribute<JSNode>::get<jsNodeOwnerDocumentGetter>(*state, thisValue, "ownerDocument");
485}
486
487static inline JSValue jsNodeParentNodeGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
488{
489 UNUSED_PARAM(throwScope);
490 UNUSED_PARAM(state);
491 auto& impl = thisObject.wrapped();
492 JSValue result = toJS<IDLNullable<IDLInterface<Node>>>(state, *thisObject.globalObject(), throwScope, impl.parentNode());
493 return result;
494}
495
496EncodedJSValue jsNodeParentNode(ExecState* state, EncodedJSValue thisValue, PropertyName)
497{
498 return IDLAttribute<JSNode>::get<jsNodeParentNodeGetter>(*state, thisValue, "parentNode");
499}
500
501static inline JSValue jsNodeParentElementGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
502{
503 UNUSED_PARAM(throwScope);
504 UNUSED_PARAM(state);
505 auto& impl = thisObject.wrapped();
506 JSValue result = toJS<IDLNullable<IDLInterface<Element>>>(state, *thisObject.globalObject(), throwScope, impl.parentElement());
507 return result;
508}
509
510EncodedJSValue jsNodeParentElement(ExecState* state, EncodedJSValue thisValue, PropertyName)
511{
512 return IDLAttribute<JSNode>::get<jsNodeParentElementGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "parentElement");
513}
514
515static inline JSValue jsNodeChildNodesGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
516{
517 UNUSED_PARAM(throwScope);
518 UNUSED_PARAM(state);
519 auto& impl = thisObject.wrapped();
520 JSValue result = toJS<IDLInterface<NodeList>>(state, *thisObject.globalObject(), throwScope, impl.childNodes());
521 return result;
522}
523
524EncodedJSValue jsNodeChildNodes(ExecState* state, EncodedJSValue thisValue, PropertyName)
525{
526 return IDLAttribute<JSNode>::get<jsNodeChildNodesGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "childNodes");
527}
528
529static inline JSValue jsNodeFirstChildGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
530{
531 UNUSED_PARAM(throwScope);
532 UNUSED_PARAM(state);
533 auto& impl = thisObject.wrapped();
534 JSValue result = toJS<IDLNullable<IDLInterface<Node>>>(state, *thisObject.globalObject(), throwScope, impl.firstChild());
535 return result;
536}
537
538EncodedJSValue jsNodeFirstChild(ExecState* state, EncodedJSValue thisValue, PropertyName)
539{
540 return IDLAttribute<JSNode>::get<jsNodeFirstChildGetter>(*state, thisValue, "firstChild");
541}
542
543static inline JSValue jsNodeLastChildGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
544{
545 UNUSED_PARAM(throwScope);
546 UNUSED_PARAM(state);
547 auto& impl = thisObject.wrapped();
548 JSValue result = toJS<IDLNullable<IDLInterface<Node>>>(state, *thisObject.globalObject(), throwScope, impl.lastChild());
549 return result;
550}
551
552EncodedJSValue jsNodeLastChild(ExecState* state, EncodedJSValue thisValue, PropertyName)
553{
554 return IDLAttribute<JSNode>::get<jsNodeLastChildGetter>(*state, thisValue, "lastChild");
555}
556
557static inline JSValue jsNodePreviousSiblingGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
558{
559 UNUSED_PARAM(throwScope);
560 UNUSED_PARAM(state);
561 auto& impl = thisObject.wrapped();
562 JSValue result = toJS<IDLNullable<IDLInterface<Node>>>(state, *thisObject.globalObject(), throwScope, impl.previousSibling());
563 return result;
564}
565
566EncodedJSValue jsNodePreviousSibling(ExecState* state, EncodedJSValue thisValue, PropertyName)
567{
568 return IDLAttribute<JSNode>::get<jsNodePreviousSiblingGetter>(*state, thisValue, "previousSibling");
569}
570
571static inline JSValue jsNodeNextSiblingGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
572{
573 UNUSED_PARAM(throwScope);
574 UNUSED_PARAM(state);
575 auto& impl = thisObject.wrapped();
576 JSValue result = toJS<IDLNullable<IDLInterface<Node>>>(state, *thisObject.globalObject(), throwScope, impl.nextSibling());
577 return result;
578}
579
580EncodedJSValue jsNodeNextSibling(ExecState* state, EncodedJSValue thisValue, PropertyName)
581{
582 return IDLAttribute<JSNode>::get<jsNodeNextSiblingGetter>(*state, thisValue, "nextSibling");
583}
584
585static inline JSValue jsNodeNodeValueGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
586{
587 UNUSED_PARAM(throwScope);
588 UNUSED_PARAM(state);
589 auto& impl = thisObject.wrapped();
590 JSValue result = toJS<IDLNullable<IDLDOMString>>(state, throwScope, impl.nodeValue());
591 return result;
592}
593
594EncodedJSValue jsNodeNodeValue(ExecState* state, EncodedJSValue thisValue, PropertyName)
595{
596 return IDLAttribute<JSNode>::get<jsNodeNodeValueGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "nodeValue");
597}
598
599static inline bool setJSNodeNodeValueSetter(ExecState& state, JSNode& thisObject, JSValue value, ThrowScope& throwScope)
600{
601 UNUSED_PARAM(throwScope);
602 CustomElementReactionStack customElementReactionStack(state);
603 auto& impl = thisObject.wrapped();
604 auto nativeValue = convert<IDLNullable<IDLDOMString>>(state, value);
605 RETURN_IF_EXCEPTION(throwScope, false);
606 AttributeSetter::call(state, throwScope, [&] {
607 return impl.setNodeValue(WTFMove(nativeValue));
608 });
609 return true;
610}
611
612bool setJSNodeNodeValue(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
613{
614 return IDLAttribute<JSNode>::set<setJSNodeNodeValueSetter>(*state, thisValue, encodedValue, "nodeValue");
615}
616
617static inline JSValue jsNodeTextContentGetter(ExecState& state, JSNode& thisObject, ThrowScope& throwScope)
618{
619 UNUSED_PARAM(throwScope);
620 UNUSED_PARAM(state);
621 auto& impl = thisObject.wrapped();
622 JSValue result = toJS<IDLNullable<IDLDOMString>>(state, throwScope, impl.textContent());
623 return result;
624}
625
626EncodedJSValue jsNodeTextContent(ExecState* state, EncodedJSValue thisValue, PropertyName)
627{
628 return IDLAttribute<JSNode>::get<jsNodeTextContentGetter, CastedThisErrorBehavior::Assert>(*state, thisValue, "textContent");
629}
630
631static inline bool setJSNodeTextContentSetter(ExecState& state, JSNode& thisObject, JSValue value, ThrowScope& throwScope)
632{
633 UNUSED_PARAM(throwScope);
634 CustomElementReactionStack customElementReactionStack(state);
635 auto& impl = thisObject.wrapped();
636 auto nativeValue = convert<IDLNullable<IDLDOMString>>(state, value);
637 RETURN_IF_EXCEPTION(throwScope, false);
638 AttributeSetter::call(state, throwScope, [&] {
639 return impl.setTextContent(WTFMove(nativeValue));
640 });
641 return true;
642}
643
644bool setJSNodeTextContent(ExecState* state, EncodedJSValue thisValue, EncodedJSValue encodedValue)
645{
646 return IDLAttribute<JSNode>::set<setJSNodeTextContentSetter>(*state, thisValue, encodedValue, "textContent");
647}
648
649static inline JSC::EncodedJSValue jsNodePrototypeFunctionGetRootNodeBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
650{
651 UNUSED_PARAM(state);
652 UNUSED_PARAM(throwScope);
653 auto& impl = castedThis->wrapped();
654 auto options = convert<IDLDictionary<Node::GetRootNodeOptions>>(*state, state->argument(0));
655 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
656 return JSValue::encode(toJS<IDLInterface<Node>>(*state, *castedThis->globalObject(), impl.getRootNode(WTFMove(options))));
657}
658
659EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionGetRootNode(ExecState* state)
660{
661 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionGetRootNodeBody>(*state, "getRootNode");
662}
663
664static inline JSC::EncodedJSValue jsNodePrototypeFunctionHasChildNodesBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
665{
666 UNUSED_PARAM(state);
667 UNUSED_PARAM(throwScope);
668 auto& impl = castedThis->wrapped();
669 return JSValue::encode(toJS<IDLBoolean>(impl.hasChildNodes()));
670}
671
672EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionHasChildNodes(ExecState* state)
673{
674 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionHasChildNodesBody>(*state, "hasChildNodes");
675}
676
677static inline JSC::EncodedJSValue jsNodePrototypeFunctionNormalizeBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
678{
679 UNUSED_PARAM(state);
680 UNUSED_PARAM(throwScope);
681 CustomElementReactionStack customElementReactionStack(*state);
682 auto& impl = castedThis->wrapped();
683 impl.normalize();
684 return JSValue::encode(jsUndefined());
685}
686
687EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionNormalize(ExecState* state)
688{
689 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionNormalizeBody>(*state, "normalize");
690}
691
692static inline JSC::EncodedJSValue jsNodePrototypeFunctionCloneNodeBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
693{
694 UNUSED_PARAM(state);
695 UNUSED_PARAM(throwScope);
696 CustomElementReactionStack customElementReactionStack(*state);
697 auto& impl = castedThis->wrapped();
698 auto deep = convert<IDLBoolean>(*state, state->argument(0));
699 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
700 return JSValue::encode(toJSNewlyCreated<IDLInterface<Node>>(*state, *castedThis->globalObject(), throwScope, impl.cloneNodeForBindings(WTFMove(deep))));
701}
702
703EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionCloneNode(ExecState* state)
704{
705 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionCloneNodeBody>(*state, "cloneNode");
706}
707
708static inline JSC::EncodedJSValue jsNodePrototypeFunctionIsEqualNodeBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
709{
710 UNUSED_PARAM(state);
711 UNUSED_PARAM(throwScope);
712 auto& impl = castedThis->wrapped();
713 if (UNLIKELY(state->argumentCount() < 1))
714 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
715 auto other = convert<IDLNullable<IDLInterface<Node>>>(*state, state->uncheckedArgument(0), [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 0, "other", "Node", "isEqualNode", "Node"); });
716 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
717 return JSValue::encode(toJS<IDLBoolean>(impl.isEqualNode(WTFMove(other))));
718}
719
720EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionIsEqualNode(ExecState* state)
721{
722 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionIsEqualNodeBody>(*state, "isEqualNode");
723}
724
725static inline JSC::EncodedJSValue jsNodePrototypeFunctionIsSameNodeBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
726{
727 UNUSED_PARAM(state);
728 UNUSED_PARAM(throwScope);
729 auto& impl = castedThis->wrapped();
730 if (UNLIKELY(state->argumentCount() < 1))
731 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
732 auto other = convert<IDLNullable<IDLInterface<Node>>>(*state, state->uncheckedArgument(0), [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 0, "other", "Node", "isSameNode", "Node"); });
733 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
734 return JSValue::encode(toJS<IDLBoolean>(impl.isSameNode(WTFMove(other))));
735}
736
737EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionIsSameNode(ExecState* state)
738{
739 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionIsSameNodeBody>(*state, "isSameNode");
740}
741
742static inline JSC::EncodedJSValue jsNodePrototypeFunctionCompareDocumentPositionBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
743{
744 UNUSED_PARAM(state);
745 UNUSED_PARAM(throwScope);
746 auto& impl = castedThis->wrapped();
747 if (UNLIKELY(state->argumentCount() < 1))
748 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
749 auto other = convert<IDLInterface<Node>>(*state, state->uncheckedArgument(0), [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 0, "other", "Node", "compareDocumentPosition", "Node"); });
750 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
751 return JSValue::encode(toJS<IDLUnsignedShort>(impl.compareDocumentPosition(*other)));
752}
753
754EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionCompareDocumentPosition(ExecState* state)
755{
756 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionCompareDocumentPositionBody>(*state, "compareDocumentPosition");
757}
758
759static inline JSC::EncodedJSValue jsNodePrototypeFunctionContainsBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
760{
761 UNUSED_PARAM(state);
762 UNUSED_PARAM(throwScope);
763 auto& impl = castedThis->wrapped();
764 if (UNLIKELY(state->argumentCount() < 1))
765 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
766 auto other = convert<IDLNullable<IDLInterface<Node>>>(*state, state->uncheckedArgument(0), [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 0, "other", "Node", "contains", "Node"); });
767 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
768 return JSValue::encode(toJS<IDLBoolean>(impl.contains(WTFMove(other))));
769}
770
771EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionContains(ExecState* state)
772{
773 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionContainsBody>(*state, "contains");
774}
775
776static inline JSC::EncodedJSValue jsNodePrototypeFunctionLookupPrefixBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
777{
778 UNUSED_PARAM(state);
779 UNUSED_PARAM(throwScope);
780 auto& impl = castedThis->wrapped();
781 if (UNLIKELY(state->argumentCount() < 1))
782 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
783 auto namespaceURI = convert<IDLNullable<IDLDOMString>>(*state, state->uncheckedArgument(0));
784 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
785 return JSValue::encode(toJS<IDLNullable<IDLDOMString>>(*state, impl.lookupPrefix(WTFMove(namespaceURI))));
786}
787
788EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionLookupPrefix(ExecState* state)
789{
790 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionLookupPrefixBody>(*state, "lookupPrefix");
791}
792
793static inline JSC::EncodedJSValue jsNodePrototypeFunctionLookupNamespaceURIBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
794{
795 UNUSED_PARAM(state);
796 UNUSED_PARAM(throwScope);
797 auto& impl = castedThis->wrapped();
798 if (UNLIKELY(state->argumentCount() < 1))
799 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
800 auto prefix = convert<IDLNullable<IDLDOMString>>(*state, state->uncheckedArgument(0));
801 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
802 return JSValue::encode(toJS<IDLNullable<IDLDOMString>>(*state, impl.lookupNamespaceURI(WTFMove(prefix))));
803}
804
805EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionLookupNamespaceURI(ExecState* state)
806{
807 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionLookupNamespaceURIBody>(*state, "lookupNamespaceURI");
808}
809
810static inline JSC::EncodedJSValue jsNodePrototypeFunctionIsDefaultNamespaceBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
811{
812 UNUSED_PARAM(state);
813 UNUSED_PARAM(throwScope);
814 auto& impl = castedThis->wrapped();
815 if (UNLIKELY(state->argumentCount() < 1))
816 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
817 auto namespaceURI = convert<IDLNullable<IDLDOMString>>(*state, state->uncheckedArgument(0));
818 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
819 return JSValue::encode(toJS<IDLBoolean>(impl.isDefaultNamespace(WTFMove(namespaceURI))));
820}
821
822EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionIsDefaultNamespace(ExecState* state)
823{
824 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionIsDefaultNamespaceBody>(*state, "isDefaultNamespace");
825}
826
827static inline JSC::EncodedJSValue jsNodePrototypeFunctionInsertBeforeBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
828{
829 UNUSED_PARAM(state);
830 UNUSED_PARAM(throwScope);
831 CustomElementReactionStack customElementReactionStack(*state);
832 auto& impl = castedThis->wrapped();
833 if (UNLIKELY(state->argumentCount() < 2))
834 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
835 auto returnValue = state->uncheckedArgument(0);
836 auto node = convert<IDLInterface<Node>>(*state, returnValue, [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 0, "node", "Node", "insertBefore", "Node"); });
837 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
838 auto child = convert<IDLNullable<IDLInterface<Node>>>(*state, state->uncheckedArgument(1), [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 1, "child", "Node", "insertBefore", "Node"); });
839 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
840 propagateException(*state, throwScope, impl.insertBefore(*node, WTFMove(child)));
841 return JSValue::encode(returnValue);
842}
843
844EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionInsertBefore(ExecState* state)
845{
846 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionInsertBeforeBody>(*state, "insertBefore");
847}
848
849static inline JSC::EncodedJSValue jsNodePrototypeFunctionAppendChildBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
850{
851 UNUSED_PARAM(state);
852 UNUSED_PARAM(throwScope);
853 CustomElementReactionStack customElementReactionStack(*state);
854 auto& impl = castedThis->wrapped();
855 if (UNLIKELY(state->argumentCount() < 1))
856 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
857 auto returnValue = state->uncheckedArgument(0);
858 auto node = convert<IDLInterface<Node>>(*state, returnValue, [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 0, "node", "Node", "appendChild", "Node"); });
859 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
860 propagateException(*state, throwScope, impl.appendChild(*node));
861 return JSValue::encode(returnValue);
862}
863
864EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionAppendChild(ExecState* state)
865{
866 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionAppendChildBody>(*state, "appendChild");
867}
868
869static inline JSC::EncodedJSValue jsNodePrototypeFunctionReplaceChildBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
870{
871 UNUSED_PARAM(state);
872 UNUSED_PARAM(throwScope);
873 CustomElementReactionStack customElementReactionStack(*state);
874 auto& impl = castedThis->wrapped();
875 if (UNLIKELY(state->argumentCount() < 2))
876 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
877 auto node = convert<IDLInterface<Node>>(*state, state->uncheckedArgument(0), [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 0, "node", "Node", "replaceChild", "Node"); });
878 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
879 auto returnValue = state->uncheckedArgument(1);
880 auto child = convert<IDLInterface<Node>>(*state, returnValue, [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 1, "child", "Node", "replaceChild", "Node"); });
881 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
882 propagateException(*state, throwScope, impl.replaceChild(*node, *child));
883 return JSValue::encode(returnValue);
884}
885
886EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionReplaceChild(ExecState* state)
887{
888 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionReplaceChildBody>(*state, "replaceChild");
889}
890
891static inline JSC::EncodedJSValue jsNodePrototypeFunctionRemoveChildBody(JSC::ExecState* state, typename IDLOperation<JSNode>::ClassParameter castedThis, JSC::ThrowScope& throwScope)
892{
893 UNUSED_PARAM(state);
894 UNUSED_PARAM(throwScope);
895 CustomElementReactionStack customElementReactionStack(*state);
896 auto& impl = castedThis->wrapped();
897 if (UNLIKELY(state->argumentCount() < 1))
898 return throwVMError(state, throwScope, createNotEnoughArgumentsError(state));
899 auto returnValue = state->uncheckedArgument(0);
900 auto child = convert<IDLInterface<Node>>(*state, returnValue, [](JSC::ExecState& state, JSC::ThrowScope& scope) { throwArgumentTypeError(state, scope, 0, "child", "Node", "removeChild", "Node"); });
901 RETURN_IF_EXCEPTION(throwScope, encodedJSValue());
902 propagateException(*state, throwScope, impl.removeChild(*child));
903 return JSValue::encode(returnValue);
904}
905
906EncodedJSValue JSC_HOST_CALL jsNodePrototypeFunctionRemoveChild(ExecState* state)
907{
908 return IDLOperation<JSNode>::call<jsNodePrototypeFunctionRemoveChildBody>(*state, "removeChild");
909}
910
911void JSNode::visitChildren(JSCell* cell, SlotVisitor& visitor)
912{
913 auto* thisObject = jsCast<JSNode*>(cell);
914 ASSERT_GC_OBJECT_INHERITS(thisObject, info());
915 Base::visitChildren(thisObject, visitor);
916 thisObject->visitAdditionalChildren(visitor);
917}
918
919void JSNode::visitOutputConstraints(JSCell* cell, SlotVisitor& visitor)
920{
921 auto* thisObject = jsCast<JSNode*>(cell);
922 ASSERT_GC_OBJECT_INHERITS(thisObject, info());
923 Base::visitOutputConstraints(thisObject, visitor);
924 thisObject->visitAdditionalChildren(visitor);
925}
926
927void JSNode::heapSnapshot(JSCell* cell, HeapSnapshotBuilder& builder)
928{
929 auto* thisObject = jsCast<JSNode*>(cell);
930 builder.setWrappedObjectForCell(cell, &thisObject->wrapped());
931 if (thisObject->scriptExecutionContext())
932 builder.setLabelForCell(cell, "url " + thisObject->scriptExecutionContext()->url().string());
933 Base::heapSnapshot(cell, builder);
934}
935
936void JSNodeOwner::finalize(JSC::Handle<JSC::Unknown> handle, void* context)
937{
938 auto* jsNode = static_cast<JSNode*>(handle.slot()->asCell());
939 auto& world = *static_cast<DOMWrapperWorld*>(context);
940 uncacheWrapper(world, &jsNode->wrapped(), jsNode);
941}
942
943Node* JSNode::toWrapped(JSC::VM& vm, JSC::JSValue value)
944{
945 if (auto* wrapper = jsDynamicCast<JSNode*>(vm, value))
946 return &wrapper->wrapped();
947 return nullptr;
948}
949
950}
951