source: webkit/trunk/JavaScriptCore/API/JSNode.c@ 15404

Last change on this file since 15404 was 15404, checked in by ggaren, 19 years ago

Pleasing to Maciej.


  • Renamed JSEvaluate -> JSEvaluateScript, JSCheckSyntax -> JSCheckScriptSyntax
  • Added exception out parameters to JSValueTo* and JSValueIsEqual because they can throw
  • Removed JSObjectGetDescription because it's useless and vague, and JSValueToString/JSValueIsObjectOfClass do a better job, anyway
  • Clarified comments about "IsFunction/Constructor" to indicate that they are true of all functions/constructors, not just those created by JSObjectMake*
File size: 7.4 KB
Line 
1// -*- mode: c++; c-basic-offset: 4 -*-
2/*
3 * Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
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.
13 *
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.
25 */
26
27#include "JSNode.h"
28#include "JSNodeList.h"
29#include "Node.h"
30#include "NodeList.h"
31#include "UnusedParam.h"
32
33static JSClassRef JSNode_class(JSContextRef context);
34
35static JSValueRef JSNodePrototype_appendChild(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, JSValueRef argv[], JSValueRef* exception)
36{
37 UNUSED_PARAM(context);
38 UNUSED_PARAM(function);
39
40 // Example of throwing a type error for invalid values
41 if (!JSValueIsObjectOfClass(thisObject, JSNode_class(context))) {
42 JSStringRef message = JSStringCreateWithUTF8CString("TypeError: appendChild can only be called on nodes");
43 *exception = JSValueMakeString(message);
44 JSStringRelease(message);
45 } else if (argc < 1 || !JSValueIsObjectOfClass(argv[0], JSNode_class(context))) {
46 JSStringRef message = JSStringCreateWithUTF8CString("TypeError: first argument to appendChild must be a node");
47 *exception = JSValueMakeString(message);
48 JSStringRelease(message);
49 } else {
50 Node* node = JSObjectGetPrivate(thisObject);
51 Node* child = JSObjectGetPrivate(JSValueToObject(context, argv[0], NULL));
52
53 Node_appendChild(node, child);
54 }
55
56 return JSValueMakeUndefined();
57}
58
59static JSValueRef JSNodePrototype_removeChild(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, JSValueRef argv[], JSValueRef* exception)
60{
61 UNUSED_PARAM(context);
62 UNUSED_PARAM(function);
63
64 // Example of ignoring invalid values
65 if (argc > 0) {
66 if (JSValueIsObjectOfClass(thisObject, JSNode_class(context))) {
67 if (JSValueIsObjectOfClass(argv[0], JSNode_class(context))) {
68 Node* node = JSObjectGetPrivate(thisObject);
69 Node* child = JSObjectGetPrivate(JSValueToObject(context, argv[0], NULL));
70
71 Node_removeChild(node, child);
72 }
73 }
74 }
75
76 return JSValueMakeUndefined();
77}
78
79static JSValueRef JSNodePrototype_replaceChild(JSContextRef context, JSObjectRef function, JSObjectRef thisObject, size_t argc, JSValueRef argv[], JSValueRef* exception)
80{
81 UNUSED_PARAM(context);
82 UNUSED_PARAM(function);
83
84 if (argc > 1) {
85 if (JSValueIsObjectOfClass(thisObject, JSNode_class(context))) {
86 if (JSValueIsObjectOfClass(argv[0], JSNode_class(context))) {
87 if (JSValueIsObjectOfClass(argv[1], JSNode_class(context))) {
88 Node* node = JSObjectGetPrivate(thisObject);
89 Node* newChild = JSObjectGetPrivate(JSValueToObject(context, argv[0], NULL));
90 Node* oldChild = JSObjectGetPrivate(JSValueToObject(context, argv[1], NULL));
91
92 Node_replaceChild(node, newChild, oldChild);
93 }
94 }
95 }
96 }
97
98 return JSValueMakeUndefined();
99}
100
101static JSStaticFunction JSNodePrototype_staticFunctions[] = {
102 { "appendChild", JSNodePrototype_appendChild, kJSPropertyAttributeDontDelete },
103 { "removeChild", JSNodePrototype_removeChild, kJSPropertyAttributeDontDelete },
104 { "replaceChild", JSNodePrototype_replaceChild, kJSPropertyAttributeDontDelete },
105 { 0, 0, 0 }
106};
107
108static JSClassRef JSNodePrototype_class(JSContextRef context)
109{
110 static JSClassRef nodePrototypeClass;
111 if (!nodePrototypeClass)
112 nodePrototypeClass = JSClassCreate(NULL, JSNodePrototype_staticFunctions, &kJSObjectCallbacksNone, NULL);
113 return nodePrototypeClass;
114}
115
116static JSValueRef JSNode_getNodeType(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)
117{
118 UNUSED_PARAM(context);
119 UNUSED_PARAM(propertyName);
120
121 Node* node = JSObjectGetPrivate(object);
122 if (node) {
123 JSStringRef nodeType = JSStringCreateWithUTF8CString(node->nodeType);
124 JSValueRef value = JSValueMakeString(nodeType);
125 JSStringRelease(nodeType);
126 return value;
127 }
128
129 return NULL;
130}
131
132static JSValueRef JSNode_getChildNodes(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
133{
134 UNUSED_PARAM(propertyName);
135 Node* node = JSObjectGetPrivate(thisObject);
136 assert(node);
137 return JSNodeList_new(context, NodeList_new(node));
138}
139
140static JSValueRef JSNode_getFirstChild(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)
141{
142 UNUSED_PARAM(context);
143 UNUSED_PARAM(propertyName);
144 UNUSED_PARAM(object);
145
146 return JSValueMakeUndefined();
147}
148
149static JSStaticValue JSNode_staticValues[] = {
150 { "nodeType", JSNode_getNodeType, NULL, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly },
151 { "childNodes", JSNode_getChildNodes, NULL, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly },
152 { "firstChild", JSNode_getFirstChild, NULL, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly },
153 { 0, 0, 0, 0 }
154};
155
156static void JSNode_finalize(JSObjectRef object)
157{
158 Node* node = JSObjectGetPrivate(object);
159 assert(node);
160
161 Node_deref(node);
162}
163
164static JSClassRef JSNode_class(JSContextRef context)
165{
166 static JSClassRef nodeClass;
167 if (!nodeClass) {
168 JSObjectCallbacks JSNode_callbacks = kJSObjectCallbacksNone;
169 JSNode_callbacks.finalize = JSNode_finalize;
170
171 nodeClass = JSClassCreate(JSNode_staticValues, NULL, &JSNode_callbacks, NULL);
172 }
173 return nodeClass;
174}
175
176static JSObjectRef JSNode_prototype(JSContextRef context)
177{
178 static JSObjectRef prototype;
179 if (!prototype) {
180 prototype = JSObjectMake(context, JSNodePrototype_class(context), NULL);
181 JSValueProtect(prototype);
182 }
183 return prototype;
184}
185
186JSObjectRef JSNode_new(JSContextRef context, Node* node)
187{
188 Node_ref(node);
189
190 JSObjectRef jsNode = JSObjectMake(context, JSNode_class(context), JSNode_prototype(context));
191 JSObjectSetPrivate(jsNode, node);
192 return jsNode;
193}
194
195JSObjectRef JSNode_construct(JSContextRef context, JSObjectRef object, size_t argc, JSValueRef argv[], JSValueRef* exception)
196{
197 UNUSED_PARAM(object);
198 UNUSED_PARAM(argc);
199 UNUSED_PARAM(argv);
200
201 return JSNode_new(context, Node_new());
202}
Note: See TracBrowser for help on using the repository browser.