| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/ash/launcher/chrome_launcher_controller.h" | 5 #include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "ash/ash_switches.h" | 11 #include "ash/ash_switches.h" |
| 12 #include "ash/launcher/launcher_item_delegate_manager.h" |
| 12 #include "ash/launcher/launcher_model.h" | 13 #include "ash/launcher/launcher_model.h" |
| 13 #include "ash/launcher/launcher_model_observer.h" | 14 #include "ash/launcher/launcher_model_observer.h" |
| 15 #include "ash/shell.h" |
| 14 #include "base/command_line.h" | 16 #include "base/command_line.h" |
| 15 #include "base/compiler_specific.h" | 17 #include "base/compiler_specific.h" |
| 16 #include "base/files/file_path.h" | 18 #include "base/files/file_path.h" |
| 17 #include "base/memory/scoped_ptr.h" | 19 #include "base/memory/scoped_ptr.h" |
| 18 #include "base/message_loop/message_loop.h" | 20 #include "base/message_loop/message_loop.h" |
| 19 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
| 20 #include "base/values.h" | 22 #include "base/values.h" |
| 21 #include "chrome/browser/extensions/extension_service.h" | 23 #include "chrome/browser/extensions/extension_service.h" |
| 22 #include "chrome/browser/extensions/test_extension_system.h" | 24 #include "chrome/browser/extensions/test_extension_system.h" |
| 23 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h" | 25 #include "chrome/browser/ui/ash/chrome_launcher_prefs.h" |
| 26 #include "chrome/browser/ui/ash/launcher/launcher_application_menu_item_model.h" |
| 24 #include "chrome/browser/ui/ash/launcher/launcher_item_controller.h" | 27 #include "chrome/browser/ui/ash/launcher/launcher_item_controller.h" |
| 25 #include "chrome/browser/ui/ash/launcher/shell_window_launcher_item_controller.h
" | 28 #include "chrome/browser/ui/ash/launcher/shell_window_launcher_item_controller.h
" |
| 26 #include "chrome/browser/ui/browser.h" | 29 #include "chrome/browser/ui/browser.h" |
| 27 #include "chrome/browser/ui/browser_commands.h" | 30 #include "chrome/browser/ui/browser_commands.h" |
| 28 #include "chrome/browser/ui/browser_finder.h" | 31 #include "chrome/browser/ui/browser_finder.h" |
| 29 #include "chrome/browser/ui/browser_list.h" | 32 #include "chrome/browser/ui/browser_list.h" |
| 30 #include "chrome/browser/ui/host_desktop.h" | 33 #include "chrome/browser/ui/host_desktop.h" |
| 31 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 34 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 32 #include "chrome/common/extensions/extension.h" | 35 #include "chrome/common/extensions/extension.h" |
| 33 #include "chrome/common/extensions/extension_constants.h" | 36 #include "chrome/common/extensions/extension_constants.h" |
| (...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1092 for (size_t i = 0; i < expected_items; i++) { | 1095 for (size_t i = 0; i < expected_items; i++) { |
| 1093 EXPECT_EQ(title[i], items[1 + i]->title()); | 1096 EXPECT_EQ(title[i], items[1 + i]->title()); |
| 1094 // Check that the first real item has a leading separator. | 1097 // Check that the first real item has a leading separator. |
| 1095 if (i == 1) | 1098 if (i == 1) |
| 1096 EXPECT_TRUE(items[i]->HasLeadingSeparator()); | 1099 EXPECT_TRUE(items[i]->HasLeadingSeparator()); |
| 1097 else | 1100 else |
| 1098 EXPECT_FALSE(items[i]->HasLeadingSeparator()); | 1101 EXPECT_FALSE(items[i]->HasLeadingSeparator()); |
| 1099 } | 1102 } |
| 1100 | 1103 |
| 1101 scoped_ptr<ash::LauncherMenuModel> menu( | 1104 scoped_ptr<ash::LauncherMenuModel> menu( |
| 1102 controller->CreateApplicationMenu(item, 0)); | 1105 new LauncherApplicationMenuItemModel( |
| 1106 controller->GetApplicationList(item, 0))); |
| 1103 // The first element in the menu is a spacing separator. On some systems | 1107 // The first element in the menu is a spacing separator. On some systems |
| 1104 // (e.g. Windows) such things do not exist. As such we check the existence | 1108 // (e.g. Windows) such things do not exist. As such we check the existence |
| 1105 // and adjust dynamically. | 1109 // and adjust dynamically. |
| 1106 int first_item = menu->GetTypeAt(0) == ui::MenuModel::TYPE_SEPARATOR ? 1 : 0; | 1110 int first_item = menu->GetTypeAt(0) == ui::MenuModel::TYPE_SEPARATOR ? 1 : 0; |
| 1107 int expected_menu_items = first_item + | 1111 int expected_menu_items = first_item + |
| 1108 (expected_items ? (expected_items + 3) : 2); | 1112 (expected_items ? (expected_items + 3) : 2); |
| 1109 EXPECT_EQ(expected_menu_items, menu->GetItemCount()); | 1113 EXPECT_EQ(expected_menu_items, menu->GetItemCount()); |
| 1110 EXPECT_FALSE(menu->IsEnabledAt(first_item)); | 1114 EXPECT_FALSE(menu->IsEnabledAt(first_item)); |
| 1111 if (expected_items) { | 1115 if (expected_items) { |
| 1112 EXPECT_EQ(ui::MenuModel::TYPE_SEPARATOR, | 1116 EXPECT_EQ(ui::MenuModel::TYPE_SEPARATOR, |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1256 item_gmail.type = ash::TYPE_APP_SHORTCUT; | 1260 item_gmail.type = ash::TYPE_APP_SHORTCUT; |
| 1257 item_gmail.id = gmail_id; | 1261 item_gmail.id = gmail_id; |
| 1258 string16 two_menu_items[] = {title1, title2}; | 1262 string16 two_menu_items[] = {title1, title2}; |
| 1259 EXPECT_TRUE(CheckMenuCreation( | 1263 EXPECT_TRUE(CheckMenuCreation( |
| 1260 launcher_controller_.get(), item_gmail, 2, two_menu_items, false)); | 1264 launcher_controller_.get(), item_gmail, 2, two_menu_items, false)); |
| 1261 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); | 1265 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); |
| 1262 // Execute the second item in the list (which shouldn't do anything since that | 1266 // Execute the second item in the list (which shouldn't do anything since that |
| 1263 // item is per definition already the active tab). | 1267 // item is per definition already the active tab). |
| 1264 { | 1268 { |
| 1265 scoped_ptr<ash::LauncherMenuModel> menu( | 1269 scoped_ptr<ash::LauncherMenuModel> menu( |
| 1266 launcher_controller_->CreateApplicationMenu(item_gmail, 0)); | 1270 new LauncherApplicationMenuItemModel( |
| 1271 launcher_controller_->GetApplicationList(item_gmail, 0))); |
| 1267 // The first element in the menu is a spacing separator. On some systems | 1272 // The first element in the menu is a spacing separator. On some systems |
| 1268 // (e.g. Windows) such things do not exist. As such we check the existence | 1273 // (e.g. Windows) such things do not exist. As such we check the existence |
| 1269 // and adjust dynamically. | 1274 // and adjust dynamically. |
| 1270 int first_item = | 1275 int first_item = |
| 1271 (menu->GetTypeAt(0) == ui::MenuModel::TYPE_SEPARATOR) ? 1 : 0; | 1276 (menu->GetTypeAt(0) == ui::MenuModel::TYPE_SEPARATOR) ? 1 : 0; |
| 1272 menu->ActivatedAt(first_item + 3); | 1277 menu->ActivatedAt(first_item + 3); |
| 1273 } | 1278 } |
| 1274 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); | 1279 EXPECT_EQ(1, browser()->tab_strip_model()->active_index()); |
| 1275 | 1280 |
| 1276 // Execute the first item. | 1281 // Execute the first item. |
| 1277 { | 1282 { |
| 1278 scoped_ptr<ash::LauncherMenuModel> menu( | 1283 scoped_ptr<ash::LauncherMenuModel> menu( |
| 1279 launcher_controller_->CreateApplicationMenu(item_gmail, 0)); | 1284 new LauncherApplicationMenuItemModel( |
| 1285 launcher_controller_->GetApplicationList(item_gmail, 0))); |
| 1280 int first_item = | 1286 int first_item = |
| 1281 (menu->GetTypeAt(0) == ui::MenuModel::TYPE_SEPARATOR) ? 1 : 0; | 1287 (menu->GetTypeAt(0) == ui::MenuModel::TYPE_SEPARATOR) ? 1 : 0; |
| 1282 menu->ActivatedAt(first_item + 2); | 1288 menu->ActivatedAt(first_item + 2); |
| 1283 } | 1289 } |
| 1284 // Now the active tab should be the second item. | 1290 // Now the active tab should be the second item. |
| 1285 EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); | 1291 EXPECT_EQ(0, browser()->tab_strip_model()->active_index()); |
| 1286 } | 1292 } |
| 1287 | 1293 |
| 1288 // Checks that the generated menu list properly deletes items. | 1294 // Checks that the generated menu list properly deletes items. |
| 1289 TEST_F(ChromeLauncherControllerTest, V1AppMenuDeletionExecution) { | 1295 TEST_F(ChromeLauncherControllerTest, V1AppMenuDeletionExecution) { |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1330 TEST_F(ChromeLauncherControllerTest, AppPanels) { | 1336 TEST_F(ChromeLauncherControllerTest, AppPanels) { |
| 1331 InitLauncherControllerWithBrowser(); | 1337 InitLauncherControllerWithBrowser(); |
| 1332 // Browser shortcut LauncherItem is added. | 1338 // Browser shortcut LauncherItem is added. |
| 1333 EXPECT_EQ(1, model_observer_->added()); | 1339 EXPECT_EQ(1, model_observer_->added()); |
| 1334 | 1340 |
| 1335 TestAppIconLoaderImpl* app_icon_loader = new TestAppIconLoaderImpl(); | 1341 TestAppIconLoaderImpl* app_icon_loader = new TestAppIconLoaderImpl(); |
| 1336 SetAppIconLoader(app_icon_loader); | 1342 SetAppIconLoader(app_icon_loader); |
| 1337 | 1343 |
| 1338 // Test adding an app panel | 1344 // Test adding an app panel |
| 1339 std::string app_id = extension1_->id(); | 1345 std::string app_id = extension1_->id(); |
| 1340 ShellWindowLauncherItemController app_panel_controller( | 1346 ShellWindowLauncherItemController* app_panel_controller = |
| 1341 LauncherItemController::TYPE_APP_PANEL, "id", app_id, | 1347 new ShellWindowLauncherItemController( |
| 1342 launcher_controller_.get()); | 1348 LauncherItemController::TYPE_APP_PANEL, |
| 1349 "id", |
| 1350 app_id, |
| 1351 launcher_controller_.get()); |
| 1343 ash::LauncherID launcher_id1 = launcher_controller_->CreateAppLauncherItem( | 1352 ash::LauncherID launcher_id1 = launcher_controller_->CreateAppLauncherItem( |
| 1344 &app_panel_controller, app_id, ash::STATUS_RUNNING); | 1353 app_panel_controller, app_id, ash::STATUS_RUNNING); |
| 1345 int panel_index = model_observer_->last_index(); | 1354 int panel_index = model_observer_->last_index(); |
| 1346 EXPECT_EQ(2, model_observer_->added()); | 1355 EXPECT_EQ(2, model_observer_->added()); |
| 1347 EXPECT_EQ(0, model_observer_->changed()); | 1356 EXPECT_EQ(0, model_observer_->changed()); |
| 1348 EXPECT_EQ(1, app_icon_loader->fetch_count()); | 1357 EXPECT_EQ(1, app_icon_loader->fetch_count()); |
| 1349 model_observer_->clear_counts(); | 1358 model_observer_->clear_counts(); |
| 1350 | 1359 |
| 1351 // App panels should have a separate identifier than the app id | 1360 // App panels should have a separate identifier than the app id |
| 1352 EXPECT_EQ(0, launcher_controller_->GetLauncherIDForAppID(app_id)); | 1361 EXPECT_EQ(0, launcher_controller_->GetLauncherIDForAppID(app_id)); |
| 1353 | 1362 |
| 1354 // Setting the app image image should not change the panel if it set its icon | 1363 // Setting the app image image should not change the panel if it set its icon |
| 1355 app_panel_controller.set_image_set_by_controller(true); | 1364 app_panel_controller->set_image_set_by_controller(true); |
| 1356 gfx::ImageSkia image; | 1365 gfx::ImageSkia image; |
| 1357 launcher_controller_->SetAppImage(app_id, image); | 1366 launcher_controller_->SetAppImage(app_id, image); |
| 1358 EXPECT_EQ(0, model_observer_->changed()); | 1367 EXPECT_EQ(0, model_observer_->changed()); |
| 1359 model_observer_->clear_counts(); | 1368 model_observer_->clear_counts(); |
| 1360 | 1369 |
| 1361 // Add a second app panel and verify that it get the same index as the first | 1370 // Add a second app panel and verify that it get the same index as the first |
| 1362 // one had, being added to the left of the existing panel. | 1371 // one had, being added to the left of the existing panel. |
| 1372 ShellWindowLauncherItemController* app_panel_controller2 = |
| 1373 new ShellWindowLauncherItemController( |
| 1374 LauncherItemController::TYPE_APP_PANEL, |
| 1375 "id", |
| 1376 app_id, |
| 1377 launcher_controller_.get()); |
| 1378 |
| 1363 ash::LauncherID launcher_id2 = launcher_controller_->CreateAppLauncherItem( | 1379 ash::LauncherID launcher_id2 = launcher_controller_->CreateAppLauncherItem( |
| 1364 &app_panel_controller, app_id, ash::STATUS_RUNNING); | 1380 app_panel_controller2, app_id, ash::STATUS_RUNNING); |
| 1365 EXPECT_EQ(panel_index, model_observer_->last_index()); | 1381 EXPECT_EQ(panel_index, model_observer_->last_index()); |
| 1366 EXPECT_EQ(1, model_observer_->added()); | 1382 EXPECT_EQ(1, model_observer_->added()); |
| 1367 model_observer_->clear_counts(); | 1383 model_observer_->clear_counts(); |
| 1368 | 1384 |
| 1369 launcher_controller_->CloseLauncherItem(launcher_id2); | 1385 launcher_controller_->CloseLauncherItem(launcher_id2); |
| 1370 launcher_controller_->CloseLauncherItem(launcher_id1); | 1386 launcher_controller_->CloseLauncherItem(launcher_id1); |
| 1371 EXPECT_EQ(2, model_observer_->removed()); | 1387 EXPECT_EQ(2, model_observer_->removed()); |
| 1388 |
| 1389 if (!ash::Shell::HasInstance()) { |
| 1390 delete app_panel_controller; |
| 1391 delete app_panel_controller2; |
| 1392 } |
| 1372 } | 1393 } |
| 1373 | 1394 |
| 1374 // Tests that the Gmail extension matches more then the app itself claims with | 1395 // Tests that the Gmail extension matches more then the app itself claims with |
| 1375 // the manifest file. | 1396 // the manifest file. |
| 1376 TEST_F(ChromeLauncherControllerTest, GmailMatching) { | 1397 TEST_F(ChromeLauncherControllerTest, GmailMatching) { |
| 1377 InitLauncherControllerWithBrowser(); | 1398 InitLauncherControllerWithBrowser(); |
| 1378 | 1399 |
| 1379 // Create a Gmail browser tab. | 1400 // Create a Gmail browser tab. |
| 1380 chrome::NewTab(browser()); | 1401 chrome::NewTab(browser()); |
| 1381 string16 title = ASCIIToUTF16("Test"); | 1402 string16 title = ASCIIToUTF16("Test"); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1459 | 1480 |
| 1460 // Move browser shortcut item from index 1 to index 3. | 1481 // Move browser shortcut item from index 1 to index 3. |
| 1461 model_->Move(1, 3); | 1482 model_->Move(1, 3); |
| 1462 EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[0].type); | 1483 EXPECT_EQ(ash::TYPE_APP_LIST, model_->items()[0].type); |
| 1463 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[1].type); | 1484 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[1].type); |
| 1464 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[2].type); | 1485 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[2].type); |
| 1465 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, model_->items()[3].type); | 1486 EXPECT_EQ(ash::TYPE_BROWSER_SHORTCUT, model_->items()[3].type); |
| 1466 | 1487 |
| 1467 launcher_controller_.reset(); | 1488 launcher_controller_.reset(); |
| 1468 model_.reset(new ash::LauncherModel); | 1489 model_.reset(new ash::LauncherModel); |
| 1490 |
| 1491 // Clear already registered LauncherItemDelegate. |
| 1492 if (ash::Shell::HasInstance()) { |
| 1493 ash::Shell::GetInstance()->launcher_item_delegate_manager()-> |
| 1494 UnregisterAllLauncherItemDelegateForTest(); |
| 1495 } |
| 1496 |
| 1469 launcher_controller_.reset( | 1497 launcher_controller_.reset( |
| 1470 ChromeLauncherController::CreateInstance(profile(), model_.get())); | 1498 ChromeLauncherController::CreateInstance(profile(), model_.get())); |
| 1471 app_tab_helper = new TestAppTabHelperImpl; | 1499 app_tab_helper = new TestAppTabHelperImpl; |
| 1472 app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1"); | 1500 app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1"); |
| 1473 app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(1), "2"); | 1501 app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(1), "2"); |
| 1474 SetAppTabHelper(app_tab_helper); | 1502 SetAppTabHelper(app_tab_helper); |
| 1475 | 1503 |
| 1476 launcher_controller_->Init(); | 1504 launcher_controller_->Init(); |
| 1477 | 1505 |
| 1478 // Check LauncherItems are restored after resetting ChromeLauncherController. | 1506 // Check LauncherItems are restored after resetting ChromeLauncherController. |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1502 ash::LauncherID id = launcher_controller_->GetLauncherIDForAppID("1"); | 1530 ash::LauncherID id = launcher_controller_->GetLauncherIDForAppID("1"); |
| 1503 int app_index = model_->ItemIndexByID(id); | 1531 int app_index = model_->ItemIndexByID(id); |
| 1504 EXPECT_EQ(1, app_icon_loader->fetch_count()); | 1532 EXPECT_EQ(1, app_icon_loader->fetch_count()); |
| 1505 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[app_index].type); | 1533 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[app_index].type); |
| 1506 EXPECT_TRUE(launcher_controller_->IsAppPinned("1")); | 1534 EXPECT_TRUE(launcher_controller_->IsAppPinned("1")); |
| 1507 EXPECT_FALSE(launcher_controller_->IsAppPinned("0")); | 1535 EXPECT_FALSE(launcher_controller_->IsAppPinned("0")); |
| 1508 EXPECT_EQ(initial_size + 1, model_->items().size()); | 1536 EXPECT_EQ(initial_size + 1, model_->items().size()); |
| 1509 | 1537 |
| 1510 launcher_controller_.reset(); | 1538 launcher_controller_.reset(); |
| 1511 model_.reset(new ash::LauncherModel); | 1539 model_.reset(new ash::LauncherModel); |
| 1540 |
| 1541 // Clear already registered LauncherItemDelegate. |
| 1542 if (ash::Shell::HasInstance()) { |
| 1543 ash::Shell::GetInstance()->launcher_item_delegate_manager()-> |
| 1544 UnregisterAllLauncherItemDelegateForTest(); |
| 1545 } |
| 1546 |
| 1512 launcher_controller_.reset( | 1547 launcher_controller_.reset( |
| 1513 ChromeLauncherController::CreateInstance(profile(), model_.get())); | 1548 ChromeLauncherController::CreateInstance(profile(), model_.get())); |
| 1514 app_tab_helper = new TestAppTabHelperImpl; | 1549 app_tab_helper = new TestAppTabHelperImpl; |
| 1515 app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1"); | 1550 app_tab_helper->SetAppID(tab_strip_model->GetWebContentsAt(0), "1"); |
| 1516 SetAppTabHelper(app_tab_helper); | 1551 SetAppTabHelper(app_tab_helper); |
| 1517 app_icon_loader = new TestAppIconLoaderImpl; | 1552 app_icon_loader = new TestAppIconLoaderImpl; |
| 1518 SetAppIconLoader(app_icon_loader); | 1553 SetAppIconLoader(app_icon_loader); |
| 1519 launcher_controller_->Init(); | 1554 launcher_controller_->Init(); |
| 1520 | 1555 |
| 1521 EXPECT_EQ(1, app_icon_loader->fetch_count()); | 1556 EXPECT_EQ(1, app_icon_loader->fetch_count()); |
| 1522 ASSERT_EQ(initial_size + 1, model_->items().size()); | 1557 ASSERT_EQ(initial_size + 1, model_->items().size()); |
| 1523 EXPECT_TRUE(launcher_controller_->IsAppPinned("1")); | 1558 EXPECT_TRUE(launcher_controller_->IsAppPinned("1")); |
| 1524 EXPECT_FALSE(launcher_controller_->IsAppPinned("0")); | 1559 EXPECT_FALSE(launcher_controller_->IsAppPinned("0")); |
| 1525 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[app_index].type); | 1560 EXPECT_EQ(ash::TYPE_APP_SHORTCUT, model_->items()[app_index].type); |
| 1526 | 1561 |
| 1527 launcher_controller_->UnpinAppWithID("1"); | 1562 launcher_controller_->UnpinAppWithID("1"); |
| 1528 ASSERT_EQ(initial_size, model_->items().size()); | 1563 ASSERT_EQ(initial_size, model_->items().size()); |
| 1529 } | 1564 } |
| OLD | NEW |