| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/mus/ws/focus_controller.h" | 5 #include "components/mus/ws/focus_controller.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 141 focus_observer.ClearAll(); | 141 focus_observer.ClearAll(); |
| 142 focus_controller.RemoveObserver(&focus_observer); | 142 focus_controller.RemoveObserver(&focus_observer); |
| 143 } | 143 } |
| 144 | 144 |
| 145 // Tests that focus shifts correctly if the focused window is destroyed. | 145 // Tests that focus shifts correctly if the focused window is destroyed. |
| 146 TEST(FocusControllerTest, FocusShiftsOnDestroy) { | 146 TEST(FocusControllerTest, FocusShiftsOnDestroy) { |
| 147 TestServerWindowDelegate server_window_delegate; | 147 TestServerWindowDelegate server_window_delegate; |
| 148 ServerWindow parent(&server_window_delegate, WindowId()); | 148 ServerWindow parent(&server_window_delegate, WindowId()); |
| 149 server_window_delegate.set_root_window(&parent); | 149 server_window_delegate.set_root_window(&parent); |
| 150 parent.SetVisible(true); | 150 parent.SetVisible(true); |
| 151 scoped_ptr<ServerWindow> child_first( | 151 ServerWindow child_first(&server_window_delegate, WindowId()); |
| 152 child_first.SetVisible(true); |
| 153 parent.Add(&child_first); |
| 154 scoped_ptr<ServerWindow> child_second( |
| 152 new ServerWindow(&server_window_delegate, WindowId())); | 155 new ServerWindow(&server_window_delegate, WindowId())); |
| 153 child_first->SetVisible(true); | 156 child_second->SetVisible(true); |
| 154 parent.Add(child_first.get()); | 157 parent.Add(child_second.get()); |
| 155 ServerWindow child_second(&server_window_delegate, WindowId()); | |
| 156 child_second.SetVisible(true); | |
| 157 parent.Add(&child_second); | |
| 158 std::vector<uint8_t> dummy; | 158 std::vector<uint8_t> dummy; |
| 159 // Allow only |parent| to be activated. | 159 // Allow only |parent| to be activated. |
| 160 parent.SetProperty(kDisallowActiveChildren, &dummy); | 160 parent.SetProperty(kDisallowActiveChildren, &dummy); |
| 161 | 161 |
| 162 TestFocusControllerObserver focus_observer; | 162 TestFocusControllerObserver focus_observer; |
| 163 focus_observer.set_ignore_explicit(false); | 163 focus_observer.set_ignore_explicit(false); |
| 164 FocusController focus_controller(&focus_observer, &parent); | 164 FocusController focus_controller(&focus_observer, &parent); |
| 165 focus_controller.AddObserver(&focus_observer); | 165 focus_controller.AddObserver(&focus_observer); |
| 166 | 166 |
| 167 focus_controller.ActivateNextWindow(); | 167 focus_controller.ActivateNextWindow(); |
| 168 EXPECT_EQ(nullptr, focus_observer.old_active_window()); | 168 EXPECT_EQ(nullptr, focus_observer.old_active_window()); |
| 169 EXPECT_EQ(&parent, focus_observer.new_active_window()); | 169 EXPECT_EQ(&parent, focus_observer.new_active_window()); |
| 170 EXPECT_EQ(nullptr, focus_observer.old_focused_window()); | 170 EXPECT_EQ(nullptr, focus_observer.old_focused_window()); |
| 171 EXPECT_EQ(child_first.get(), focus_observer.new_focused_window()); | 171 EXPECT_EQ(child_second.get(), focus_observer.new_focused_window()); |
| 172 focus_observer.ClearAll(); | 172 focus_observer.ClearAll(); |
| 173 | 173 |
| 174 // Destroying |child_first| should move focus to |child_second|. | 174 // Destroying |child_second| should move focus to |child_first|. |
| 175 child_first.reset(); | 175 child_second.reset(); |
| 176 EXPECT_NE(nullptr, focus_observer.old_focused_window()); | 176 EXPECT_NE(nullptr, focus_observer.old_focused_window()); |
| 177 EXPECT_EQ(&child_second, focus_observer.new_focused_window()); | 177 EXPECT_EQ(&child_first, focus_observer.new_focused_window()); |
| 178 | 178 |
| 179 focus_controller.RemoveObserver(&focus_observer); | 179 focus_controller.RemoveObserver(&focus_observer); |
| 180 } | 180 } |
| 181 | 181 |
| 182 TEST(FocusControllerTest, ActivationSkipsOverHiddenWindow) { | 182 TEST(FocusControllerTest, ActivationSkipsOverHiddenWindow) { |
| 183 TestServerWindowDelegate server_window_delegate; | 183 TestServerWindowDelegate server_window_delegate; |
| 184 ServerWindow parent(&server_window_delegate, WindowId()); | 184 ServerWindow parent(&server_window_delegate, WindowId()); |
| 185 server_window_delegate.set_root_window(&parent); | 185 server_window_delegate.set_root_window(&parent); |
| 186 parent.SetVisible(true); | 186 parent.SetVisible(true); |
| 187 | 187 |
| 188 ServerWindow child_first(&server_window_delegate, WindowId()); | 188 ServerWindow child_first(&server_window_delegate, WindowId()); |
| 189 ServerWindow child_second(&server_window_delegate, WindowId()); | 189 ServerWindow child_second(&server_window_delegate, WindowId()); |
| 190 ServerWindow child_third(&server_window_delegate, WindowId()); | 190 ServerWindow child_third(&server_window_delegate, WindowId()); |
| 191 | 191 |
| 192 parent.Add(&child_first); | 192 parent.Add(&child_first); |
| 193 parent.Add(&child_second); | 193 parent.Add(&child_second); |
| 194 parent.Add(&child_third); | 194 parent.Add(&child_third); |
| 195 | 195 |
| 196 child_first.SetVisible(true); | 196 child_first.SetVisible(true); |
| 197 child_second.SetVisible(false); | 197 child_second.SetVisible(false); |
| 198 child_third.SetVisible(true); | 198 child_third.SetVisible(true); |
| 199 | 199 |
| 200 TestFocusControllerObserver focus_observer; | 200 TestFocusControllerObserver focus_observer; |
| 201 focus_observer.set_ignore_explicit(false); | 201 focus_observer.set_ignore_explicit(false); |
| 202 FocusController focus_controller(&focus_observer, &parent); | 202 FocusController focus_controller(&focus_observer, &parent); |
| 203 focus_controller.AddObserver(&focus_observer); | 203 focus_controller.AddObserver(&focus_observer); |
| 204 | 204 |
| 205 // Since |child_second| is invisible, activation should cycle from | 205 // Since |child_second| is invisible, activation should cycle from |
| 206 // |child_first|, to |child_third|, to |parent|, back to |child_first|. | 206 // |child_third|, to |child_first|, to |parent|, back to |child_third|. |
| 207 focus_controller.ActivateNextWindow(); | 207 focus_controller.ActivateNextWindow(); |
| 208 EXPECT_EQ(nullptr, focus_observer.old_active_window()); | 208 EXPECT_EQ(nullptr, focus_observer.old_active_window()); |
| 209 EXPECT_EQ(&child_third, focus_observer.new_active_window()); |
| 210 focus_observer.ClearAll(); |
| 211 |
| 212 focus_controller.ActivateNextWindow(); |
| 213 EXPECT_EQ(&child_third, focus_observer.old_active_window()); |
| 209 EXPECT_EQ(&child_first, focus_observer.new_active_window()); | 214 EXPECT_EQ(&child_first, focus_observer.new_active_window()); |
| 210 focus_observer.ClearAll(); | 215 focus_observer.ClearAll(); |
| 211 | 216 |
| 212 focus_controller.ActivateNextWindow(); | 217 focus_controller.ActivateNextWindow(); |
| 213 EXPECT_EQ(&child_first, focus_observer.old_active_window()); | 218 EXPECT_EQ(&child_first, focus_observer.old_active_window()); |
| 214 EXPECT_EQ(&child_third, focus_observer.new_active_window()); | |
| 215 focus_observer.ClearAll(); | |
| 216 | |
| 217 focus_controller.ActivateNextWindow(); | |
| 218 EXPECT_EQ(&child_third, focus_observer.old_active_window()); | |
| 219 EXPECT_EQ(&parent, focus_observer.new_active_window()); | 219 EXPECT_EQ(&parent, focus_observer.new_active_window()); |
| 220 focus_observer.ClearAll(); | 220 focus_observer.ClearAll(); |
| 221 | 221 |
| 222 focus_controller.ActivateNextWindow(); | 222 focus_controller.ActivateNextWindow(); |
| 223 EXPECT_EQ(&parent, focus_observer.old_active_window()); | 223 EXPECT_EQ(&parent, focus_observer.old_active_window()); |
| 224 EXPECT_EQ(&child_first, focus_observer.new_active_window()); | 224 EXPECT_EQ(&child_third, focus_observer.new_active_window()); |
| 225 focus_observer.ClearAll(); | 225 focus_observer.ClearAll(); |
| 226 | 226 |
| 227 // Once |child_second| is made visible, activation should go from | 227 // Once |child_second| is made visible, activation should go from |
| 228 // |child_first| to |child_second|. | 228 // |child_third| to |child_second|. |
| 229 child_second.SetVisible(true); | 229 child_second.SetVisible(true); |
| 230 focus_controller.ActivateNextWindow(); | 230 focus_controller.ActivateNextWindow(); |
| 231 EXPECT_EQ(&child_first, focus_observer.old_active_window()); | 231 EXPECT_EQ(&child_third, focus_observer.old_active_window()); |
| 232 EXPECT_EQ(&child_second, focus_observer.new_active_window()); | 232 EXPECT_EQ(&child_second, focus_observer.new_active_window()); |
| 233 } | 233 } |
| 234 | 234 |
| 235 } // namespace ws | 235 } // namespace ws |
| 236 } // namespace mus | 236 } // namespace mus |
| OLD | NEW |