| 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/browser/extensions/component_loader.h" | 5 #include "chrome/browser/extensions/component_loader.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/file_util.h" | 8 #include "base/file_util.h" |
| 9 #include "base/json/json_string_value_serializer.h" | 9 #include "base/json/json_string_value_serializer.h" |
| 10 #include "base/path_service.h" | 10 #include "base/path_service.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 pref_change_registrar_.Add( | 81 pref_change_registrar_.Add( |
| 82 prefs::kEnterpriseWebStoreURL, | 82 prefs::kEnterpriseWebStoreURL, |
| 83 base::Bind(&ComponentLoader::AddOrReloadEnterpriseWebStore, | 83 base::Bind(&ComponentLoader::AddOrReloadEnterpriseWebStore, |
| 84 base::Unretained(this))); | 84 base::Unretained(this))); |
| 85 } | 85 } |
| 86 | 86 |
| 87 ComponentLoader::~ComponentLoader() { | 87 ComponentLoader::~ComponentLoader() { |
| 88 ClearAllRegistered(); | 88 ClearAllRegistered(); |
| 89 } | 89 } |
| 90 | 90 |
| 91 void ComponentLoader::LoadAll() { | 91 void ComponentLoader::LoadAll(bool defer_extensions_with_background_pages) { |
| 92 for (RegisteredComponentExtensions::iterator it = | 92 for (RegisteredComponentExtensions::iterator it = |
| 93 component_extensions_.begin(); | 93 component_extensions_.begin(); |
| 94 it != component_extensions_.end(); ++it) { | 94 it != component_extensions_.end(); ++it) { |
| 95 Load(*it); | 95 Load(*it, defer_extensions_with_background_pages); |
| 96 } | 96 } |
| 97 } | 97 } |
| 98 | 98 |
| 99 void ComponentLoader::LoadAllDeferred() { |
| 100 for (DeferredAtLoadExtensions::iterator it = |
| 101 deferred_at_load_extensions.begin(); |
| 102 it != deferred_at_load_extensions.end(); ++it) { |
| 103 extension_service_->AddComponentExtension(*it); |
| 104 } |
| 105 deferred_at_load_extensions.clear(); |
| 106 } |
| 107 |
| 99 DictionaryValue* ComponentLoader::ParseManifest( | 108 DictionaryValue* ComponentLoader::ParseManifest( |
| 100 const std::string& manifest_contents) const { | 109 const std::string& manifest_contents) const { |
| 101 JSONStringValueSerializer serializer(manifest_contents); | 110 JSONStringValueSerializer serializer(manifest_contents); |
| 102 scoped_ptr<Value> manifest(serializer.Deserialize(NULL, NULL)); | 111 scoped_ptr<Value> manifest(serializer.Deserialize(NULL, NULL)); |
| 103 | 112 |
| 104 if (!manifest.get() || !manifest->IsType(Value::TYPE_DICTIONARY)) { | 113 if (!manifest.get() || !manifest->IsType(Value::TYPE_DICTIONARY)) { |
| 105 LOG(ERROR) << "Failed to parse extension manifest."; | 114 LOG(ERROR) << "Failed to parse extension manifest."; |
| 106 return NULL; | 115 return NULL; |
| 107 } | 116 } |
| 108 // Transfer ownership to the caller. | 117 // Transfer ownership to the caller. |
| (...skipping 26 matching lines...) Expand all Loading... |
| 135 if (manifest) | 144 if (manifest) |
| 136 return Add(manifest, root_directory); | 145 return Add(manifest, root_directory); |
| 137 return ""; | 146 return ""; |
| 138 } | 147 } |
| 139 | 148 |
| 140 std::string ComponentLoader::Add(const DictionaryValue* parsed_manifest, | 149 std::string ComponentLoader::Add(const DictionaryValue* parsed_manifest, |
| 141 const FilePath& root_directory) { | 150 const FilePath& root_directory) { |
| 142 ComponentExtensionInfo info(parsed_manifest, root_directory); | 151 ComponentExtensionInfo info(parsed_manifest, root_directory); |
| 143 component_extensions_.push_back(info); | 152 component_extensions_.push_back(info); |
| 144 if (extension_service_->is_ready()) | 153 if (extension_service_->is_ready()) |
| 145 Load(info); | 154 Load(info, false); |
| 146 return info.extension_id; | 155 return info.extension_id; |
| 147 } | 156 } |
| 148 | 157 |
| 149 std::string ComponentLoader::AddOrReplace(const FilePath& path) { | 158 std::string ComponentLoader::AddOrReplace(const FilePath& path) { |
| 150 FilePath absolute_path = path; | 159 FilePath absolute_path = path; |
| 151 file_util::AbsolutePath(&absolute_path); | 160 file_util::AbsolutePath(&absolute_path); |
| 152 std::string error; | 161 std::string error; |
| 153 scoped_ptr<DictionaryValue> manifest( | 162 scoped_ptr<DictionaryValue> manifest( |
| 154 extension_file_util::LoadManifest(absolute_path, &error)); | 163 extension_file_util::LoadManifest(absolute_path, &error)); |
| 155 if (!manifest.get()) { | 164 if (!manifest.get()) { |
| 156 LOG(ERROR) << "Could not load extension from '" << | 165 LOG(ERROR) << "Could not load extension from '" << |
| 157 absolute_path.value() << "'. " << error; | 166 absolute_path.value() << "'. " << error; |
| 158 return NULL; | 167 return NULL; |
| 159 } | 168 } |
| 160 Remove(GenerateId(manifest.get(), absolute_path)); | 169 Remove(GenerateId(manifest.get(), absolute_path)); |
| 161 | 170 |
| 162 return Add(manifest.release(), absolute_path); | 171 return Add(manifest.release(), absolute_path); |
| 163 } | 172 } |
| 164 | 173 |
| 165 void ComponentLoader::Reload(const std::string& extension_id) { | 174 void ComponentLoader::Reload(const std::string& extension_id) { |
| 166 for (RegisteredComponentExtensions::iterator it = | 175 for (RegisteredComponentExtensions::iterator it = |
| 167 component_extensions_.begin(); it != component_extensions_.end(); | 176 component_extensions_.begin(); it != component_extensions_.end(); |
| 168 ++it) { | 177 ++it) { |
| 169 if (it->extension_id == extension_id) { | 178 if (it->extension_id == extension_id) { |
| 170 Load(*it); | 179 Load(*it, false); |
| 171 break; | 180 break; |
| 172 } | 181 } |
| 173 } | 182 } |
| 174 } | 183 } |
| 175 | 184 |
| 176 const Extension* ComponentLoader::Load(const ComponentExtensionInfo& info) { | 185 void ComponentLoader::Load(const ComponentExtensionInfo& info, |
| 186 bool defer_if_has_background_page) { |
| 177 // TODO(abarth): We should REQUIRE_MODERN_MANIFEST_VERSION once we've updated | 187 // TODO(abarth): We should REQUIRE_MODERN_MANIFEST_VERSION once we've updated |
| 178 // our component extensions to the new manifest version. | 188 // our component extensions to the new manifest version. |
| 179 int flags = Extension::REQUIRE_KEY; | 189 int flags = Extension::REQUIRE_KEY; |
| 180 | 190 |
| 181 std::string error; | 191 std::string error; |
| 182 | 192 |
| 183 scoped_refptr<const Extension> extension(Extension::Create( | 193 scoped_refptr<const Extension> extension(Extension::Create( |
| 184 info.root_directory, | 194 info.root_directory, |
| 185 Extension::COMPONENT, | 195 Extension::COMPONENT, |
| 186 *info.manifest, | 196 *info.manifest, |
| 187 flags, | 197 flags, |
| 188 &error)); | 198 &error)); |
| 189 if (!extension.get()) { | 199 if (!extension.get()) { |
| 190 LOG(ERROR) << error; | 200 LOG(ERROR) << error; |
| 191 return NULL; | 201 return; |
| 192 } | 202 } |
| 203 |
| 193 CHECK_EQ(info.extension_id, extension->id()) << extension->name(); | 204 CHECK_EQ(info.extension_id, extension->id()) << extension->name(); |
| 194 extension_service_->AddComponentExtension(extension); | 205 if (extension->has_background_page() && defer_if_has_background_page) { |
| 195 return extension; | 206 deferred_at_load_extensions.push_back(extension); |
| 207 } else { |
| 208 extension_service_->AddComponentExtension(extension); |
| 209 } |
| 196 } | 210 } |
| 197 | 211 |
| 198 void ComponentLoader::RemoveAll() { | 212 void ComponentLoader::RemoveAll() { |
| 199 RegisteredComponentExtensions::iterator it = component_extensions_.begin(); | 213 RegisteredComponentExtensions::iterator it = component_extensions_.begin(); |
| 200 for (; it != component_extensions_.end(); ++it) | 214 for (; it != component_extensions_.end(); ++it) |
| 201 UnloadComponent(&(*it)); | 215 UnloadComponent(&(*it)); |
| 202 | 216 |
| 203 component_extensions_.clear(); | 217 component_extensions_.clear(); |
| 204 } | 218 } |
| 205 | 219 |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 430 void ComponentLoader::RegisterUserPrefs(PrefService* prefs) { | 444 void ComponentLoader::RegisterUserPrefs(PrefService* prefs) { |
| 431 prefs->RegisterStringPref(prefs::kEnterpriseWebStoreURL, | 445 prefs->RegisterStringPref(prefs::kEnterpriseWebStoreURL, |
| 432 std::string() /* default_value */, | 446 std::string() /* default_value */, |
| 433 PrefService::UNSYNCABLE_PREF); | 447 PrefService::UNSYNCABLE_PREF); |
| 434 prefs->RegisterStringPref(prefs::kEnterpriseWebStoreName, | 448 prefs->RegisterStringPref(prefs::kEnterpriseWebStoreName, |
| 435 std::string() /* default_value */, | 449 std::string() /* default_value */, |
| 436 PrefService::UNSYNCABLE_PREF); | 450 PrefService::UNSYNCABLE_PREF); |
| 437 } | 451 } |
| 438 | 452 |
| 439 } // namespace extensions | 453 } // namespace extensions |
| OLD | NEW |