Index: chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc |
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc |
index 9de260a325590655f1b9467623c86c5a90cd2888..728737d43fe7b5b4977eb82b316c2002405242e2 100644 |
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc |
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_impl.cc |
@@ -264,9 +264,8 @@ ChromeLauncherControllerImpl::~ChromeLauncherControllerImpl() { |
model_->RemoveObserver(this); |
if (ash::Shell::HasInstance()) |
ash::Shell::GetInstance()->window_tree_host_manager()->RemoveObserver(this); |
- for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin(); |
- i != id_to_item_controller_map_.end(); ++i) { |
- int index = model_->ItemIndexByID(i->first); |
+ for (const auto& pair : id_to_item_controller_map_) { |
+ int index = model_->ItemIndexByID(pair.first); |
// A "browser proxy" is not known to the model and this removal does |
// therefore not need to be propagated to the model. |
if (index != -1 && |
@@ -301,32 +300,31 @@ ash::ShelfID ChromeLauncherControllerImpl::CreateAppLauncherItem( |
ash::TYPE_APP); |
} |
-const ash::ShelfItem& ChromeLauncherControllerImpl::GetItem( |
+const ash::ShelfItem* ChromeLauncherControllerImpl::GetItem( |
ash::ShelfID id) const { |
const int index = model_->ItemIndexByID(id); |
- DCHECK_GE(index, 0); |
- return model_->items()[index]; |
+ if (index >= 0 && index < model_->item_count()) |
+ return &model_->items()[index]; |
+ return nullptr; |
} |
void ChromeLauncherControllerImpl::SetItemType(ash::ShelfID id, |
ash::ShelfItemType type) { |
- const int index = model_->ItemIndexByID(id); |
- DCHECK_GE(index, 0); |
- ash::ShelfItem item = model_->items()[index]; |
- if (item.type != type) { |
- item.type = type; |
- model_->Set(index, item); |
+ const ash::ShelfItem* item = GetItem(id); |
+ if (item && item->type != type) { |
+ ash::ShelfItem new_item = *item; |
+ new_item.type = type; |
+ model_->Set(model_->ItemIndexByID(id), new_item); |
} |
} |
void ChromeLauncherControllerImpl::SetItemStatus(ash::ShelfID id, |
ash::ShelfItemStatus status) { |
- const int index = model_->ItemIndexByID(id); |
- DCHECK_GE(index, 0); |
- ash::ShelfItem item = model_->items()[index]; |
- if (item.status != status) { |
- item.status = status; |
- model_->Set(index, item); |
+ const ash::ShelfItem* item = GetItem(id); |
+ if (item && item->status != status) { |
+ ash::ShelfItem new_item = *item; |
+ new_item.status = status; |
+ model_->Set(model_->ItemIndexByID(id), new_item); |
} |
} |
@@ -363,18 +361,11 @@ void ChromeLauncherControllerImpl::CloseLauncherItem(ash::ShelfID id) { |
void ChromeLauncherControllerImpl::Pin(ash::ShelfID id) { |
DCHECK(HasShelfIDToAppIDMapping(id)); |
- |
- int index = model_->ItemIndexByID(id); |
- DCHECK_GE(index, 0); |
- |
- ash::ShelfItem item = model_->items()[index]; |
- |
- if (item.type == ash::TYPE_APP) { |
- item.type = ash::TYPE_APP_SHORTCUT; |
- model_->Set(index, item); |
- } else if (item.type != ash::TYPE_APP_SHORTCUT) { |
+ const ash::ShelfItem* item = GetItem(id); |
+ if (item && item->type == ash::TYPE_APP) |
+ SetItemType(id, ash::TYPE_APP_SHORTCUT); |
+ else if (!item || item->type != ash::TYPE_APP_SHORTCUT) |
return; |
- } |
SyncPinPosition(id); |
} |
@@ -394,18 +385,17 @@ void ChromeLauncherControllerImpl::UnpinAndUpdatePrefs(ash::ShelfID id, |
GetLaunchIDForShelfID(id))); |
} |
- if (GetItem(id).status != ash::STATUS_CLOSED || controller->locked()) |
+ const ash::ShelfItem* item = GetItem(id); |
+ if (item && (item->status != ash::STATUS_CLOSED || controller->locked())) |
UnpinRunningAppInternal(model_->ItemIndexByID(id)); |
else |
LauncherItemClosed(id); |
} |
bool ChromeLauncherControllerImpl::IsPinned(ash::ShelfID id) { |
- int index = model_->ItemIndexByID(id); |
- if (index < 0) |
- return false; |
- ash::ShelfItemType type = model_->items()[index].type; |
- return (type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_BROWSER_SHORTCUT); |
+ const ash::ShelfItem* item = GetItem(id); |
+ return item && (item->type == ash::TYPE_APP_SHORTCUT || |
+ item->type == ash::TYPE_BROWSER_SHORTCUT); |
} |
void ChromeLauncherControllerImpl::TogglePinned(ash::ShelfID id) { |
@@ -419,13 +409,9 @@ void ChromeLauncherControllerImpl::TogglePinned(ash::ShelfID id) { |
} |
bool ChromeLauncherControllerImpl::IsPinnable(ash::ShelfID id) const { |
- int index = model_->ItemIndexByID(id); |
- if (index == -1) |
- return false; |
- |
- ash::ShelfItemType type = model_->items()[index].type; |
- std::string app_id; |
- return ((type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_APP) && |
+ const ash::ShelfItem* item = GetItem(id); |
+ return (item && (item->type == ash::TYPE_APP_SHORTCUT || |
+ item->type == ash::TYPE_APP) && |
model_->GetShelfItemDelegate(id)->CanPin()); |
} |
@@ -465,8 +451,8 @@ void ChromeLauncherControllerImpl::Close(ash::ShelfID id) { |
} |
bool ChromeLauncherControllerImpl::IsOpen(ash::ShelfID id) { |
- const int index = model_->ItemIndexByID(id); |
- return index >= 0 && model_->items()[index].status != ash::STATUS_CLOSED; |
+ const ash::ShelfItem* item = GetItem(id); |
+ return item && item->status != ash::STATUS_CLOSED; |
} |
bool ChromeLauncherControllerImpl::IsPlatformApp(ash::ShelfID id) { |
@@ -517,12 +503,12 @@ extensions::LaunchType ChromeLauncherControllerImpl::GetLaunchType( |
void ChromeLauncherControllerImpl::SetLauncherItemImage( |
ash::ShelfID shelf_id, |
const gfx::ImageSkia& image) { |
- int index = model_->ItemIndexByID(shelf_id); |
- if (index == -1) |
- return; |
- ash::ShelfItem item = model_->items()[index]; |
- item.image = image; |
- model_->Set(index, item); |
+ const ash::ShelfItem* item = GetItem(shelf_id); |
+ if (item) { |
+ ash::ShelfItem new_item = *item; |
+ new_item.image = image; |
+ model_->Set(model_->ItemIndexByID(shelf_id), new_item); |
+ } |
} |
void ChromeLauncherControllerImpl::SetLaunchType( |
@@ -596,22 +582,16 @@ ash::ShelfID ChromeLauncherControllerImpl::GetShelfIDForWebContents( |
void ChromeLauncherControllerImpl::SetRefocusURLPatternForTest( |
ash::ShelfID id, |
const GURL& url) { |
- int index = model_->ItemIndexByID(id); |
- if (index == -1) { |
- NOTREACHED() << "Invalid launcher id"; |
- return; |
- } |
- |
- ash::ShelfItemType type = model_->items()[index].type; |
- if ((type == ash::TYPE_APP_SHORTCUT || type == ash::TYPE_APP) && |
- !IsPlatformApp(id)) { |
+ const ash::ShelfItem* item = GetItem(id); |
+ if (item && !IsPlatformApp(id) && |
+ (item->type == ash::TYPE_APP_SHORTCUT || item->type == ash::TYPE_APP)) { |
LauncherItemController* controller = GetLauncherItemController(id); |
DCHECK(controller); |
AppShortcutLauncherItemController* app_controller = |
static_cast<AppShortcutLauncherItemController*>(controller); |
app_controller->set_refocus_url(url); |
} else { |
- NOTREACHED() << "Invalid launcher type"; |
+ NOTREACHED() << "Invalid launcher item or type"; |
} |
} |
@@ -687,35 +667,29 @@ void ChromeLauncherControllerImpl::AdditionalUserAddedToSession( |
ChromeLauncherAppMenuItems ChromeLauncherControllerImpl::GetApplicationList( |
const ash::ShelfItem& item, |
int event_flags) { |
- // Make sure that there is a controller associated with the id and that the |
- // extension itself is a valid application and not a panel. |
LauncherItemController* controller = GetLauncherItemController(item.id); |
- if (!controller || !GetShelfIDForAppID(controller->app_id())) |
- return ChromeLauncherAppMenuItems(); |
- |
- return controller->GetApplicationList(event_flags); |
+ return controller ? controller->GetApplicationList(event_flags) |
+ : ChromeLauncherAppMenuItems(); |
} |
std::vector<content::WebContents*> |
ChromeLauncherControllerImpl::GetV1ApplicationsFromAppId( |
const std::string& app_id) { |
- ash::ShelfID id = GetShelfIDForAppID(app_id); |
+ const ash::ShelfItem* item = GetItem(GetShelfIDForAppID(app_id)); |
// If there is no such item pinned to the launcher, no menu gets created. |
- if (id != ash::kInvalidShelfID && |
- GetItem(id).type == ash::TYPE_APP_SHORTCUT) { |
- LauncherItemController* controller = GetLauncherItemController(id); |
- AppShortcutLauncherItemController* app_controller = |
- static_cast<AppShortcutLauncherItemController*>(controller); |
- return app_controller->GetRunningApplications(); |
- } |
- return std::vector<content::WebContents*>(); |
+ if (!item || item->type != ash::TYPE_APP_SHORTCUT) |
+ return std::vector<content::WebContents*>(); |
+ LauncherItemController* controller = GetLauncherItemController(item->id); |
+ AppShortcutLauncherItemController* app_controller = |
+ static_cast<AppShortcutLauncherItemController*>(controller); |
+ return app_controller->GetRunningApplications(); |
} |
void ChromeLauncherControllerImpl::ActivateShellApp(const std::string& app_id, |
int window_index) { |
- ash::ShelfID id = GetShelfIDForAppID(app_id); |
- if (id != ash::kInvalidShelfID && GetItem(id).type == ash::TYPE_APP) { |
- LauncherItemController* controller = GetLauncherItemController(id); |
+ const ash::ShelfItem* item = GetItem(GetShelfIDForAppID(app_id)); |
+ if (item && item->type == ash::TYPE_APP) { |
+ LauncherItemController* controller = GetLauncherItemController(item->id); |
AppWindowLauncherItemController* app_window_controller = |
static_cast<AppWindowLauncherItemController*>(controller); |
app_window_controller->ActivateIndexedApp(window_index); |
@@ -781,12 +755,10 @@ base::string16 ChromeLauncherControllerImpl::GetAppListTitle( |
BrowserShortcutLauncherItemController* |
ChromeLauncherControllerImpl::GetBrowserShortcutLauncherItemController() { |
- for (IDToItemControllerMap::iterator i = id_to_item_controller_map_.begin(); |
- i != id_to_item_controller_map_.end(); ++i) { |
- int index = model_->ItemIndexByID(i->first); |
- const ash::ShelfItem& item = model_->items()[index]; |
- if (item.type == ash::TYPE_BROWSER_SHORTCUT) |
- return static_cast<BrowserShortcutLauncherItemController*>(i->second); |
+ for (const auto& pair : id_to_item_controller_map_) { |
+ const ash::ShelfItem* item = GetItem(pair.first); |
+ if (item && item->type == ash::TYPE_BROWSER_SHORTCUT) |
+ return static_cast<BrowserShortcutLauncherItemController*>(pair.second); |
} |
NOTREACHED() |
<< "There should be always be a BrowserShortcutLauncherItemController."; |
@@ -944,10 +916,8 @@ void ChromeLauncherControllerImpl::PinAppWithID(const std::string& app_id) { |
bool ChromeLauncherControllerImpl::IsAppPinned(const std::string& app_id) { |
const std::string shelf_app_id = |
ArcAppWindowLauncherController::GetShelfAppIdFromArcAppId(app_id); |
- for (IDToItemControllerMap::const_iterator i = |
- id_to_item_controller_map_.begin(); |
- i != id_to_item_controller_map_.end(); ++i) { |
- if (IsPinned(i->first) && i->second->app_id() == shelf_app_id) |
+ for (const auto& pair : id_to_item_controller_map_) { |
+ if (IsPinned(pair.first) && pair.second->app_id() == shelf_app_id) |
return true; |
} |
return false; |
@@ -1044,17 +1014,14 @@ void ChromeLauncherControllerImpl::RestoreUnpinnedRunningApplicationOrder( |
// Find the first insertion point for running applications. |
int running_index = model_->FirstRunningAppIndex(); |
- for (RunningAppListIds::iterator app_id = app_id_list->second.begin(); |
- app_id != app_id_list->second.end(); ++app_id) { |
- ash::ShelfID shelf_id = GetShelfIDForAppID(*app_id); |
- if (shelf_id) { |
- int app_index = model_->ItemIndexByID(shelf_id); |
+ for (const std::string& app_id : app_id_list->second) { |
+ const ash::ShelfItem* item = GetItem(GetShelfIDForAppID(app_id)); |
+ if (item && item->type == ash::TYPE_APP) { |
+ int app_index = model_->ItemIndexByID(item->id); |
DCHECK_GE(app_index, 0); |
- if (model_->items()[app_index].type == ash::TYPE_APP) { |
- if (running_index != app_index) |
- model_->Move(running_index, app_index); |
- running_index++; |
- } |
+ if (running_index != app_index) |
+ model_->Move(running_index, app_index); |
+ running_index++; |
} |
} |
} |
@@ -1116,14 +1083,9 @@ void ChromeLauncherControllerImpl::DoUnpinAppWithID(const std::string& app_id, |
void ChromeLauncherControllerImpl::PinRunningAppInternal( |
int index, |
ash::ShelfID shelf_id) { |
+ DCHECK_EQ(GetItem(shelf_id)->type, ash::TYPE_APP); |
+ SetItemType(shelf_id, ash::TYPE_APP_SHORTCUT); |
int running_index = model_->ItemIndexByID(shelf_id); |
- ash::ShelfItem item = model_->items()[running_index]; |
- DCHECK_EQ(item.type, ash::TYPE_APP); |
- item.type = ash::TYPE_APP_SHORTCUT; |
- model_->Set(running_index, item); |
- // The |ShelfModel|'s weight system might reposition the item to a |
- // new index, so we get the index again. |
- running_index = model_->ItemIndexByID(shelf_id); |
if (running_index < index) |
--index; |
if (running_index != index) |
@@ -1131,11 +1093,10 @@ void ChromeLauncherControllerImpl::PinRunningAppInternal( |
} |
void ChromeLauncherControllerImpl::UnpinRunningAppInternal(int index) { |
- DCHECK_GE(index, 0); |
+ DCHECK(index >= 0 && index < model_->item_count()); |
ash::ShelfItem item = model_->items()[index]; |
DCHECK_EQ(item.type, ash::TYPE_APP_SHORTCUT); |
- item.type = ash::TYPE_APP; |
- model_->Set(index, item); |
+ SetItemType(item.id, ash::TYPE_APP); |
} |
void ChromeLauncherControllerImpl::SyncPinPosition(ash::ShelfID shelf_id) { |