| 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/extension_app_model_builder.h" | 5 #include "chrome/browser/ui/app_list/extension_app_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" |
| 11 #include "base/prefs/pref_service.h" | 11 #include "base/prefs/pref_service.h" |
| 12 #include "base/run_loop.h" | 12 #include "base/run_loop.h" |
| 13 #include "base/values.h" | 13 #include "base/values.h" |
| 14 #include "chrome/browser/extensions/extension_function_test_utils.h" | 14 #include "chrome/browser/extensions/extension_function_test_utils.h" |
| 15 #include "chrome/browser/extensions/extension_service.h" | 15 #include "chrome/browser/extensions/extension_service.h" |
| 16 #include "chrome/browser/extensions/install_tracker.h" | 16 #include "chrome/browser/extensions/install_tracker.h" |
| 17 #include "chrome/browser/extensions/install_tracker_factory.h" | 17 #include "chrome/browser/extensions/install_tracker_factory.h" |
| 18 #include "chrome/browser/ui/app_list/app_list_test_util.h" | 18 #include "chrome/browser/ui/app_list/app_list_test_util.h" |
| 19 #include "chrome/browser/ui/app_list/test/test_app_list_controller_delegate.h" | 19 #include "chrome/browser/ui/app_list/test/test_app_list_controller_delegate.h" |
| 20 #include "chrome/common/chrome_constants.h" | 20 #include "chrome/common/chrome_constants.h" |
| 21 #include "chrome/common/extensions/extension_constants.h" | 21 #include "chrome/common/extensions/extension_constants.h" |
| 22 #include "chrome/common/pref_names.h" | 22 #include "chrome/common/pref_names.h" |
| 23 #include "chrome/test/base/testing_profile.h" | 23 #include "chrome/test/base/testing_profile.h" |
| 24 #include "extensions/browser/app_sorting.h" | 24 #include "extensions/browser/app_sorting.h" |
| 25 #include "extensions/browser/extension_prefs.h" | 25 #include "extensions/browser/extension_prefs.h" |
| 26 #include "extensions/browser/extension_registry.h" | 26 #include "extensions/browser/extension_registry.h" |
| 27 #include "extensions/browser/extension_system.h" |
| 27 #include "extensions/browser/uninstall_reason.h" | 28 #include "extensions/browser/uninstall_reason.h" |
| 28 #include "extensions/common/constants.h" | 29 #include "extensions/common/constants.h" |
| 29 #include "extensions/common/extension_set.h" | 30 #include "extensions/common/extension_set.h" |
| 30 #include "extensions/common/manifest.h" | 31 #include "extensions/common/manifest.h" |
| 31 #include "testing/gtest/include/gtest/gtest.h" | 32 #include "testing/gtest/include/gtest/gtest.h" |
| 32 #include "ui/app_list/app_list_item.h" | 33 #include "ui/app_list/app_list_item.h" |
| 33 | 34 |
| 35 using extensions::AppSorting; |
| 36 using extensions::ExtensionSystem; |
| 37 |
| 34 namespace { | 38 namespace { |
| 35 | 39 |
| 36 // Get a string of all apps in |model| joined with ','. | 40 // Get a string of all apps in |model| joined with ','. |
| 37 std::string GetModelContent(app_list::AppListModel* model) { | 41 std::string GetModelContent(app_list::AppListModel* model) { |
| 38 std::string content; | 42 std::string content; |
| 39 for (size_t i = 0; i < model->top_level_item_list()->item_count(); ++i) { | 43 for (size_t i = 0; i < model->top_level_item_list()->item_count(); ++i) { |
| 40 if (i > 0) | 44 if (i > 0) |
| 41 content += ','; | 45 content += ','; |
| 42 content += model->top_level_item_list()->item_at(i)->name(); | 46 content += model->top_level_item_list()->item_at(i)->name(); |
| 43 } | 47 } |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 extensions::InstallTracker* tracker = | 211 extensions::InstallTracker* tracker = |
| 208 extensions::InstallTrackerFactory::GetForBrowserContext(profile_.get()); | 212 extensions::InstallTrackerFactory::GetForBrowserContext(profile_.get()); |
| 209 extensions::InstallObserver::ExtensionInstallParams params( | 213 extensions::InstallObserver::ExtensionInstallParams params( |
| 210 kPackagedApp1Id, "", gfx::ImageSkia(), true, true); | 214 kPackagedApp1Id, "", gfx::ImageSkia(), true, true); |
| 211 tracker->OnBeginExtensionInstall(params); | 215 tracker->OnBeginExtensionInstall(params); |
| 212 | 216 |
| 213 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); | 217 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); |
| 214 } | 218 } |
| 215 | 219 |
| 216 TEST_F(ExtensionAppModelBuilderTest, OrdinalPrefsChange) { | 220 TEST_F(ExtensionAppModelBuilderTest, OrdinalPrefsChange) { |
| 217 extensions::AppSorting* sorting = | 221 AppSorting* sorting = ExtensionSystem::Get(profile_.get())->app_sorting(); |
| 218 extensions::ExtensionPrefs::Get(profile_.get())->app_sorting(); | |
| 219 | 222 |
| 220 syncer::StringOrdinal package_app_page = | 223 syncer::StringOrdinal package_app_page = |
| 221 sorting->GetPageOrdinal(kPackagedApp1Id); | 224 sorting->GetPageOrdinal(kPackagedApp1Id); |
| 222 sorting->SetPageOrdinal(kHostedAppId, package_app_page.CreateBefore()); | 225 sorting->SetPageOrdinal(kHostedAppId, package_app_page.CreateBefore()); |
| 223 // Old behavior: This would be "Hosted App,Packaged App 1,Packaged App 2" | 226 // Old behavior: This would be "Hosted App,Packaged App 1,Packaged App 2" |
| 224 // New behavior: Sorting order doesn't change. | 227 // New behavior: Sorting order doesn't change. |
| 225 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); | 228 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); |
| 226 | 229 |
| 227 syncer::StringOrdinal app1_ordinal = | 230 syncer::StringOrdinal app1_ordinal = |
| 228 sorting->GetAppLaunchOrdinal(kPackagedApp1Id); | 231 sorting->GetAppLaunchOrdinal(kPackagedApp1Id); |
| 229 syncer::StringOrdinal app2_ordinal = | 232 syncer::StringOrdinal app2_ordinal = |
| 230 sorting->GetAppLaunchOrdinal(kPackagedApp2Id); | 233 sorting->GetAppLaunchOrdinal(kPackagedApp2Id); |
| 231 sorting->SetPageOrdinal(kHostedAppId, package_app_page); | 234 sorting->SetPageOrdinal(kHostedAppId, package_app_page); |
| 232 sorting->SetAppLaunchOrdinal(kHostedAppId, | 235 sorting->SetAppLaunchOrdinal(kHostedAppId, |
| 233 app1_ordinal.CreateBetween(app2_ordinal)); | 236 app1_ordinal.CreateBetween(app2_ordinal)); |
| 234 // Old behavior: This would be "Packaged App 1,Hosted App,Packaged App 2" | 237 // Old behavior: This would be "Packaged App 1,Hosted App,Packaged App 2" |
| 235 // New behavior: Sorting order doesn't change. | 238 // New behavior: Sorting order doesn't change. |
| 236 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); | 239 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); |
| 237 } | 240 } |
| 238 | 241 |
| 239 TEST_F(ExtensionAppModelBuilderTest, OnExtensionMoved) { | 242 TEST_F(ExtensionAppModelBuilderTest, OnExtensionMoved) { |
| 240 extensions::AppSorting* sorting = | 243 AppSorting* sorting = ExtensionSystem::Get(profile_.get())->app_sorting(); |
| 241 extensions::ExtensionPrefs::Get(profile_.get())->app_sorting(); | |
| 242 sorting->SetPageOrdinal(kHostedAppId, | 244 sorting->SetPageOrdinal(kHostedAppId, |
| 243 sorting->GetPageOrdinal(kPackagedApp1Id)); | 245 sorting->GetPageOrdinal(kPackagedApp1Id)); |
| 244 | 246 |
| 245 sorting->OnExtensionMoved(kHostedAppId, kPackagedApp1Id, kPackagedApp2Id); | 247 sorting->OnExtensionMoved(kHostedAppId, kPackagedApp1Id, kPackagedApp2Id); |
| 246 // Old behavior: This would be "Packaged App 1,Hosted App,Packaged App 2" | 248 // Old behavior: This would be "Packaged App 1,Hosted App,Packaged App 2" |
| 247 // New behavior: Sorting order doesn't change. | 249 // New behavior: Sorting order doesn't change. |
| 248 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); | 250 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); |
| 249 | 251 |
| 250 sorting->OnExtensionMoved(kHostedAppId, kPackagedApp2Id, std::string()); | 252 sorting->OnExtensionMoved(kHostedAppId, kPackagedApp2Id, std::string()); |
| 251 // Old behavior: This would be restored to the default order. | 253 // Old behavior: This would be restored to the default order. |
| 252 // New behavior: Sorting order still doesn't change. | 254 // New behavior: Sorting order still doesn't change. |
| 253 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); | 255 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); |
| 254 | 256 |
| 255 sorting->OnExtensionMoved(kHostedAppId, std::string(), kPackagedApp1Id); | 257 sorting->OnExtensionMoved(kHostedAppId, std::string(), kPackagedApp1Id); |
| 256 // Old behavior: This would be "Hosted App,Packaged App 1,Packaged App 2" | 258 // Old behavior: This would be "Hosted App,Packaged App 1,Packaged App 2" |
| 257 // New behavior: Sorting order doesn't change. | 259 // New behavior: Sorting order doesn't change. |
| 258 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); | 260 EXPECT_EQ(std::string(kDefaultApps), GetModelContent(model_.get())); |
| 259 } | 261 } |
| 260 | 262 |
| 261 TEST_F(ExtensionAppModelBuilderTest, InvalidOrdinal) { | 263 TEST_F(ExtensionAppModelBuilderTest, InvalidOrdinal) { |
| 262 // Creates a no-ordinal case. | 264 // Creates a no-ordinal case. |
| 263 extensions::AppSorting* sorting = | 265 AppSorting* sorting = ExtensionSystem::Get(profile_.get())->app_sorting(); |
| 264 extensions::ExtensionPrefs::Get(profile_.get())->app_sorting(); | |
| 265 sorting->ClearOrdinals(kPackagedApp1Id); | 266 sorting->ClearOrdinals(kPackagedApp1Id); |
| 266 | 267 |
| 267 // Creates a corrupted ordinal case. | 268 // Creates a corrupted ordinal case. |
| 268 extensions::ExtensionScopedPrefs* scoped_prefs = | 269 extensions::ExtensionScopedPrefs* scoped_prefs = |
| 269 extensions::ExtensionPrefs::Get(profile_.get()); | 270 extensions::ExtensionPrefs::Get(profile_.get()); |
| 270 scoped_prefs->UpdateExtensionPref( | 271 scoped_prefs->UpdateExtensionPref( |
| 271 kHostedAppId, | 272 kHostedAppId, |
| 272 "page_ordinal", | 273 "page_ordinal", |
| 273 new base::StringValue("a corrupted ordinal")); | 274 new base::StringValue("a corrupted ordinal")); |
| 274 | 275 |
| 275 // This should not assert or crash. | 276 // This should not assert or crash. |
| 276 CreateBuilder(); | 277 CreateBuilder(); |
| 277 } | 278 } |
| 278 | 279 |
| 279 TEST_F(ExtensionAppModelBuilderTest, OrdinalConfilicts) { | 280 TEST_F(ExtensionAppModelBuilderTest, OrdinalConfilicts) { |
| 280 // Creates conflict ordinals for app1 and app2. | 281 // Creates conflict ordinals for app1 and app2. |
| 281 syncer::StringOrdinal conflict_ordinal = | 282 syncer::StringOrdinal conflict_ordinal = |
| 282 syncer::StringOrdinal::CreateInitialOrdinal(); | 283 syncer::StringOrdinal::CreateInitialOrdinal(); |
| 283 | 284 |
| 284 extensions::AppSorting* sorting = | 285 AppSorting* sorting = ExtensionSystem::Get(profile_.get())->app_sorting(); |
| 285 extensions::ExtensionPrefs::Get(profile_.get())->app_sorting(); | |
| 286 sorting->SetPageOrdinal(kHostedAppId, conflict_ordinal); | 286 sorting->SetPageOrdinal(kHostedAppId, conflict_ordinal); |
| 287 sorting->SetAppLaunchOrdinal(kHostedAppId, conflict_ordinal); | 287 sorting->SetAppLaunchOrdinal(kHostedAppId, conflict_ordinal); |
| 288 | 288 |
| 289 sorting->SetPageOrdinal(kPackagedApp1Id, conflict_ordinal); | 289 sorting->SetPageOrdinal(kPackagedApp1Id, conflict_ordinal); |
| 290 sorting->SetAppLaunchOrdinal(kPackagedApp1Id, conflict_ordinal); | 290 sorting->SetAppLaunchOrdinal(kPackagedApp1Id, conflict_ordinal); |
| 291 | 291 |
| 292 sorting->SetPageOrdinal(kPackagedApp2Id, conflict_ordinal); | 292 sorting->SetPageOrdinal(kPackagedApp2Id, conflict_ordinal); |
| 293 sorting->SetAppLaunchOrdinal(kPackagedApp2Id, conflict_ordinal); | 293 sorting->SetAppLaunchOrdinal(kPackagedApp2Id, conflict_ordinal); |
| 294 | 294 |
| 295 // This should not assert or crash. | 295 // This should not assert or crash. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 319 extensions::Extension::WAS_INSTALLED_BY_DEFAULT | | 319 extensions::Extension::WAS_INSTALLED_BY_DEFAULT | |
| 320 extensions::Extension::FROM_BOOKMARK, | 320 extensions::Extension::FROM_BOOKMARK, |
| 321 kAppId, | 321 kAppId, |
| 322 &err); | 322 &err); |
| 323 EXPECT_TRUE(err.empty()); | 323 EXPECT_TRUE(err.empty()); |
| 324 | 324 |
| 325 service_->AddExtension(bookmark_app.get()); | 325 service_->AddExtension(bookmark_app.get()); |
| 326 EXPECT_EQ(kDefaultAppCount + 1, model_->top_level_item_list()->item_count()); | 326 EXPECT_EQ(kDefaultAppCount + 1, model_->top_level_item_list()->item_count()); |
| 327 EXPECT_NE(std::string::npos, GetModelContent(model_.get()).find(kAppName)); | 327 EXPECT_NE(std::string::npos, GetModelContent(model_.get()).find(kAppName)); |
| 328 } | 328 } |
| OLD | NEW |