/ API / tests / JSNodeList.c
JSNodeList.c
  1  /*
  2   * Copyright (C) 2006 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  #include "config.h"
 27  
 28  #include "JSNode.h"
 29  #include "JSNodeList.h"
 30  #include "JSObjectRef.h"
 31  #include "JSValueRef.h"
 32  #include <wtf/Assertions.h>
 33  
 34  static JSValueRef JSNodeList_item(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
 35  {
 36      UNUSED_PARAM(object);
 37  
 38      if (argumentCount > 0) {
 39          NodeList* nodeList = JSObjectGetPrivate(thisObject);
 40          ASSERT(nodeList);
 41          Node* node = NodeList_item(nodeList, (unsigned)JSValueToNumber(context, arguments[0], exception));
 42          if (node)
 43              return JSNode_new(context, node);
 44      }
 45      
 46      return JSValueMakeUndefined(context);
 47  }
 48  
 49  static JSStaticFunction JSNodeList_staticFunctions[] = {
 50      { "item", JSNodeList_item, kJSPropertyAttributeDontDelete },
 51      { 0, 0, 0 }
 52  };
 53  
 54  static JSValueRef JSNodeList_length(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
 55  {
 56      UNUSED_PARAM(propertyName);
 57      UNUSED_PARAM(exception);
 58      
 59      NodeList* nodeList = JSObjectGetPrivate(thisObject);
 60      ASSERT(nodeList);
 61      return JSValueMakeNumber(context, NodeList_length(nodeList));
 62  }
 63  
 64  static JSStaticValue JSNodeList_staticValues[] = {
 65      { "length", JSNodeList_length, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete },
 66      { 0, 0, 0, 0 }
 67  };
 68  
 69  static JSValueRef JSNodeList_getProperty(JSContextRef context, JSObjectRef thisObject, JSStringRef propertyName, JSValueRef* exception)
 70  {
 71      NodeList* nodeList = JSObjectGetPrivate(thisObject);
 72      ASSERT(nodeList);
 73      double index = JSValueToNumber(context, JSValueMakeString(context, propertyName), exception);
 74      unsigned uindex = (unsigned)index;
 75      if (uindex == index) { /* false for NaN */
 76          Node* node = NodeList_item(nodeList, uindex);
 77          if (node)
 78              return JSNode_new(context, node);
 79      }
 80      
 81      return NULL;
 82  }
 83  
 84  static void JSNodeList_initialize(JSContextRef context, JSObjectRef thisObject)
 85  {
 86      UNUSED_PARAM(context);
 87  
 88      NodeList* nodeList = JSObjectGetPrivate(thisObject);
 89      ASSERT(nodeList);
 90      
 91      NodeList_ref(nodeList);
 92  }
 93  
 94  static void JSNodeList_finalize(JSObjectRef thisObject)
 95  {
 96      NodeList* nodeList = JSObjectGetPrivate(thisObject);
 97      ASSERT(nodeList);
 98  
 99      NodeList_deref(nodeList);
100  }
101  
102  static JSClassRef JSNodeList_class(JSContextRef context)
103  {
104      UNUSED_PARAM(context);
105  
106      static JSClassRef jsClass;
107      if (!jsClass) {
108          JSClassDefinition definition = kJSClassDefinitionEmpty;
109          definition.staticValues = JSNodeList_staticValues;
110          definition.staticFunctions = JSNodeList_staticFunctions;
111          definition.getProperty = JSNodeList_getProperty;
112          definition.initialize = JSNodeList_initialize;
113          definition.finalize = JSNodeList_finalize;
114  
115          jsClass = JSClassCreate(&definition);
116      }
117      
118      return jsClass;
119  }
120  
121  JSObjectRef JSNodeList_new(JSContextRef context, NodeList* nodeList)
122  {
123      return JSObjectMake(context, JSNodeList_class(context), nodeList);
124  }