Index: ui/aura/mus/focus_synchronizer.cc |
diff --git a/ui/aura/mus/focus_synchronizer.cc b/ui/aura/mus/focus_synchronizer.cc |
index 1e1e408ad5b9362f1270bf91b3ee1774a8e20fc9..cc24e7e7adf47b3245e79168f3e97a32e3da2f41 100644 |
--- a/ui/aura/mus/focus_synchronizer.cc |
+++ b/ui/aura/mus/focus_synchronizer.cc |
@@ -42,7 +42,9 @@ void FocusSynchronizer::SetFocusFromServer(WindowMus* window) { |
Window* root = window->GetWindow()->GetRootWindow(); |
// The client should provide a focus client for all roots. |
DCHECK(client::GetFocusClient(root)); |
- if (active_focus_client_root_ != root) |
+ if (is_singleton_focus_client_) |
+ DCHECK_EQ(active_focus_client_, client::GetFocusClient(root)); |
+ else if (active_focus_client_root_ != root) |
SetActiveFocusClient(client::GetFocusClient(root), root); |
window->GetWindow()->Focus(); |
} else if (active_focus_client_) { |
@@ -54,19 +56,31 @@ void FocusSynchronizer::OnFocusedWindowDestroyed() { |
focused_window_ = nullptr; |
} |
+void FocusSynchronizer::SetSingletonFocusClient( |
+ client::FocusClient* focus_client) { |
+ SetActiveFocusClient(focus_client, nullptr); |
+ if (focus_client) |
+ is_singleton_focus_client_ = true; |
+} |
+ |
void FocusSynchronizer::SetActiveFocusClient(client::FocusClient* focus_client, |
Window* focus_client_root) { |
- if (focus_client_root == active_focus_client_root_) { |
- DCHECK_EQ(focus_client, active_focus_client_); |
+ if (focus_client == active_focus_client_ && |
+ focus_client_root == active_focus_client_root_) { |
return; |
} |
+ is_singleton_focus_client_ = false; |
+ |
if (active_focus_client_root_) |
active_focus_client_root_->RemoveObserver(this); |
active_focus_client_root_ = focus_client_root; |
if (active_focus_client_root_) |
active_focus_client_root_->AddObserver(this); |
+ if (focus_client == active_focus_client_) |
+ return; |
+ |
OnActiveFocusClientChanged(focus_client, focus_client_root); |
for (FocusSynchronizerObserver& observer : observers_) |
observer.OnActiveFocusClientChanged(focus_client, focus_client_root); |
@@ -118,12 +132,14 @@ void FocusSynchronizer::OnWindowFocused(Window* gained_focus, |
} |
void FocusSynchronizer::OnWindowDestroying(Window* window) { |
+ DCHECK(!is_singleton_focus_client_); |
SetActiveFocusClient(nullptr, nullptr); |
} |
void FocusSynchronizer::OnWindowPropertyChanged(Window* window, |
const void* key, |
intptr_t old) { |
+ DCHECK(!is_singleton_focus_client_); |
if (key != client::kFocusClientKey) |
return; |