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

Unified 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 side-by-side diff with in-line comments
Download patch
Index: webkit/port/bindings/v8/v8_collection.h
===================================================================
--- webkit/port/bindings/v8/v8_collection.h (revision 2436)
+++ webkit/port/bindings/v8/v8_collection.h (working copy)
@@ -11,7 +11,6 @@
namespace WebCore {
-
// Returns named property of a collection.
template <class C>
static v8::Handle<v8::Value> GetNamedPropertyOfCollection(
@@ -20,14 +19,17 @@
v8::Local<v8::Value> data) {
// TODO: assert object is a collection type
ASSERT(V8Proxy::MaybeDOMWrapper(object));
-
V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object);
- C* collection = V8Proxy::FastToNativeObject<C>(t, object);
+ ASSERT(t != V8ClassIndex::NODE);
+ C* collection = V8Proxy::ToNativeObject<C>(t, object);
String prop_name = ToWebCoreString(name);
void* result = collection->namedItem(prop_name);
if (!result) return v8::Handle<v8::Value>();
V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(data);
- return V8Proxy::ToV8Object(type, result);
+ if (type == V8ClassIndex::NODE)
+ return V8Proxy::NodeToV8Object(static_cast<Node*>(result));
+ else
+ return V8Proxy::ToV8Object(type, result);
}
// A template of named property accessor of collections.
@@ -37,6 +39,26 @@
return GetNamedPropertyOfCollection<C>(name, info.Holder(), info.Data());
}
+
+// A template of named property accessor of HTMLSelectElement and
+// HTMLFormElement.
+template <class C>
+static v8::Handle<v8::Value> NodeCollectionNamedPropertyGetter(
+ v8::Local<v8::String> name, const v8::AccessorInfo& info) {
+ ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
+ ASSERT(V8Proxy::GetDOMWrapperType(info.Holder()) == V8ClassIndex::NODE);
+ C* collection = V8Proxy::DOMWrapperToNode<C>(info.Holder());
+ String prop_name = ToWebCoreString(name);
+ void* result = collection->namedItem(prop_name);
+ if (!result) return v8::Handle<v8::Value>();
+ V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(info.Data());
+ if (type == V8ClassIndex::NODE)
+ return V8Proxy::NodeToV8Object(static_cast<Node*>(result));
+ else
+ return V8Proxy::ToV8Object(type, result);
+}
+
+
// A template returns whether a collection has a named property.
// This function does not cause JS heap allocation.
template <class C>
@@ -47,7 +69,7 @@
ASSERT(V8Proxy::MaybeDOMWrapper(object));
V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object);
- C* collection = V8Proxy::FastToNativeObject<C>(t, object);
+ C* collection = V8Proxy::ToNativeObject<C>(t, object);
String prop_name = ToWebCoreString(name);
void* result = collection->namedItem(prop_name);
return result != NULL;
@@ -61,11 +83,15 @@
// TODO, assert that object must be a collection type
ASSERT(V8Proxy::MaybeDOMWrapper(object));
V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object);
- C* collection = V8Proxy::FastToNativeObject<C>(t, object);
+ ASSERT(t != V8ClassIndex::NODE);
+ C* collection = V8Proxy::ToNativeObject<C>(t, object);
void* result = collection->item(index);
if (!result) return v8::Handle<v8::Value>();
V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(data);
- return V8Proxy::ToV8Object(type, result);
+ if (type == V8ClassIndex::NODE)
+ return V8Proxy::NodeToV8Object(static_cast<Node*>(result));
+ else
+ return V8Proxy::ToV8Object(type, result);
}
@@ -77,13 +103,49 @@
}
+// A template of index interceptor of HTMLSelectElement and HTMLFormElement.
+template <class C>
+static v8::Handle<v8::Value> NodeCollectionIndexedPropertyGetter(
+ uint32_t index, const v8::AccessorInfo& info) {
+ ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
+ ASSERT(V8Proxy::GetDOMWrapperType(info.Holder()) == V8ClassIndex::NODE);
+ C* collection = V8Proxy::DOMWrapperToNode<C>(info.Holder());
+ void* result = collection->item(index);
+ if (!result) return v8::Handle<v8::Value>();
+ V8ClassIndex::V8WrapperType type = V8ClassIndex::ToWrapperType(info.Data());
+ if (type == V8ClassIndex::NODE)
+ return V8Proxy::NodeToV8Object(static_cast<Node*>(result));
+ else
+ return V8Proxy::ToV8Object(type, result);
+}
+
+
+// Get an array containing the names of indexed properties of
+// HTMLSelectElement and HTMLFormElement.
+template <class C>
+static v8::Handle<v8::Array> NodeCollectionIndexedPropertyEnumerator(
+ const v8::AccessorInfo& info) {
+ ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
+ ASSERT(V8Proxy::GetDOMWrapperType(info.Holder()) == V8ClassIndex::NODE);
+ C* collection = V8Proxy::DOMWrapperToNode<C>(info.Holder());
+ int length = collection->length();
+ v8::Handle<v8::Array> properties = v8::Array::New(length);
+ for (int i = 0; i < length; i++) {
+ // TODO(ager): Do we need to check that the item function returns
+ // a non-null value for this index?
+ v8::Handle<v8::Integer> integer = v8::Integer::New(i);
+ properties->Set(integer, integer);
+ }
+ return properties;
+}
+
// Get an array containing the names of indexed properties in a collection.
template <class C>
static v8::Handle<v8::Array> CollectionIndexedPropertyEnumerator(
const v8::AccessorInfo& info) {
ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(info.Holder());
- C* collection = V8Proxy::FastToNativeObject<C>(t, info.Holder());
+ C* collection = V8Proxy::ToNativeObject<C>(t, info.Holder());
int length = collection->length();
v8::Handle<v8::Array> properties = v8::Array::New(length);
for (int i = 0; i < length; i++) {
@@ -105,7 +167,7 @@
// TODO, assert that object must be a collection type
ASSERT(V8Proxy::MaybeDOMWrapper(object));
V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(object);
- C* collection = V8Proxy::FastToNativeObject<C>(t, object);
+ C* collection = V8Proxy::ToNativeObject<C>(t, object);
void* result = collection->item(index);
return result != NULL;
}
@@ -119,7 +181,7 @@
// TODO, assert that object must be a collection type
ASSERT(V8Proxy::MaybeDOMWrapper(info.Holder()));
V8ClassIndex::V8WrapperType t = V8Proxy::GetDOMWrapperType(info.Holder());
- C* collection = V8Proxy::FastToNativeObject<C>(t, info.Holder());
+ C* collection = V8Proxy::ToNativeObject<C>(t, info.Holder());
String result = collection->item(index);
return v8StringOrNull(result);
}

Powered by Google App Engine
This is Rietveld 408576698