extensions_client.cc 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // Copyright 2013 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "extensions/common/extensions_client.h"
  5. #include "base/check.h"
  6. #include "base/metrics/histogram_macros.h"
  7. #include "base/notreached.h"
  8. #include "base/timer/elapsed_timer.h"
  9. #include "extensions/common/extension_icon_set.h"
  10. #include "extensions/common/extensions_api_provider.h"
  11. #include "extensions/common/features/feature_provider.h"
  12. #include "extensions/common/features/json_feature_provider_source.h"
  13. #include "extensions/common/manifest_handler.h"
  14. #include "extensions/common/manifest_handlers/icons_handler.h"
  15. #include "extensions/common/permissions/permissions_info.h"
  16. namespace extensions {
  17. namespace {
  18. ExtensionsClient* g_client = NULL;
  19. } // namespace
  20. ExtensionsClient* ExtensionsClient::Get() {
  21. DCHECK(g_client);
  22. return g_client;
  23. }
  24. void ExtensionsClient::Set(ExtensionsClient* client) {
  25. // This can happen in unit tests, where the utility thread runs in-process.
  26. if (g_client)
  27. return;
  28. g_client = client;
  29. g_client->DoInitialize();
  30. }
  31. ExtensionsClient::ExtensionsClient() = default;
  32. ExtensionsClient::~ExtensionsClient() = default;
  33. std::unique_ptr<FeatureProvider> ExtensionsClient::CreateFeatureProvider(
  34. const std::string& name) const {
  35. auto feature_provider = std::make_unique<FeatureProvider>();
  36. using ProviderMethod = void (ExtensionsAPIProvider::*)(FeatureProvider*);
  37. ProviderMethod method = nullptr;
  38. if (name == "api") {
  39. method = &ExtensionsAPIProvider::AddAPIFeatures;
  40. } else if (name == "manifest") {
  41. method = &ExtensionsAPIProvider::AddManifestFeatures;
  42. } else if (name == "permission") {
  43. method = &ExtensionsAPIProvider::AddPermissionFeatures;
  44. } else if (name == "behavior") {
  45. method = &ExtensionsAPIProvider::AddBehaviorFeatures;
  46. } else {
  47. NOTREACHED();
  48. }
  49. for (const auto& api_provider : api_providers_)
  50. ((*api_provider).*method)(feature_provider.get());
  51. return feature_provider;
  52. }
  53. std::unique_ptr<JSONFeatureProviderSource>
  54. ExtensionsClient::CreateAPIFeatureSource() const {
  55. auto source = std::make_unique<JSONFeatureProviderSource>("api");
  56. for (const auto& api_provider : api_providers_)
  57. api_provider->AddAPIJSONSources(source.get());
  58. return source;
  59. }
  60. bool ExtensionsClient::IsAPISchemaGenerated(const std::string& name) const {
  61. for (const auto& provider : api_providers_) {
  62. if (provider->IsAPISchemaGenerated(name))
  63. return true;
  64. }
  65. return false;
  66. }
  67. base::StringPiece ExtensionsClient::GetAPISchema(
  68. const std::string& name) const {
  69. for (const auto& provider : api_providers_) {
  70. base::StringPiece api = provider->GetAPISchema(name);
  71. if (!api.empty())
  72. return api;
  73. }
  74. return base::StringPiece();
  75. }
  76. void ExtensionsClient::AddAPIProvider(
  77. std::unique_ptr<ExtensionsAPIProvider> provider) {
  78. DCHECK(!initialize_called_)
  79. << "APIProviders can only be added before client initialization.";
  80. api_providers_.push_back(std::move(provider));
  81. }
  82. std::set<base::FilePath> ExtensionsClient::GetBrowserImagePaths(
  83. const Extension* extension) {
  84. std::set<base::FilePath> paths;
  85. IconsInfo::GetIcons(extension).GetPaths(&paths);
  86. return paths;
  87. }
  88. void ExtensionsClient::AddOriginAccessPermissions(
  89. const Extension& extension,
  90. bool is_extension_active,
  91. std::vector<network::mojom::CorsOriginPatternPtr>* origin_patterns) const {}
  92. absl::optional<int> ExtensionsClient::GetExtensionExtendedErrorCode() const {
  93. return absl::nullopt;
  94. }
  95. void ExtensionsClient::DoInitialize() {
  96. initialize_called_ = true;
  97. DCHECK(!ManifestHandler::IsRegistrationFinalized());
  98. PermissionsInfo* permissions_info = PermissionsInfo::GetInstance();
  99. const base::ElapsedTimer timer;
  100. for (const auto& provider : api_providers_) {
  101. provider->RegisterManifestHandlers();
  102. provider->RegisterPermissions(permissions_info);
  103. }
  104. ManifestHandler::FinalizeRegistration();
  105. Initialize();
  106. UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
  107. "Extensions.ChromeExtensionsClientInitTime2", timer.Elapsed(),
  108. base::Microseconds(1), base::Seconds(10), 50);
  109. }
  110. } // namespace extensions