OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/multi_profile_app_window_launcher_contr
oller.h" | 5 #include "chrome/browser/ui/ash/launcher/multi_profile_app_window_launcher_contr
oller.h" |
6 | 6 |
7 #include "apps/app_window.h" | |
8 #include "chrome/browser/profiles/profile.h" | 7 #include "chrome/browser/profiles/profile.h" |
9 #include "chrome/browser/profiles/profile_manager.h" | 8 #include "chrome/browser/profiles/profile_manager.h" |
10 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" | 9 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" |
11 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" | 10 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager.h" |
12 #include "chrome/browser/ui/host_desktop.h" | 11 #include "chrome/browser/ui/host_desktop.h" |
| 12 #include "extensions/browser/app_window/app_window.h" |
13 #include "extensions/browser/app_window/native_app_window.h" | 13 #include "extensions/browser/app_window/native_app_window.h" |
14 #include "ui/aura/window.h" | 14 #include "ui/aura/window.h" |
15 | 15 |
16 namespace { | 16 namespace { |
17 | 17 |
18 bool ControlsWindow(aura::Window* window) { | 18 bool ControlsWindow(aura::Window* window) { |
19 return chrome::GetHostDesktopTypeForNativeWindow(window) == | 19 return chrome::GetHostDesktopTypeForNativeWindow(window) == |
20 chrome::HOST_DESKTOP_TYPE_ASH; | 20 chrome::HOST_DESKTOP_TYPE_ASH; |
21 } | 21 } |
22 | 22 |
(...skipping 14 matching lines...) Expand all Loading... |
37 | 37 |
38 void MultiProfileAppWindowLauncherController::ActiveUserChanged( | 38 void MultiProfileAppWindowLauncherController::ActiveUserChanged( |
39 const std::string& user_email) { | 39 const std::string& user_email) { |
40 // The active user has changed and we need to traverse our list of items to | 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 | 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 | 42 // "survives" in a launcher item, we first delete all items making sure that |
43 // nothing remains and then re-create them again. | 43 // nothing remains and then re-create them again. |
44 for (AppWindowList::iterator it = app_window_list_.begin(); | 44 for (AppWindowList::iterator it = app_window_list_.begin(); |
45 it != app_window_list_.end(); | 45 it != app_window_list_.end(); |
46 ++it) { | 46 ++it) { |
47 apps::AppWindow* app_window = *it; | 47 extensions::AppWindow* app_window = *it; |
48 Profile* profile = | 48 Profile* profile = |
49 Profile::FromBrowserContext(app_window->browser_context()); | 49 Profile::FromBrowserContext(app_window->browser_context()); |
50 if (!multi_user_util::IsProfileFromActiveUser(profile) && | 50 if (!multi_user_util::IsProfileFromActiveUser(profile) && |
51 IsRegisteredApp(app_window->GetNativeWindow())) | 51 IsRegisteredApp(app_window->GetNativeWindow())) |
52 UnregisterApp(app_window->GetNativeWindow()); | 52 UnregisterApp(app_window->GetNativeWindow()); |
53 } | 53 } |
54 for (AppWindowList::iterator it = app_window_list_.begin(); | 54 for (AppWindowList::iterator it = app_window_list_.begin(); |
55 it != app_window_list_.end(); | 55 it != app_window_list_.end(); |
56 ++it) { | 56 ++it) { |
57 apps::AppWindow* app_window = *it; | 57 extensions::AppWindow* app_window = *it; |
58 Profile* profile = | 58 Profile* profile = |
59 Profile::FromBrowserContext(app_window->browser_context()); | 59 Profile::FromBrowserContext(app_window->browser_context()); |
60 if (multi_user_util::IsProfileFromActiveUser(profile) && | 60 if (multi_user_util::IsProfileFromActiveUser(profile) && |
61 !IsRegisteredApp(app_window->GetNativeWindow()) && | 61 !IsRegisteredApp(app_window->GetNativeWindow()) && |
62 (app_window->GetBaseWindow()->IsMinimized() || | 62 (app_window->GetBaseWindow()->IsMinimized() || |
63 app_window->GetNativeWindow()->IsVisible())) | 63 app_window->GetNativeWindow()->IsVisible())) |
64 RegisterApp(*it); | 64 RegisterApp(*it); |
65 } | 65 } |
66 } | 66 } |
67 | 67 |
68 void MultiProfileAppWindowLauncherController::AdditionalUserAddedToSession( | 68 void MultiProfileAppWindowLauncherController::AdditionalUserAddedToSession( |
69 Profile* profile) { | 69 Profile* profile) { |
70 // Each users AppWindowRegistry needs to be observed. | 70 // Each users AppWindowRegistry needs to be observed. |
71 apps::AppWindowRegistry* registry = apps::AppWindowRegistry::Get(profile); | 71 extensions::AppWindowRegistry* registry = |
| 72 extensions::AppWindowRegistry::Get(profile); |
72 multi_user_registry_.push_back(registry); | 73 multi_user_registry_.push_back(registry); |
73 registry->AddObserver(this); | 74 registry->AddObserver(this); |
74 } | 75 } |
75 | 76 |
76 void MultiProfileAppWindowLauncherController::OnAppWindowAdded( | 77 void MultiProfileAppWindowLauncherController::OnAppWindowAdded( |
77 apps::AppWindow* app_window) { | 78 extensions::AppWindow* app_window) { |
78 if (!ControlsWindow(app_window->GetNativeWindow())) | 79 if (!ControlsWindow(app_window->GetNativeWindow())) |
79 return; | 80 return; |
80 | 81 |
81 app_window_list_.push_back(app_window); | 82 app_window_list_.push_back(app_window); |
82 Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); | 83 Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); |
83 // If the window got created for a non active user but the user allowed to | 84 // If the window got created for a non active user but the user allowed to |
84 // teleport to the current user's desktop, we teleport it now. | 85 // teleport to the current user's desktop, we teleport it now. |
85 if (!multi_user_util::IsProfileFromActiveUser(profile) && | 86 if (!multi_user_util::IsProfileFromActiveUser(profile) && |
86 UserHasAppOnActiveDesktop(app_window)) { | 87 UserHasAppOnActiveDesktop(app_window)) { |
87 chrome::MultiUserWindowManager::GetInstance()->ShowWindowForUser( | 88 chrome::MultiUserWindowManager::GetInstance()->ShowWindowForUser( |
88 app_window->GetNativeWindow(), multi_user_util::GetCurrentUserId()); | 89 app_window->GetNativeWindow(), multi_user_util::GetCurrentUserId()); |
89 } | 90 } |
90 } | 91 } |
91 | 92 |
92 void MultiProfileAppWindowLauncherController::OnAppWindowShown( | 93 void MultiProfileAppWindowLauncherController::OnAppWindowShown( |
93 apps::AppWindow* app_window) { | 94 extensions::AppWindow* app_window) { |
94 if (!ControlsWindow(app_window->GetNativeWindow())) | 95 if (!ControlsWindow(app_window->GetNativeWindow())) |
95 return; | 96 return; |
96 | 97 |
97 Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); | 98 Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); |
98 | 99 |
99 if (multi_user_util::IsProfileFromActiveUser(profile) && | 100 if (multi_user_util::IsProfileFromActiveUser(profile) && |
100 !IsRegisteredApp(app_window->GetNativeWindow())) { | 101 !IsRegisteredApp(app_window->GetNativeWindow())) { |
101 RegisterApp(app_window); | 102 RegisterApp(app_window); |
102 return; | 103 return; |
103 } | 104 } |
104 | 105 |
105 // The panel layout manager only manages windows which are anchored. | 106 // The panel layout manager only manages windows which are anchored. |
106 // Since this window did never had an anchor, it would stay hidden. We | 107 // Since this window did never had an anchor, it would stay hidden. We |
107 // therefore make it visible now. | 108 // therefore make it visible now. |
108 if (UserHasAppOnActiveDesktop(app_window) && | 109 if (UserHasAppOnActiveDesktop(app_window) && |
109 app_window->GetNativeWindow()->type() == ui::wm::WINDOW_TYPE_PANEL && | 110 app_window->GetNativeWindow()->type() == ui::wm::WINDOW_TYPE_PANEL && |
110 !app_window->GetNativeWindow()->layer()->GetTargetOpacity()) { | 111 !app_window->GetNativeWindow()->layer()->GetTargetOpacity()) { |
111 app_window->GetNativeWindow()->layer()->SetOpacity(1.0f); | 112 app_window->GetNativeWindow()->layer()->SetOpacity(1.0f); |
112 } | 113 } |
113 } | 114 } |
114 | 115 |
115 void MultiProfileAppWindowLauncherController::OnAppWindowHidden( | 116 void MultiProfileAppWindowLauncherController::OnAppWindowHidden( |
116 apps::AppWindow* app_window) { | 117 extensions::AppWindow* app_window) { |
117 if (!ControlsWindow(app_window->GetNativeWindow())) | 118 if (!ControlsWindow(app_window->GetNativeWindow())) |
118 return; | 119 return; |
119 | 120 |
120 Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); | 121 Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); |
121 if (multi_user_util::IsProfileFromActiveUser(profile) && | 122 if (multi_user_util::IsProfileFromActiveUser(profile) && |
122 IsRegisteredApp(app_window->GetNativeWindow())) { | 123 IsRegisteredApp(app_window->GetNativeWindow())) { |
123 UnregisterApp(app_window->GetNativeWindow()); | 124 UnregisterApp(app_window->GetNativeWindow()); |
124 } | 125 } |
125 } | 126 } |
126 | 127 |
127 void MultiProfileAppWindowLauncherController::OnAppWindowRemoved( | 128 void MultiProfileAppWindowLauncherController::OnAppWindowRemoved( |
128 apps::AppWindow* app_window) { | 129 extensions::AppWindow* app_window) { |
129 if (!ControlsWindow(app_window->GetNativeWindow())) | 130 if (!ControlsWindow(app_window->GetNativeWindow())) |
130 return; | 131 return; |
131 | 132 |
132 // If the application is registered with AppWindowLauncher (because the user | 133 // If the application is registered with AppWindowLauncher (because the user |
133 // is currently active), the OnWindowDestroying observer has already (or will | 134 // is currently active), the OnWindowDestroying observer has already (or will |
134 // soon) unregister it independently from the shelf. If it was not registered | 135 // soon) unregister it independently from the shelf. If it was not registered |
135 // we don't need to do anything anyways. As such, all which is left to do here | 136 // we don't need to do anything anyways. As such, all which is left to do here |
136 // is to get rid of our own reference. | 137 // is to get rid of our own reference. |
137 AppWindowList::iterator it = | 138 AppWindowList::iterator it = |
138 std::find(app_window_list_.begin(), app_window_list_.end(), app_window); | 139 std::find(app_window_list_.begin(), app_window_list_.end(), app_window); |
139 DCHECK(it != app_window_list_.end()); | 140 DCHECK(it != app_window_list_.end()); |
140 app_window_list_.erase(it); | 141 app_window_list_.erase(it); |
141 } | 142 } |
142 | 143 |
143 bool MultiProfileAppWindowLauncherController::UserHasAppOnActiveDesktop( | 144 bool MultiProfileAppWindowLauncherController::UserHasAppOnActiveDesktop( |
144 apps::AppWindow* app_window) { | 145 extensions::AppWindow* app_window) { |
145 const std::string& app_id = app_window->extension_id(); | 146 const std::string& app_id = app_window->extension_id(); |
146 content::BrowserContext* app_context = app_window->browser_context(); | 147 content::BrowserContext* app_context = app_window->browser_context(); |
147 DCHECK(!app_context->IsOffTheRecord()); | 148 DCHECK(!app_context->IsOffTheRecord()); |
148 const std::string& current_user = multi_user_util::GetCurrentUserId(); | 149 const std::string& current_user = multi_user_util::GetCurrentUserId(); |
149 chrome::MultiUserWindowManager* manager = | 150 chrome::MultiUserWindowManager* manager = |
150 chrome::MultiUserWindowManager::GetInstance(); | 151 chrome::MultiUserWindowManager::GetInstance(); |
151 for (AppWindowList::iterator it = app_window_list_.begin(); | 152 for (AppWindowList::iterator it = app_window_list_.begin(); |
152 it != app_window_list_.end(); | 153 it != app_window_list_.end(); |
153 ++it) { | 154 ++it) { |
154 apps::AppWindow* other_window = *it; | 155 extensions::AppWindow* other_window = *it; |
155 DCHECK(!other_window->browser_context()->IsOffTheRecord()); | 156 DCHECK(!other_window->browser_context()->IsOffTheRecord()); |
156 if (manager->IsWindowOnDesktopOfUser(other_window->GetNativeWindow(), | 157 if (manager->IsWindowOnDesktopOfUser(other_window->GetNativeWindow(), |
157 current_user) && | 158 current_user) && |
158 app_id == other_window->extension_id() && | 159 app_id == other_window->extension_id() && |
159 app_context == other_window->browser_context()) { | 160 app_context == other_window->browser_context()) { |
160 return true; | 161 return true; |
161 } | 162 } |
162 } | 163 } |
163 return false; | 164 return false; |
164 } | 165 } |
OLD | NEW |