| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 | 4 |
| 5 #include "extensions/renderer/argument_spec.h" | 5 #include "extensions/renderer/argument_spec.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/values.h" | 8 #include "base/values.h" |
| 9 #include "content/public/child/v8_value_converter.h" | 9 #include "content/public/child/v8_value_converter.h" |
| 10 #include "extensions/renderer/api_type_reference_map.h" | 10 #include "extensions/renderer/api_type_reference_map.h" |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 } | 137 } |
| 138 | 138 |
| 139 ArgumentSpec::~ArgumentSpec() {} | 139 ArgumentSpec::~ArgumentSpec() {} |
| 140 | 140 |
| 141 bool ArgumentSpec::ParseArgument(v8::Local<v8::Context> context, | 141 bool ArgumentSpec::ParseArgument(v8::Local<v8::Context> context, |
| 142 v8::Local<v8::Value> value, | 142 v8::Local<v8::Value> value, |
| 143 const APITypeReferenceMap& refs, | 143 const APITypeReferenceMap& refs, |
| 144 std::unique_ptr<base::Value>* out_value, | 144 std::unique_ptr<base::Value>* out_value, |
| 145 std::string* error) const { | 145 std::string* error) const { |
| 146 if (type_ == ArgumentType::FUNCTION) { | 146 if (type_ == ArgumentType::FUNCTION) { |
| 147 // We can't serialize functions. We shouldn't be asked to. | 147 if (!value->IsFunction()) |
| 148 DCHECK(!out_value); | 148 return false; |
| 149 return value->IsFunction(); | 149 |
| 150 if (out_value) { |
| 151 // Certain APIs (contextMenus) have functions as parameters other than the |
| 152 // callback (contextMenus uses it for an onclick listener). Our generated |
| 153 // types have adapted to consider functions "objects" and serialize them |
| 154 // as dictionaries. |
| 155 // TODO(devlin): It'd be awfully nice to get rid of this eccentricity. |
| 156 *out_value = base::MakeUnique<base::DictionaryValue>(); |
| 157 } |
| 158 return true; |
| 150 } | 159 } |
| 151 | 160 |
| 152 if (type_ == ArgumentType::REF) { | 161 if (type_ == ArgumentType::REF) { |
| 153 DCHECK(ref_); | 162 DCHECK(ref_); |
| 154 const ArgumentSpec* reference = refs.GetSpec(ref_.value()); | 163 const ArgumentSpec* reference = refs.GetSpec(ref_.value()); |
| 155 DCHECK(reference) << ref_.value(); | 164 DCHECK(reference) << ref_.value(); |
| 156 return reference->ParseArgument(context, value, refs, out_value, error); | 165 return reference->ParseArgument(context, value, refs, out_value, error); |
| 157 } | 166 } |
| 158 | 167 |
| 159 if (type_ == ArgumentType::CHOICES) { | 168 if (type_ == ArgumentType::CHOICES) { |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 return false; | 439 return false; |
| 431 } | 440 } |
| 432 if (type_ == ArgumentType::BINARY) | 441 if (type_ == ArgumentType::BINARY) |
| 433 DCHECK_EQ(base::Value::Type::BINARY, converted->GetType()); | 442 DCHECK_EQ(base::Value::Type::BINARY, converted->GetType()); |
| 434 *out_value = std::move(converted); | 443 *out_value = std::move(converted); |
| 435 } | 444 } |
| 436 return true; | 445 return true; |
| 437 } | 446 } |
| 438 | 447 |
| 439 } // namespace extensions | 448 } // namespace extensions |
| OLD | NEW |