| 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/ui/app_list/apps_model_builder.h" | 5 #include "chrome/browser/ui/app_list/apps_model_builder.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 // There should be 4 extensions in the test profile. | 84 // There should be 4 extensions in the test profile. |
| 85 const ExtensionSet* extensions = service_->extensions(); | 85 const ExtensionSet* extensions = service_->extensions(); |
| 86 ASSERT_EQ(static_cast<size_t>(4), extensions->size()); | 86 ASSERT_EQ(static_cast<size_t>(4), extensions->size()); |
| 87 } | 87 } |
| 88 }; | 88 }; |
| 89 | 89 |
| 90 TEST_F(AppsModelBuilderTest, Build) { | 90 TEST_F(AppsModelBuilderTest, Build) { |
| 91 scoped_ptr<app_list::AppListModel::Apps> model( | 91 scoped_ptr<app_list::AppListModel::Apps> model( |
| 92 new app_list::AppListModel::Apps); | 92 new app_list::AppListModel::Apps); |
| 93 AppsModelBuilder builder(profile_.get(), model.get(), NULL); | 93 AppsModelBuilder builder(profile_.get(), model.get(), NULL); |
| 94 builder.Build(); | |
| 95 | 94 |
| 96 // The apps list would have 3 extension apps in the profile. | 95 // The apps list would have 3 extension apps in the profile. |
| 97 EXPECT_EQ(std::string("Packaged App 1,Packaged App 2,Hosted App"), | 96 EXPECT_EQ(std::string("Packaged App 1,Packaged App 2,Hosted App"), |
| 98 GetModelContent(model.get())); | 97 GetModelContent(model.get())); |
| 99 } | 98 } |
| 100 | 99 |
| 101 TEST_F(AppsModelBuilderTest, HideWebStore) { | 100 TEST_F(AppsModelBuilderTest, HideWebStore) { |
| 102 // Install a "web store" app. | 101 // Install a "web store" app. |
| 103 scoped_refptr<extensions::Extension> store = | 102 scoped_refptr<extensions::Extension> store = |
| 104 MakeApp("webstore", | 103 MakeApp("webstore", |
| 105 "0.0", | 104 "0.0", |
| 106 "http://google.com", | 105 "http://google.com", |
| 107 std::string(extension_misc::kWebStoreAppId)); | 106 std::string(extension_misc::kWebStoreAppId)); |
| 108 service_->AddExtension(store.get()); | 107 service_->AddExtension(store.get()); |
| 109 | 108 |
| 110 // Install an "enterprise web store" app. | 109 // Install an "enterprise web store" app. |
| 111 scoped_refptr<extensions::Extension> enterprise_store = | 110 scoped_refptr<extensions::Extension> enterprise_store = |
| 112 MakeApp("enterprise_webstore", | 111 MakeApp("enterprise_webstore", |
| 113 "0.0", | 112 "0.0", |
| 114 "http://google.com", | 113 "http://google.com", |
| 115 std::string(extension_misc::kEnterpriseWebStoreAppId)); | 114 std::string(extension_misc::kEnterpriseWebStoreAppId)); |
| 116 service_->AddExtension(enterprise_store.get()); | 115 service_->AddExtension(enterprise_store.get()); |
| 117 | 116 |
| 118 // Web stores should be present in the AppListModel. | 117 // Web stores should be present in the AppListModel. |
| 119 app_list::AppListModel::Apps model1; | 118 app_list::AppListModel::Apps model1; |
| 120 AppsModelBuilder builder1(profile_.get(), &model1, NULL); | 119 AppsModelBuilder builder1(profile_.get(), &model1, NULL); |
| 121 builder1.Build(); | |
| 122 std::string content = GetModelContent(&model1); | 120 std::string content = GetModelContent(&model1); |
| 123 EXPECT_NE(std::string::npos, content.find("webstore")); | 121 EXPECT_NE(std::string::npos, content.find("webstore")); |
| 124 EXPECT_NE(std::string::npos, content.find("enterprise_webstore")); | 122 EXPECT_NE(std::string::npos, content.find("enterprise_webstore")); |
| 125 | 123 |
| 126 // Activate the HideWebStoreIcon policy. | 124 // Activate the HideWebStoreIcon policy. |
| 127 profile_->GetPrefs()->SetBoolean(prefs::kHideWebStoreIcon, true); | 125 profile_->GetPrefs()->SetBoolean(prefs::kHideWebStoreIcon, true); |
| 128 | 126 |
| 129 // Web stores should NOT be in the AppListModel. | 127 // Web stores should NOT be in the AppListModel. |
| 130 app_list::AppListModel::Apps model2; | 128 app_list::AppListModel::Apps model2; |
| 131 AppsModelBuilder builder2(profile_.get(), &model2, NULL); | 129 AppsModelBuilder builder2(profile_.get(), &model2, NULL); |
| 132 builder2.Build(); | |
| 133 content = GetModelContent(&model2); | 130 content = GetModelContent(&model2); |
| 134 EXPECT_EQ(std::string::npos, content.find("webstore")); | 131 EXPECT_EQ(std::string::npos, content.find("webstore")); |
| 135 EXPECT_EQ(std::string::npos, content.find("enterprise_webstore")); | 132 EXPECT_EQ(std::string::npos, content.find("enterprise_webstore")); |
| 136 } | 133 } |
| 137 | 134 |
| 138 TEST_F(AppsModelBuilderTest, DisableAndEnable) { | 135 TEST_F(AppsModelBuilderTest, DisableAndEnable) { |
| 139 scoped_ptr<app_list::AppListModel::Apps> model( | 136 scoped_ptr<app_list::AppListModel::Apps> model( |
| 140 new app_list::AppListModel::Apps); | 137 new app_list::AppListModel::Apps); |
| 141 AppsModelBuilder builder(profile_.get(), model.get(), NULL); | 138 AppsModelBuilder builder(profile_.get(), model.get(), NULL); |
| 142 builder.Build(); | |
| 143 | 139 |
| 144 service_->DisableExtension(kHostedAppId, | 140 service_->DisableExtension(kHostedAppId, |
| 145 extensions::Extension::DISABLE_NONE); | 141 extensions::Extension::DISABLE_NONE); |
| 146 EXPECT_EQ(std::string("Packaged App 1,Packaged App 2,Hosted App"), | 142 EXPECT_EQ(std::string("Packaged App 1,Packaged App 2,Hosted App"), |
| 147 GetModelContent(model.get())); | 143 GetModelContent(model.get())); |
| 148 | 144 |
| 149 service_->EnableExtension(kHostedAppId); | 145 service_->EnableExtension(kHostedAppId); |
| 150 EXPECT_EQ(std::string("Packaged App 1,Packaged App 2,Hosted App"), | 146 EXPECT_EQ(std::string("Packaged App 1,Packaged App 2,Hosted App"), |
| 151 GetModelContent(model.get())); | 147 GetModelContent(model.get())); |
| 152 } | 148 } |
| 153 | 149 |
| 154 TEST_F(AppsModelBuilderTest, Uninstall) { | 150 TEST_F(AppsModelBuilderTest, Uninstall) { |
| 155 scoped_ptr<app_list::AppListModel::Apps> model( | 151 scoped_ptr<app_list::AppListModel::Apps> model( |
| 156 new app_list::AppListModel::Apps); | 152 new app_list::AppListModel::Apps); |
| 157 AppsModelBuilder builder(profile_.get(), model.get(), NULL); | 153 AppsModelBuilder builder(profile_.get(), model.get(), NULL); |
| 158 builder.Build(); | |
| 159 | 154 |
| 160 service_->UninstallExtension(kPackagedApp2Id, false, NULL); | 155 service_->UninstallExtension(kPackagedApp2Id, false, NULL); |
| 161 EXPECT_EQ(std::string("Packaged App 1,Hosted App"), | 156 EXPECT_EQ(std::string("Packaged App 1,Hosted App"), |
| 162 GetModelContent(model.get())); | 157 GetModelContent(model.get())); |
| 163 | 158 |
| 164 base::RunLoop().RunUntilIdle(); | 159 base::RunLoop().RunUntilIdle(); |
| 165 } | 160 } |
| 166 | 161 |
| 167 TEST_F(AppsModelBuilderTest, UninstallTerminatedApp) { | 162 TEST_F(AppsModelBuilderTest, UninstallTerminatedApp) { |
| 168 scoped_ptr<app_list::AppListModel::Apps> model( | 163 scoped_ptr<app_list::AppListModel::Apps> model( |
| 169 new app_list::AppListModel::Apps); | 164 new app_list::AppListModel::Apps); |
| 170 AppsModelBuilder builder(profile_.get(), model.get(), NULL); | 165 AppsModelBuilder builder(profile_.get(), model.get(), NULL); |
| 171 builder.Build(); | |
| 172 | 166 |
| 173 const extensions::Extension* app = | 167 const extensions::Extension* app = |
| 174 service_->GetInstalledExtension(kPackagedApp2Id); | 168 service_->GetInstalledExtension(kPackagedApp2Id); |
| 175 ASSERT_TRUE(app != NULL); | 169 ASSERT_TRUE(app != NULL); |
| 176 | 170 |
| 177 // Simulate an app termination. | 171 // Simulate an app termination. |
| 178 service_->TrackTerminatedExtensionForTest(app); | 172 service_->TrackTerminatedExtensionForTest(app); |
| 179 | 173 |
| 180 service_->UninstallExtension(kPackagedApp2Id, false, NULL); | 174 service_->UninstallExtension(kPackagedApp2Id, false, NULL); |
| 181 EXPECT_EQ(std::string("Packaged App 1,Hosted App"), | 175 EXPECT_EQ(std::string("Packaged App 1,Hosted App"), |
| 182 GetModelContent(model.get())); | 176 GetModelContent(model.get())); |
| 183 | 177 |
| 184 base::RunLoop().RunUntilIdle(); | 178 base::RunLoop().RunUntilIdle(); |
| 185 } | 179 } |
| 186 | 180 |
| 187 TEST_F(AppsModelBuilderTest, OrdinalPrefsChange) { | 181 TEST_F(AppsModelBuilderTest, OrdinalPrefsChange) { |
| 188 scoped_ptr<app_list::AppListModel::Apps> model( | 182 scoped_ptr<app_list::AppListModel::Apps> model( |
| 189 new app_list::AppListModel::Apps); | 183 new app_list::AppListModel::Apps); |
| 190 AppsModelBuilder builder(profile_.get(), model.get(), NULL); | 184 AppsModelBuilder builder(profile_.get(), model.get(), NULL); |
| 191 builder.Build(); | |
| 192 | 185 |
| 193 ExtensionSorting* sorting = service_->extension_prefs()->extension_sorting(); | 186 ExtensionSorting* sorting = service_->extension_prefs()->extension_sorting(); |
| 194 | 187 |
| 195 syncer::StringOrdinal package_app_page = | 188 syncer::StringOrdinal package_app_page = |
| 196 sorting->GetPageOrdinal(kPackagedApp1Id); | 189 sorting->GetPageOrdinal(kPackagedApp1Id); |
| 197 sorting->SetPageOrdinal(kHostedAppId, package_app_page.CreateBefore()); | 190 sorting->SetPageOrdinal(kHostedAppId, package_app_page.CreateBefore()); |
| 198 EXPECT_EQ(std::string("Hosted App,Packaged App 1,Packaged App 2"), | 191 EXPECT_EQ(std::string("Hosted App,Packaged App 1,Packaged App 2"), |
| 199 GetModelContent(model.get())); | 192 GetModelContent(model.get())); |
| 200 | 193 |
| 201 syncer::StringOrdinal app1_ordinal = | 194 syncer::StringOrdinal app1_ordinal = |
| 202 sorting->GetAppLaunchOrdinal(kPackagedApp1Id); | 195 sorting->GetAppLaunchOrdinal(kPackagedApp1Id); |
| 203 syncer::StringOrdinal app2_ordinal = | 196 syncer::StringOrdinal app2_ordinal = |
| 204 sorting->GetAppLaunchOrdinal(kPackagedApp2Id); | 197 sorting->GetAppLaunchOrdinal(kPackagedApp2Id); |
| 205 sorting->SetPageOrdinal(kHostedAppId, package_app_page); | 198 sorting->SetPageOrdinal(kHostedAppId, package_app_page); |
| 206 sorting->SetAppLaunchOrdinal(kHostedAppId, | 199 sorting->SetAppLaunchOrdinal(kHostedAppId, |
| 207 app1_ordinal.CreateBetween(app2_ordinal)); | 200 app1_ordinal.CreateBetween(app2_ordinal)); |
| 208 EXPECT_EQ(std::string("Packaged App 1,Hosted App,Packaged App 2"), | 201 EXPECT_EQ(std::string("Packaged App 1,Hosted App,Packaged App 2"), |
| 209 GetModelContent(model.get())); | 202 GetModelContent(model.get())); |
| 210 } | 203 } |
| 211 | 204 |
| 212 TEST_F(AppsModelBuilderTest, OnExtensionMoved) { | 205 TEST_F(AppsModelBuilderTest, OnExtensionMoved) { |
| 213 scoped_ptr<app_list::AppListModel::Apps> model( | 206 scoped_ptr<app_list::AppListModel::Apps> model( |
| 214 new app_list::AppListModel::Apps); | 207 new app_list::AppListModel::Apps); |
| 215 AppsModelBuilder builder(profile_.get(), model.get(), NULL); | 208 AppsModelBuilder builder(profile_.get(), model.get(), NULL); |
| 216 builder.Build(); | |
| 217 | 209 |
| 218 ExtensionSorting* sorting = service_->extension_prefs()->extension_sorting(); | 210 ExtensionSorting* sorting = service_->extension_prefs()->extension_sorting(); |
| 219 sorting->SetPageOrdinal(kHostedAppId, | 211 sorting->SetPageOrdinal(kHostedAppId, |
| 220 sorting->GetPageOrdinal(kPackagedApp1Id)); | 212 sorting->GetPageOrdinal(kPackagedApp1Id)); |
| 221 | 213 |
| 222 service_->OnExtensionMoved(kHostedAppId, kPackagedApp1Id, kPackagedApp2Id); | 214 service_->OnExtensionMoved(kHostedAppId, kPackagedApp1Id, kPackagedApp2Id); |
| 223 EXPECT_EQ(std::string("Packaged App 1,Hosted App,Packaged App 2"), | 215 EXPECT_EQ(std::string("Packaged App 1,Hosted App,Packaged App 2"), |
| 224 GetModelContent(model.get())); | 216 GetModelContent(model.get())); |
| 225 | 217 |
| 226 service_->OnExtensionMoved(kHostedAppId, kPackagedApp2Id, std::string()); | 218 service_->OnExtensionMoved(kHostedAppId, kPackagedApp2Id, std::string()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 239 | 231 |
| 240 // Creates an corrupted ordinal case. | 232 // Creates an corrupted ordinal case. |
| 241 ExtensionScopedPrefs* scoped_prefs = service_->extension_prefs(); | 233 ExtensionScopedPrefs* scoped_prefs = service_->extension_prefs(); |
| 242 scoped_prefs->UpdateExtensionPref( | 234 scoped_prefs->UpdateExtensionPref( |
| 243 kHostedAppId, | 235 kHostedAppId, |
| 244 "page_ordinal", | 236 "page_ordinal", |
| 245 base::Value::CreateStringValue("a corrupted ordinal")); | 237 base::Value::CreateStringValue("a corrupted ordinal")); |
| 246 | 238 |
| 247 scoped_ptr<app_list::AppListModel::Apps> model( | 239 scoped_ptr<app_list::AppListModel::Apps> model( |
| 248 new app_list::AppListModel::Apps); | 240 new app_list::AppListModel::Apps); |
| 249 AppsModelBuilder builder(profile_.get(), model.get(), NULL); | |
| 250 | 241 |
| 251 // This should not assert or crash. | 242 // This should not assert or crash. |
| 252 builder.Build(); | 243 AppsModelBuilder builder(profile_.get(), model.get(), NULL); |
| 253 } | 244 } |
| 254 | 245 |
| 255 TEST_F(AppsModelBuilderTest, OrdinalConfilicts) { | 246 TEST_F(AppsModelBuilderTest, OrdinalConfilicts) { |
| 256 // Creates conflict ordinals for app1 and app2. | 247 // Creates conflict ordinals for app1 and app2. |
| 257 syncer::StringOrdinal conflict_ordinal = | 248 syncer::StringOrdinal conflict_ordinal = |
| 258 syncer::StringOrdinal::CreateInitialOrdinal(); | 249 syncer::StringOrdinal::CreateInitialOrdinal(); |
| 259 | 250 |
| 260 ExtensionSorting* sorting = service_->extension_prefs()->extension_sorting(); | 251 ExtensionSorting* sorting = service_->extension_prefs()->extension_sorting(); |
| 261 sorting->SetPageOrdinal(kHostedAppId, conflict_ordinal); | 252 sorting->SetPageOrdinal(kHostedAppId, conflict_ordinal); |
| 262 sorting->SetAppLaunchOrdinal(kHostedAppId, conflict_ordinal); | 253 sorting->SetAppLaunchOrdinal(kHostedAppId, conflict_ordinal); |
| 263 | 254 |
| 264 sorting->SetPageOrdinal(kPackagedApp1Id, conflict_ordinal); | 255 sorting->SetPageOrdinal(kPackagedApp1Id, conflict_ordinal); |
| 265 sorting->SetAppLaunchOrdinal(kPackagedApp1Id, conflict_ordinal); | 256 sorting->SetAppLaunchOrdinal(kPackagedApp1Id, conflict_ordinal); |
| 266 | 257 |
| 267 sorting->SetPageOrdinal(kPackagedApp2Id, conflict_ordinal); | 258 sorting->SetPageOrdinal(kPackagedApp2Id, conflict_ordinal); |
| 268 sorting->SetAppLaunchOrdinal(kPackagedApp2Id, conflict_ordinal); | 259 sorting->SetAppLaunchOrdinal(kPackagedApp2Id, conflict_ordinal); |
| 269 | 260 |
| 270 scoped_ptr<app_list::AppListModel::Apps> model( | 261 scoped_ptr<app_list::AppListModel::Apps> model( |
| 271 new app_list::AppListModel::Apps); | 262 new app_list::AppListModel::Apps); |
| 272 AppsModelBuilder builder(profile_.get(), model.get(), NULL); | 263 AppsModelBuilder builder(profile_.get(), model.get(), NULL); |
| 273 builder.Build(); | |
| 274 | 264 |
| 275 // By default, conflicted items are sorted by their app ids. | 265 // By default, conflicted items are sorted by their app ids. |
| 276 EXPECT_EQ(std::string("Hosted App,Packaged App 1,Packaged App 2"), | 266 EXPECT_EQ(std::string("Hosted App,Packaged App 1,Packaged App 2"), |
| 277 GetModelContent(model.get())); | 267 GetModelContent(model.get())); |
| 278 | 268 |
| 279 // Move hosted app between app1 and app2 and it should not crash. | 269 // Move hosted app between app1 and app2 and it should not crash. |
| 280 service_->OnExtensionMoved(kHostedAppId, kPackagedApp1Id, kPackagedApp2Id); | 270 service_->OnExtensionMoved(kHostedAppId, kPackagedApp1Id, kPackagedApp2Id); |
| 281 EXPECT_EQ(std::string("Packaged App 1,Hosted App,Packaged App 2"), | 271 EXPECT_EQ(std::string("Packaged App 1,Hosted App,Packaged App 2"), |
| 282 GetModelContent(model.get())); | 272 GetModelContent(model.get())); |
| 283 } | 273 } |
| OLD | NEW |