1 // -*- mode: c++; c-basic-offset: 4 -*-
3 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "JSNodeList.h"
29 #include "JSObjectRef.h"
30 #include "JSStringRef.h"
31 #include "JSValueRef.h"
34 #include "UnusedParam.h"
35 #include <wtf/Assertions.h>
37 static JSValueRef
JSNode_appendChild(JSContextRef context
, JSObjectRef function
, JSObjectRef thisObject
, size_t argumentCount
, const JSValueRef arguments
[], JSValueRef
* exception
)
39 UNUSED_PARAM(function
);
41 // Example of throwing a type error for invalid values
42 if (!JSValueIsObjectOfClass(context
, thisObject
, JSNode_class(context
))) {
43 JSStringRef message
= JSStringCreateWithUTF8CString("TypeError: appendChild can only be called on nodes");
44 *exception
= JSValueMakeString(context
, message
);
45 JSStringRelease(message
);
46 } else if (argumentCount
< 1 || !JSValueIsObjectOfClass(context
, arguments
[0], JSNode_class(context
))) {
47 JSStringRef message
= JSStringCreateWithUTF8CString("TypeError: first argument to appendChild must be a node");
48 *exception
= JSValueMakeString(context
, message
);
49 JSStringRelease(message
);
51 Node
* node
= JSObjectGetPrivate(thisObject
);
52 Node
* child
= JSObjectGetPrivate(JSValueToObject(context
, arguments
[0], NULL
));
54 Node_appendChild(node
, child
);
57 return JSValueMakeUndefined(context
);
60 static JSValueRef
JSNode_removeChild(JSContextRef context
, JSObjectRef function
, JSObjectRef thisObject
, size_t argumentCount
, const JSValueRef arguments
[], JSValueRef
* exception
)
62 UNUSED_PARAM(function
);
64 // Example of ignoring invalid values
65 if (argumentCount
> 0) {
66 if (JSValueIsObjectOfClass(context
, thisObject
, JSNode_class(context
))) {
67 if (JSValueIsObjectOfClass(context
, arguments
[0], JSNode_class(context
))) {
68 Node
* node
= JSObjectGetPrivate(thisObject
);
69 Node
* child
= JSObjectGetPrivate(JSValueToObject(context
, arguments
[0], exception
));
71 Node_removeChild(node
, child
);
76 return JSValueMakeUndefined(context
);
79 static JSValueRef
JSNode_replaceChild(JSContextRef context
, JSObjectRef function
, JSObjectRef thisObject
, size_t argumentCount
, const JSValueRef arguments
[], JSValueRef
* exception
)
81 UNUSED_PARAM(function
);
83 if (argumentCount
> 1) {
84 if (JSValueIsObjectOfClass(context
, thisObject
, JSNode_class(context
))) {
85 if (JSValueIsObjectOfClass(context
, arguments
[0], JSNode_class(context
))) {
86 if (JSValueIsObjectOfClass(context
, arguments
[1], JSNode_class(context
))) {
87 Node
* node
= JSObjectGetPrivate(thisObject
);
88 Node
* newChild
= JSObjectGetPrivate(JSValueToObject(context
, arguments
[0], exception
));
89 Node
* oldChild
= JSObjectGetPrivate(JSValueToObject(context
, arguments
[1], exception
));
91 Node_replaceChild(node
, newChild
, oldChild
);
97 return JSValueMakeUndefined(context
);
100 static JSStaticFunction JSNode_staticFunctions
[] = {
101 { "appendChild", JSNode_appendChild
, kJSPropertyAttributeDontDelete
},
102 { "removeChild", JSNode_removeChild
, kJSPropertyAttributeDontDelete
},
103 { "replaceChild", JSNode_replaceChild
, kJSPropertyAttributeDontDelete
},
107 static JSValueRef
JSNode_getNodeType(JSContextRef context
, JSObjectRef object
, JSStringRef propertyName
, JSValueRef
* exception
)
109 UNUSED_PARAM(propertyName
);
110 UNUSED_PARAM(exception
);
112 Node
* node
= JSObjectGetPrivate(object
);
114 JSStringRef nodeType
= JSStringCreateWithUTF8CString(node
->nodeType
);
115 JSValueRef value
= JSValueMakeString(context
, nodeType
);
116 JSStringRelease(nodeType
);
123 static JSValueRef
JSNode_getChildNodes(JSContextRef context
, JSObjectRef thisObject
, JSStringRef propertyName
, JSValueRef
* exception
)
125 UNUSED_PARAM(propertyName
);
126 UNUSED_PARAM(exception
);
128 Node
* node
= JSObjectGetPrivate(thisObject
);
130 return JSNodeList_new(context
, NodeList_new(node
));
133 static JSValueRef
JSNode_getFirstChild(JSContextRef context
, JSObjectRef object
, JSStringRef propertyName
, JSValueRef
* exception
)
135 UNUSED_PARAM(object
);
136 UNUSED_PARAM(propertyName
);
137 UNUSED_PARAM(exception
);
139 return JSValueMakeUndefined(context
);
142 static JSStaticValue JSNode_staticValues
[] = {
143 { "nodeType", JSNode_getNodeType
, NULL
, kJSPropertyAttributeDontDelete
| kJSPropertyAttributeReadOnly
},
144 { "childNodes", JSNode_getChildNodes
, NULL
, kJSPropertyAttributeDontDelete
| kJSPropertyAttributeReadOnly
},
145 { "firstChild", JSNode_getFirstChild
, NULL
, kJSPropertyAttributeDontDelete
| kJSPropertyAttributeReadOnly
},
149 static void JSNode_initialize(JSContextRef context
, JSObjectRef object
)
151 UNUSED_PARAM(context
);
153 Node
* node
= JSObjectGetPrivate(object
);
159 static void JSNode_finalize(JSObjectRef object
)
161 Node
* node
= JSObjectGetPrivate(object
);
167 JSClassRef
JSNode_class(JSContextRef context
)
169 UNUSED_PARAM(context
);
171 static JSClassRef jsClass
;
173 JSClassDefinition definition
= kJSClassDefinitionEmpty
;
174 definition
.staticValues
= JSNode_staticValues
;
175 definition
.staticFunctions
= JSNode_staticFunctions
;
176 definition
.initialize
= JSNode_initialize
;
177 definition
.finalize
= JSNode_finalize
;
179 jsClass
= JSClassCreate(&definition
);
184 JSObjectRef
JSNode_new(JSContextRef context
, Node
* node
)
186 return JSObjectMake(context
, JSNode_class(context
), node
);
189 JSObjectRef
JSNode_construct(JSContextRef context
, JSObjectRef object
, size_t argumentCount
, const JSValueRef arguments
[], JSValueRef
* exception
)
191 UNUSED_PARAM(object
);
192 UNUSED_PARAM(argumentCount
);
193 UNUSED_PARAM(arguments
);
194 UNUSED_PARAM(exception
);
196 return JSNode_new(context
, Node_new());