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

Unified Diff: chrome/browser/extensions/external_extension_provider_impl.cc

Issue 10692168: Moved ExternalExtensionLoaders/Providers into extensions namespace (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Even later master Created 8 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/external_extension_provider_impl.cc
diff --git a/chrome/browser/extensions/external_extension_provider_impl.cc b/chrome/browser/extensions/external_extension_provider_impl.cc
deleted file mode 100644
index a71c68b57e0b7c9b5bf98365c17ec4a188f18bbf..0000000000000000000000000000000000000000
--- a/chrome/browser/extensions/external_extension_provider_impl.cc
+++ /dev/null
@@ -1,426 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/extensions/external_extension_provider_impl.h"
-
-#include "base/command_line.h"
-#include "base/file_path.h"
-#include "base/logging.h"
-#include "base/memory/linked_ptr.h"
-#include "base/metrics/field_trial.h"
-#include "base/path_service.h"
-#include "base/string_util.h"
-#include "base/values.h"
-#include "base/version.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/external_extension_provider_interface.h"
-#include "chrome/browser/extensions/external_policy_extension_loader.h"
-#include "chrome/browser/extensions/external_pref_extension_loader.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/common/chrome_paths.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/common/pref_names.h"
-#include "content/public/browser/browser_thread.h"
-#include "ui/base/l10n/l10n_util.h"
-
-#if defined(OS_CHROMEOS)
-#include "chrome/browser/chromeos/login/user_manager.h"
-#include "chrome/browser/policy/app_pack_updater.h"
-#include "chrome/browser/policy/browser_policy_connector.h"
-#endif
-
-#if !defined(OS_CHROMEOS)
-#include "chrome/browser/extensions/default_apps.h"
-#endif
-
-#if defined(OS_WIN)
-#include "chrome/browser/extensions/external_registry_extension_loader_win.h"
-#endif
-
-using content::BrowserThread;
-using extensions::Extension;
-
-// Constants for keeping track of extension preferences in a dictionary.
-const char ExternalExtensionProviderImpl::kExternalCrx[] = "external_crx";
-const char ExternalExtensionProviderImpl::kExternalVersion[] =
- "external_version";
-const char ExternalExtensionProviderImpl::kExternalUpdateUrl[] =
- "external_update_url";
-const char ExternalExtensionProviderImpl::kSupportedLocales[] =
- "supported_locales";
-const char ExternalExtensionProviderImpl::kIsBookmarkApp[] =
- "is_bookmark_app";
-
-ExternalExtensionProviderImpl::ExternalExtensionProviderImpl(
- VisitorInterface* service,
- ExternalExtensionLoader* loader,
- Extension::Location crx_location,
- Extension::Location download_location,
- int creation_flags)
- : crx_location_(crx_location),
- download_location_(download_location),
- service_(service),
- prefs_(NULL),
- ready_(false),
- loader_(loader),
- creation_flags_(creation_flags),
- auto_acknowledge_(false) {
- loader_->Init(this);
-}
-
-ExternalExtensionProviderImpl::~ExternalExtensionProviderImpl() {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- loader_->OwnerShutdown();
-}
-
-void ExternalExtensionProviderImpl::VisitRegisteredExtension() {
- // The loader will call back to SetPrefs.
- loader_->StartLoading();
-}
-
-void ExternalExtensionProviderImpl::SetPrefs(DictionaryValue* prefs) {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- // Check if the service is still alive. It is possible that it went
- // away while |loader_| was working on the FILE thread.
- if (!service_) return;
-
- prefs_.reset(prefs);
- ready_ = true; // Queries for extensions are allowed from this point.
-
- // Set of unsupported extensions that need to be deleted from prefs_.
- std::set<std::string> unsupported_extensions;
-
- // Notify ExtensionService about all the extensions this provider has.
- for (DictionaryValue::key_iterator i = prefs_->begin_keys();
- i != prefs_->end_keys(); ++i) {
- const std::string& extension_id = *i;
- DictionaryValue* extension;
-
- if (!Extension::IdIsValid(extension_id)) {
- LOG(WARNING) << "Malformed extension dictionary: key "
- << extension_id.c_str() << " is not a valid id.";
- continue;
- }
-
- if (!prefs_->GetDictionaryWithoutPathExpansion(extension_id, &extension)) {
- LOG(WARNING) << "Malformed extension dictionary: key "
- << extension_id.c_str()
- << " has a value that is not a dictionary.";
- continue;
- }
-
- FilePath::StringType external_crx;
- Value* external_version_value;
- std::string external_version;
- std::string external_update_url;
-
- bool has_external_crx = extension->GetString(kExternalCrx, &external_crx);
-
- bool has_external_version = false;
- if (extension->Get(kExternalVersion, &external_version_value)) {
- if (external_version_value->IsType(Value::TYPE_STRING)) {
- external_version_value->GetAsString(&external_version);
- has_external_version = true;
- } else {
- LOG(WARNING) << "Malformed extension dictionary for extension: "
- << extension_id.c_str() << ". " << kExternalVersion
- << " value must be a string.";
- continue;
- }
- }
-
- bool has_external_update_url = extension->GetString(kExternalUpdateUrl,
- &external_update_url);
- if (has_external_crx != has_external_version) {
- LOG(WARNING) << "Malformed extension dictionary for extension: "
- << extension_id.c_str() << ". " << kExternalCrx
- << " and " << kExternalVersion << " must be used together.";
- continue;
- }
-
- if (has_external_crx == has_external_update_url) {
- LOG(WARNING) << "Malformed extension dictionary for extension: "
- << extension_id.c_str() << ". Exactly one of the "
- << "followng keys should be used: " << kExternalCrx
- << ", " << kExternalUpdateUrl << ".";
- continue;
- }
-
- // Check that extension supports current browser locale.
- ListValue* supported_locales = NULL;
- if (extension->GetList(kSupportedLocales, &supported_locales)) {
- std::vector<std::string> browser_locales;
- l10n_util::GetParentLocales(g_browser_process->GetApplicationLocale(),
- &browser_locales);
-
- size_t num_locales = supported_locales->GetSize();
- bool locale_supported = false;
- for (size_t j = 0; j < num_locales; j++) {
- std::string current_locale;
- if (supported_locales->GetString(j, &current_locale) &&
- l10n_util::IsValidLocaleSyntax(current_locale)) {
- current_locale = l10n_util::NormalizeLocale(current_locale);
- if (std::find(browser_locales.begin(), browser_locales.end(),
- current_locale) != browser_locales.end()) {
- locale_supported = true;
- break;
- }
- } else {
- LOG(WARNING) << "Unrecognized locale '" << current_locale
- << "' found as supported locale for extension: "
- << extension_id;
- }
- }
-
- if (!locale_supported) {
- unsupported_extensions.insert(extension_id);
- LOG(INFO) << "Skip installing (or uninstall) external extension: "
- << extension_id << " because the extension doesn't support "
- << "the browser locale.";
- continue;
- }
- }
-
- int creation_flags = creation_flags_;
- bool is_bookmark_app;
- if (extension->GetBoolean(kIsBookmarkApp, &is_bookmark_app) &&
- is_bookmark_app) {
- creation_flags |= Extension::FROM_BOOKMARK;
- }
-
- if (has_external_crx) {
- if (crx_location_ == Extension::INVALID) {
- LOG(WARNING) << "This provider does not support installing external "
- << "extensions from crx files.";
- continue;
- }
- if (external_crx.find(FilePath::kParentDirectory) !=
- base::StringPiece::npos) {
- LOG(WARNING) << "Path traversal not allowed in path: "
- << external_crx.c_str();
- continue;
- }
-
- // If the path is relative, and the provider has a base path,
- // build the absolute path to the crx file.
- FilePath path(external_crx);
- if (!path.IsAbsolute()) {
- FilePath base_path = loader_->GetBaseCrxFilePath();
- if (base_path.empty()) {
- LOG(WARNING) << "File path " << external_crx.c_str()
- << " is relative. An absolute path is required.";
- continue;
- }
- path = base_path.Append(external_crx);
- }
-
- Version version(external_version);
- if (!version.IsValid()) {
- LOG(WARNING) << "Malformed extension dictionary for extension: "
- << extension_id.c_str() << ". Invalid version string \""
- << external_version << "\".";
- continue;
- }
- service_->OnExternalExtensionFileFound(extension_id, &version, path,
- crx_location_, creation_flags,
- auto_acknowledge_);
- } else { // if (has_external_update_url)
- CHECK(has_external_update_url); // Checking of keys above ensures this.
- if (download_location_ == Extension::INVALID) {
- LOG(WARNING) << "This provider does not support installing external "
- << "extensions from update URLs.";
- continue;
- }
- GURL update_url(external_update_url);
- if (!update_url.is_valid()) {
- LOG(WARNING) << "Malformed extension dictionary for extension: "
- << extension_id.c_str() << ". Key " << kExternalUpdateUrl
- << " has value \"" << external_update_url
- << "\", which is not a valid URL.";
- continue;
- }
- service_->OnExternalExtensionUpdateUrlFound(
- extension_id, update_url, download_location_);
- }
- }
-
- for (std::set<std::string>::iterator it = unsupported_extensions.begin();
- it != unsupported_extensions.end(); ++it) {
- // Remove extension for the list of know external extensions. The extension
- // will be uninstalled later because provider doesn't provide it anymore.
- prefs_->Remove(*it, NULL);
- }
-
- service_->OnExternalProviderReady(this);
-}
-
-void ExternalExtensionProviderImpl::ServiceShutdown() {
- service_ = NULL;
-}
-
-bool ExternalExtensionProviderImpl::IsReady() const {
- return ready_;
-}
-
-bool ExternalExtensionProviderImpl::HasExtension(
- const std::string& id) const {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- CHECK(prefs_.get());
- CHECK(ready_);
- return prefs_->HasKey(id);
-}
-
-bool ExternalExtensionProviderImpl::GetExtensionDetails(
- const std::string& id, Extension::Location* location,
- scoped_ptr<Version>* version) const {
- CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- CHECK(prefs_.get());
- CHECK(ready_);
- DictionaryValue* extension = NULL;
- if (!prefs_->GetDictionary(id, &extension))
- return false;
-
- Extension::Location loc = Extension::INVALID;
- if (extension->HasKey(kExternalUpdateUrl)) {
- loc = download_location_;
-
- } else if (extension->HasKey(kExternalCrx)) {
- loc = crx_location_;
-
- std::string external_version;
- if (!extension->GetString(kExternalVersion, &external_version))
- return false;
-
- if (version)
- version->reset(new Version(external_version));
-
- } else {
- NOTREACHED(); // Chrome should not allow prefs to get into this state.
- return false;
- }
-
- if (location)
- *location = loc;
-
- return true;
-}
-
-// static
-void ExternalExtensionProviderImpl::CreateExternalProviders(
- VisitorInterface* service,
- Profile* profile,
- ProviderCollection* provider_list) {
-
- // On Mac OS, items in /Library/... should be written by the superuser.
- // Check that all components of the path are writable by root only.
- ExternalPrefExtensionLoader::Options check_admin_permissions_on_mac;
-#if defined(OS_MACOSX)
- check_admin_permissions_on_mac =
- ExternalPrefExtensionLoader::ENSURE_PATH_CONTROLLED_BY_ADMIN;
-#else
- check_admin_permissions_on_mac = ExternalPrefExtensionLoader::NONE;
-#endif
-
- bool is_chromeos_demo_session = false;
- int bundled_extension_creation_flags = Extension::NO_FLAGS;
-#if defined(OS_CHROMEOS)
- chromeos::UserManager* user_manager = chromeos::UserManager::Get();
- is_chromeos_demo_session =
- user_manager && user_manager->IsLoggedInAsDemoUser() &&
- g_browser_process->browser_policy_connector()->GetDeviceMode() ==
- policy::DEVICE_MODE_KIOSK;
- bundled_extension_creation_flags = Extension::FROM_WEBSTORE;
-#endif
-
- if (!is_chromeos_demo_session) {
- provider_list->push_back(
- linked_ptr<ExternalExtensionProviderInterface>(
- new ExternalExtensionProviderImpl(
- service,
- new ExternalPrefExtensionLoader(
- chrome::DIR_EXTERNAL_EXTENSIONS,
- check_admin_permissions_on_mac),
- Extension::EXTERNAL_PREF,
- Extension::EXTERNAL_PREF_DOWNLOAD,
- bundled_extension_creation_flags)));
- }
-
-#if defined(OS_CHROMEOS) || defined (OS_MACOSX)
- // Define a per-user source of external extensions.
- // On Chrome OS, this serves as a source for OEM customization.
- provider_list->push_back(
- linked_ptr<ExternalExtensionProviderInterface>(
- new ExternalExtensionProviderImpl(
- service,
- new ExternalPrefExtensionLoader(
- chrome::DIR_USER_EXTERNAL_EXTENSIONS,
- ExternalPrefExtensionLoader::NONE),
- Extension::EXTERNAL_PREF,
- Extension::EXTERNAL_PREF_DOWNLOAD,
- Extension::NO_FLAGS)));
-#endif
-#if defined(OS_WIN)
- provider_list->push_back(
- linked_ptr<ExternalExtensionProviderInterface>(
- new ExternalExtensionProviderImpl(
- service,
- new ExternalRegistryExtensionLoader,
- Extension::EXTERNAL_REGISTRY,
- Extension::INVALID,
- Extension::NO_FLAGS)));
-#endif
-
-#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
- provider_list->push_back(
- linked_ptr<ExternalExtensionProviderInterface>(
- new ExternalExtensionProviderImpl(
- service,
- new ExternalPrefExtensionLoader(
- chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS,
- ExternalPrefExtensionLoader::NONE),
- Extension::EXTERNAL_PREF,
- Extension::EXTERNAL_PREF_DOWNLOAD,
- Extension::NO_FLAGS)));
-#endif
-
- provider_list->push_back(
- linked_ptr<ExternalExtensionProviderInterface>(
- new ExternalExtensionProviderImpl(
- service,
- new ExternalPolicyExtensionLoader(profile),
- Extension::INVALID,
- Extension::EXTERNAL_POLICY_DOWNLOAD,
- Extension::NO_FLAGS)));
-
-#if !defined(OS_CHROMEOS)
- provider_list->push_back(
- linked_ptr<ExternalExtensionProviderInterface>(
- new default_apps::Provider(
- profile,
- service,
- new ExternalPrefExtensionLoader(
- chrome::DIR_DEFAULT_APPS,
- ExternalPrefExtensionLoader::NONE),
- Extension::EXTERNAL_PREF,
- Extension::INVALID,
- Extension::FROM_WEBSTORE)));
-#endif
-
-#if defined(OS_CHROMEOS)
- policy::BrowserPolicyConnector* connector =
- g_browser_process->browser_policy_connector();
- if (is_chromeos_demo_session && connector->GetAppPackUpdater()) {
- provider_list->push_back(
- linked_ptr<ExternalExtensionProviderInterface>(
- new ExternalExtensionProviderImpl(
- service,
- connector->GetAppPackUpdater()->CreateExternalExtensionLoader(),
- Extension::EXTERNAL_PREF,
- Extension::INVALID,
- Extension::NO_FLAGS)));
- }
-#endif
-}

Powered by Google App Engine
This is Rietveld 408576698