Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: chrome/browser/ui/app_list/app_context_menu_unittest.cc

Issue 2393453002: arc: Fix Arc app item context menu. (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 <map> 5 #include <map>
6 #include <memory> 6 #include <memory>
7 #include <string> 7 #include <string>
8 #include <unordered_set> 8 #include <unordered_set>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/macros.h" 11 #include "base/macros.h"
12 12
13 #include "chrome/browser/extensions/extension_util.h" 13 #include "chrome/browser/extensions/extension_util.h"
14 #include "chrome/browser/extensions/menu_manager_factory.h" 14 #include "chrome/browser/extensions/menu_manager_factory.h"
15 #include "chrome/browser/ui/app_list/app_context_menu_delegate.h" 15 #include "chrome/browser/ui/app_list/app_context_menu_delegate.h"
16 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h" 16 #include "chrome/browser/ui/app_list/app_list_controller_delegate.h"
17 #include "chrome/browser/ui/app_list/app_list_test_util.h" 17 #include "chrome/browser/ui/app_list/app_list_test_util.h"
18 #include "chrome/browser/ui/app_list/chrome_app_list_item.h" 18 #include "chrome/browser/ui/app_list/chrome_app_list_item.h"
19 #include "chrome/browser/ui/app_list/extension_app_context_menu.h" 19 #include "chrome/browser/ui/app_list/extension_app_context_menu.h"
20 #include "chrome/browser/ui/app_list/test/test_app_list_controller_delegate.h" 20 #include "chrome/browser/ui/app_list/test/test_app_list_controller_delegate.h"
21 #include "chrome/test/base/testing_profile.h" 21 #include "chrome/test/base/testing_profile.h"
22 #include "components/keyed_service/core/keyed_service.h" 22 #include "components/keyed_service/core/keyed_service.h"
23 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
24 24
25 #if defined(OS_CHROMEOS) 25 #if defined(OS_CHROMEOS)
26 #include "chrome/browser/ui/app_list/arc/arc_app_item.h" 26 #include "chrome/browser/ui/app_list/arc/arc_app_item.h"
27 #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
27 #include "chrome/browser/ui/app_list/arc/arc_app_test.h" 28 #include "chrome/browser/ui/app_list/arc/arc_app_test.h"
28 #include "components/arc/test/fake_app_instance.h" 29 #include "components/arc/test/fake_app_instance.h"
29 #include "components/arc/test/fake_arc_bridge_service.h" 30 #include "components/arc/test/fake_arc_bridge_service.h"
30 #endif 31 #endif
31 32
32 namespace { 33 namespace {
33 34
34 class FakeAppContextMenuDelegate : public app_list::AppContextMenuDelegate { 35 class FakeAppContextMenuDelegate : public app_list::AppContextMenuDelegate {
35 public: 36 public:
36 FakeAppContextMenuDelegate() = default; 37 FakeAppContextMenuDelegate() = default;
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 : command_id(command_id), 143 : command_id(command_id),
143 is_enabled(enabled), 144 is_enabled(enabled),
144 is_checked(checked) { 145 is_checked(checked) {
145 } 146 }
146 147
147 int command_id; 148 int command_id;
148 bool is_enabled; 149 bool is_enabled;
149 bool is_checked; 150 bool is_checked;
150 }; 151 };
151 152
153 void ValidateItemState(const ui::MenuModel* menu_model,
154 int index,
155 const MenuState& state) {
156 EXPECT_EQ(state.command_id, menu_model->GetCommandIdAt(index));
157 if (state.command_id == -1)
158 return; // Don't check separator.
159 EXPECT_EQ(state.is_enabled, menu_model->IsEnabledAt(index));
160 EXPECT_EQ(state.is_checked, menu_model->IsItemCheckedAt(index));
161 }
162
152 void ValidateMenuState(const ui::MenuModel* menu_model, 163 void ValidateMenuState(const ui::MenuModel* menu_model,
153 const std::vector<MenuState>& states) { 164 const std::vector<MenuState>& states) {
154 ASSERT_NE(nullptr, menu_model); 165 ASSERT_NE(nullptr, menu_model);
155 size_t state_index = 0; 166 size_t state_index = 0;
156 for (int i = 0; i < menu_model->GetItemCount(); ++i) { 167 for (int i = 0; i < menu_model->GetItemCount(); ++i) {
157 ASSERT_LT(state_index, states.size()); 168 ASSERT_LT(state_index, states.size());
158 const MenuState& state = states[state_index++]; 169 ValidateItemState(menu_model, i, states[state_index++]);
159 EXPECT_EQ(state.command_id, menu_model->GetCommandIdAt(i));
160 if (state.command_id == -1)
161 continue; // Don't check separator.
162 EXPECT_EQ(state.is_enabled, menu_model->IsEnabledAt(i));
163 EXPECT_EQ(state.is_checked, menu_model->IsItemCheckedAt(i));
164 } 170 }
165 EXPECT_EQ(state_index, states.size()); 171 EXPECT_EQ(state_index, states.size());
166 } 172 }
167 173
168 FakeAppListControllerDelegate* controller() { 174 FakeAppListControllerDelegate* controller() {
169 return controller_.get(); 175 return controller_.get();
170 } 176 }
171 177
172 FakeAppContextMenuDelegate* menu_delegate() { 178 FakeAppContextMenuDelegate* menu_delegate() {
173 return menu_delegate_.get(); 179 return menu_delegate_.get();
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 controller()); 347 controller());
342 ui::MenuModel* menu_model = menu.GetMenuModel(); 348 ui::MenuModel* menu_model = menu.GetMenuModel();
343 EXPECT_EQ(nullptr, menu_model); 349 EXPECT_EQ(nullptr, menu_model);
344 } 350 }
345 351
346 #if defined(OS_CHROMEOS) 352 #if defined(OS_CHROMEOS)
347 TEST_F(AppContextMenuTest, ArcMenu) { 353 TEST_F(AppContextMenuTest, ArcMenu) {
348 ArcAppTest arc_test; 354 ArcAppTest arc_test;
349 arc_test.SetUp(profile()); 355 arc_test.SetUp(profile());
350 356
351 const arc::mojom::AppInfo& app_info = arc_test.fake_apps()[0]; 357 const arc::mojom::AppInfo& app_info = arc_test.fake_apps()[1];
khmel 2016/10/03 23:48:03 0 app is sticky and does not have uninstall item.
352 const std::string app_id = ArcAppTest::GetAppId(app_info); 358 const std::string app_id = ArcAppTest::GetAppId(app_info);
353 controller()->SetAppPinnable(app_id, AppListControllerDelegate::PIN_EDITABLE); 359 controller()->SetAppPinnable(app_id, AppListControllerDelegate::PIN_EDITABLE);
354 360
355 arc_test.app_instance()->RefreshAppList(); 361 arc_test.app_instance()->RefreshAppList();
356 arc_test.app_instance()->SendRefreshAppList(arc_test.fake_apps()); 362 arc_test.app_instance()->SendRefreshAppList(arc_test.fake_apps());
357 363
358 ArcAppItem item(profile(), nullptr, app_id, std::string()); 364 ArcAppItem item(profile(), nullptr, app_id, std::string());
359 365
360 ui::MenuModel* menu = item.GetContextMenuModel(); 366 ui::MenuModel* menu = item.GetContextMenuModel();
361 ASSERT_NE(nullptr, menu); 367 ASSERT_NE(nullptr, menu);
362 368
363 ASSERT_EQ(4, menu->GetItemCount()); 369 ASSERT_EQ(6, menu->GetItemCount());
364 EXPECT_EQ(app_list::AppContextMenu::LAUNCH_NEW, menu->GetCommandIdAt(0)); 370 ValidateItemState(menu, 0, MenuState(app_list::AppContextMenu::LAUNCH_NEW));
365 EXPECT_TRUE(menu->IsEnabledAt(0)); 371 ValidateItemState(menu, 1, MenuState()); // separator
366 EXPECT_FALSE(menu->IsItemCheckedAt(0)); 372 ValidateItemState(menu, 2, MenuState(app_list::AppContextMenu::TOGGLE_PIN));
367 EXPECT_EQ(-1, menu->GetCommandIdAt(1)); // separator 373 ValidateItemState(menu, 3, MenuState()); // separator
368 EXPECT_EQ(app_list::AppContextMenu::TOGGLE_PIN, menu->GetCommandIdAt(2)); 374 ValidateItemState(menu, 4, MenuState(app_list::AppContextMenu::UNINSTALL));
369 EXPECT_TRUE(menu->IsEnabledAt(2)); 375 ValidateItemState(
370 EXPECT_FALSE(menu->IsItemCheckedAt(2)); 376 menu, 5, MenuState(app_list::AppContextMenu::SHOW_APP_INFO));
371 EXPECT_EQ(app_list::AppContextMenu::SHOW_APP_INFO, menu->GetCommandIdAt(3));
372 EXPECT_TRUE(menu->IsEnabledAt(3));
373 EXPECT_FALSE(menu->IsItemCheckedAt(3));
374 377
375 // Test activate request. 378 // Test activate request.
376 EXPECT_EQ(0u, arc_test.app_instance()->launch_requests().size()); 379 EXPECT_EQ(0u, arc_test.app_instance()->launch_requests().size());
377 380
378 menu->ActivatedAt(0); 381 menu->ActivatedAt(0);
379 382
380 const std::vector<std::unique_ptr<arc::FakeAppInstance::Request>>& 383 const std::vector<std::unique_ptr<arc::FakeAppInstance::Request>>&
381 launch_requests = arc_test.app_instance()->launch_requests(); 384 launch_requests = arc_test.app_instance()->launch_requests();
382 ASSERT_EQ(1u, launch_requests.size()); 385 ASSERT_EQ(1u, launch_requests.size());
383 EXPECT_TRUE(launch_requests[0]->IsForApp(app_info)); 386 EXPECT_TRUE(launch_requests[0]->IsForApp(app_info));
384 387
385 controller()->SetAppOpen(app_id, true); 388 controller()->SetAppOpen(app_id, true);
386 // It is not expected that menu model is unchanged on GetContextMenuModel. Arc 389 // It is not expected that menu model is unchanged on GetContextMenuModel. Arc
387 // app menu requires model to be recalculated. 390 // app menu requires model to be recalculated.
388 menu = item.GetContextMenuModel(); 391 menu = item.GetContextMenuModel();
389 ASSERT_EQ(2, menu->GetItemCount()); 392 ASSERT_EQ(4, menu->GetItemCount());
390 EXPECT_EQ(app_list::AppContextMenu::TOGGLE_PIN, menu->GetCommandIdAt(0)); 393 ValidateItemState(menu, 0, MenuState(app_list::AppContextMenu::TOGGLE_PIN));
391 EXPECT_TRUE(menu->IsEnabledAt(0)); 394 ValidateItemState(menu, 1, MenuState()); // separator
392 EXPECT_FALSE(menu->IsItemCheckedAt(0)); 395 ValidateItemState(menu, 2, MenuState(app_list::AppContextMenu::UNINSTALL));
393 EXPECT_EQ(app_list::AppContextMenu::SHOW_APP_INFO, menu->GetCommandIdAt(1)); 396 ValidateItemState(
394 EXPECT_TRUE(menu->IsEnabledAt(1)); 397 menu, 3, MenuState(app_list::AppContextMenu::SHOW_APP_INFO));
395 EXPECT_FALSE(menu->IsItemCheckedAt(1));
396 398
399 // This makes all apps non-ready.
400 controller()->SetAppOpen(app_id, false);
401 arc::InstanceHolder<arc::mojom::AppInstance>::Observer* instance_observer =
402 arc_test.arc_app_list_prefs();
403 instance_observer->OnInstanceClosed();
404
405 menu = item.GetContextMenuModel();
406 ASSERT_EQ(6, menu->GetItemCount());
407 ValidateItemState(menu, 0, MenuState(app_list::AppContextMenu::LAUNCH_NEW));
408 ValidateItemState(menu, 1, MenuState()); // separator
409 ValidateItemState(menu, 2, MenuState(app_list::AppContextMenu::TOGGLE_PIN));
410 ValidateItemState(menu, 3, MenuState()); // separator
411 ValidateItemState(
412 menu, 4, MenuState(app_list::AppContextMenu::UNINSTALL, false, false));
413 ValidateItemState(
414 menu, 5,
415 MenuState(app_list::AppContextMenu::SHOW_APP_INFO, false, false));
416
417 // Uninstall all apps.
397 arc_test.app_instance()->RefreshAppList(); 418 arc_test.app_instance()->RefreshAppList();
398 arc_test.app_instance()->SendRefreshAppList( 419 arc_test.app_instance()->SendRefreshAppList(
399 std::vector<arc::mojom::AppInfo>()); 420 std::vector<arc::mojom::AppInfo>());
400 controller()->SetAppOpen(app_id, false); 421 controller()->SetAppOpen(app_id, false);
401 422
423 // No app available case.
402 menu = item.GetContextMenuModel(); 424 menu = item.GetContextMenuModel();
403 ASSERT_EQ(4, menu->GetItemCount()); 425 EXPECT_EQ(0, menu->GetItemCount());
404 EXPECT_EQ(app_list::AppContextMenu::LAUNCH_NEW, menu->GetCommandIdAt(0)); 426 }
405 EXPECT_TRUE(menu->IsEnabledAt(0)); 427
406 EXPECT_FALSE(menu->IsItemCheckedAt(0)); 428
407 EXPECT_EQ(-1, menu->GetCommandIdAt(1)); // separator 429 TEST_F(AppContextMenuTest, ArcMenuShortcut) {
408 EXPECT_EQ(app_list::AppContextMenu::TOGGLE_PIN, menu->GetCommandIdAt(2)); 430 ArcAppTest arc_test;
409 EXPECT_TRUE(menu->IsEnabledAt(2)); 431 arc_test.SetUp(profile());
410 EXPECT_FALSE(menu->IsItemCheckedAt(2)); 432
411 EXPECT_EQ(app_list::AppContextMenu::SHOW_APP_INFO, menu->GetCommandIdAt(3)); 433 const arc::mojom::ShortcutInfo& shortcut_info = arc_test.fake_shortcuts()[0];
412 EXPECT_TRUE(menu->IsEnabledAt(3)); 434 const std::string app_id = ArcAppTest::GetAppId(shortcut_info);
413 EXPECT_FALSE(menu->IsItemCheckedAt(3)); 435 controller()->SetAppPinnable(app_id, AppListControllerDelegate::PIN_EDITABLE);
436
437 arc_test.app_instance()->SendInstallShortcuts(arc_test.fake_shortcuts());
438
439 ArcAppItem item(profile(), nullptr, app_id, std::string());
440
441 ui::MenuModel* menu = item.GetContextMenuModel();
442 ASSERT_NE(nullptr, menu);
443
444 ASSERT_EQ(6, menu->GetItemCount());
445 ValidateItemState(menu, 0, MenuState(app_list::AppContextMenu::LAUNCH_NEW));
446 ValidateItemState(menu, 1, MenuState()); // separator
447 ValidateItemState(menu, 2, MenuState(app_list::AppContextMenu::TOGGLE_PIN));
448 ValidateItemState(menu, 3, MenuState()); // separator
449 ValidateItemState(menu, 4, MenuState(app_list::AppContextMenu::UNINSTALL));
450 ValidateItemState(
451 menu, 5, MenuState(app_list::AppContextMenu::SHOW_APP_INFO));
452
453 // This makes all apps non-ready. Shortcut is still uninstall-able.
454 arc::InstanceHolder<arc::mojom::AppInstance>::Observer* instance_observer =
455 arc_test.arc_app_list_prefs();
456 instance_observer->OnInstanceClosed();
457
458 menu = item.GetContextMenuModel();
459 ASSERT_EQ(6, menu->GetItemCount());
460 ValidateItemState(menu, 0, MenuState(app_list::AppContextMenu::LAUNCH_NEW));
461 ValidateItemState(menu, 1, MenuState()); // separator
462 ValidateItemState(menu, 2, MenuState(app_list::AppContextMenu::TOGGLE_PIN));
463 ValidateItemState(menu, 3, MenuState()); // separator
464 ValidateItemState(menu, 4, MenuState(app_list::AppContextMenu::UNINSTALL));
465 ValidateItemState(
466 menu, 5,
467 MenuState(app_list::AppContextMenu::SHOW_APP_INFO, false, false));
414 } 468 }
415 469
416 TEST_F(AppContextMenuTest, ArcMenuStickyItem) { 470 TEST_F(AppContextMenuTest, ArcMenuStickyItem) {
417 ArcAppTest arc_test; 471 ArcAppTest arc_test;
418 arc_test.SetUp(profile()); 472 arc_test.SetUp(profile());
419 473
420 arc_test.app_instance()->RefreshAppList(); 474 arc_test.app_instance()->RefreshAppList();
421 arc_test.app_instance()->SendRefreshAppList(arc_test.fake_apps()); 475 arc_test.app_instance()->SendRefreshAppList(arc_test.fake_apps());
422 476
423 { 477 {
424 // Verify menu of store 478 // Verify menu of store
425 const arc::mojom::AppInfo& store_info = arc_test.fake_apps()[0]; 479 const arc::mojom::AppInfo& store_info = arc_test.fake_apps()[0];
426 const std::string store_id = ArcAppTest::GetAppId(store_info); 480 const std::string store_id = ArcAppTest::GetAppId(store_info);
427 controller()->SetAppPinnable(store_id, 481 controller()->SetAppPinnable(store_id,
428 AppListControllerDelegate::PIN_EDITABLE); 482 AppListControllerDelegate::PIN_EDITABLE);
429 ArcAppItem item(profile(), nullptr, store_id, std::string()); 483 ArcAppItem item(profile(), nullptr, store_id, std::string());
430 ui::MenuModel* menu = item.GetContextMenuModel(); 484 ui::MenuModel* menu = item.GetContextMenuModel();
431 ASSERT_NE(nullptr, menu); 485 ASSERT_NE(nullptr, menu);
432 486
433 ASSERT_EQ(4, menu->GetItemCount()); 487 ASSERT_EQ(5, menu->GetItemCount());
434 EXPECT_EQ(app_list::AppContextMenu::LAUNCH_NEW, menu->GetCommandIdAt(0)); 488 ValidateItemState(menu, 0, MenuState(app_list::AppContextMenu::LAUNCH_NEW));
435 EXPECT_TRUE(menu->IsEnabledAt(0)); 489 ValidateItemState(menu, 1, MenuState()); // separator
436 EXPECT_FALSE(menu->IsItemCheckedAt(0)); 490 ValidateItemState(menu, 2, MenuState(app_list::AppContextMenu::TOGGLE_PIN));
437 EXPECT_EQ(-1, menu->GetCommandIdAt(1)); // separator 491 ValidateItemState(menu, 3, MenuState()); // separator
438 EXPECT_EQ(app_list::AppContextMenu::TOGGLE_PIN, menu->GetCommandIdAt(2)); 492 ValidateItemState(
439 EXPECT_TRUE(menu->IsEnabledAt(2)); 493 menu, 4, MenuState(app_list::AppContextMenu::SHOW_APP_INFO));
440 EXPECT_FALSE(menu->IsItemCheckedAt(2));
441 EXPECT_EQ(app_list::AppContextMenu::SHOW_APP_INFO, menu->GetCommandIdAt(3));
442 EXPECT_TRUE(menu->IsEnabledAt(3));
443 EXPECT_FALSE(menu->IsItemCheckedAt(3));
444
445 // No "uninstall" entry.
446 }
447
448 {
449 // Verify normal app menu
450 const arc::mojom::AppInfo& app_info = arc_test.fake_apps()[1];
451 const std::string app_id = ArcAppTest::GetAppId(app_info);
452 controller()->SetAppPinnable(app_id,
453 AppListControllerDelegate::PIN_EDITABLE);
454 ArcAppItem item(profile(), nullptr, app_id, std::string());
455 ui::MenuModel* menu = item.GetContextMenuModel();
456 ASSERT_NE(nullptr, menu);
457
458 ASSERT_EQ(6, menu->GetItemCount());
459 EXPECT_EQ(app_list::AppContextMenu::LAUNCH_NEW, menu->GetCommandIdAt(0));
460 EXPECT_TRUE(menu->IsEnabledAt(0));
461 EXPECT_FALSE(menu->IsItemCheckedAt(0));
462 EXPECT_EQ(-1, menu->GetCommandIdAt(1)); // separator
463 EXPECT_EQ(app_list::AppContextMenu::TOGGLE_PIN, menu->GetCommandIdAt(2));
464 EXPECT_TRUE(menu->IsEnabledAt(2));
465 EXPECT_FALSE(menu->IsItemCheckedAt(2));
466 EXPECT_EQ(-1, menu->GetCommandIdAt(3)); // separator
467 EXPECT_EQ(app_list::AppContextMenu::UNINSTALL, menu->GetCommandIdAt(4));
468 EXPECT_TRUE(menu->IsEnabledAt(4));
469 EXPECT_FALSE(menu->IsItemCheckedAt(4));
470 EXPECT_EQ(app_list::AppContextMenu::SHOW_APP_INFO, menu->GetCommandIdAt(5));
471 EXPECT_TRUE(menu->IsEnabledAt(5));
472 EXPECT_FALSE(menu->IsItemCheckedAt(5));
473 } 494 }
474 } 495 }
496
475 #endif 497 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698