Index: chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc |
diff --git a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc |
index 5038c15ee2d7e8662ad46f5b51cf017612bf5050..c2d7b1d2dcaa283d0a6734a8a9c0b8a252efb464 100644 |
--- a/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc |
+++ b/chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc |
@@ -289,16 +289,30 @@ void ArcAppWindowLauncherController::OnWindowInitialized(aura::Window* window) { |
window->AddObserver(this); |
} |
-void ArcAppWindowLauncherController::OnWindowVisibilityChanged( |
+void ArcAppWindowLauncherController::OnWindowPropertyChanged( |
aura::Window* window, |
- bool visible) { |
- // The application id property should be set at this time. It is important to |
- // have window->IsVisible set to true before attaching to a controller because |
- // the window is registered in multi-user manager and this manager may |
- // consider this new window as hidden for current profile. Multi-user manager |
- // uses OnWindowVisibilityChanging event to update window state. |
- if (visible && observed_profile_ == owner()->GetProfile()) |
- AttachControllerToWindowIfNeeded(window); |
+ const void* key, |
+ intptr_t old) { |
+ if (!exo::ShellSurface::IsApplicationWindowReadyPropertyKey(key)) |
+ return; |
+ |
+ DCHECK(exo::ShellSurface::IsApplicationWindowReadyToShow(window)); |
+ if (observed_profile_ == owner()->GetProfile()) { |
+ if (AttachControllerToWindowIfNeeded(window)) |
+ window->Show(); |
+ } else { |
+ chrome::MultiUserWindowManager* multi_user_manager = |
+ chrome::MultiUserWindowManager::GetInstance(); |
+ if (multi_user_manager->GetWindowOwner(window).empty()) { |
+ multi_user_manager->SetWindowOwner( |
+ window, |
+ user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId()); |
+ // Now the window is registered for primary user however it is marked as |
+ // hidden. Manually mark it as visible in order to get it automatically |
+ // restored when user switches back to primary profile. |
+ multi_user_manager->MarkWindowAsVisible(window); |
+ } |
+ } |
} |
void ArcAppWindowLauncherController::OnWindowDestroying(aura::Window* window) { |
@@ -335,18 +349,21 @@ void ArcAppWindowLauncherController::AttachControllerToWindowsIfNeeded() { |
AttachControllerToWindowIfNeeded(window); |
} |
-void ArcAppWindowLauncherController::AttachControllerToWindowIfNeeded( |
+bool ArcAppWindowLauncherController::AttachControllerToWindowIfNeeded( |
aura::Window* window) { |
+ if (!exo::ShellSurface::IsApplicationWindowReadyToShow(window)) |
+ return false; |
+ |
const std::string window_app_id = exo::ShellSurface::GetApplicationId(window); |
if (window_app_id.empty()) |
- return; |
+ return false; |
int task_id = -1; |
if (sscanf(window_app_id.c_str(), "org.chromium.arc.%d", &task_id) != 1) |
- return; |
+ return false; |
if (!task_id) |
- return; |
+ return false; |
// We need to add the observer after exo started observing shell |
// because we want to update the orientation after exo send |
@@ -358,12 +375,12 @@ void ArcAppWindowLauncherController::AttachControllerToWindowIfNeeded( |
// Check if we have controller for this task. |
if (GetAppWindowForTask(task_id)) |
- return; |
+ return false; |
// Create controller if we have task info. |
TaskIdToShelfAppIdMap::iterator it = task_id_to_shelf_app_id_.find(task_id); |
if (it == task_id_to_shelf_app_id_.end()) |
- return; |
+ return false; |
const std::string& app_id = it->second; |
@@ -384,6 +401,7 @@ void ArcAppWindowLauncherController::AttachControllerToWindowIfNeeded( |
SetOrientationLockForAppWindow(app_window.get()); |
} |
task_id_to_app_window_[task_id] = std::move(app_window); |
+ return true; |
} |
void ArcAppWindowLauncherController::OnAppReadyChanged( |