| Index: content/renderer/pepper/v8_var_converter.cc
|
| diff --git a/content/renderer/pepper/v8_var_converter.cc b/content/renderer/pepper/v8_var_converter.cc
|
| index 6dc5d78ecdd0e2b55839d7fa44072d5d7917b35b..bc1a25347aac0c4cdaef8a09a101afe8adb2090c 100644
|
| --- a/content/renderer/pepper/v8_var_converter.cc
|
| +++ b/content/renderer/pepper/v8_var_converter.cc
|
| @@ -399,6 +399,20 @@ void V8VarConverter::FromV8Value(
|
| v8::Handle<v8::Value> val,
|
| v8::Handle<v8::Context> context,
|
| const base::Callback<void(const ScopedPPVar&, bool)>& callback) {
|
| + ScopedPPVar result_var;
|
| + if (FromV8ValueInternal(val, context, &result_var)) {
|
| + resource_converter_->Flush(base::Bind(callback, result_var));
|
| + } else {
|
| + message_loop_proxy_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(callback, result_var, false));
|
| + }
|
| +}
|
| +
|
| +bool V8VarConverter::FromV8ValueInternal(
|
| + v8::Handle<v8::Value> val,
|
| + v8::Handle<v8::Context> context,
|
| + ppapi::ScopedPPVar* result_var) {
|
| v8::Context::Scope context_scope(context);
|
| v8::HandleScope handle_scope(context->GetIsolate());
|
|
|
| @@ -408,6 +422,7 @@ void V8VarConverter::FromV8Value(
|
| std::stack<StackEntry<v8::Handle<v8::Value> > > stack;
|
| stack.push(StackEntry<v8::Handle<v8::Value> >(val));
|
| ScopedPPVar root;
|
| + *result_var = PP_MakeUndefined();
|
| bool is_root = true;
|
|
|
| while (!stack.empty()) {
|
| @@ -431,10 +446,7 @@ void V8VarConverter::FromV8Value(
|
| &visited_handles,
|
| &parent_handles,
|
| resource_converter_.get())) {
|
| - message_loop_proxy_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, ScopedPPVar(PP_MakeUndefined()), false));
|
| - return;
|
| + return false;
|
| }
|
|
|
| if (is_root) {
|
| @@ -451,21 +463,14 @@ void V8VarConverter::FromV8Value(
|
| ArrayVar* array_var = ArrayVar::FromPPVar(current_var);
|
| if (!array_var) {
|
| NOTREACHED();
|
| - message_loop_proxy_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, ScopedPPVar(PP_MakeUndefined()), false));
|
| - return;
|
| + return false;
|
| }
|
|
|
| for (uint32 i = 0; i < v8_array->Length(); ++i) {
|
| v8::TryCatch try_catch;
|
| v8::Handle<v8::Value> child_v8 = v8_array->Get(i);
|
| - if (try_catch.HasCaught()) {
|
| - message_loop_proxy_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, ScopedPPVar(PP_MakeUndefined()), false));
|
| - return;
|
| - }
|
| + if (try_catch.HasCaught())
|
| + return false;
|
|
|
| if (!v8_array->HasRealIndexedProperty(i))
|
| continue;
|
| @@ -478,10 +483,7 @@ void V8VarConverter::FromV8Value(
|
| &visited_handles,
|
| &parent_handles,
|
| resource_converter_.get())) {
|
| - message_loop_proxy_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, ScopedPPVar(PP_MakeUndefined()), false));
|
| - return;
|
| + return false;
|
| }
|
| if (did_create && child_v8->IsObject())
|
| stack.push(child_v8);
|
| @@ -496,10 +498,7 @@ void V8VarConverter::FromV8Value(
|
| DictionaryVar* dict_var = DictionaryVar::FromPPVar(current_var);
|
| if (!dict_var) {
|
| NOTREACHED();
|
| - message_loop_proxy_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, ScopedPPVar(PP_MakeUndefined()), false));
|
| - return;
|
| + return false;
|
| }
|
|
|
| v8::Handle<v8::Array> property_names(v8_object->GetOwnPropertyNames());
|
| @@ -511,10 +510,7 @@ void V8VarConverter::FromV8Value(
|
| NOTREACHED() << "Key \"" << *v8::String::Utf8Value(key)
|
| << "\" "
|
| "is neither a string nor a number";
|
| - message_loop_proxy_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, ScopedPPVar(PP_MakeUndefined()), false));
|
| - return;
|
| + return false;
|
| }
|
|
|
| // Skip all callbacks: crbug.com/139933
|
| @@ -525,12 +521,8 @@ void V8VarConverter::FromV8Value(
|
|
|
| v8::TryCatch try_catch;
|
| v8::Handle<v8::Value> child_v8 = v8_object->Get(key);
|
| - if (try_catch.HasCaught()) {
|
| - message_loop_proxy_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, ScopedPPVar(PP_MakeUndefined()), false));
|
| - return;
|
| - }
|
| + if (try_catch.HasCaught())
|
| + return false;
|
|
|
| PP_Var child_var;
|
| if (!GetOrCreateVar(child_v8,
|
| @@ -540,10 +532,7 @@ void V8VarConverter::FromV8Value(
|
| &visited_handles,
|
| &parent_handles,
|
| resource_converter_.get())) {
|
| - message_loop_proxy_->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, ScopedPPVar(PP_MakeUndefined()), false));
|
| - return;
|
| + return false;
|
| }
|
| if (did_create && child_v8->IsObject())
|
| stack.push(child_v8);
|
| @@ -554,7 +543,8 @@ void V8VarConverter::FromV8Value(
|
| }
|
| }
|
| }
|
| - resource_converter_->Flush(base::Bind(callback, root));
|
| + *result_var = root;
|
| + return true;
|
| }
|
|
|
| } // namespace content
|
|
|