Commit 39438d7d authored by treib@chromium.org's avatar treib@chromium.org

app_list ExtensionAppModelBuilder: Observe and handle changes to prefs::kHideWebStoreIcon.

The pref was already implicitly checked on initialization during PopulateApps (via extensions::ui_util::ShouldDisplayInAppLauncher).
This CL adds handling of pref changes by re-checking ShouldDisplayInAppLauncher. It also extends an existing test to cover these cases.

Handling of prefs::kHideWebStoreIcon was originally added in https://codereview.chromium.org/12038067

BUG=

Review URL: https://codereview.chromium.org/409123002

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@285886 0039d316-1c4b-4281-b951-d872f2087c98
parent d76e84f1
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "chrome/browser/ui/app_list/app_list_syncable_service_factory.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/browser/ui/app_list/extension_app_item.h"
#include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_switches.h"
#include "chrome/common/pref_names.h"
#include "extensions/browser/extension_prefs.h" #include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h" #include "extensions/browser/extension_system.h"
...@@ -56,7 +57,7 @@ void ExtensionAppModelBuilder::InitializeWithService( ...@@ -56,7 +57,7 @@ void ExtensionAppModelBuilder::InitializeWithService(
model_ = service->model(); model_ = service->model();
service_ = service; service_ = service;
profile_ = service->profile(); profile_ = service->profile();
InitializePrefChangeRegistrar(); InitializePrefChangeRegistrars();
BuildModel(); BuildModel();
} }
...@@ -68,12 +69,18 @@ void ExtensionAppModelBuilder::InitializeWithProfile( ...@@ -68,12 +69,18 @@ void ExtensionAppModelBuilder::InitializeWithProfile(
model_ = model; model_ = model;
model_->top_level_item_list()->AddObserver(this); model_->top_level_item_list()->AddObserver(this);
profile_ = profile; profile_ = profile;
InitializePrefChangeRegistrar(); InitializePrefChangeRegistrars();
BuildModel(); BuildModel();
} }
void ExtensionAppModelBuilder::InitializePrefChangeRegistrar() { void ExtensionAppModelBuilder::InitializePrefChangeRegistrars() {
profile_pref_change_registrar_.Init(profile_->GetPrefs());
profile_pref_change_registrar_.Add(
prefs::kHideWebStoreIcon,
base::Bind(&ExtensionAppModelBuilder::OnProfilePreferenceChanged,
base::Unretained(this)));
if (!CommandLine::ForCurrentProcess()->HasSwitch( if (!CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableStreamlinedHostedApps)) switches::kEnableStreamlinedHostedApps))
return; return;
...@@ -90,6 +97,33 @@ void ExtensionAppModelBuilder::InitializePrefChangeRegistrar() { ...@@ -90,6 +97,33 @@ void ExtensionAppModelBuilder::InitializePrefChangeRegistrar() {
base::Unretained(this))); base::Unretained(this)));
} }
void ExtensionAppModelBuilder::OnProfilePreferenceChanged() {
extensions::ExtensionSet extensions;
controller_->GetApps(profile_, &extensions);
for (extensions::ExtensionSet::const_iterator app = extensions.begin();
app != extensions.end(); ++app) {
bool should_display =
extensions::ui_util::ShouldDisplayInAppLauncher(*app, profile_);
bool does_display = GetExtensionAppItem((*app)->id()) != NULL;
if (should_display == does_display)
continue;
if (should_display) {
InsertApp(CreateAppItem((*app)->id(),
"",
gfx::ImageSkia(),
(*app)->is_platform_app()));
} else {
if (service_)
service_->RemoveItem((*app)->id());
else
model_->DeleteItem((*app)->id());
}
}
}
void ExtensionAppModelBuilder::OnExtensionPreferenceChanged() { void ExtensionAppModelBuilder::OnExtensionPreferenceChanged() {
model_->NotifyExtensionPreferenceChanged(); model_->NotifyExtensionPreferenceChanged();
} }
......
...@@ -97,9 +97,6 @@ class ExtensionAppModelBuilder : public extensions::InstallObserver, ...@@ -97,9 +97,6 @@ class ExtensionAppModelBuilder : public extensions::InstallObserver,
// Populates the model with apps. // Populates the model with apps.
void PopulateApps(); void PopulateApps();
// Re-sort apps in case app ordinal prefs are changed.
void ResortApps();
// Inserts an app based on app ordinal prefs. // Inserts an app based on app ordinal prefs.
void InsertApp(scoped_ptr<ExtensionAppItem> app); void InsertApp(scoped_ptr<ExtensionAppItem> app);
...@@ -116,10 +113,14 @@ class ExtensionAppModelBuilder : public extensions::InstallObserver, ...@@ -116,10 +113,14 @@ class ExtensionAppModelBuilder : public extensions::InstallObserver,
// Returns app instance matching |extension_id| or NULL. // Returns app instance matching |extension_id| or NULL.
ExtensionAppItem* GetExtensionAppItem(const std::string& extension_id); ExtensionAppItem* GetExtensionAppItem(const std::string& extension_id);
// Initializes the |extension_pref_change_registrar| to listen for extension // Initializes the |profile_pref_change_registrar_| and the
// prefs changes. OnExtensionPreferenceChanged() is called when extension // |extension_pref_change_registrar_| to listen for changes to profile and
// prefs change. // extension prefs, and call OnProfilePreferenceChanged() or
void InitializePrefChangeRegistrar(); // OnExtensionPreferenceChanged().
void InitializePrefChangeRegistrars();
// Handles profile prefs changes.
void OnProfilePreferenceChanged();
// Handles extension prefs changes. // Handles extension prefs changes.
void OnExtensionPreferenceChanged(); void OnExtensionPreferenceChanged();
...@@ -128,6 +129,9 @@ class ExtensionAppModelBuilder : public extensions::InstallObserver, ...@@ -128,6 +129,9 @@ class ExtensionAppModelBuilder : public extensions::InstallObserver,
app_list::AppListSyncableService* service_; app_list::AppListSyncableService* service_;
Profile* profile_; Profile* profile_;
// Registrar used to monitor the profile prefs.
PrefChangeRegistrar profile_pref_change_registrar_;
// Registrar used to monitor the extension prefs. // Registrar used to monitor the extension prefs.
PrefChangeRegistrar extension_pref_change_registrar_; PrefChangeRegistrar extension_pref_change_registrar_;
......
...@@ -171,20 +171,29 @@ TEST_F(ExtensionAppModelBuilderTest, HideWebStore) { ...@@ -171,20 +171,29 @@ TEST_F(ExtensionAppModelBuilderTest, HideWebStore) {
app_list::AppListModel model1; app_list::AppListModel model1;
ExtensionAppModelBuilder builder1(controller_.get()); ExtensionAppModelBuilder builder1(controller_.get());
builder1.InitializeWithProfile(profile_.get(), &model1); builder1.InitializeWithProfile(profile_.get(), &model1);
std::string content = GetModelContent(&model1); EXPECT_TRUE(model1.FindItem(store->id()));
EXPECT_NE(std::string::npos, content.find("webstore")); EXPECT_TRUE(model1.FindItem(enterprise_store->id()));
EXPECT_NE(std::string::npos, content.find("enterprise_webstore"));
// Activate the HideWebStoreIcon policy. // Activate the HideWebStoreIcon policy.
profile_->GetPrefs()->SetBoolean(prefs::kHideWebStoreIcon, true); profile_->GetPrefs()->SetBoolean(prefs::kHideWebStoreIcon, true);
// Web stores should NOT be in the AppListModel. // Now the web stores should not be present anymore.
EXPECT_FALSE(model1.FindItem(store->id()));
EXPECT_FALSE(model1.FindItem(enterprise_store->id()));
// Build a new AppListModel; web stores should NOT be present.
app_list::AppListModel model2; app_list::AppListModel model2;
ExtensionAppModelBuilder builder2(controller_.get()); ExtensionAppModelBuilder builder2(controller_.get());
builder2.InitializeWithProfile(profile_.get(), &model2); builder2.InitializeWithProfile(profile_.get(), &model2);
content = GetModelContent(&model2); EXPECT_FALSE(model2.FindItem(store->id()));
EXPECT_EQ(std::string::npos, content.find("webstore")); EXPECT_FALSE(model2.FindItem(enterprise_store->id()));
EXPECT_EQ(std::string::npos, content.find("enterprise_webstore"));
// Deactivate the HideWebStoreIcon policy again.
profile_->GetPrefs()->SetBoolean(prefs::kHideWebStoreIcon, false);
// Now the web stores should have appeared.
EXPECT_TRUE(model2.FindItem(store->id()));
EXPECT_TRUE(model2.FindItem(enterprise_store->id()));
} }
TEST_F(ExtensionAppModelBuilderTest, DisableAndEnable) { TEST_F(ExtensionAppModelBuilderTest, DisableAndEnable) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment