| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <stdint.h> | 5 #include <stdint.h> |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 55 scoped_refptr<SurfacesState>())); | 55 scoped_refptr<SurfacesState>())); |
| 56 window_server_delegate_.set_window_server(window_server_.get()); | 56 window_server_delegate_.set_window_server(window_server_.get()); |
| 57 } | 57 } |
| 58 | 58 |
| 59 protected: | 59 protected: |
| 60 int32_t cursor_id_; | 60 int32_t cursor_id_; |
| 61 TestPlatformDisplayFactory platform_display_factory_; | 61 TestPlatformDisplayFactory platform_display_factory_; |
| 62 TestWindowServerDelegate window_server_delegate_; | 62 TestWindowServerDelegate window_server_delegate_; |
| 63 std::unique_ptr<WindowServer> window_server_; | 63 std::unique_ptr<WindowServer> window_server_; |
| 64 base::MessageLoop message_loop_; | 64 base::MessageLoop message_loop_; |
| 65 TestWindowManagerFactory test_window_manager_factory_; | |
| 66 | 65 |
| 67 private: | 66 private: |
| 68 DISALLOW_COPY_AND_ASSIGN(DisplayTest); | 67 DISALLOW_COPY_AND_ASSIGN(DisplayTest); |
| 69 }; | 68 }; |
| 70 | 69 |
| 71 TEST_F(DisplayTest, CallsCreateDefaultDisplays) { | 70 TEST_F(DisplayTest, CallsCreateDefaultDisplays) { |
| 72 const int kNumHostsToCreate = 2; | 71 const int kNumHostsToCreate = 2; |
| 73 window_server_delegate_.set_num_displays_to_create(kNumHostsToCreate); | 72 window_server_delegate_.set_num_displays_to_create(kNumHostsToCreate); |
| 74 | 73 |
| 75 const UserId kTestId1 = "2"; | 74 const UserId kTestId1 = "2"; |
| 76 const UserId kTestId2 = "21"; | 75 const UserId kTestId2 = "21"; |
| 77 DisplayManager* display_manager = window_server_->display_manager(); | 76 DisplayManager* display_manager = window_server_->display_manager(); |
| 78 WindowManagerFactoryRegistryTestApi( | 77 WindowManagerWindowTreeFactorySetTestApi( |
| 79 window_server_->window_manager_factory_registry()) | 78 window_server_->window_manager_window_tree_factory_set()) |
| 80 .AddService(kTestId1, &test_window_manager_factory_); | 79 .Add(kTestId1); |
| 81 // The first register should trigger creation of the default | 80 // The first register should trigger creation of the default |
| 82 // Displays. There should be kNumHostsToCreate Displays. | 81 // Displays. There should be kNumHostsToCreate Displays. |
| 83 EXPECT_EQ(static_cast<size_t>(kNumHostsToCreate), | 82 EXPECT_EQ(static_cast<size_t>(kNumHostsToCreate), |
| 84 display_manager->displays().size()); | 83 display_manager->displays().size()); |
| 85 | 84 |
| 86 // Each host should have a WindowManagerState for kTestId1. | 85 // Each host should have a WindowManagerState for kTestId1. |
| 87 for (Display* display : display_manager->displays()) { | 86 for (Display* display : display_manager->displays()) { |
| 88 EXPECT_EQ(1u, display->num_window_manger_states()); | 87 EXPECT_EQ(1u, display->num_window_manger_states()); |
| 89 EXPECT_TRUE(display->GetWindowManagerStateForUser(kTestId1)); | 88 EXPECT_TRUE(display->GetWindowManagerStateForUser(kTestId1)); |
| 90 EXPECT_FALSE(display->GetWindowManagerStateForUser(kTestId2)); | 89 EXPECT_FALSE(display->GetWindowManagerStateForUser(kTestId2)); |
| 91 } | 90 } |
| 92 | 91 |
| 93 // Add another registry, should trigger creation of another wm. | 92 // Add another registry, should trigger creation of another wm. |
| 94 WindowManagerFactoryRegistryTestApi( | 93 WindowManagerWindowTreeFactorySetTestApi( |
| 95 window_server_->window_manager_factory_registry()) | 94 window_server_->window_manager_window_tree_factory_set()) |
| 96 .AddService(kTestId2, &test_window_manager_factory_); | 95 .Add(kTestId2); |
| 97 for (Display* display : display_manager->displays()) { | 96 for (Display* display : display_manager->displays()) { |
| 98 ASSERT_EQ(2u, display->num_window_manger_states()); | 97 ASSERT_EQ(2u, display->num_window_manger_states()); |
| 99 WindowManagerState* state1 = | 98 WindowManagerState* state1 = |
| 100 display->GetWindowManagerStateForUser(kTestId1); | 99 display->GetWindowManagerStateForUser(kTestId1); |
| 101 ASSERT_TRUE(state1); | 100 ASSERT_TRUE(state1); |
| 102 WindowManagerState* state2 = | 101 WindowManagerState* state2 = |
| 103 display->GetWindowManagerStateForUser(kTestId2); | 102 display->GetWindowManagerStateForUser(kTestId2); |
| 104 ASSERT_TRUE(state2); | 103 ASSERT_TRUE(state2); |
| 105 // Verify the two states have different roots. | 104 // Verify the two states have different roots. |
| 106 EXPECT_NE(state1, state2); | 105 EXPECT_NE(state1, state2); |
| 107 EXPECT_NE(state1->root(), state2->root()); | 106 EXPECT_NE(state1->root(), state2->root()); |
| 108 } | 107 } |
| 109 } | 108 } |
| 110 | 109 |
| 111 TEST_F(DisplayTest, Destruction) { | 110 TEST_F(DisplayTest, Destruction) { |
| 112 window_server_delegate_.set_num_displays_to_create(1); | 111 window_server_delegate_.set_num_displays_to_create(1); |
| 113 | 112 |
| 114 const UserId kTestId1 = "2"; | 113 const UserId kTestId1 = "2"; |
| 115 const UserId kTestId2 = "21"; | 114 const UserId kTestId2 = "21"; |
| 116 WindowManagerFactoryRegistryTestApi( | 115 WindowManagerWindowTreeFactorySetTestApi( |
| 117 window_server_->window_manager_factory_registry()) | 116 window_server_->window_manager_window_tree_factory_set()) |
| 118 .AddService(kTestId1, &test_window_manager_factory_); | 117 .Add(kTestId1); |
| 119 | 118 |
| 120 // Add another registry, should trigger creation of another wm. | 119 // Add another registry, should trigger creation of another wm. |
| 121 DisplayManager* display_manager = window_server_->display_manager(); | 120 DisplayManager* display_manager = window_server_->display_manager(); |
| 122 WindowManagerFactoryRegistryTestApi( | 121 WindowManagerWindowTreeFactorySetTestApi( |
| 123 window_server_->window_manager_factory_registry()) | 122 window_server_->window_manager_window_tree_factory_set()) |
| 124 .AddService(kTestId2, &test_window_manager_factory_); | 123 .Add(kTestId2); |
| 125 ASSERT_EQ(1u, display_manager->displays().size()); | 124 ASSERT_EQ(1u, display_manager->displays().size()); |
| 126 Display* display = *display_manager->displays().begin(); | 125 Display* display = *display_manager->displays().begin(); |
| 127 ASSERT_EQ(2u, display->num_window_manger_states()); | 126 ASSERT_EQ(2u, display->num_window_manger_states()); |
| 128 // There should be two trees, one for each windowmanager. | 127 // There should be two trees, one for each windowmanager. |
| 129 EXPECT_EQ(2u, window_server_->num_trees()); | 128 EXPECT_EQ(2u, window_server_->num_trees()); |
| 130 | 129 |
| 131 { | 130 { |
| 132 WindowManagerState* state = display->GetWindowManagerStateForUser(kTestId1); | 131 WindowManagerState* state = display->GetWindowManagerStateForUser(kTestId1); |
| 133 // Destroy the tree associated with |state|. Should result in deleting | 132 // Destroy the tree associated with |state|. Should result in deleting |
| 134 // |state|. | 133 // |state|. |
| 135 window_server_->DestroyTree(state->tree()); | 134 window_server_->DestroyTree(state->tree()); |
| 136 ASSERT_EQ(1u, display->num_window_manger_states()); | 135 ASSERT_EQ(1u, display->num_window_manger_states()); |
| 137 EXPECT_FALSE(display->GetWindowManagerStateForUser(kTestId1)); | 136 EXPECT_FALSE(display->GetWindowManagerStateForUser(kTestId1)); |
| 138 EXPECT_EQ(1u, display_manager->displays().size()); | 137 EXPECT_EQ(1u, display_manager->displays().size()); |
| 139 EXPECT_EQ(1u, window_server_->num_trees()); | 138 EXPECT_EQ(1u, window_server_->num_trees()); |
| 140 } | 139 } |
| 141 | 140 |
| 142 EXPECT_FALSE(window_server_delegate_.got_on_no_more_displays()); | 141 EXPECT_FALSE(window_server_delegate_.got_on_no_more_displays()); |
| 143 // Destroy the Display, which should shutdown the trees. | 142 // Destroy the Display, which should shutdown the trees. |
| 144 window_server_->display_manager()->DestroyDisplay(display); | 143 window_server_->display_manager()->DestroyDisplay(display); |
| 145 EXPECT_EQ(0u, window_server_->num_trees()); | 144 EXPECT_EQ(0u, window_server_->num_trees()); |
| 146 EXPECT_TRUE(window_server_delegate_.got_on_no_more_displays()); | 145 EXPECT_TRUE(window_server_delegate_.got_on_no_more_displays()); |
| 147 } | 146 } |
| 148 | 147 |
| 149 TEST_F(DisplayTest, EventStateResetOnUserSwitch) { | 148 TEST_F(DisplayTest, EventStateResetOnUserSwitch) { |
| 150 window_server_delegate_.set_num_displays_to_create(1); | 149 window_server_delegate_.set_num_displays_to_create(1); |
| 151 | 150 |
| 152 const UserId kTestId1 = "20"; | 151 const UserId kTestId1 = "20"; |
| 153 const UserId kTestId2 = "201"; | 152 const UserId kTestId2 = "201"; |
| 154 WindowManagerFactoryRegistryTestApi( | 153 WindowManagerWindowTreeFactorySetTestApi( |
| 155 window_server_->window_manager_factory_registry()) | 154 window_server_->window_manager_window_tree_factory_set()) |
| 156 .AddService(kTestId1, &test_window_manager_factory_); | 155 .Add(kTestId1); |
| 157 WindowManagerFactoryRegistryTestApi( | 156 WindowManagerWindowTreeFactorySetTestApi( |
| 158 window_server_->window_manager_factory_registry()) | 157 window_server_->window_manager_window_tree_factory_set()) |
| 159 .AddService(kTestId2, &test_window_manager_factory_); | 158 .Add(kTestId2); |
| 160 | 159 |
| 161 window_server_->user_id_tracker()->SetActiveUserId(kTestId1); | 160 window_server_->user_id_tracker()->SetActiveUserId(kTestId1); |
| 162 | 161 |
| 163 DisplayManager* display_manager = window_server_->display_manager(); | 162 DisplayManager* display_manager = window_server_->display_manager(); |
| 164 ASSERT_EQ(1u, display_manager->displays().size()); | 163 ASSERT_EQ(1u, display_manager->displays().size()); |
| 165 Display* display = *display_manager->displays().begin(); | 164 Display* display = *display_manager->displays().begin(); |
| 166 WindowManagerState* active_wms = display->GetActiveWindowManagerState(); | 165 WindowManagerState* active_wms = display->GetActiveWindowManagerState(); |
| 167 ASSERT_TRUE(active_wms); | 166 ASSERT_TRUE(active_wms); |
| 168 EXPECT_EQ(kTestId1, active_wms->user_id()); | 167 EXPECT_EQ(kTestId1, active_wms->user_id()); |
| 169 | 168 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 189 active_wms->event_dispatcher()->mouse_pointer_last_location()); | 188 active_wms->event_dispatcher()->mouse_pointer_last_location()); |
| 190 EXPECT_FALSE(EventDispatcherTestApi(active_wms->event_dispatcher()) | 189 EXPECT_FALSE(EventDispatcherTestApi(active_wms->event_dispatcher()) |
| 191 .AreAnyPointersDown()); | 190 .AreAnyPointersDown()); |
| 192 } | 191 } |
| 193 | 192 |
| 194 // Verifies capture fails when wm is inactive and succeeds when wm is active. | 193 // Verifies capture fails when wm is inactive and succeeds when wm is active. |
| 195 TEST_F(DisplayTest, SetCaptureFromWindowManager) { | 194 TEST_F(DisplayTest, SetCaptureFromWindowManager) { |
| 196 window_server_delegate_.set_num_displays_to_create(1); | 195 window_server_delegate_.set_num_displays_to_create(1); |
| 197 const UserId kTestId1 = "20"; | 196 const UserId kTestId1 = "20"; |
| 198 const UserId kTestId2 = "201"; | 197 const UserId kTestId2 = "201"; |
| 199 WindowManagerFactoryRegistryTestApi( | 198 WindowManagerWindowTreeFactorySetTestApi( |
| 200 window_server_->window_manager_factory_registry()) | 199 window_server_->window_manager_window_tree_factory_set()) |
| 201 .AddService(kTestId1, &test_window_manager_factory_); | 200 .Add(kTestId1); |
| 202 WindowManagerFactoryRegistryTestApi( | 201 WindowManagerWindowTreeFactorySetTestApi( |
| 203 window_server_->window_manager_factory_registry()) | 202 window_server_->window_manager_window_tree_factory_set()) |
| 204 .AddService(kTestId2, &test_window_manager_factory_); | 203 .Add(kTestId2); |
| 205 window_server_->user_id_tracker()->SetActiveUserId(kTestId1); | 204 window_server_->user_id_tracker()->SetActiveUserId(kTestId1); |
| 206 DisplayManager* display_manager = window_server_->display_manager(); | 205 DisplayManager* display_manager = window_server_->display_manager(); |
| 207 ASSERT_EQ(1u, display_manager->displays().size()); | 206 ASSERT_EQ(1u, display_manager->displays().size()); |
| 208 Display* display = *display_manager->displays().begin(); | 207 Display* display = *display_manager->displays().begin(); |
| 209 WindowManagerState* wms_for_id2 = | 208 WindowManagerState* wms_for_id2 = |
| 210 display->GetWindowManagerStateForUser(kTestId2); | 209 display->GetWindowManagerStateForUser(kTestId2); |
| 211 ASSERT_TRUE(wms_for_id2); | 210 ASSERT_TRUE(wms_for_id2); |
| 212 EXPECT_FALSE(wms_for_id2->IsActive()); | 211 EXPECT_FALSE(wms_for_id2->IsActive()); |
| 213 | 212 |
| 214 // Create a child of the root that we can set capture on. | 213 // Create a child of the root that we can set capture on. |
| 215 WindowTree* tree = wms_for_id2->tree(); | 214 WindowTree* tree = wms_for_id2->tree(); |
| 216 ClientWindowId child_window_id; | 215 ClientWindowId child_window_id; |
| 217 ASSERT_TRUE(NewWindowInTree(tree, &child_window_id)); | 216 ASSERT_TRUE(NewWindowInTree(tree, &child_window_id)); |
| 218 | 217 |
| 219 WindowTreeTestApi(tree).EnableCapture(); | 218 WindowTreeTestApi(tree).EnableCapture(); |
| 220 | 219 |
| 221 // SetCapture() should fail for user id2 as it is inactive. | 220 // SetCapture() should fail for user id2 as it is inactive. |
| 222 EXPECT_FALSE(tree->SetCapture(child_window_id)); | 221 EXPECT_FALSE(tree->SetCapture(child_window_id)); |
| 223 | 222 |
| 224 // Make the second user active and verify capture works. | 223 // Make the second user active and verify capture works. |
| 225 window_server_->user_id_tracker()->SetActiveUserId(kTestId2); | 224 window_server_->user_id_tracker()->SetActiveUserId(kTestId2); |
| 226 EXPECT_TRUE(wms_for_id2->IsActive()); | 225 EXPECT_TRUE(wms_for_id2->IsActive()); |
| 227 EXPECT_TRUE(tree->SetCapture(child_window_id)); | 226 EXPECT_TRUE(tree->SetCapture(child_window_id)); |
| 228 } | 227 } |
| 229 | 228 |
| 230 TEST_F(DisplayTest, FocusFailsForInactiveUser) { | 229 TEST_F(DisplayTest, FocusFailsForInactiveUser) { |
| 231 window_server_delegate_.set_num_displays_to_create(1); | 230 window_server_delegate_.set_num_displays_to_create(1); |
| 232 const UserId kTestId1 = "20"; | 231 const UserId kTestId1 = "20"; |
| 233 const UserId kTestId2 = "201"; | 232 const UserId kTestId2 = "201"; |
| 234 WindowManagerFactoryRegistryTestApi( | 233 WindowManagerWindowTreeFactorySetTestApi( |
| 235 window_server_->window_manager_factory_registry()) | 234 window_server_->window_manager_window_tree_factory_set()) |
| 236 .AddService(kTestId1, &test_window_manager_factory_); | 235 .Add(kTestId1); |
| 237 TestWindowTreeClient* window_tree_client1 = | 236 TestWindowTreeClient* window_tree_client1 = |
| 238 window_server_delegate_.last_client(); | 237 window_server_delegate_.last_client(); |
| 239 ASSERT_TRUE(window_tree_client1); | 238 ASSERT_TRUE(window_tree_client1); |
| 240 WindowManagerFactoryRegistryTestApi( | 239 WindowManagerWindowTreeFactorySetTestApi( |
| 241 window_server_->window_manager_factory_registry()) | 240 window_server_->window_manager_window_tree_factory_set()) |
| 242 .AddService(kTestId2, &test_window_manager_factory_); | 241 .Add(kTestId2); |
| 243 window_server_->user_id_tracker()->SetActiveUserId(kTestId1); | 242 window_server_->user_id_tracker()->SetActiveUserId(kTestId1); |
| 244 DisplayManager* display_manager = window_server_->display_manager(); | 243 DisplayManager* display_manager = window_server_->display_manager(); |
| 245 ASSERT_EQ(1u, display_manager->displays().size()); | 244 ASSERT_EQ(1u, display_manager->displays().size()); |
| 246 Display* display = *display_manager->displays().begin(); | 245 Display* display = *display_manager->displays().begin(); |
| 247 WindowManagerState* wms_for_id2 = | 246 WindowManagerState* wms_for_id2 = |
| 248 display->GetWindowManagerStateForUser(kTestId2); | 247 display->GetWindowManagerStateForUser(kTestId2); |
| 249 wms_for_id2->tree()->AddActivationParent( | 248 wms_for_id2->tree()->AddActivationParent( |
| 250 ClientWindowIdForFirstRoot(wms_for_id2->tree())); | 249 ClientWindowIdForFirstRoot(wms_for_id2->tree())); |
| 251 ASSERT_TRUE(wms_for_id2); | 250 ASSERT_TRUE(wms_for_id2); |
| 252 EXPECT_FALSE(wms_for_id2->IsActive()); | 251 EXPECT_FALSE(wms_for_id2->IsActive()); |
| 253 ClientWindowId child2_id; | 252 ClientWindowId child2_id; |
| 254 NewWindowInTree(wms_for_id2->tree(), &child2_id); | 253 NewWindowInTree(wms_for_id2->tree(), &child2_id); |
| 255 | 254 |
| 256 // Focus should fail for windows in inactive window managers. | 255 // Focus should fail for windows in inactive window managers. |
| 257 EXPECT_FALSE(wms_for_id2->tree()->SetFocus(child2_id)); | 256 EXPECT_FALSE(wms_for_id2->tree()->SetFocus(child2_id)); |
| 258 | 257 |
| 259 // Focus should succeed for the active window manager. | 258 // Focus should succeed for the active window manager. |
| 260 WindowManagerState* wms_for_id1 = | 259 WindowManagerState* wms_for_id1 = |
| 261 display->GetWindowManagerStateForUser(kTestId1); | 260 display->GetWindowManagerStateForUser(kTestId1); |
| 262 ASSERT_TRUE(wms_for_id1); | 261 ASSERT_TRUE(wms_for_id1); |
| 263 wms_for_id1->tree()->AddActivationParent( | 262 wms_for_id1->tree()->AddActivationParent( |
| 264 ClientWindowIdForFirstRoot(wms_for_id1->tree())); | 263 ClientWindowIdForFirstRoot(wms_for_id1->tree())); |
| 265 ClientWindowId child1_id; | 264 ClientWindowId child1_id; |
| 266 NewWindowInTree(wms_for_id1->tree(), &child1_id); | 265 NewWindowInTree(wms_for_id1->tree(), &child1_id); |
| 267 EXPECT_TRUE(wms_for_id1->IsActive()); | 266 EXPECT_TRUE(wms_for_id1->IsActive()); |
| 268 EXPECT_TRUE(wms_for_id1->tree()->SetFocus(child1_id)); | 267 EXPECT_TRUE(wms_for_id1->tree()->SetFocus(child1_id)); |
| 269 } | 268 } |
| 270 | 269 |
| 271 // Verifies clients are notified of focus changes in different displays. | 270 // Verifies a single tree is used for multiple displays. |
| 272 TEST_F(DisplayTest, CrossDisplayFocus) { | 271 TEST_F(DisplayTest, MultipleDisplays) { |
| 273 window_server_delegate_.set_num_displays_to_create(2); | 272 window_server_delegate_.set_num_displays_to_create(2); |
| 274 const UserId kTestId1 = "20"; | 273 const UserId kTestId1 = "20"; |
| 275 WindowManagerFactoryRegistryTestApi( | 274 WindowManagerWindowTreeFactorySetTestApi( |
| 276 window_server_->window_manager_factory_registry()) | 275 window_server_->window_manager_window_tree_factory_set()) |
| 277 .AddService(kTestId1, &test_window_manager_factory_); | 276 .Add(kTestId1); |
| 278 window_server_->user_id_tracker()->SetActiveUserId(kTestId1); | 277 window_server_->user_id_tracker()->SetActiveUserId(kTestId1); |
| 279 ASSERT_EQ(2u, window_server_delegate_.bindings()->size()); | 278 ASSERT_EQ(1u, window_server_delegate_.bindings()->size()); |
| 280 TestWindowTreeBinding* window_tree_binding1 = | 279 TestWindowTreeBinding* window_tree_binding = |
| 281 (*window_server_delegate_.bindings())[0]; | 280 (*window_server_delegate_.bindings())[0]; |
| 282 Display* display1 = window_tree_binding1->tree()->GetDisplay( | 281 WindowTree* tree = window_tree_binding->tree(); |
| 283 FirstRoot(window_tree_binding1->tree())); | 282 ASSERT_EQ(2u, tree->roots().size()); |
| 283 std::set<const ServerWindow*> roots = tree->roots(); |
| 284 auto it = roots.begin(); |
| 285 ServerWindow* root1 = tree->GetWindow((*it)->id()); |
| 286 ++it; |
| 287 ServerWindow* root2 = tree->GetWindow((*it)->id()); |
| 288 ASSERT_NE(root1, root2); |
| 289 Display* display1 = tree->GetDisplay(root1); |
| 284 WindowManagerState* display1_wms = | 290 WindowManagerState* display1_wms = |
| 285 display1->GetWindowManagerStateForUser(kTestId1); | 291 display1->GetWindowManagerStateForUser(kTestId1); |
| 286 TestWindowTreeBinding* window_tree_binding2 = | 292 Display* display2 = tree->GetDisplay(root2); |
| 287 (*window_server_delegate_.bindings())[1]; | |
| 288 Display* display2 = window_tree_binding2->tree()->GetDisplay( | |
| 289 FirstRoot(window_tree_binding2->tree())); | |
| 290 WindowManagerState* display2_wms = | 293 WindowManagerState* display2_wms = |
| 291 display2->GetWindowManagerStateForUser(kTestId1); | 294 display2->GetWindowManagerStateForUser(kTestId1); |
| 292 | 295 EXPECT_EQ(display1_wms->tree(), display2_wms->tree()); |
| 293 // Create children in both displays. | |
| 294 ClientWindowId child1_id; | |
| 295 ServerWindow* child1 = NewWindowInTree(display1_wms->tree(), &child1_id); | |
| 296 ASSERT_TRUE(child1); | |
| 297 child1->set_can_focus(true); | |
| 298 ClientWindowId child2_id; | |
| 299 ServerWindow* child2 = NewWindowInTree(display2_wms->tree(), &child2_id); | |
| 300 ASSERT_TRUE(child2); | |
| 301 child2->set_can_focus(true); | |
| 302 | |
| 303 display1->AddActivationParent(FirstRoot(display1_wms->tree())); | |
| 304 display2->AddActivationParent(FirstRoot(display2_wms->tree())); | |
| 305 FirstRoot(display1_wms->tree())->set_can_focus(true); | |
| 306 FirstRoot(display2_wms->tree())->set_can_focus(true); | |
| 307 EXPECT_TRUE(display1_wms->tree()->SetFocus(child1_id)); | |
| 308 EXPECT_EQ(child1, display1->GetFocusedWindow()); | |
| 309 EXPECT_FALSE(display2->GetFocusedWindow()); | |
| 310 window_tree_binding1->client()->tracker()->changes()->clear(); | |
| 311 window_tree_binding2->client()->tracker()->changes()->clear(); | |
| 312 // Moving focus to display2 should result in notifying display1. | |
| 313 EXPECT_TRUE(display2_wms->tree()->SetFocus(child2_id)); | |
| 314 EXPECT_EQ("Focused id=null", | |
| 315 SingleChangeToDescription( | |
| 316 *window_tree_binding1->client()->tracker()->changes())); | |
| 317 EXPECT_EQ("", SingleChangeToDescription( | |
| 318 *window_tree_binding2->client()->tracker()->changes())); | |
| 319 EXPECT_TRUE(window_tree_binding2->client()->tracker()->changes()->empty()); | |
| 320 window_tree_binding1->client()->tracker()->changes()->clear(); | |
| 321 window_tree_binding2->client()->tracker()->changes()->clear(); | |
| 322 EXPECT_FALSE(display1->GetFocusedWindow()); | |
| 323 EXPECT_EQ(child2, display2->GetFocusedWindow()); | |
| 324 } | 296 } |
| 325 | 297 |
| 326 } // namespace test | 298 } // namespace test |
| 327 } // namespace ws | 299 } // namespace ws |
| 328 } // namespace mus | 300 } // namespace mus |
| OLD | NEW |