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 |