Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / external_provider_impl.cc
index 67ef13a..e62599a 100644 (file)
 #include "base/logging.h"
 #include "base/memory/linked_ptr.h"
 #include "base/metrics/field_trial.h"
-#include "base/path_service.h"
 #include "base/strings/string_util.h"
 #include "base/values.h"
 #include "base/version.h"
 #include "chrome/browser/app_mode/app_mode_utils.h"
 #include "chrome/browser/browser_process.h"
+#include "chrome/browser/extensions/extension_management.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_system.h"
 #include "chrome/browser/extensions/external_component_loader.h"
 #include "chrome/browser/extensions/external_policy_loader.h"
 #include "chrome/browser/extensions/external_pref_loader.h"
-#include "chrome/browser/extensions/external_provider_interface.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_switches.h"
-#include "chrome/common/extensions/extension.h"
-#include "chrome/common/pref_names.h"
+#include "components/crx_file/id_util.h"
 #include "content/public/browser/browser_thread.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/browser/external_provider_interface.h"
+#include "extensions/common/extension.h"
 #include "extensions/common/manifest.h"
 #include "ui/base/l10n/l10n_util.h"
 
 #if defined(OS_CHROMEOS)
+#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
+#include "chrome/browser/chromeos/customization_document.h"
 #include "chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.h"
-#include "chrome/browser/chromeos/extensions/external_pref_cache_loader.h"
-#include "chrome/browser/chromeos/login/user.h"
-#include "chrome/browser/chromeos/login/user_manager.h"
 #include "chrome/browser/chromeos/policy/app_pack_updater.h"
+#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/device_local_account.h"
 #include "chrome/browser/chromeos/policy/device_local_account_policy_service.h"
-#include "chrome/browser/policy/browser_policy_connector.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "components/user_manager/user.h"
+#include "components/user_manager/user_manager.h"
 #else
 #include "chrome/browser/extensions/default_apps.h"
 #endif
@@ -55,13 +57,16 @@ using content::BrowserThread;
 namespace extensions {
 
 // Constants for keeping track of extension preferences in a dictionary.
+const char ExternalProviderImpl::kInstallParam[] = "install_parameter";
 const char ExternalProviderImpl::kExternalCrx[] = "external_crx";
 const char ExternalProviderImpl::kExternalVersion[] = "external_version";
 const char ExternalProviderImpl::kExternalUpdateUrl[] = "external_update_url";
-const char ExternalProviderImpl::kSupportedLocales[] = "supported_locales";
 const char ExternalProviderImpl::kIsBookmarkApp[] = "is_bookmark_app";
 const char ExternalProviderImpl::kIsFromWebstore[] = "is_from_webstore";
 const char ExternalProviderImpl::kKeepIfPresent[] = "keep_if_present";
+const char ExternalProviderImpl::kWasInstalledByOem[] = "was_installed_by_oem";
+const char ExternalProviderImpl::kSupportedLocales[] = "supported_locales";
+const char ExternalProviderImpl::kMayBeUntrusted[] = "may_be_untrusted";
 
 ExternalProviderImpl::ExternalProviderImpl(
     VisitorInterface* service,
@@ -109,7 +114,7 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) {
     const std::string& extension_id = i.key();
     const base::DictionaryValue* extension = NULL;
 
-    if (!Extension::IdIsValid(extension_id)) {
+    if (!crx_file::id_util::IdIsValid(extension_id)) {
       LOG(WARNING) << "Malformed extension dictionary: key "
                    << extension_id.c_str() << " is not a valid id.";
       continue;
@@ -123,7 +128,7 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) {
     }
 
     base::FilePath::StringType external_crx;
-    const Value* external_version_value = NULL;
+    const base::Value* external_version_value = NULL;
     std::string external_version;
     std::string external_update_url;
 
@@ -131,7 +136,7 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) {
 
     bool has_external_version = false;
     if (extension->Get(kExternalVersion, &external_version_value)) {
-      if (external_version_value->IsType(Value::TYPE_STRING)) {
+      if (external_version_value->IsType(base::Value::TYPE_STRING)) {
         external_version_value->GetAsString(&external_version);
         has_external_version = true;
       } else {
@@ -200,12 +205,12 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) {
         is_bookmark_app) {
       creation_flags |= Extension::FROM_BOOKMARK;
     }
-    bool is_from_webstore;
+    bool is_from_webstore = false;
     if (extension->GetBoolean(kIsFromWebstore, &is_from_webstore) &&
         is_from_webstore) {
       creation_flags |= Extension::FROM_WEBSTORE;
     }
-    bool keep_if_present;
+    bool keep_if_present = false;
     if (extension->GetBoolean(kKeepIfPresent, &keep_if_present) &&
         keep_if_present && profile_) {
       ExtensionServiceInterface* extension_service =
@@ -219,6 +224,19 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) {
         continue;
       }
     }
+    bool was_installed_by_oem = false;
+    if (extension->GetBoolean(kWasInstalledByOem, &was_installed_by_oem) &&
+        was_installed_by_oem) {
+      creation_flags |= Extension::WAS_INSTALLED_BY_OEM;
+    }
+    bool may_be_untrusted = false;
+    if (extension->GetBoolean(kMayBeUntrusted, &may_be_untrusted) &&
+        may_be_untrusted) {
+      creation_flags |= Extension::MAY_BE_UNTRUSTED;
+    }
+
+    std::string install_parameter;
+    extension->GetString(kInstallParam, &install_parameter);
 
     if (has_external_crx) {
       if (crx_location_ == Manifest::INVALID_LOCATION) {
@@ -271,9 +289,12 @@ void ExternalProviderImpl::SetPrefs(base::DictionaryValue* prefs) {
                      << "\", which is not a valid URL.";
         continue;
       }
-      service_->OnExternalExtensionUpdateUrlFound(
-          extension_id, update_url, download_location_, creation_flags,
-          auto_acknowledge_);
+      service_->OnExternalExtensionUpdateUrlFound(extension_id,
+                                                  install_parameter,
+                                                  update_url,
+                                                  download_location_,
+                                                  creation_flags,
+                                                  auto_acknowledge_);
     }
   }
 
@@ -344,15 +365,21 @@ void ExternalProviderImpl::CreateExternalProviders(
     Profile* profile,
     ProviderCollection* provider_list) {
   scoped_refptr<ExternalLoader> external_loader;
+  scoped_refptr<ExternalLoader> external_recommended_loader;
   extensions::Manifest::Location crx_location = Manifest::INVALID_LOCATION;
 #if defined(OS_CHROMEOS)
-  const chromeos::User* user =
-      chromeos::UserManager::Get()->GetUserByProfile(profile);
-  if (user && policy::IsDeviceLocalAccountUser(user->email(), NULL)) {
+  policy::BrowserPolicyConnectorChromeOS* connector =
+      g_browser_process->platform_part()->browser_policy_connector_chromeos();
+  bool is_chrome_os_public_session = false;
+  const user_manager::User* user =
+      chromeos::ProfileHelper::Get()->GetUserByProfile(profile);
+  policy::DeviceLocalAccount::Type account_type;
+  if (user && policy::IsDeviceLocalAccountUser(user->email(), &account_type)) {
+    if (account_type == policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)
+      is_chrome_os_public_session = true;
     policy::DeviceLocalAccountPolicyBroker* broker =
-        g_browser_process->browser_policy_connector()->
-            GetDeviceLocalAccountPolicyService()->
-                GetBrokerForUser(user->email());
+        connector->GetDeviceLocalAccountPolicyService()->GetBrokerForUser(
+            user->email());
     if (broker) {
       external_loader = broker->extension_loader();
       crx_location = Manifest::EXTERNAL_POLICY;
@@ -360,14 +387,24 @@ void ExternalProviderImpl::CreateExternalProviders(
       NOTREACHED();
     }
   } else {
-    external_loader = new ExternalPolicyLoader(profile);
+    external_loader = new ExternalPolicyLoader(
+        ExtensionManagementFactory::GetForBrowserContext(profile),
+        ExternalPolicyLoader::FORCED);
+    external_recommended_loader = new ExternalPolicyLoader(
+        ExtensionManagementFactory::GetForBrowserContext(profile),
+        ExternalPolicyLoader::RECOMMENDED);
   }
 #else
-  external_loader = new ExternalPolicyLoader(profile);
+  external_loader = new ExternalPolicyLoader(
+      ExtensionManagementFactory::GetForBrowserContext(profile),
+      ExternalPolicyLoader::FORCED);
+  external_recommended_loader = new ExternalPolicyLoader(
+      ExtensionManagementFactory::GetForBrowserContext(profile),
+      ExternalPolicyLoader::RECOMMENDED);
 #endif
 
   // Policies are mandatory so they can't be skipped with command line flag.
-  if (external_loader) {
+  if (external_loader.get()) {
     provider_list->push_back(
         linked_ptr<ExternalProviderInterface>(
             new ExternalProviderImpl(
@@ -379,16 +416,42 @@ void ExternalProviderImpl::CreateExternalProviders(
                 Extension::NO_FLAGS)));
   }
 
+  // Load the KioskAppExternalProvider when running in kiosk mode.
+  if (chrome::IsRunningInForcedAppMode()) {
+#if defined(OS_CHROMEOS)
+    chromeos::KioskAppManager* kiosk_app_manager =
+        chromeos::KioskAppManager::Get();
+    DCHECK(kiosk_app_manager);
+    if (kiosk_app_manager && !kiosk_app_manager->external_loader_created()) {
+      provider_list->push_back(linked_ptr<ExternalProviderInterface>(
+          new ExternalProviderImpl(service,
+                                   kiosk_app_manager->CreateExternalLoader(),
+                                   profile,
+                                   Manifest::EXTERNAL_PREF,
+                                   Manifest::INVALID_LOCATION,
+                                   Extension::NO_FLAGS)));
+    }
+#endif
+    return;
+  }
+
+  // Extensions provided by recommended policies.
+  if (external_recommended_loader.get()) {
+    provider_list->push_back(linked_ptr<ExternalProviderInterface>(
+        new ExternalProviderImpl(service,
+                                 external_recommended_loader,
+                                 profile,
+                                 crx_location,
+                                 Manifest::EXTERNAL_PREF_DOWNLOAD,
+                                 Extension::NO_FLAGS)));
+  }
+
   // In tests don't install extensions from default external sources.
   // It would only slowdown tests and make them flaky.
   if (CommandLine::ForCurrentProcess()->HasSwitch(
       switches::kDisableDefaultApps))
     return;
 
-  // No external app install in app mode.
-  if (chrome::IsRunningInForcedAppMode())
-    return;
-
   // On Mac OS, items in /Library/... should be written by the superuser.
   // Check that all components of the path are writable by root only.
   ExternalPrefLoader::Options check_admin_permissions_on_mac;
@@ -402,24 +465,24 @@ void ExternalProviderImpl::CreateExternalProviders(
   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();
+  user_manager::UserManager* user_manager = user_manager::UserManager::Get();
   is_chromeos_demo_session =
       user_manager && user_manager->IsLoggedInAsDemoUser() &&
-      g_browser_process->browser_policy_connector()->GetDeviceMode() ==
-          policy::DEVICE_MODE_RETAIL_KIOSK;
+      connector->GetDeviceMode() == policy::DEVICE_MODE_RETAIL_KIOSK;
   bundled_extension_creation_flags = Extension::FROM_WEBSTORE |
       Extension::WAS_INSTALLED_BY_DEFAULT;
 #endif
 
 #if defined(OS_LINUX) && !defined(OS_CHROMEOS)
-  if (!profile->IsManaged()) {
+  if (!profile->IsSupervised()) {
     provider_list->push_back(
         linked_ptr<ExternalProviderInterface>(
             new ExternalProviderImpl(
                 service,
                 new ExternalPrefLoader(
                     chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS,
-                    ExternalPrefLoader::NONE),
+                    ExternalPrefLoader::NONE,
+                    NULL),
                 profile,
                 Manifest::EXTERNAL_PREF,
                 Manifest::EXTERNAL_PREF_DOWNLOAD,
@@ -428,24 +491,39 @@ void ExternalProviderImpl::CreateExternalProviders(
 #endif
 
 #if defined(OS_CHROMEOS)
-  if (!is_chromeos_demo_session) {
-    int external_apps_path_id = profile->IsManaged() ?
-        chrome::DIR_MANAGED_USERS_DEFAULT_APPS :
+  if (!is_chromeos_demo_session && !is_chrome_os_public_session) {
+    int external_apps_path_id = profile->IsSupervised() ?
+        chrome::DIR_SUPERVISED_USERS_DEFAULT_APPS :
         chrome::DIR_STANDALONE_EXTERNAL_EXTENSIONS;
+    ExternalPrefLoader::Options pref_load_flags = profile->IsNewProfile() ?
+        ExternalPrefLoader::DELAY_LOAD_UNTIL_PRIORITY_SYNC :
+        ExternalPrefLoader::NONE;
     provider_list->push_back(
-        linked_ptr<ExternalProviderInterface>(
-            new ExternalProviderImpl(
-                service,
-                new chromeos::ExternalPrefCacheLoader(
-                    external_apps_path_id, profile),
-                profile,
-                Manifest::EXTERNAL_PREF,
-                Manifest::EXTERNAL_PREF_DOWNLOAD,
-                bundled_extension_creation_flags)));
+        linked_ptr<ExternalProviderInterface>(new ExternalProviderImpl(
+            service,
+            new ExternalPrefLoader(external_apps_path_id,
+                                   pref_load_flags,
+                                   profile),
+            profile,
+            Manifest::EXTERNAL_PREF,
+            Manifest::EXTERNAL_PREF_DOWNLOAD,
+            bundled_extension_creation_flags)));
+
+    // OEM default apps.
+    int oem_extension_creation_flags =
+        bundled_extension_creation_flags | Extension::WAS_INSTALLED_BY_OEM;
+    chromeos::ServicesCustomizationDocument* customization =
+        chromeos::ServicesCustomizationDocument::GetInstance();
+    provider_list->push_back(linked_ptr<ExternalProviderInterface>(
+        new ExternalProviderImpl(service,
+                                 customization->CreateExternalLoader(profile),
+                                 profile,
+                                 Manifest::EXTERNAL_PREF,
+                                 Manifest::EXTERNAL_PREF_DOWNLOAD,
+                                 oem_extension_creation_flags)));
   }
 
-  policy::AppPackUpdater* app_pack_updater =
-      g_browser_process->browser_policy_connector()->GetAppPackUpdater();
+  policy::AppPackUpdater* app_pack_updater = connector->GetAppPackUpdater();
   if (is_chromeos_demo_session && app_pack_updater &&
       !app_pack_updater->created_external_loader()) {
     provider_list->push_back(
@@ -460,27 +538,30 @@ void ExternalProviderImpl::CreateExternalProviders(
   }
 #endif
 
-  if (!profile->IsManaged() && !is_chromeos_demo_session) {
+  if (!profile->IsSupervised() && !is_chromeos_demo_session) {
+#if !defined(OS_WIN)
     provider_list->push_back(
         linked_ptr<ExternalProviderInterface>(
             new ExternalProviderImpl(
                 service,
                 new ExternalPrefLoader(chrome::DIR_EXTERNAL_EXTENSIONS,
-                                       check_admin_permissions_on_mac),
+                                       check_admin_permissions_on_mac,
+                                       NULL),
                 profile,
                 Manifest::EXTERNAL_PREF,
                 Manifest::EXTERNAL_PREF_DOWNLOAD,
                 bundled_extension_creation_flags)));
+#endif
 
-#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.
+#if defined(OS_MACOSX)
     provider_list->push_back(
         linked_ptr<ExternalProviderInterface>(
             new ExternalProviderImpl(
                 service,
                 new ExternalPrefLoader(chrome::DIR_USER_EXTERNAL_EXTENSIONS,
-                                       ExternalPrefLoader::NONE),
+                                       ExternalPrefLoader::NONE,
+                                       NULL),
                 profile,
                 Manifest::EXTERNAL_PREF,
                 Manifest::EXTERNAL_PREF_DOWNLOAD,
@@ -495,7 +576,7 @@ void ExternalProviderImpl::CreateExternalProviders(
                 new ExternalRegistryLoader,
                 profile,
                 Manifest::EXTERNAL_REGISTRY,
-                Manifest::INVALID_LOCATION,
+                Manifest::EXTERNAL_PREF_DOWNLOAD,
                 Extension::NO_FLAGS)));
 #endif
 
@@ -508,9 +589,10 @@ void ExternalProviderImpl::CreateExternalProviders(
                 profile,
                 service,
                 new ExternalPrefLoader(chrome::DIR_DEFAULT_APPS,
-                                       ExternalPrefLoader::NONE),
+                                       ExternalPrefLoader::NONE,
+                                       NULL),
+                Manifest::INTERNAL,
                 Manifest::INTERNAL,
-                Manifest::INVALID_LOCATION,
                 Extension::FROM_WEBSTORE |
                     Extension::WAS_INSTALLED_BY_DEFAULT)));
 #endif
@@ -519,7 +601,7 @@ void ExternalProviderImpl::CreateExternalProviders(
       linked_ptr<ExternalProviderInterface>(
         new ExternalProviderImpl(
             service,
-            new ExternalComponentLoader(),
+            new ExternalComponentLoader(profile),
             profile,
             Manifest::INVALID_LOCATION,
             Manifest::EXTERNAL_COMPONENT,