NaCl: Update revision in DEPS, r12770 -> r12773
[chromium-blink-merge.git] / chrome / browser / ui / ash / launcher / multi_profile_shell_window_launcher_controller.cc
blob7e8d8083a869c77d51ed8a3325775c4755c217f2
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
3 // found in the LICENSE file.
5 #include "chrome/browser/ui/ash/launcher/multi_profile_shell_window_launcher_controller.h"
7 #include "apps/app_window.h"
8 #include "chrome/browser/profiles/profile.h"
9 #include "chrome/browser/profiles/profile_manager.h"
10 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h"
11 #include "chrome/browser/ui/host_desktop.h"
13 namespace {
15 bool ControlsWindow(aura::Window* window) {
16 return chrome::GetHostDesktopTypeForNativeWindow(window) ==
17 chrome::HOST_DESKTOP_TYPE_ASH;
20 } // namespace
23 MultiProfileShellWindowLauncherController::
24 MultiProfileShellWindowLauncherController(
25 ChromeLauncherController* owner)
26 : ShellWindowLauncherController(owner) {
29 MultiProfileShellWindowLauncherController::
30 ~MultiProfileShellWindowLauncherController() {
31 // We need to remove all Registry observers for added users.
32 for (AppWindowRegistryList::iterator it = multi_user_registry_.begin();
33 it != multi_user_registry_.end();
34 ++it)
35 (*it)->RemoveObserver(this);
38 void MultiProfileShellWindowLauncherController::ActiveUserChanged(
39 const std::string& user_email) {
40 // The active user has changed and we need to traverse our list of items to
41 // show / hide them one by one. To avoid that a user dependent state
42 // "survives" in a launcher item, we first delete all items making sure that
43 // nothing remains and then re-create them again.
44 for (AppWindowList::iterator it = app_window_list_.begin();
45 it != app_window_list_.end();
46 ++it) {
47 apps::AppWindow* app_window = *it;
48 Profile* profile =
49 Profile::FromBrowserContext(app_window->browser_context());
50 if (!multi_user_util::IsProfileFromActiveUser(profile) &&
51 IsRegisteredApp(app_window->GetNativeWindow()))
52 UnregisterApp(app_window->GetNativeWindow());
54 for (AppWindowList::iterator it = app_window_list_.begin();
55 it != app_window_list_.end();
56 ++it) {
57 apps::AppWindow* app_window = *it;
58 Profile* profile =
59 Profile::FromBrowserContext(app_window->browser_context());
60 if (multi_user_util::IsProfileFromActiveUser(profile) &&
61 !IsRegisteredApp(app_window->GetNativeWindow()))
62 RegisterApp(*it);
66 void MultiProfileShellWindowLauncherController::AdditionalUserAddedToSession(
67 Profile* profile) {
68 // Each users AppWindowRegistry needs to be observed.
69 apps::AppWindowRegistry* registry = apps::AppWindowRegistry::Get(profile);
70 multi_user_registry_.push_back(registry);
71 registry->AddObserver(this);
74 void MultiProfileShellWindowLauncherController::OnAppWindowAdded(
75 apps::AppWindow* app_window) {
76 if (!ControlsWindow(app_window->GetNativeWindow()))
77 return;
78 app_window_list_.push_back(app_window);
79 Profile* profile = Profile::FromBrowserContext(app_window->browser_context());
80 if (multi_user_util::IsProfileFromActiveUser(profile))
81 RegisterApp(app_window);
84 void MultiProfileShellWindowLauncherController::OnAppWindowRemoved(
85 apps::AppWindow* app_window) {
86 if (!ControlsWindow(app_window->GetNativeWindow()))
87 return;
89 // If the application is registered with ShellWindowLauncher (because the user
90 // is currently active), the OnWindowDestroying observer has already (or will
91 // soon) unregister it independently from the shelf. If it was not registered
92 // we don't need to do anything anyways. As such, all which is left to do here
93 // is to get rid of our own reference.
94 AppWindowList::iterator it =
95 std::find(app_window_list_.begin(), app_window_list_.end(), app_window);
96 DCHECK(it != app_window_list_.end());
97 app_window_list_.erase(it);