| 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/api_binding.h" |    5 #include "extensions/renderer/api_binding.h" | 
|    6  |    6  | 
|    7 #include <algorithm> |    7 #include <algorithm> | 
|    8  |    8  | 
|    9 #include "base/bind.h" |    9 #include "base/bind.h" | 
|   10 #include "base/logging.h" |   10 #include "base/logging.h" | 
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  142       weak_factory_(this) { |  142       weak_factory_(this) { | 
|  143   // TODO(devlin): It might make sense to instantiate the object_template_ |  143   // TODO(devlin): It might make sense to instantiate the object_template_ | 
|  144   // directly here, which would avoid the need to hold on to |  144   // directly here, which would avoid the need to hold on to | 
|  145   // |property_definitions_| and |enums_|. However, there are *some* cases where |  145   // |property_definitions_| and |enums_|. However, there are *some* cases where | 
|  146   // we don't immediately stamp out an API from the template following |  146   // we don't immediately stamp out an API from the template following | 
|  147   // construction. |  147   // construction. | 
|  148  |  148  | 
|  149   if (function_definitions) { |  149   if (function_definitions) { | 
|  150     for (const auto& func : *function_definitions) { |  150     for (const auto& func : *function_definitions) { | 
|  151       const base::DictionaryValue* func_dict = nullptr; |  151       const base::DictionaryValue* func_dict = nullptr; | 
|  152       CHECK(func->GetAsDictionary(&func_dict)); |  152       CHECK(func.GetAsDictionary(&func_dict)); | 
|  153       std::string name; |  153       std::string name; | 
|  154       CHECK(func_dict->GetString("name", &name)); |  154       CHECK(func_dict->GetString("name", &name)); | 
|  155  |  155  | 
|  156       const base::ListValue* params = nullptr; |  156       const base::ListValue* params = nullptr; | 
|  157       CHECK(func_dict->GetList("parameters", ¶ms)); |  157       CHECK(func_dict->GetList("parameters", ¶ms)); | 
|  158       auto signature = base::MakeUnique<APISignature>(*params); |  158       auto signature = base::MakeUnique<APISignature>(*params); | 
|  159       std::string full_name = |  159       std::string full_name = | 
|  160           base::StringPrintf("%s.%s", api_name_.c_str(), name.c_str()); |  160           base::StringPrintf("%s.%s", api_name_.c_str(), name.c_str()); | 
|  161       methods_[name] = base::MakeUnique<MethodData>(full_name, signature.get()); |  161       methods_[name] = base::MakeUnique<MethodData>(full_name, signature.get()); | 
|  162       type_refs->AddAPIMethodSignature(full_name, std::move(signature)); |  162       type_refs->AddAPIMethodSignature(full_name, std::move(signature)); | 
|  163     } |  163     } | 
|  164   } |  164   } | 
|  165  |  165  | 
|  166   if (type_definitions) { |  166   if (type_definitions) { | 
|  167     for (const auto& type : *type_definitions) { |  167     for (const auto& type : *type_definitions) { | 
|  168       const base::DictionaryValue* type_dict = nullptr; |  168       const base::DictionaryValue* type_dict = nullptr; | 
|  169       CHECK(type->GetAsDictionary(&type_dict)); |  169       CHECK(type.GetAsDictionary(&type_dict)); | 
|  170       std::string id; |  170       std::string id; | 
|  171       CHECK(type_dict->GetString("id", &id)); |  171       CHECK(type_dict->GetString("id", &id)); | 
|  172       auto argument_spec = base::MakeUnique<ArgumentSpec>(*type_dict); |  172       auto argument_spec = base::MakeUnique<ArgumentSpec>(*type_dict); | 
|  173       const std::set<std::string>& enum_values = argument_spec->enum_values(); |  173       const std::set<std::string>& enum_values = argument_spec->enum_values(); | 
|  174       if (!enum_values.empty()) { |  174       if (!enum_values.empty()) { | 
|  175         // Type names may be prefixed by the api name. If so, remove the prefix. |  175         // Type names may be prefixed by the api name. If so, remove the prefix. | 
|  176         base::Optional<std::string> stripped_id; |  176         base::Optional<std::string> stripped_id; | 
|  177         if (base::StartsWith(id, api_name_, base::CompareCase::SENSITIVE)) |  177         if (base::StartsWith(id, api_name_, base::CompareCase::SENSITIVE)) | 
|  178           stripped_id = id.substr(api_name_.size() + 1);  // +1 for trailing '.' |  178           stripped_id = id.substr(api_name_.size() + 1);  // +1 for trailing '.' | 
|  179         std::vector<EnumEntry>& entries = |  179         std::vector<EnumEntry>& entries = | 
|  180             enums_[stripped_id ? *stripped_id : id]; |  180             enums_[stripped_id ? *stripped_id : id]; | 
|  181         entries.reserve(enum_values.size()); |  181         entries.reserve(enum_values.size()); | 
|  182         for (const auto& enum_value : enum_values) { |  182         for (const auto& enum_value : enum_values) { | 
|  183           entries.push_back( |  183           entries.push_back( | 
|  184               std::make_pair(enum_value, GetJSEnumEntryName(enum_value))); |  184               std::make_pair(enum_value, GetJSEnumEntryName(enum_value))); | 
|  185         } |  185         } | 
|  186       } |  186       } | 
|  187       type_refs->AddSpec(id, std::move(argument_spec)); |  187       type_refs->AddSpec(id, std::move(argument_spec)); | 
|  188       // Some types, like storage.StorageArea, have functions associated with |  188       // Some types, like storage.StorageArea, have functions associated with | 
|  189       // them. Cache the function signatures in the type map. |  189       // them. Cache the function signatures in the type map. | 
|  190       const base::ListValue* type_functions = nullptr; |  190       const base::ListValue* type_functions = nullptr; | 
|  191       if (type_dict->GetList("functions", &type_functions)) { |  191       if (type_dict->GetList("functions", &type_functions)) { | 
|  192         for (const auto& func : *type_functions) { |  192         for (const auto& func : *type_functions) { | 
|  193           const base::DictionaryValue* func_dict = nullptr; |  193           const base::DictionaryValue* func_dict = nullptr; | 
|  194           CHECK(func->GetAsDictionary(&func_dict)); |  194           CHECK(func.GetAsDictionary(&func_dict)); | 
|  195           std::string function_name; |  195           std::string function_name; | 
|  196           CHECK(func_dict->GetString("name", &function_name)); |  196           CHECK(func_dict->GetString("name", &function_name)); | 
|  197  |  197  | 
|  198           const base::ListValue* params = nullptr; |  198           const base::ListValue* params = nullptr; | 
|  199           CHECK(func_dict->GetList("parameters", ¶ms)); |  199           CHECK(func_dict->GetList("parameters", ¶ms)); | 
|  200           type_refs->AddTypeMethodSignature( |  200           type_refs->AddTypeMethodSignature( | 
|  201               base::StringPrintf("%s.%s", id.c_str(), function_name.c_str()), |  201               base::StringPrintf("%s.%s", id.c_str(), function_name.c_str()), | 
|  202               base::MakeUnique<APISignature>(*params)); |  202               base::MakeUnique<APISignature>(*params)); | 
|  203         } |  203         } | 
|  204       } |  204       } | 
|  205     } |  205     } | 
|  206   } |  206   } | 
|  207  |  207  | 
|  208   if (event_definitions) { |  208   if (event_definitions) { | 
|  209     events_.reserve(event_definitions->GetSize()); |  209     events_.reserve(event_definitions->GetSize()); | 
|  210     for (const auto& event : *event_definitions) { |  210     for (const auto& event : *event_definitions) { | 
|  211       const base::DictionaryValue* event_dict = nullptr; |  211       const base::DictionaryValue* event_dict = nullptr; | 
|  212       CHECK(event->GetAsDictionary(&event_dict)); |  212       CHECK(event.GetAsDictionary(&event_dict)); | 
|  213       std::string name; |  213       std::string name; | 
|  214       CHECK(event_dict->GetString("name", &name)); |  214       CHECK(event_dict->GetString("name", &name)); | 
|  215       std::string full_name = |  215       std::string full_name = | 
|  216           base::StringPrintf("%s.%s", api_name_.c_str(), name.c_str()); |  216           base::StringPrintf("%s.%s", api_name_.c_str(), name.c_str()); | 
|  217       events_.push_back(base::MakeUnique<EventData>( |  217       events_.push_back(base::MakeUnique<EventData>( | 
|  218           std::move(name), std::move(full_name), event_handler)); |  218           std::move(name), std::move(full_name), event_handler)); | 
|  219     } |  219     } | 
|  220   } |  220   } | 
|  221 } |  221 } | 
|  222  |  222  | 
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  463   if (invalid_invocation) { |  463   if (invalid_invocation) { | 
|  464     arguments->ThrowTypeError("Invalid invocation"); |  464     arguments->ThrowTypeError("Invalid invocation"); | 
|  465     return; |  465     return; | 
|  466   } |  466   } | 
|  467  |  467  | 
|  468   request_handler_->StartRequest(context, name, std::move(converted_arguments), |  468   request_handler_->StartRequest(context, name, std::move(converted_arguments), | 
|  469                                  callback, custom_callback); |  469                                  callback, custom_callback); | 
|  470 } |  470 } | 
|  471  |  471  | 
|  472 }  // namespace extensions |  472 }  // namespace extensions | 
| OLD | NEW |