OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/common/extensions/api/extension_api.h" | 5 #include "chrome/common/extensions/api/extension_api.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
11 #include "base/bind.h" | |
11 #include "base/json/json_reader.h" | 12 #include "base/json/json_reader.h" |
12 #include "base/json/json_writer.h" | 13 #include "base/json/json_writer.h" |
13 #include "base/lazy_instance.h" | 14 #include "base/lazy_instance.h" |
14 #include "base/logging.h" | 15 #include "base/logging.h" |
15 #include "base/string_util.h" | 16 #include "base/string_util.h" |
16 #include "base/strings/string_number_conversions.h" | 17 #include "base/strings/string_number_conversions.h" |
17 #include "base/strings/string_split.h" | 18 #include "base/strings/string_split.h" |
18 #include "base/values.h" | 19 #include "base/values.h" |
19 #include "chrome/common/extensions/api/generated_schemas.h" | 20 #include "chrome/common/extensions/api/generated_schemas.h" |
20 #include "chrome/common/extensions/extension.h" | 21 #include "chrome/common/extensions/extension.h" |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
279 void ExtensionAPI::InitDefaultConfiguration() { | 280 void ExtensionAPI::InitDefaultConfiguration() { |
280 RegisterDependencyProvider( | 281 RegisterDependencyProvider( |
281 "api", BaseFeatureProvider::GetByName("api")); | 282 "api", BaseFeatureProvider::GetByName("api")); |
282 RegisterDependencyProvider( | 283 RegisterDependencyProvider( |
283 "manifest", BaseFeatureProvider::GetByName("manifest")); | 284 "manifest", BaseFeatureProvider::GetByName("manifest")); |
284 RegisterDependencyProvider( | 285 RegisterDependencyProvider( |
285 "permission", BaseFeatureProvider::GetByName("permission")); | 286 "permission", BaseFeatureProvider::GetByName("permission")); |
286 | 287 |
287 // Schemas to be loaded from resources. | 288 // Schemas to be loaded from resources. |
288 CHECK(unloaded_schemas_.empty()); | 289 CHECK(unloaded_schemas_.empty()); |
289 RegisterSchema("app", ReadFromResource( | 290 RegisterSchema("app", IDR_EXTENSION_API_JSON_APP); |
290 IDR_EXTENSION_API_JSON_APP)); | 291 RegisterSchema("browserAction", IDR_EXTENSION_API_JSON_BROWSERACTION); |
291 RegisterSchema("browserAction", ReadFromResource( | 292 RegisterSchema("browsingData", IDR_EXTENSION_API_JSON_BROWSINGDATA); |
292 IDR_EXTENSION_API_JSON_BROWSERACTION)); | 293 RegisterSchema("commands", IDR_EXTENSION_API_JSON_COMMANDS); |
293 RegisterSchema("browsingData", ReadFromResource( | 294 RegisterSchema("declarativeContent", |
294 IDR_EXTENSION_API_JSON_BROWSINGDATA)); | 295 IDR_EXTENSION_API_JSON_DECLARATIVE_CONTENT); |
295 RegisterSchema("commands", ReadFromResource( | 296 RegisterSchema("declarativeWebRequest", |
296 IDR_EXTENSION_API_JSON_COMMANDS)); | 297 IDR_EXTENSION_API_JSON_DECLARATIVE_WEBREQUEST); |
297 RegisterSchema("declarativeContent", ReadFromResource( | 298 RegisterSchema("experimental.input.virtualKeyboard", |
298 IDR_EXTENSION_API_JSON_DECLARATIVE_CONTENT)); | 299 IDR_EXTENSION_API_JSON_EXPERIMENTAL_INPUT_VIRTUALKEYBOARD); |
299 RegisterSchema("declarativeWebRequest", ReadFromResource( | 300 RegisterSchema("experimental.processes", |
300 IDR_EXTENSION_API_JSON_DECLARATIVE_WEBREQUEST)); | 301 IDR_EXTENSION_API_JSON_EXPERIMENTAL_PROCESSES); |
301 RegisterSchema("experimental.input.virtualKeyboard", ReadFromResource( | 302 RegisterSchema("experimental.rlz", IDR_EXTENSION_API_JSON_EXPERIMENTAL_RLZ); |
302 IDR_EXTENSION_API_JSON_EXPERIMENTAL_INPUT_VIRTUALKEYBOARD)); | 303 RegisterSchema("runtime", IDR_EXTENSION_API_JSON_RUNTIME); |
303 RegisterSchema("experimental.processes", ReadFromResource( | 304 RegisterSchema("fileBrowserHandler", |
304 IDR_EXTENSION_API_JSON_EXPERIMENTAL_PROCESSES)); | 305 IDR_EXTENSION_API_JSON_FILEBROWSERHANDLER); |
305 RegisterSchema("experimental.rlz", ReadFromResource( | 306 RegisterSchema("fileBrowserPrivate", |
306 IDR_EXTENSION_API_JSON_EXPERIMENTAL_RLZ)); | 307 IDR_EXTENSION_API_JSON_FILEBROWSERPRIVATE); |
307 RegisterSchema("runtime", ReadFromResource( | 308 RegisterSchema("input.ime", IDR_EXTENSION_API_JSON_INPUT_IME); |
308 IDR_EXTENSION_API_JSON_RUNTIME)); | 309 RegisterSchema("inputMethodPrivate", |
309 RegisterSchema("fileBrowserHandler", ReadFromResource( | 310 IDR_EXTENSION_API_JSON_INPUTMETHODPRIVATE); |
310 IDR_EXTENSION_API_JSON_FILEBROWSERHANDLER)); | 311 RegisterSchema("pageAction", IDR_EXTENSION_API_JSON_PAGEACTION); |
311 RegisterSchema("fileBrowserPrivate", ReadFromResource( | 312 RegisterSchema("pageActions", IDR_EXTENSION_API_JSON_PAGEACTIONS); |
312 IDR_EXTENSION_API_JSON_FILEBROWSERPRIVATE)); | 313 RegisterSchema("privacy", IDR_EXTENSION_API_JSON_PRIVACY); |
313 RegisterSchema("input.ime", ReadFromResource( | 314 RegisterSchema("proxy", IDR_EXTENSION_API_JSON_PROXY); |
314 IDR_EXTENSION_API_JSON_INPUT_IME)); | 315 RegisterSchema("scriptBadge", IDR_EXTENSION_API_JSON_SCRIPTBADGE); |
315 RegisterSchema("inputMethodPrivate", ReadFromResource( | 316 RegisterSchema("streamsPrivate", IDR_EXTENSION_API_JSON_STREAMSPRIVATE); |
316 IDR_EXTENSION_API_JSON_INPUTMETHODPRIVATE)); | 317 RegisterSchema("ttsEngine", IDR_EXTENSION_API_JSON_TTSENGINE); |
317 RegisterSchema("pageAction", ReadFromResource( | 318 RegisterSchema("tts", IDR_EXTENSION_API_JSON_TTS); |
318 IDR_EXTENSION_API_JSON_PAGEACTION)); | 319 RegisterSchema("types", IDR_EXTENSION_API_JSON_TYPES); |
319 RegisterSchema("pageActions", ReadFromResource( | 320 RegisterSchema("webRequestInternal", |
320 IDR_EXTENSION_API_JSON_PAGEACTIONS)); | 321 IDR_EXTENSION_API_JSON_WEBREQUESTINTERNAL); |
321 RegisterSchema("privacy", ReadFromResource( | 322 RegisterSchema("webstore", IDR_EXTENSION_API_JSON_WEBSTORE); |
322 IDR_EXTENSION_API_JSON_PRIVACY)); | 323 RegisterSchema("webstorePrivate", IDR_EXTENSION_API_JSON_WEBSTOREPRIVATE); |
323 RegisterSchema("proxy", ReadFromResource( | |
324 IDR_EXTENSION_API_JSON_PROXY)); | |
325 RegisterSchema("scriptBadge", ReadFromResource( | |
326 IDR_EXTENSION_API_JSON_SCRIPTBADGE)); | |
327 RegisterSchema("streamsPrivate", ReadFromResource( | |
328 IDR_EXTENSION_API_JSON_STREAMSPRIVATE)); | |
329 RegisterSchema("ttsEngine", ReadFromResource( | |
330 IDR_EXTENSION_API_JSON_TTSENGINE)); | |
331 RegisterSchema("tts", ReadFromResource( | |
332 IDR_EXTENSION_API_JSON_TTS)); | |
333 RegisterSchema("types", ReadFromResource( | |
334 IDR_EXTENSION_API_JSON_TYPES)); | |
335 RegisterSchema("webRequestInternal", ReadFromResource( | |
336 IDR_EXTENSION_API_JSON_WEBREQUESTINTERNAL)); | |
337 RegisterSchema("webstore", ReadFromResource( | |
338 IDR_EXTENSION_API_JSON_WEBSTORE)); | |
339 RegisterSchema("webstorePrivate", ReadFromResource( | |
340 IDR_EXTENSION_API_JSON_WEBSTOREPRIVATE)); | |
341 | 324 |
342 // Schemas to be loaded via JSON generated from IDL files. | 325 // Schemas to be loaded via JSON generated from IDL files. |
343 GeneratedSchemas::Get(&unloaded_schemas_); | 326 std::vector<std::string> names; |
327 GeneratedSchemas::GetNames(&names); | |
328 for (size_t i = 0; i < names.size(); ++i) | |
329 RegisterGeneratedSchema(names[i]); | |
344 } | 330 } |
345 | 331 |
346 void ExtensionAPI::RegisterSchema(const std::string& name, | 332 void ExtensionAPI::RegisterSchema(const std::string& name, int resource_id) { |
not at google - send to devlin
2013/05/10 02:46:45
RegisterSchemaResource?
cduvall
2013/05/10 03:31:07
Done.
| |
347 const base::StringPiece& source) { | 333 unloaded_schemas_[name] = base::Bind(&ReadFromResource, resource_id); |
348 unloaded_schemas_[name] = source; | 334 } |
335 | |
336 void ExtensionAPI::RegisterGeneratedSchema(const std::string& name) { | |
337 unloaded_schemas_[name] = base::Bind(&GeneratedSchemas::Get, name); | |
not at google - send to devlin
2013/05/10 02:46:45
There should be some kind of optimisation possible
cduvall
2013/05/10 03:31:07
So I tried to optimize by adding the IsGenerated()
| |
349 } | 338 } |
350 | 339 |
351 void ExtensionAPI::RegisterDependencyProvider(const std::string& name, | 340 void ExtensionAPI::RegisterDependencyProvider(const std::string& name, |
352 FeatureProvider* provider) { | 341 FeatureProvider* provider) { |
353 dependency_providers_[name] = provider; | 342 dependency_providers_[name] = provider; |
354 } | 343 } |
355 | 344 |
356 bool ExtensionAPI::IsAnyFeatureAvailableToContext(const std::string& api_name, | 345 bool ExtensionAPI::IsAnyFeatureAvailableToContext(const std::string& api_name, |
357 Feature::Context context, | 346 Feature::Context context, |
358 const GURL& url) { | 347 const GURL& url) { |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
448 const DictionaryValue* ExtensionAPI::GetSchema(const std::string& full_name) { | 437 const DictionaryValue* ExtensionAPI::GetSchema(const std::string& full_name) { |
449 std::string child_name; | 438 std::string child_name; |
450 std::string api_name = GetAPINameFromFullName(full_name, &child_name); | 439 std::string api_name = GetAPINameFromFullName(full_name, &child_name); |
451 | 440 |
452 const DictionaryValue* result = NULL; | 441 const DictionaryValue* result = NULL; |
453 SchemaMap::iterator maybe_schema = schemas_.find(api_name); | 442 SchemaMap::iterator maybe_schema = schemas_.find(api_name); |
454 if (maybe_schema != schemas_.end()) { | 443 if (maybe_schema != schemas_.end()) { |
455 result = maybe_schema->second.get(); | 444 result = maybe_schema->second.get(); |
456 } else { | 445 } else { |
457 // Might not have loaded yet; or might just not exist. | 446 // Might not have loaded yet; or might just not exist. |
458 std::map<std::string, base::StringPiece>::iterator maybe_schema_resource = | 447 UnloadedSchemaMap ::iterator maybe_schema_resource = |
not at google - send to devlin
2013/05/10 02:46:45
extra space?
cduvall
2013/05/10 03:31:07
Done.
| |
459 unloaded_schemas_.find(api_name); | 448 unloaded_schemas_.find(api_name); |
460 if (maybe_schema_resource == unloaded_schemas_.end()) | 449 if (maybe_schema_resource == unloaded_schemas_.end()) |
461 return NULL; | 450 return NULL; |
462 | 451 |
463 LoadSchema(maybe_schema_resource->first, maybe_schema_resource->second); | 452 LoadSchema(maybe_schema_resource->first, |
453 maybe_schema_resource->second.Run()); | |
464 maybe_schema = schemas_.find(api_name); | 454 maybe_schema = schemas_.find(api_name); |
465 CHECK(schemas_.end() != maybe_schema); | 455 CHECK(schemas_.end() != maybe_schema); |
466 result = maybe_schema->second.get(); | 456 result = maybe_schema->second.get(); |
467 } | 457 } |
468 | 458 |
469 if (!child_name.empty()) | 459 if (!child_name.empty()) |
470 result = GetSchemaChild(result, child_name); | 460 result = GetSchemaChild(result, child_name); |
471 | 461 |
472 return result; | 462 return result; |
473 } | 463 } |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
602 PermissionsData::GetOptionalPermissions(extension)-> | 592 PermissionsData::GetOptionalPermissions(extension)-> |
603 HasAnyAccessToAPI(name); | 593 HasAnyAccessToAPI(name); |
604 } | 594 } |
605 | 595 |
606 bool ExtensionAPI::IsPrivilegedAPI(const std::string& name) { | 596 bool ExtensionAPI::IsPrivilegedAPI(const std::string& name) { |
607 return completely_unprivileged_apis_.count(name) || | 597 return completely_unprivileged_apis_.count(name) || |
608 partially_unprivileged_apis_.count(name); | 598 partially_unprivileged_apis_.count(name); |
609 } | 599 } |
610 | 600 |
611 } // namespace extensions | 601 } // namespace extensions |
OLD | NEW |