Index: content/renderer/v8_value_converter_impl.cc |
diff --git a/content/renderer/v8_value_converter_impl.cc b/content/renderer/v8_value_converter_impl.cc |
index cb4b9af00f1c667ded643d7c3735833225e43272..efd3d447769b94a06d4862573d28b9942cb67ca4 100644 |
--- a/content/renderer/v8_value_converter_impl.cc |
+++ b/content/renderer/v8_value_converter_impl.cc |
@@ -86,7 +86,8 @@ V8ValueConverterImpl::V8ValueConverterImpl() |
reg_exp_allowed_(false), |
function_allowed_(false), |
strip_null_from_objects_(false), |
- avoid_identity_hash_for_testing_(false) {} |
+ avoid_identity_hash_for_testing_(false), |
+ strategy_(NULL) {} |
void V8ValueConverterImpl::SetDateAllowed(bool val) { |
date_allowed_ = val; |
@@ -104,6 +105,10 @@ void V8ValueConverterImpl::SetStripNullFromObjects(bool val) { |
strip_null_from_objects_ = val; |
} |
+void V8ValueConverterImpl::SetStrategy(Strategy* strategy) { |
+ strategy_ = strategy; |
+} |
+ |
v8::Handle<v8::Value> V8ValueConverterImpl::ToV8Value( |
const base::Value* value, v8::Handle<v8::Context> context) const { |
v8::Context::Scope context_scope(context); |
@@ -302,6 +307,12 @@ base::Value* V8ValueConverterImpl::FromV8Array( |
val->CreationContext() != v8::Context::GetCurrent()) |
scope.reset(new v8::Context::Scope(val->CreationContext())); |
+ if (strategy_) { |
+ Value* out = NULL; |
+ if (strategy_->FromV8Array(val, &out)) |
+ return out; |
+ } |
+ |
base::ListValue* result = new base::ListValue(); |
// Only fields with integer keys are carried over to the ListValue. |
@@ -357,6 +368,7 @@ base::Value* V8ValueConverterImpl::FromV8Object( |
FromV8ValueState* state) const { |
if (!state->UpdateAndCheckUniqueness(val)) |
return base::Value::CreateNullValue(); |
+ |
scoped_ptr<v8::Context::Scope> scope; |
// If val was created in a different context than our current one, change to |
// that context, but change back after val is converted. |
@@ -364,6 +376,12 @@ base::Value* V8ValueConverterImpl::FromV8Object( |
val->CreationContext() != v8::Context::GetCurrent()) |
scope.reset(new v8::Context::Scope(val->CreationContext())); |
+ if (strategy_) { |
+ Value* out = NULL; |
+ if (strategy_->FromV8Object(val, &out)) |
+ return out; |
+ } |
+ |
scoped_ptr<base::DictionaryValue> result(new base::DictionaryValue()); |
v8::Handle<v8::Array> property_names(val->GetOwnPropertyNames()); |