Index: webkit/glue/cpp_variant.cc |
diff --git a/webkit/glue/cpp_variant.cc b/webkit/glue/cpp_variant.cc |
index eca554bcafe0a37e51b758de96fc5b4c35363fe1..a281c97ce9f2e3b131a9f6e08ff1df1c80da5e4d 100644 |
--- a/webkit/glue/cpp_variant.cc |
+++ b/webkit/glue/cpp_variant.cc |
@@ -252,6 +252,42 @@ std::vector<std::string> CppVariant::ToStringVector() const { |
return string_vector; |
} |
+std::vector<CppVariant> CppVariant::ToVector() const { |
+ DCHECK(isObject()); |
+ std::vector<CppVariant> vector; |
+ NPObject* np_value = value.objectValue; |
+ NPIdentifier length_id = WebBindings::getStringIdentifier("length"); |
+ |
+ if (WebBindings::hasProperty(NULL, np_value, length_id)) { |
+ NPVariant length_value; |
+ if (WebBindings::getProperty(NULL, np_value, length_id, &length_value)) { |
+ int length = 0; |
+ // The length is a double in some cases. |
+ if (NPVARIANT_IS_DOUBLE(length_value)) |
+ length = static_cast<int>(NPVARIANT_TO_DOUBLE(length_value)); |
+ else if (NPVARIANT_IS_INT32(length_value)) |
+ length = NPVARIANT_TO_INT32(length_value); |
+ WebBindings::releaseVariantValue(&length_value); |
+ |
+ // For sanity, only allow 60000 items. |
+ length = std::min(60000, length); |
+ for (int i = 0; i < length; ++i) { |
+ // Get each of the items. |
+ std::string index = base::StringPrintf("%d", i); |
+ NPIdentifier index_id = WebBindings::getStringIdentifier(index.c_str()); |
+ if (WebBindings::hasProperty(NULL, np_value, index_id)) { |
+ CppVariant index_value; |
+ if (WebBindings::getProperty(NULL, np_value, index_id, &index_value)) { |
+ vector.push_back(index_value); |
+ } |
+ // CppVariant has a destructor which calls releaseVariantValue. |
+ } |
+ } |
+ } |
+ } |
+ return vector; |
+} |
+ |
bool CppVariant::Invoke(const std::string& method, const CppVariant* args, |
uint32 arg_count, CppVariant& result) const { |
DCHECK(isObject()); |