Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(114)

Side by Side Diff: webkit/port/bindings/v8/v8_collection.h

Issue 3195: Use static type information from IDL to streamline the wrapping and unwrappin... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 12 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // Copied from base/basictypes.h with some modifications 4 // Copied from base/basictypes.h with some modifications
5 5
6 #ifndef V8_PROPERTY_H__ 6 #ifndef V8_PROPERTY_H__
7 #define V8_PROPERTY_H__ 7 #define V8_PROPERTY_H__
8 8
9 #include <v8.h> 9 #include <v8.h>
10 #include "v8_proxy.h" 10 #include "v8_proxy.h"
11 11
12 namespace WebCore { 12 namespace WebCore {
13 13
14
15 // Returns named property of a collection. 14 // Returns named property of a collection.
16 template <class C> 15 template <class C>
17 static v8::Handle<v8::Value> GetNamedPropertyOfCollection( 16 static v8::Handle<v8::Value> GetNamedPropertyOfCollection(
18 v8::Local<v8::String> name, 17 v8::Local<v8::String> name,
19 v8::Local<v8::Object> object, 18 v8::Local<v8::Object> object,
20 v8::Local<v8::Value> data) { 19 v8::Local<v8::Value> data) {
21 // TODO: assert object is a collection type 20 // TODO: assert object is a collection type
22 ASSERT(V8Proxy::MaybeDOMWrapper(object)); 21 ASSERT(V8Proxy::MaybeDOMWrapper(object));
23
24 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object); 22 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object);
25 C* collection = V8Proxy::FastToNativeObject<C>(t, object); 23 ASSERT(t != V8ClassIndex::NODE);
24 C* collection = V8Proxy::ToNativeObject<C>(t, object);
26 String prop_name = ToWebCoreString(name); 25 String prop_name = ToWebCoreString(name);
27 void* result = collection->namedItem(prop_name); 26 void* result = collection->namedItem(prop_name);
28 if (!result) return v8::Handle<v8::Value>(); 27 if (!result) return v8::Handle<v8::Value>();
29 V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(data); 28 V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(data);
30 return V8Proxy::ToV8Object(type, result); 29 if (type == V8ClassIndex::NODE)
30 return V8Proxy::NodeToV8Object(static_cast<Node*>(result));
31 else
32 return V8Proxy::ToV8Object(type, result);
31 } 33 }
32 34
33 // A template of named property accessor of collections. 35 // A template of named property accessor of collections.
34 template <class C> 36 template <class C>
35 static v8::Handle<v8::Value> CollectionNamedPropertyGetter( 37 static v8::Handle<v8::Value> CollectionNamedPropertyGetter(
36 v8::Local<v8::String> name, const v8::AccessorInfo& info) { 38 v8::Local<v8::String> name, const v8::AccessorInfo& info) {
37 return GetNamedPropertyOfCollection<C>(name, info.Holder(), info.Data()); 39 return GetNamedPropertyOfCollection<C>(name, info.Holder(), info.Data());
38 } 40 }
39 41
42
43 // A template of named property accessor of HTMLSelectElement and
44 // HTMLFormElement.
45 template <class C>
46 static v8::Handle<v8::Value> NodeCollectionNamedPropertyGetter(
47 v8::Local<v8::String> name, const v8::AccessorInfo& info) {
48 ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
49 ASSERT(V8Proxy::GetDOMWrapperType(info.Holder()) == V8ClassIndex::NODE);
50 C* collection = V8Proxy::DOMWrapperToNode<C>(info.Holder());
51 String prop_name = ToWebCoreString(name);
52 void* result = collection->namedItem(prop_name);
53 if (!result) return v8::Handle<v8::Value>();
54 V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(info.Data());
55 if (type == V8ClassIndex::NODE)
56 return V8Proxy::NodeToV8Object(static_cast<Node*>(result));
57 else
58 return V8Proxy::ToV8Object(type, result);
59 }
60
61
40 // A template returns whether a collection has a named property. 62 // A template returns whether a collection has a named property.
41 // This function does not cause JS heap allocation. 63 // This function does not cause JS heap allocation.
42 template <class C> 64 template <class C>
43 static bool HasNamedPropertyOfCollection(v8::Local<v8::String> name, 65 static bool HasNamedPropertyOfCollection(v8::Local<v8::String> name,
44 v8::Local<v8::Object> object, 66 v8::Local<v8::Object> object,
45 v8::Local<v8::Value> data) { 67 v8::Local<v8::Value> data) {
46 // TODO: assert object is a collection type 68 // TODO: assert object is a collection type
47 ASSERT(V8Proxy::MaybeDOMWrapper(object)); 69 ASSERT(V8Proxy::MaybeDOMWrapper(object));
48 70
49 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object); 71 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object);
50 C* collection = V8Proxy::FastToNativeObject<C>(t, object); 72 C* collection = V8Proxy::ToNativeObject<C>(t, object);
51 String prop_name = ToWebCoreString(name); 73 String prop_name = ToWebCoreString(name);
52 void* result = collection->namedItem(prop_name); 74 void* result = collection->namedItem(prop_name);
53 return result != NULL; 75 return result != NULL;
54 } 76 }
55 77
56 78
57 // Returns the property at the index of a collection. 79 // Returns the property at the index of a collection.
58 template <class C> 80 template <class C>
59 static v8::Handle<v8::Value> GetIndexedPropertyOfCollection( 81 static v8::Handle<v8::Value> GetIndexedPropertyOfCollection(
60 uint32_t index, v8::Local<v8::Object> object, v8::Local<v8::Value> data) { 82 uint32_t index, v8::Local<v8::Object> object, v8::Local<v8::Value> data) {
61 // TODO, assert that object must be a collection type 83 // TODO, assert that object must be a collection type
62 ASSERT(V8Proxy::MaybeDOMWrapper(object)); 84 ASSERT(V8Proxy::MaybeDOMWrapper(object));
63 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object); 85 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object);
64 C* collection = V8Proxy::FastToNativeObject<C>(t, object); 86 ASSERT(t != V8ClassIndex::NODE);
87 C* collection = V8Proxy::ToNativeObject<C>(t, object);
65 void* result = collection->item(index); 88 void* result = collection->item(index);
66 if (!result) return v8::Handle<v8::Value>(); 89 if (!result) return v8::Handle<v8::Value>();
67 V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(data); 90 V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(data);
68 return V8Proxy::ToV8Object(type, result); 91 if (type == V8ClassIndex::NODE)
92 return V8Proxy::NodeToV8Object(static_cast<Node*>(result));
93 else
94 return V8Proxy::ToV8Object(type, result);
69 } 95 }
70 96
71 97
72 // A template of index interceptor of collections. 98 // A template of index interceptor of collections.
73 template <class C> 99 template <class C>
74 static v8::Handle<v8::Value> CollectionIndexedPropertyGetter( 100 static v8::Handle<v8::Value> CollectionIndexedPropertyGetter(
75 uint32_t index, const v8::AccessorInfo& info) { 101 uint32_t index, const v8::AccessorInfo& info) {
76 return GetIndexedPropertyOfCollection<C>(index, info.Holder(), info.Data()); 102 return GetIndexedPropertyOfCollection<C>(index, info.Holder(), info.Data());
77 } 103 }
78 104
79 105
106 // A template of index interceptor of HTMLSelectElement and HTMLFormElement.
107 template <class C>
108 static v8::Handle<v8::Value> NodeCollectionIndexedPropertyGetter(
109 uint32_t index, const v8::AccessorInfo& info) {
110 ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
111 ASSERT(V8Proxy::GetDOMWrapperType(info.Holder()) == V8ClassIndex::NODE);
112 C* collection = V8Proxy::DOMWrapperToNode<C>(info.Holder());
113 void* result = collection->item(index);
114 if (!result) return v8::Handle<v8::Value>();
115 V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(info.Data());
116 if (type == V8ClassIndex::NODE)
117 return V8Proxy::NodeToV8Object(static_cast<Node*>(result));
118 else
119 return V8Proxy::ToV8Object(type, result);
120 }
121
122
123 // Get an array containing the names of indexed properties of
124 // HTMLSelectElement and HTMLFormElement.
125 template <class C>
126 static v8::Handle<v8::Array> NodeCollectionIndexedPropertyEnumerator(
127 const v8::AccessorInfo& info) {
128 ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
129 ASSERT(V8Proxy::GetDOMWrapperType(info.Holder()) == V8ClassIndex::NODE);
130 C* collection = V8Proxy::DOMWrapperToNode<C>(info.Holder());
131 int length = collection->length();
132 v8::Handle<v8::Array> properties = v8::Array::New(length);
133 for (int i = 0; i < length; i++) {
134 // TODO(ager): Do we need to check that the item function returns
135 // a non-null value for this index?
136 v8::Handle<v8::Integer> integer = v8::Integer::New(i);
137 properties->Set(integer, integer);
138 }
139 return properties;
140 }
141
80 // Get an array containing the names of indexed properties in a collection. 142 // Get an array containing the names of indexed properties in a collection.
81 template <class C> 143 template <class C>
82 static v8::Handle<v8::Array> CollectionIndexedPropertyEnumerator( 144 static v8::Handle<v8::Array> CollectionIndexedPropertyEnumerator(
83 const v8::AccessorInfo& info) { 145 const v8::AccessorInfo& info) {
84 ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder())); 146 ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
85 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(info.Holder()); 147 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(info.Holder());
86 C* collection = V8Proxy::FastToNativeObject<C>(t, info.Holder()); 148 C* collection = V8Proxy::ToNativeObject<C>(t, info.Holder());
87 int length = collection->length(); 149 int length = collection->length();
88 v8::Handle<v8::Array> properties = v8::Array::New(length); 150 v8::Handle<v8::Array> properties = v8::Array::New(length);
89 for (int i = 0; i < length; i++) { 151 for (int i = 0; i < length; i++) {
90 // TODO(ager): Do we need to check that the item function returns 152 // TODO(ager): Do we need to check that the item function returns
91 // a non-null value for this index? 153 // a non-null value for this index?
92 v8::Handle<v8::Integer> integer = v8::Integer::New(i); 154 v8::Handle<v8::Integer> integer = v8::Integer::New(i);
93 properties->Set(integer, integer); 155 properties->Set(integer, integer);
94 } 156 }
95 return properties; 157 return properties;
96 } 158 }
97 159
98 160
99 // Returns whether a collection has a property at a given index. 161 // Returns whether a collection has a property at a given index.
100 // This function does not cause JS heap allocation. 162 // This function does not cause JS heap allocation.
101 template <class C> 163 template <class C>
102 static bool HasIndexedPropertyOfCollection(uint32_t index, 164 static bool HasIndexedPropertyOfCollection(uint32_t index,
103 v8::Local<v8::Object> object, 165 v8::Local<v8::Object> object,
104 v8::Local<v8::Value> data) { 166 v8::Local<v8::Value> data) {
105 // TODO, assert that object must be a collection type 167 // TODO, assert that object must be a collection type
106 ASSERT(V8Proxy::MaybeDOMWrapper(object)); 168 ASSERT(V8Proxy::MaybeDOMWrapper(object));
107 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object); 169 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object);
108 C* collection = V8Proxy::FastToNativeObject<C>(t, object); 170 C* collection = V8Proxy::ToNativeObject<C>(t, object);
109 void* result = collection->item(index); 171 void* result = collection->item(index);
110 return result != NULL; 172 return result != NULL;
111 } 173 }
112 174
113 175
114 // A template for indexed getters on collections of strings that should return 176 // A template for indexed getters on collections of strings that should return
115 // null if the resulting string is a null string. 177 // null if the resulting string is a null string.
116 template <class C> 178 template <class C>
117 static v8::Handle<v8::Value> CollectionStringOrNullIndexedPropertyGetter( 179 static v8::Handle<v8::Value> CollectionStringOrNullIndexedPropertyGetter(
118 uint32_t index, const v8::AccessorInfo& info) { 180 uint32_t index, const v8::AccessorInfo& info) {
119 // TODO, assert that object must be a collection type 181 // TODO, assert that object must be a collection type
120 ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder())); 182 ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
121 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(info.Holder()); 183 V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(info.Holder());
122 C* collection = V8Proxy::FastToNativeObject<C>(t, info.Holder()); 184 C* collection = V8Proxy::ToNativeObject<C>(t, info.Holder());
123 String result = collection->item(index); 185 String result = collection->item(index);
124 return v8StringOrNull(result); 186 return v8StringOrNull(result);
125 } 187 }
126 188
127 189
128 // Add indexed getter to the function template for a collection. 190 // Add indexed getter to the function template for a collection.
129 template <class T> 191 template <class T>
130 static void SetCollectionIndexedGetter(v8::Handle<v8::FunctionTemplate> desc, 192 static void SetCollectionIndexedGetter(v8::Handle<v8::FunctionTemplate> desc,
131 V8ClassIndex::V8WrapperType type) { 193 V8ClassIndex::V8WrapperType type) {
132 desc->InstanceTemplate()->SetIndexedPropertyHandler( 194 desc->InstanceTemplate()->SetIndexedPropertyHandler(
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 0, 250 0,
189 0, 251 0,
190 CollectionIndexedPropertyEnumerator<T>); 252 CollectionIndexedPropertyEnumerator<T>);
191 } 253 }
192 254
193 255
194 } // namespace WebCore 256 } // namespace WebCore
195 257
196 #endif // V8_PROPERTY_H__ 258 #endif // V8_PROPERTY_H__
197 259
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698