Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(422)

Side by Side Diff: chrome/common/extensions/api/extension_api.cc

Issue 15091002: Lazily load API schemas from resource files and convert all APIs to features (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698