Chromium Code Reviews| 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 <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
| 10 #include "ash/launcher/launcher.h" | 10 #include "ash/launcher/launcher.h" |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 341 void ChromeLauncherController::SetItemStatus( | 341 void ChromeLauncherController::SetItemStatus( |
| 342 ash::LauncherID id, | 342 ash::LauncherID id, |
| 343 ash::LauncherItemStatus status) { | 343 ash::LauncherItemStatus status) { |
| 344 int index = model_->ItemIndexByID(id); | 344 int index = model_->ItemIndexByID(id); |
| 345 // Since ordinary browser windows are not registered, we might get a negative | 345 // Since ordinary browser windows are not registered, we might get a negative |
| 346 // index here. | 346 // index here. |
| 347 if (index >= 0) { | 347 if (index >= 0) { |
| 348 ash::LauncherItem item = model_->items()[index]; | 348 ash::LauncherItem item = model_->items()[index]; |
| 349 item.status = status; | 349 item.status = status; |
| 350 model_->Set(index, item); | 350 model_->Set(index, item); |
| 351 | |
| 352 if (model_->items()[index].type == ash::TYPE_BROWSER_SHORTCUT) | |
| 353 return; | |
| 354 } | 351 } |
| 355 UpdateBrowserItemStatus(); | |
| 356 } | 352 } |
| 357 | 353 |
| 358 void ChromeLauncherController::SetItemController( | 354 void ChromeLauncherController::SetItemController( |
| 359 ash::LauncherID id, | 355 ash::LauncherID id, |
| 360 LauncherItemController* controller) { | 356 LauncherItemController* controller) { |
| 361 CHECK(controller); | 357 CHECK(controller); |
| 362 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); | 358 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); |
| 363 CHECK(iter != id_to_item_controller_map_.end()); | 359 CHECK(iter != id_to_item_controller_map_.end()); |
| 364 iter->second->OnRemoved(); | 360 iter->second->OnRemoved(); |
| 365 iter->second = controller; | 361 iter->second = controller; |
| (...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 812 app_id = kGmailAppId; | 808 app_id = kGmailAppId; |
| 813 | 809 |
| 814 // Check the old |app_id| for a tab. If the contents has changed we need to | 810 // Check the old |app_id| for a tab. If the contents has changed we need to |
| 815 // remove it from the previous app. | 811 // remove it from the previous app. |
| 816 if (web_contents_to_app_id_.find(contents) != web_contents_to_app_id_.end()) { | 812 if (web_contents_to_app_id_.find(contents) != web_contents_to_app_id_.end()) { |
| 817 std::string last_app_id = web_contents_to_app_id_[contents]; | 813 std::string last_app_id = web_contents_to_app_id_[contents]; |
| 818 if (last_app_id != app_id) | 814 if (last_app_id != app_id) |
| 819 RemoveTabFromRunningApp(contents, last_app_id); | 815 RemoveTabFromRunningApp(contents, last_app_id); |
| 820 } | 816 } |
| 821 | 817 |
| 822 if (app_id.empty()) { | |
| 823 // Even if there is no application running, we should update the activation | |
| 824 // state of the associated browser. | |
| 825 UpdateBrowserItemStatus(); | |
| 826 return; | |
| 827 } | |
| 828 | |
| 829 web_contents_to_app_id_[contents] = app_id; | 818 web_contents_to_app_id_[contents] = app_id; |
| 830 | 819 |
| 831 if (app_state == APP_STATE_REMOVED) { | 820 if (app_state == APP_STATE_REMOVED) { |
| 832 // The tab has gone away. | 821 // The tab has gone away. |
| 833 RemoveTabFromRunningApp(contents, app_id); | 822 RemoveTabFromRunningApp(contents, app_id); |
| 834 } else { | 823 } else { |
| 835 WebContentsList& tab_list(app_id_to_web_contents_list_[app_id]); | 824 WebContentsList& tab_list(app_id_to_web_contents_list_[app_id]); |
| 836 | 825 |
| 837 if (app_state == APP_STATE_INACTIVE) { | 826 if (app_state == APP_STATE_INACTIVE) { |
| 838 WebContentsList::const_iterator i_tab = | 827 WebContentsList::const_iterator i_tab = |
| 839 std::find(tab_list.begin(), tab_list.end(), contents); | 828 std::find(tab_list.begin(), tab_list.end(), contents); |
| 840 if (i_tab == tab_list.end()) | 829 if (i_tab == tab_list.end()) |
| 841 tab_list.push_back(contents); | 830 tab_list.push_back(contents); |
| 842 if (i_tab != tab_list.begin()) { | 831 if (i_tab != tab_list.begin()) { |
| 843 // Going inactive, but wasn't the front tab, indicating that a new | 832 // Going inactive, but wasn't the front tab, indicating that a new |
| 844 // tab has already become active. | 833 // tab has already become active. |
| 845 return; | 834 return; |
| 846 } | 835 } |
| 847 } else { | 836 } else { |
| 848 tab_list.remove(contents); | 837 tab_list.remove(contents); |
| 849 tab_list.push_front(contents); | 838 tab_list.push_front(contents); |
| 850 } | 839 } |
| 851 ash::LauncherID id = GetLauncherIDForAppID(app_id); | 840 ash::LauncherID id = GetLauncherIDForAppID(app_id); |
| 852 if (id) { | 841 if (id) { |
| 853 // If the window is active, mark the app as active. | 842 // If the window is active, mark the app as active. |
| 854 SetItemStatus(id, app_state == APP_STATE_WINDOW_ACTIVE ? | 843 SetItemStatus(id, app_state == APP_STATE_WINDOW_ACTIVE ? |
| 855 ash::STATUS_ACTIVE : ash::STATUS_RUNNING); | 844 ash::STATUS_ACTIVE : ash::STATUS_RUNNING); |
| 856 } | 845 } |
| 857 } | 846 } |
| 858 UpdateBrowserItemStatus(); | |
| 859 } | 847 } |
| 860 | 848 |
| 861 void ChromeLauncherController::SetRefocusURLPatternForTest(ash::LauncherID id, | 849 void ChromeLauncherController::SetRefocusURLPatternForTest(ash::LauncherID id, |
| 862 const GURL& url) { | 850 const GURL& url) { |
| 863 DCHECK(HasItemController(id)); | 851 DCHECK(HasItemController(id)); |
| 864 LauncherItemController* controller = id_to_item_controller_map_[id]; | 852 LauncherItemController* controller = id_to_item_controller_map_[id]; |
| 865 | 853 |
| 866 int index = model_->ItemIndexByID(id); | 854 int index = model_->ItemIndexByID(id); |
| 867 if (index == -1) { | 855 if (index == -1) { |
| 868 NOTREACHED() << "Invalid launcher id"; | 856 NOTREACHED() << "Invalid launcher id"; |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1229 const std::string& app_id, | 1217 const std::string& app_id, |
| 1230 int index, | 1218 int index, |
| 1231 ash::LauncherItemType launcher_item_type) { | 1219 ash::LauncherItemType launcher_item_type) { |
| 1232 AppShortcutLauncherItemController* controller = | 1220 AppShortcutLauncherItemController* controller = |
| 1233 new AppShortcutLauncherItemController(app_id, this); | 1221 new AppShortcutLauncherItemController(app_id, this); |
| 1234 ash::LauncherID launcher_id = InsertAppLauncherItem( | 1222 ash::LauncherID launcher_id = InsertAppLauncherItem( |
| 1235 controller, app_id, ash::STATUS_CLOSED, index, launcher_item_type); | 1223 controller, app_id, ash::STATUS_CLOSED, index, launcher_item_type); |
| 1236 return launcher_id; | 1224 return launcher_id; |
| 1237 } | 1225 } |
| 1238 | 1226 |
| 1239 void ChromeLauncherController::UpdateBrowserItemStatus() { | |
| 1240 // This check needs for win7_aura. UpdateBrowserItemStatus() access Shell. | |
| 1241 // Without this ChromeLauncherControllerTest.BrowserMenuGeneration test will | |
| 1242 // fail. | |
| 1243 if (!ash::Shell::HasInstance()) | |
| 1244 return; | |
| 1245 | |
| 1246 // Determine the new browser's active state and change if necessary. | |
| 1247 size_t browser_index = ash::launcher::GetBrowserItemIndex(*model_); | |
| 1248 DCHECK_GE(browser_index, 0u); | |
| 1249 ash::LauncherItem browser_item = model_->items()[browser_index]; | |
| 1250 ash::LauncherItemStatus browser_status = ash::STATUS_CLOSED; | |
| 1251 | |
| 1252 aura::Window* window = ash::wm::GetActiveWindow(); | |
| 1253 if (window) { | |
| 1254 // Check if the active browser / tab is a browser which is not an app, | |
| 1255 // a windowed app, a popup or any other item which is not a browser of | |
| 1256 // interest. | |
| 1257 Browser* browser = chrome::FindBrowserWithWindow(window); | |
| 1258 if (IsBrowserRepresentedInBrowserList(browser)) { | |
| 1259 browser_status = ash::STATUS_ACTIVE; | |
| 1260 const ash::LauncherItems& items = model_->items(); | |
| 1261 // If another launcher item has claimed to be active, we don't. | |
| 1262 for (size_t i = 0; | |
| 1263 i < items.size() && browser_status == ash::STATUS_ACTIVE; ++i) { | |
| 1264 if (i != browser_index && items[i].status == ash::STATUS_ACTIVE) | |
| 1265 browser_status = ash::STATUS_RUNNING; | |
| 1266 } | |
| 1267 } | |
| 1268 } | |
| 1269 | |
| 1270 if (browser_status == ash::STATUS_CLOSED) { | |
| 1271 const BrowserList* ash_browser_list = | |
| 1272 BrowserList::GetInstance(chrome::HOST_DESKTOP_TYPE_ASH); | |
| 1273 for (BrowserList::const_reverse_iterator it = | |
| 1274 ash_browser_list->begin_last_active(); | |
| 1275 it != ash_browser_list->end_last_active() && | |
| 1276 browser_status == ash::STATUS_CLOSED; ++it) { | |
| 1277 if (IsBrowserRepresentedInBrowserList(*it)) | |
| 1278 browser_status = ash::STATUS_RUNNING; | |
| 1279 } | |
| 1280 } | |
| 1281 | |
| 1282 if (browser_status != browser_item.status) { | |
| 1283 browser_item.status = browser_status; | |
| 1284 model_->Set(browser_index, browser_item); | |
| 1285 } | |
| 1286 } | |
| 1287 | |
| 1288 Profile* ChromeLauncherController::GetProfileForNewWindows() { | 1227 Profile* ChromeLauncherController::GetProfileForNewWindows() { |
| 1289 return ProfileManager::GetDefaultProfileOrOffTheRecord(); | 1228 return ProfileManager::GetDefaultProfileOrOffTheRecord(); |
| 1290 } | 1229 } |
| 1291 | 1230 |
| 1292 void ChromeLauncherController::LauncherItemClosed(ash::LauncherID id) { | 1231 void ChromeLauncherController::LauncherItemClosed(ash::LauncherID id) { |
| 1293 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); | 1232 IDToItemControllerMap::iterator iter = id_to_item_controller_map_.find(id); |
| 1294 CHECK(iter != id_to_item_controller_map_.end()); | 1233 CHECK(iter != id_to_item_controller_map_.end()); |
| 1295 CHECK(iter->second); | 1234 CHECK(iter->second); |
| 1296 app_icon_loader_->ClearImage(iter->second->app_id()); | 1235 app_icon_loader_->ClearImage(iter->second->app_id()); |
| 1297 iter->second->OnRemoved(); | 1236 iter->second->OnRemoved(); |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1549 | 1488 |
| 1550 std::vector<content::WebContents*> | 1489 std::vector<content::WebContents*> |
| 1551 ChromeLauncherController::GetV1ApplicationsFromController( | 1490 ChromeLauncherController::GetV1ApplicationsFromController( |
| 1552 LauncherItemController* controller) { | 1491 LauncherItemController* controller) { |
| 1553 DCHECK(controller->type() == LauncherItemController::TYPE_SHORTCUT); | 1492 DCHECK(controller->type() == LauncherItemController::TYPE_SHORTCUT); |
| 1554 AppShortcutLauncherItemController* app_controller = | 1493 AppShortcutLauncherItemController* app_controller = |
| 1555 static_cast<AppShortcutLauncherItemController*>(controller); | 1494 static_cast<AppShortcutLauncherItemController*>(controller); |
| 1556 return app_controller->GetRunningApplications(); | 1495 return app_controller->GetRunningApplications(); |
| 1557 } | 1496 } |
| 1558 | 1497 |
| 1559 bool ChromeLauncherController::IsBrowserRepresentedInBrowserList( | 1498 BrowserShortcutLauncherItemController* |
| 1560 Browser* browser) { | |
| 1561 return (browser && | |
| 1562 (browser->is_type_tabbed() || | |
| 1563 !browser->is_app() || | |
| 1564 !browser->is_type_popup() || | |
| 1565 GetLauncherIDForAppID(web_app::GetExtensionIdFromApplicationName( | |
| 1566 browser->app_name())) <= 0)); | |
| 1567 } | |
| 1568 | |
| 1569 LauncherItemController* | |
| 1570 ChromeLauncherController::GetBrowserShortcutLauncherItemController() { | 1499 ChromeLauncherController::GetBrowserShortcutLauncherItemController() { |
| 1571 for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin(); | 1500 for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin(); |
| 1572 i != id_to_item_controller_map_.end(); ++i) { | 1501 i != id_to_item_controller_map_.end(); ++i) { |
| 1573 int index = model_->ItemIndexByID(i->first); | 1502 int index = model_->ItemIndexByID(i->first); |
| 1574 const ash::LauncherItem& item = model_->items()[index]; | 1503 const ash::LauncherItem& item = model_->items()[index]; |
| 1575 if (item.type == ash::TYPE_BROWSER_SHORTCUT) | 1504 if (item.type == ash::TYPE_BROWSER_SHORTCUT) |
| 1576 return i->second; | 1505 return static_cast<BrowserShortcutLauncherItemController*>(i->second); |
| 1577 } | 1506 } |
| 1578 // LauncerItemController For Browser Shortcut must be existed. If it does not | 1507 // LauncerItemController For Browser Shortcut must be existed. If it does not |
| 1579 // existe create it. | 1508 // exist, create it. |
|
Mr4D (OOO till 08-26)
2013/09/04 15:12:33
What about:
// Create a LauncherItemController fo
simonhong_
2013/09/04 17:08:31
Done.
| |
| 1580 ash::LauncherID id = CreateBrowserShortcutLauncherItem(); | 1509 ash::LauncherID id = CreateBrowserShortcutLauncherItem(); |
| 1581 DCHECK(id_to_item_controller_map_[id]); | 1510 DCHECK(id_to_item_controller_map_[id]); |
| 1582 return id_to_item_controller_map_[id]; | 1511 return static_cast<BrowserShortcutLauncherItemController*>( |
| 1512 id_to_item_controller_map_[id]); | |
| 1583 } | 1513 } |
| 1584 | 1514 |
| 1585 ash::LauncherID ChromeLauncherController::CreateBrowserShortcutLauncherItem() { | 1515 ash::LauncherID ChromeLauncherController::CreateBrowserShortcutLauncherItem() { |
| 1586 ash::LauncherItem browser_shortcut; | 1516 ash::LauncherItem browser_shortcut; |
| 1587 browser_shortcut.type = ash::TYPE_BROWSER_SHORTCUT; | 1517 browser_shortcut.type = ash::TYPE_BROWSER_SHORTCUT; |
| 1588 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); | 1518 ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| 1589 browser_shortcut.image = *rb.GetImageSkiaNamed(IDR_PRODUCT_LOGO_32); | 1519 browser_shortcut.image = *rb.GetImageSkiaNamed(IDR_PRODUCT_LOGO_32); |
| 1590 ash::LauncherID id = model_->next_id(); | 1520 ash::LauncherID id = model_->next_id(); |
| 1591 size_t index = GetChromeIconIndexFromPref(); | 1521 size_t index = GetChromeIconIndexFromPref(); |
| 1592 model_->AddAt(index, browser_shortcut); | 1522 model_->AddAt(index, browser_shortcut); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1656 // TODO(simon.hong81): Register LauncherItemDelegate when LauncherItemDelegate | 1586 // TODO(simon.hong81): Register LauncherItemDelegate when LauncherItemDelegate |
| 1657 // is created. | 1587 // is created. |
| 1658 ash::LauncherItemDelegateManager* manager = | 1588 ash::LauncherItemDelegateManager* manager = |
| 1659 ash::Shell::GetInstance()->launcher_item_delegate_manager(); | 1589 ash::Shell::GetInstance()->launcher_item_delegate_manager(); |
| 1660 manager->RegisterLauncherItemDelegate(ash::TYPE_APP_PANEL, this); | 1590 manager->RegisterLauncherItemDelegate(ash::TYPE_APP_PANEL, this); |
| 1661 manager->RegisterLauncherItemDelegate(ash::TYPE_APP_SHORTCUT, this); | 1591 manager->RegisterLauncherItemDelegate(ash::TYPE_APP_SHORTCUT, this); |
| 1662 manager->RegisterLauncherItemDelegate(ash::TYPE_BROWSER_SHORTCUT, this); | 1592 manager->RegisterLauncherItemDelegate(ash::TYPE_BROWSER_SHORTCUT, this); |
| 1663 manager->RegisterLauncherItemDelegate(ash::TYPE_PLATFORM_APP, this); | 1593 manager->RegisterLauncherItemDelegate(ash::TYPE_PLATFORM_APP, this); |
| 1664 manager->RegisterLauncherItemDelegate(ash::TYPE_WINDOWED_APP, this); | 1594 manager->RegisterLauncherItemDelegate(ash::TYPE_WINDOWED_APP, this); |
| 1665 } | 1595 } |
| OLD | NEW |