Index: chrome/browser/ui/browser_list.cc |
diff --git a/chrome/browser/ui/browser_list.cc b/chrome/browser/ui/browser_list.cc |
index 5516e79a2d661b03360ed12af48582c656e1ed4b..d94fd697ce3cd2dd8fe75a2f96c917b0b2539256 100644 |
--- a/chrome/browser/ui/browser_list.cc |
+++ b/chrome/browser/ui/browser_list.cc |
@@ -20,6 +20,7 @@ |
#include "chrome/browser/ui/browser_window.h" |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/user_metrics.h" |
+#include "ui/display/desktop.h" |
using base::UserMetricsAction; |
using content::WebContents; |
@@ -217,12 +218,52 @@ bool BrowserList::IsOffTheRecordSessionActiveForProfile(Profile* profile) { |
} |
//////////////////////////////////////////////////////////////////////////////// |
+// BrowserList, display::DesktopObserver implementation: |
+ |
+void BrowserList::OnWorkspaceChanged(const std::string& new_workspace) { |
+ DCHECK(!new_workspace.empty()); |
+ |
+ Browser* old_last_active = GetLastActive(); |
+ |
+ // Reorder the browsers in the list so that the browsers in the new workspace |
+ // appear after the browsers in the other workspaces. |
+ // |
+ // For example, if we have a list of browser-workspace pairs |
+ // [{b1, 0}, {b2, 1}, {b3, 0}, {b4, 1}] |
+ // and we switch to workspace 1, we want the resulting browser list to look |
+ // like [{b1, 0}, {b3, 0}, {b2, 1}, {b4, 1}]. |
+ BrowserVector in_this_workspace; |
+ BrowserVector in_different_workspace; |
+ for (Browser* browser : last_active_browsers_) { |
+ if (browser->window()->GetWorkspace() == new_workspace) |
+ in_this_workspace.push_back(browser); |
+ else |
+ in_different_workspace.push_back(browser); |
+ } |
+ last_active_browsers_.clear(); |
+ last_active_browsers_.insert(last_active_browsers_.end(), |
+ in_different_workspace.begin(), |
+ in_different_workspace.end()); |
+ last_active_browsers_.insert(last_active_browsers_.end(), |
+ in_this_workspace.begin(), |
+ in_this_workspace.end()); |
+ |
+ Browser* new_last_active = GetLastActive(); |
+ if (old_last_active != new_last_active) { |
+ FOR_EACH_OBSERVER(chrome::BrowserListObserver, observers_.Get(), |
+ OnBrowserSetLastActive(new_last_active)); |
+ } |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
// BrowserList, private: |
BrowserList::BrowserList() { |
+ display::Desktop::AddObserver(this); |
} |
BrowserList::~BrowserList() { |
+ display::Desktop::RemoveObserver(this); |
} |
// static |