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 |