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"
31
#include "UnusedParam.h"
34
static JSValueRef JSNode_appendChild(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
36
UNUSED_PARAM(context);
37
UNUSED_PARAM(function);
39
// Example of throwing a type error for invalid values
40
if (!JSValueIsObjectOfClass(context, thisObject, JSNode_class(context))) {
41
JSStringRef message = JSStringCreateWithUTF8CString("TypeError: appendChild can only be called on nodes");
42
*exception = JSValueMakeString(context, message);
43
JSStringRelease(message);
44
} else if (argumentCount < 1 || !JSValueIsObjectOfClass(context, arguments[0], JSNode_class(context))) {
45
JSStringRef message = JSStringCreateWithUTF8CString("TypeError: first argument to appendChild must be a node");
46
*exception = JSValueMakeString(context, message);
47
JSStringRelease(message);
49
Node* node = JSObjectGetPrivate(thisObject);
50
Node* child = JSObjectGetPrivate(JSValueToObject(context, arguments[0], NULL));
52
Node_appendChild(node, child);
55
return JSValueMakeUndefined(context);
58
static JSValueRef JSNode_removeChild(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
60
UNUSED_PARAM(context);
61
UNUSED_PARAM(function);
63
// Example of ignoring invalid values
64
if (argumentCount > 0) {
65
if (JSValueIsObjectOfClass(context, thisObject, JSNode_class(context))) {
66
if (JSValueIsObjectOfClass(context, arguments[0], JSNode_class(context))) {
67
Node* node = JSObjectGetPrivate(thisObject);
68
Node* child = JSObjectGetPrivate(JSValueToObject(context, arguments[0], NULL));
70
Node_removeChild(node, child);
75
return JSValueMakeUndefined(context);
78
static JSValueRef JSNode_replaceChild(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
80
UNUSED_PARAM(context);
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], NULL));
89
Node* oldChild = JSObjectGetPrivate(JSValueToObject(context, arguments[1], NULL));
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(context);
110
UNUSED_PARAM(propertyName);
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
Node* node = JSObjectGetPrivate(thisObject);
128
return JSNodeList_new(context, NodeList_new(node));
131
static JSValueRef JSNode_getFirstChild(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)
133
UNUSED_PARAM(context);
134
UNUSED_PARAM(propertyName);
135
UNUSED_PARAM(object);
137
return JSValueMakeUndefined(context);
140
static JSStaticValue JSNode_staticValues[] = {
141
{ "nodeType", JSNode_getNodeType, NULL, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly },
142
{ "childNodes", JSNode_getChildNodes, NULL, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly },
143
{ "firstChild", JSNode_getFirstChild, NULL, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly },
147
static void JSNode_initialize(JSContextRef context, JSObjectRef object)
149
Node* node = JSObjectGetPrivate(object);
155
static void JSNode_finalize(JSObjectRef object)
157
Node* node = JSObjectGetPrivate(object);
163
JSClassRef JSNode_class(JSContextRef context)
165
static JSClassRef jsClass;
167
JSClassDefinition definition = kJSClassDefinitionEmpty;
168
definition.staticValues = JSNode_staticValues;
169
definition.staticFunctions = JSNode_staticFunctions;
170
definition.initialize = JSNode_initialize;
171
definition.finalize = JSNode_finalize;
173
jsClass = JSClassCreate(&definition);
178
JSObjectRef JSNode_new(JSContextRef context, Node* node)
180
return JSObjectMake(context, JSNode_class(context), node);
183
JSObjectRef JSNode_construct(JSContextRef context, JSObjectRef object, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
185
UNUSED_PARAM(object);
186
UNUSED_PARAM(argumentCount);
187
UNUSED_PARAM(arguments);
189
return JSNode_new(context, Node_new());