Move URL from WebCore to WTF
[WebKit-https.git] / Source / WebKitLegacy / mac / DOM / DOMNode.mm
1 /*
2  * Copyright (C) 2004-2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "DOMNodeInternal.h"
27
28 #import "DOMDocumentInternal.h"
29 #import "DOMElementInternal.h"
30 #import "DOMEventInternal.h"
31 #import "DOMInternal.h"
32 #import "DOMNamedNodeMapInternal.h"
33 #import "DOMNodeListInternal.h"
34 #import "ExceptionHandlers.h"
35 #import "ObjCEventListener.h"
36 #import <WebCore/DOMImplementation.h>
37 #import <WebCore/Element.h>
38 #import <WebCore/JSExecState.h>
39 #import <WebCore/NodeList.h>
40 #import <WebCore/SVGTests.h>
41 #import <WebCore/ThreadCheck.h>
42 #import <WebCore/WebCoreObjCExtras.h>
43 #import <WebCore/WebScriptObjectPrivate.h>
44
45 using namespace WebCore;
46
47 static inline Node& unwrap(DOMNode& wrapper)
48 {
49     ASSERT(wrapper._internal);
50     return reinterpret_cast<Node&>(*wrapper._internal);
51 }
52
53 Node* core(DOMNode *wrapper)
54 {
55     return wrapper ? &unwrap(*wrapper) : nullptr;
56 }
57
58 DOMNode *kit(Node* value)
59 {
60     WebCoreThreadViolationCheckRoundOne();
61     if (!value)
62         return nil;
63     if (DOMNode *wrapper = getDOMWrapper(value))
64         return [[wrapper retain] autorelease];
65     DOMNode *wrapper = [[kitClass(value) alloc] _init];
66     if (!wrapper)
67         return nil;
68     wrapper->_internal = reinterpret_cast<DOMObjectInternal*>(value);
69     value->ref();
70     addDOMWrapper(wrapper, value);
71     return [wrapper autorelease];
72 }
73
74 @implementation DOMNode
75
76 - (void)dealloc
77 {
78     if (WebCoreObjCScheduleDeallocateOnMainThread([DOMNode class], self))
79         return;
80     if (_internal)
81         unwrap(*self).deref();
82     [super dealloc];
83 }
84
85 - (NSString *)nodeName
86 {
87     JSMainThreadNullState state;
88     return unwrap(*self).nodeName();
89 }
90
91 - (NSString *)nodeValue
92 {
93     JSMainThreadNullState state;
94     return unwrap(*self).nodeValue();
95 }
96
97 - (void)setNodeValue:(NSString *)newNodeValue
98 {
99     JSMainThreadNullState state;
100     raiseOnDOMError(unwrap(*self).setNodeValue(newNodeValue));
101 }
102
103 - (unsigned short)nodeType
104 {
105     JSMainThreadNullState state;
106     return unwrap(*self).nodeType();
107 }
108
109 - (DOMNode *)parentNode
110 {
111     JSMainThreadNullState state;
112     return kit(unwrap(*self).parentNode());
113 }
114
115 - (DOMNodeList *)childNodes
116 {
117     JSMainThreadNullState state;
118     return kit(unwrap(*self).childNodes().get());
119 }
120
121 - (DOMNode *)firstChild
122 {
123     JSMainThreadNullState state;
124     return kit(unwrap(*self).firstChild());
125 }
126
127 - (DOMNode *)lastChild
128 {
129     JSMainThreadNullState state;
130     return kit(unwrap(*self).lastChild());
131 }
132
133 - (DOMNode *)previousSibling
134 {
135     JSMainThreadNullState state;
136     return kit(unwrap(*self).previousSibling());
137 }
138
139 - (DOMNode *)nextSibling
140 {
141     JSMainThreadNullState state;
142     return kit(unwrap(*self).nextSibling());
143 }
144
145 - (DOMDocument *)ownerDocument
146 {
147     JSMainThreadNullState state;
148     return kit(&unwrap(*self).document());
149 }
150
151 - (NSString *)namespaceURI
152 {
153     JSMainThreadNullState state;
154     return unwrap(*self).namespaceURI();
155 }
156
157 - (NSString *)prefix
158 {
159     JSMainThreadNullState state;
160     return unwrap(*self).prefix();
161 }
162
163 - (void)setPrefix:(NSString *)newPrefix
164 {
165     JSMainThreadNullState state;
166     raiseOnDOMError(unwrap(*self).setPrefix(newPrefix));
167 }
168
169 - (NSString *)localName
170 {
171     JSMainThreadNullState state;
172     return unwrap(*self).localName();
173 }
174
175 - (DOMNamedNodeMap *)attributes
176 {
177     JSMainThreadNullState state;
178     return kit(unwrap(*self).attributes());
179 }
180
181 - (NSString *)baseURI
182 {
183     JSMainThreadNullState state;
184     return unwrap(*self).baseURI();
185 }
186
187 - (NSString *)textContent
188 {
189     JSMainThreadNullState state;
190     return unwrap(*self).textContent();
191 }
192
193 - (void)setTextContent:(NSString *)newTextContent
194 {
195     JSMainThreadNullState state;
196     raiseOnDOMError(unwrap(*self).setTextContent(newTextContent));
197 }
198
199 - (BOOL)isConnected
200 {
201     JSMainThreadNullState state;
202     return unwrap(*self).isConnected();
203 }
204
205 - (DOMElement *)parentElement
206 {
207     JSMainThreadNullState state;
208     return kit(unwrap(*self).parentElement());
209 }
210
211 - (BOOL)isContentEditable
212 {
213     JSMainThreadNullState state;
214     return unwrap(*self).isContentEditable();
215 }
216
217 - (DOMNode *)insertBefore:(DOMNode *)newChild refChild:(DOMNode *)refChild
218 {
219     JSMainThreadNullState state;
220     if (!newChild)
221         raiseTypeErrorException();
222     raiseOnDOMError(unwrap(*self).insertBefore(*core(newChild), core(refChild)));
223     return newChild;
224 }
225
226 - (DOMNode *)replaceChild:(DOMNode *)newChild oldChild:(DOMNode *)oldChild
227 {
228     JSMainThreadNullState state;
229     if (!newChild)
230         raiseTypeErrorException();
231     if (!oldChild)
232         raiseTypeErrorException();
233     raiseOnDOMError(unwrap(*self).replaceChild(*core(newChild), *core(oldChild)));
234     return oldChild;
235 }
236
237 - (DOMNode *)removeChild:(DOMNode *)oldChild
238 {
239     JSMainThreadNullState state;
240     if (!oldChild)
241         raiseTypeErrorException();
242     raiseOnDOMError(unwrap(*self).removeChild(*core(oldChild)));
243     return oldChild;
244 }
245
246 - (DOMNode *)appendChild:(DOMNode *)newChild
247 {
248     JSMainThreadNullState state;
249     if (!newChild)
250         raiseTypeErrorException();
251     raiseOnDOMError(unwrap(*self).appendChild(*core(newChild)));
252     return newChild;
253 }
254
255 - (BOOL)hasChildNodes
256 {
257     JSMainThreadNullState state;
258     return unwrap(*self).hasChildNodes();
259 }
260
261 - (DOMNode *)cloneNode:(BOOL)deep
262 {
263     JSMainThreadNullState state;
264     return kit(raiseOnDOMError(unwrap(*self).cloneNodeForBindings(deep)).ptr());
265 }
266
267 - (void)normalize
268 {
269     JSMainThreadNullState state;
270     unwrap(*self).normalize();
271 }
272
273 - (BOOL)isSupported:(NSString *)feature version:(NSString *)version
274 {
275     return SVGTests::hasFeatureForLegacyBindings(feature, version);
276 }
277
278 - (BOOL)hasAttributes
279 {
280     JSMainThreadNullState state;
281     return unwrap(*self).hasAttributes();
282 }
283
284 - (BOOL)isSameNode:(DOMNode *)other
285 {
286     JSMainThreadNullState state;
287     return unwrap(*self).isSameNode(core(other));
288 }
289
290 - (BOOL)isEqualNode:(DOMNode *)other
291 {
292     JSMainThreadNullState state;
293     return unwrap(*self).isEqualNode(core(other));
294 }
295
296 - (NSString *)lookupPrefix:(NSString *)inNamespaceURI
297 {
298     JSMainThreadNullState state;
299     return unwrap(*self).lookupPrefix(inNamespaceURI);
300 }
301
302 - (NSString *)lookupNamespaceURI:(NSString *)inPrefix
303 {
304     JSMainThreadNullState state;
305     return unwrap(*self).lookupNamespaceURI(inPrefix);
306 }
307
308 - (BOOL)isDefaultNamespace:(NSString *)inNamespaceURI
309 {
310     JSMainThreadNullState state;
311     return unwrap(*self).isDefaultNamespace(inNamespaceURI);
312 }
313
314 - (unsigned short)compareDocumentPosition:(DOMNode *)other
315 {
316     JSMainThreadNullState state;
317     if (!other)
318         return Node::DOCUMENT_POSITION_DISCONNECTED;
319     return unwrap(*self).compareDocumentPosition(*core(other));
320 }
321
322 - (BOOL)contains:(DOMNode *)other
323 {
324     JSMainThreadNullState state;
325     return unwrap(*self).contains(core(other));
326 }
327
328 - (void)inspect
329 {
330     JSMainThreadNullState state;
331     unwrap(*self).inspect();
332 }
333
334 - (void)addEventListener:(NSString *)type listener:(id <DOMEventListener>)listener useCapture:(BOOL)useCapture
335 {
336     JSMainThreadNullState state;
337     unwrap(*self).addEventListenerForBindings(type, ObjCEventListener::wrap(listener), static_cast<bool>(useCapture));
338 }
339
340 - (void)addEventListener:(NSString *)type :(id <DOMEventListener>)listener :(BOOL)useCapture
341 {
342     JSMainThreadNullState state;
343     unwrap(*self).addEventListenerForBindings(type, ObjCEventListener::wrap(listener), static_cast<bool>(useCapture));
344 }
345
346 - (void)removeEventListener:(NSString *)type listener:(id <DOMEventListener>)listener useCapture:(BOOL)useCapture
347 {
348     JSMainThreadNullState state;
349     unwrap(*self).removeEventListenerForBindings(type, ObjCEventListener::wrap(listener), static_cast<bool>(useCapture));
350 }
351
352 - (void)removeEventListener:(NSString *)type :(id <DOMEventListener>)listener :(BOOL)useCapture
353 {
354     JSMainThreadNullState state;
355     unwrap(*self).removeEventListenerForBindings(type, ObjCEventListener::wrap(listener), static_cast<bool>(useCapture));
356 }
357
358 - (BOOL)dispatchEvent:(DOMEvent *)event
359 {
360     JSMainThreadNullState state;
361     if (!event)
362         raiseTypeErrorException();
363     return raiseOnDOMError(unwrap(*self).dispatchEventForBindings(*core(event)));
364 }
365
366 @end
367
368 @implementation DOMNode (DOMNodeDeprecated)
369
370 - (DOMNode *)insertBefore:(DOMNode *)newChild :(DOMNode *)refChild
371 {
372     return [self insertBefore:newChild refChild:refChild];
373 }
374
375 - (DOMNode *)replaceChild:(DOMNode *)newChild :(DOMNode *)oldChild
376 {
377     return [self replaceChild:newChild oldChild:oldChild];
378 }
379
380 - (BOOL)isSupported:(NSString *)feature :(NSString *)version
381 {
382     return [self isSupported:feature version:version];
383 }
384
385 @end