Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / app_list / extension_app_model_builder.cc
index 68ff0e8..56de1b9 100644 (file)
@@ -7,10 +7,11 @@
 #include <algorithm>
 
 #include "base/auto_reset.h"
+#include "base/callback.h"
+#include "base/command_line.h"
 #include "base/prefs/pref_service.h"
 #include "chrome/browser/chrome_notification_types.h"
 #include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_system.h"
 #include "chrome/browser/extensions/install_tracker.h"
 #include "chrome/browser/extensions/install_tracker_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/app_list/app_list_syncable_service.h"
 #include "chrome/browser/ui/app_list/app_list_syncable_service_factory.h"
 #include "chrome/browser/ui/app_list/extension_app_item.h"
+#include "chrome/common/chrome_switches.h"
 #include "chrome/common/extensions/extension_constants.h"
 #include "chrome/common/pref_names.h"
 #include "content/public/browser/notification_service.h"
 #include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_system.h"
+#include "extensions/browser/pref_names.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_set.h"
 #include "ui/gfx/image/image_skia.h"
@@ -59,22 +63,59 @@ ExtensionAppModelBuilder::~ExtensionAppModelBuilder() {
 
 void ExtensionAppModelBuilder::InitializeWithService(
     app_list::AppListSyncableService* service) {
+  DCHECK(!service_ && !profile_);
   model_ = service->model();
   model_->item_list()->AddObserver(this);
   service_ = service;
   profile_ = service->profile();
+  InitializePrefChangeRegistrar();
+
   BuildModel();
 }
 
 void ExtensionAppModelBuilder::InitializeWithProfile(
     Profile* profile,
     app_list::AppListModel* model) {
+  DCHECK(!service_ && !profile_);
   model_ = model;
   model_->item_list()->AddObserver(this);
   profile_ = profile;
+  InitializePrefChangeRegistrar();
+
   BuildModel();
 }
 
+void ExtensionAppModelBuilder::InitializePrefChangeRegistrar() {
+  if (!CommandLine::ForCurrentProcess()->HasSwitch(
+          switches::kEnableStreamlinedHostedApps))
+    return;
+
+  const ExtensionService* extension_service =
+      extensions::ExtensionSystem::Get(profile_)->extension_service();
+  if (!extension_service)
+    return;
+
+  extension_pref_change_registrar_.Init(
+      extension_service->extension_prefs()->pref_service());
+  extension_pref_change_registrar_.Add(
+    extensions::pref_names::kExtensions,
+    base::Bind(&ExtensionAppModelBuilder::OnExtensionPreferenceChanged,
+               base::Unretained(this)));
+}
+
+void ExtensionAppModelBuilder::OnExtensionPreferenceChanged() {
+  // TODO(calamity): analyze the performance impact of doing this every
+  // extension pref change.
+  app_list::AppListItemList* item_list = model_->item_list();
+  for (size_t i = 0; i < item_list->item_count(); ++i) {
+    app_list::AppListItem* item = item_list->item_at(i);
+    if (item->GetItemType() != ExtensionAppItem::kItemType)
+      continue;
+
+    static_cast<ExtensionAppItem*>(item)->UpdateIconOverlay();
+  }
+}
+
 void ExtensionAppModelBuilder::OnBeginExtensionInstall(
     const ExtensionInstallParams& params) {
   if (!params.is_app || params.is_ephemeral)
@@ -105,7 +146,7 @@ void ExtensionAppModelBuilder::OnDownloadProgress(
 
 void ExtensionAppModelBuilder::OnInstallFailure(
     const std::string& extension_id) {
-  model_->item_list()->DeleteItem(extension_id);
+  model_->DeleteItem(extension_id);
 }
 
 void ExtensionAppModelBuilder::OnExtensionLoaded(const Extension* extension) {
@@ -142,7 +183,7 @@ void ExtensionAppModelBuilder::OnExtensionUninstalled(
     service_->RemoveItem(extension->id());
     return;
   }
-  model_->item_list()->DeleteItem(extension->id());
+  model_->DeleteItem(extension->id());
 }
 
 void ExtensionAppModelBuilder::OnAppsReordered() {
@@ -161,42 +202,23 @@ void ExtensionAppModelBuilder::OnShutdown() {
   }
 }
 
-ExtensionAppItem* ExtensionAppModelBuilder::CreateAppItem(
+scoped_ptr<ExtensionAppItem> ExtensionAppModelBuilder::CreateAppItem(
     const std::string& extension_id,
     const std::string& extension_name,
     const gfx::ImageSkia& installing_icon,
     bool is_platform_app) {
   const app_list::AppListSyncableService::SyncItem* sync_item =
       service_ ? service_->GetSyncItem(extension_id) : NULL;
-  return new ExtensionAppItem(profile_,
-                              sync_item,
-                              extension_id,
-                              extension_name,
-                              installing_icon,
-                              is_platform_app);
-}
-
-void ExtensionAppModelBuilder::AddApps(
-    const extensions::ExtensionSet* extensions,
-    ExtensionAppList* apps) {
-  for (extensions::ExtensionSet::const_iterator app = extensions->begin();
-       app != extensions->end(); ++app) {
-    if (ShouldDisplayInAppLauncher(profile_, *app)) {
-      apps->push_back(CreateAppItem((*app)->id(),
-                                    "",
-                                    gfx::ImageSkia(),
-                                    (*app)->is_platform_app()));
-    }
-  }
+  return make_scoped_ptr(new ExtensionAppItem(profile_,
+                                              sync_item,
+                                              extension_id,
+                                              extension_name,
+                                              installing_icon,
+                                              is_platform_app));
 }
 
 void ExtensionAppModelBuilder::BuildModel() {
-  // Delete any extension apps.
-  model_->item_list()->DeleteItemsByType(ExtensionAppItem::kItemType);
-
-  if (tracker_)
-    tracker_->RemoveObserver(this);
-
+  DCHECK(!tracker_);
   tracker_ = controller_->GetInstallTrackerFor(profile_);
 
   PopulateApps();
@@ -210,22 +232,24 @@ void ExtensionAppModelBuilder::BuildModel() {
 void ExtensionAppModelBuilder::PopulateApps() {
   extensions::ExtensionSet extensions;
   controller_->GetApps(profile_, &extensions);
-  ExtensionAppList apps;
-  AddApps(&extensions, &apps);
 
-  if (apps.empty())
-    return;
-
-  for (size_t i = 0; i < apps.size(); ++i)
-    InsertApp(apps[i]);
+  for (extensions::ExtensionSet::const_iterator app = extensions.begin();
+       app != extensions.end(); ++app) {
+    if (!ShouldDisplayInAppLauncher(profile_, *app))
+      continue;
+    InsertApp(CreateAppItem((*app)->id(),
+                            "",
+                            gfx::ImageSkia(),
+                            (*app)->is_platform_app()));
+  }
 }
 
-void ExtensionAppModelBuilder::InsertApp(ExtensionAppItem* app) {
+void ExtensionAppModelBuilder::InsertApp(scoped_ptr<ExtensionAppItem> app) {
   if (service_) {
-    service_->AddItem(app);
+    service_->AddItem(app.PassAs<app_list::AppListItem>());
     return;
   }
-  model_->item_list()->AddItem(app);
+  model_->AddItem(app.PassAs<app_list::AppListItem>());
 }
 
 void ExtensionAppModelBuilder::SetHighlightedApp(