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

Unified Diff: chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc

Issue 213193007: Simplifying launcher handling by removing an unnecessary data structure and some functions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/ui/ash/launcher/chrome_launcher_controller.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
index 7dd041107b0d4baca8e89f43074dd030524da2d9..fe7d3633fded1d51eee800f1f047a19f89383404 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller.cc
@@ -920,31 +920,6 @@ void ChromeLauncherController::ToggleShelfAutoHideBehavior(
return;
}
-void ChromeLauncherController::RemoveTabFromRunningApp(
- WebContents* tab,
- const std::string& app_id) {
- web_contents_to_app_id_.erase(tab);
- // BrowserShortcutLauncherItemController::UpdateBrowserItemState() will update
- // the state when no application is associated with the tab.
- if (app_id.empty())
- return;
-
- AppIDToWebContentsListMap::iterator i_app_id =
- app_id_to_web_contents_list_.find(app_id);
- if (i_app_id != app_id_to_web_contents_list_.end()) {
- WebContentsList* tab_list = &i_app_id->second;
- tab_list->remove(tab);
- ash::ShelfItemStatus status = ash::STATUS_RUNNING;
- if (tab_list->empty()) {
- app_id_to_web_contents_list_.erase(i_app_id);
- status = ash::STATUS_CLOSED;
- }
- ash::ShelfID id = GetShelfIDForAppID(app_id);
- if (id)
- SetItemStatus(id, status);
- }
-}
-
void ChromeLauncherController::UpdateAppState(content::WebContents* contents,
AppState app_state) {
std::string app_id = app_tab_helper_->GetAppID(contents);
@@ -958,43 +933,24 @@ void ChromeLauncherController::UpdateAppState(content::WebContents* contents,
// remove it from the previous app.
if (web_contents_to_app_id_.find(contents) != web_contents_to_app_id_.end()) {
std::string last_app_id = web_contents_to_app_id_[contents];
- if (last_app_id != app_id)
- RemoveTabFromRunningApp(contents, last_app_id);
+ if (last_app_id != app_id) {
+ ash::ShelfID id = GetShelfIDForAppID(last_app_id);
+ if (id) {
+ // We remove the content before checking existence with GetAppState.
sky 2014/03/26 21:59:35 Again, document why. This comment just documents c
Mr4D (OOO till 08-26) 2014/03/27 14:50:54 I do not see it this way. It says that it removes
+ web_contents_to_app_id_.erase(contents);
+ SetItemStatus(id, GetAppState(last_app_id));
+ }
+ }
}
web_contents_to_app_id_[contents] = app_id;
sky 2014/03/26 21:59:35 Seems silly to have a remove 2 lines later. How ab
Mr4D (OOO till 08-26) 2014/03/27 14:50:54 Done.
- if (app_state == APP_STATE_REMOVED) {
- // The tab has gone away.
- RemoveTabFromRunningApp(contents, app_id);
- } else if (!app_id.empty()) {
- WebContentsList& tab_list(app_id_to_web_contents_list_[app_id]);
- WebContentsList::const_iterator i_tab =
- std::find(tab_list.begin(), tab_list.end(), contents);
-
- if (i_tab == tab_list.end())
- tab_list.push_back(contents);
-
- if (app_state == APP_STATE_INACTIVE || app_state == APP_STATE_ACTIVE) {
- if (i_tab != tab_list.begin()) {
- // Going to running state, but wasn't the front tab, indicating that a
- // new tab has already become active.
- return;
- }
- }
-
- if (app_state == APP_STATE_ACTIVE || app_state == APP_STATE_WINDOW_ACTIVE) {
- tab_list.remove(contents);
- tab_list.push_front(contents);
- }
+ if (app_state == APP_STATE_REMOVED)
+ web_contents_to_app_id_.erase(contents);
- ash::ShelfID id = GetShelfIDForAppID(app_id);
- if (id) {
- // If the window is active, mark the app as active.
- SetItemStatus(id, app_state == APP_STATE_WINDOW_ACTIVE ?
- ash::STATUS_ACTIVE : ash::STATUS_RUNNING);
- }
- }
+ ash::ShelfID id = GetShelfIDForAppID(app_id);
+ if (id)
+ SetItemStatus(id, GetAppState(app_id));
}
ash::ShelfID ChromeLauncherController::GetShelfIDForWebContents(
@@ -1719,35 +1675,24 @@ void ChromeLauncherController::SetShelfBehaviorsFromPrefs() {
SetShelfAlignmentFromPrefs();
}
-WebContents* ChromeLauncherController::GetLastActiveWebContents(
- const std::string& app_id) {
- AppIDToWebContentsListMap::iterator i =
- app_id_to_web_contents_list_.find(app_id);
- if (i == app_id_to_web_contents_list_.end())
- return NULL;
-
- // There are many crash records (crbug.com/341250) which indicate that the
- // app_id_to_web_contents_list_ contains deleted content entries - so there
- // must be a way that the content does not get properly updated. To fix
- // M33 and M34 we filter out the invalid items here, but this should be
- // addressed by a later patch correctly. Looking at the code however, the
- // real culprit is possibly BrowserStatusMonitor::UpdateAppItemState which
- // does not call "UpdateAppState(.., APP_STATE_REMOVED)" because due to a
- // Browser::SwapTabContent operation it isn't able to get the browser. I
- // think that the real patch is to call anyway when APP_STATE_REMOVED is
- // requested, but for a backport that seems risky.
- WebContentsList* list = &i->second;
- while (!list->empty()) {
- WebContents* contents = *list->begin();
- if (chrome::FindBrowserWithWebContents(contents))
- return contents;
- list->erase(list->begin());
- // This might not be necessary, but since we do not know why the lists
- // diverged we also erase it since it cannot be correct either.
- web_contents_to_app_id_.erase(contents);
+ash::ShelfItemStatus ChromeLauncherController::GetAppState(
+ const::std::string& app_id) {
+ ash::ShelfItemStatus status = ash::STATUS_CLOSED;
+ WebContentsToAppIDMap::iterator it = web_contents_to_app_id_.begin();
sky 2014/03/26 21:59:35 nit: for loop?
Mr4D (OOO till 08-26) 2014/03/27 14:50:54 Done.
+ while (it != web_contents_to_app_id_.end()) {
+ if (it->second == app_id) {
+ Browser* browser = chrome::FindBrowserWithWebContents(it->first);
+ DCHECK(browser);
sky 2014/03/26 21:59:35 Are you sure this DCHECK is valid here? Seems to m
Mr4D (OOO till 08-26) 2014/03/27 14:50:54 This DCHECK was added to identify an ilegal state
+ if (browser->window()->IsActive()) {
+ return browser->tab_strip_model()->GetActiveWebContents() == it->first ?
+ ash::STATUS_ACTIVE : ash::STATUS_RUNNING;
+ } else {
+ status = ash::STATUS_RUNNING;
+ }
+ }
+ ++it;
}
- app_id_to_web_contents_list_.erase(app_id);
- return NULL;
+ return status;
}
ash::ShelfID ChromeLauncherController::InsertAppLauncherItem(
@@ -1766,15 +1711,10 @@ ash::ShelfID ChromeLauncherController::InsertAppLauncherItem(
item.type = shelf_item_type;
item.image = extensions::IconsInfo::GetDefaultAppIcon();
- WebContents* active_tab = GetLastActiveWebContents(app_id);
- if (active_tab) {
- Browser* browser = chrome::FindBrowserWithWebContents(active_tab);
- DCHECK(browser);
- if (browser->window()->IsActive())
- status = ash::STATUS_ACTIVE;
- else
- status = ash::STATUS_RUNNING;
- }
+ ash::ShelfItemStatus new_state = GetAppState(app_id);
+ if (new_state != ash::STATUS_CLOSED)
+ status = new_state;
+
item.status = status;
model_->AddAt(index, item);
« no previous file with comments | « chrome/browser/ui/ash/launcher/chrome_launcher_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698