| 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 "ui/aura/mus/window_tree_client.h" | 5 #include "ui/aura/mus/window_tree_client.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <string> | 9 #include <string> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 WindowMus* window, | 433 WindowMus* window, |
| 434 const ui::mojom::WindowData& window_data) { | 434 const ui::mojom::WindowData& window_data) { |
| 435 for (auto& pair : window_data.properties) | 435 for (auto& pair : window_data.properties) |
| 436 window->SetPropertyFromServer(pair.first, &pair.second); | 436 window->SetPropertyFromServer(pair.first, &pair.second); |
| 437 } | 437 } |
| 438 | 438 |
| 439 std::unique_ptr<WindowTreeHostMus> WindowTreeClient::CreateWindowTreeHost( | 439 std::unique_ptr<WindowTreeHostMus> WindowTreeClient::CreateWindowTreeHost( |
| 440 WindowMusType window_mus_type, | 440 WindowMusType window_mus_type, |
| 441 const ui::mojom::WindowData& window_data, | 441 const ui::mojom::WindowData& window_data, |
| 442 int64_t display_id, | 442 int64_t display_id, |
| 443 const cc::FrameSinkId& frame_sink_id) { | 443 const cc::FrameSinkId& frame_sink_id, |
| 444 const base::Optional<cc::LocalSurfaceId>& local_surface_id) { |
| 444 std::unique_ptr<WindowPortMus> window_port = | 445 std::unique_ptr<WindowPortMus> window_port = |
| 445 CreateWindowPortMus(window_data, window_mus_type); | 446 CreateWindowPortMus(window_data, window_mus_type); |
| 446 roots_.insert(window_port.get()); | 447 roots_.insert(window_port.get()); |
| 447 std::unique_ptr<WindowTreeHostMus> window_tree_host = | 448 std::unique_ptr<WindowTreeHostMus> window_tree_host = |
| 448 base::MakeUnique<WindowTreeHostMus>(std::move(window_port), this, | 449 base::MakeUnique<WindowTreeHostMus>(std::move(window_port), this, |
| 449 display_id, frame_sink_id); | 450 display_id, frame_sink_id); |
| 450 window_tree_host->InitHost(); | 451 window_tree_host->InitHost(); |
| 451 SetLocalPropertiesFromServerProperties( | 452 SetLocalPropertiesFromServerProperties( |
| 452 WindowMus::Get(window_tree_host->window()), window_data); | 453 WindowMus::Get(window_tree_host->window()), window_data); |
| 453 if (window_data.visible) { | 454 if (window_data.visible) { |
| 454 SetWindowVisibleFromServer(WindowMus::Get(window_tree_host->window()), | 455 SetWindowVisibleFromServer(WindowMus::Get(window_tree_host->window()), |
| 455 true); | 456 true); |
| 456 } | 457 } |
| 457 SetWindowBoundsFromServer(WindowMus::Get(window_tree_host->window()), | 458 WindowMus* window = WindowMus::Get(window_tree_host->window()); |
| 458 window_data.bounds, base::nullopt); | 459 |
| 460 SetWindowBoundsFromServer(window, window_data.bounds, local_surface_id); |
| 459 return window_tree_host; | 461 return window_tree_host; |
| 460 } | 462 } |
| 461 | 463 |
| 462 WindowMus* WindowTreeClient::NewWindowFromWindowData( | 464 WindowMus* WindowTreeClient::NewWindowFromWindowData( |
| 463 WindowMus* parent, | 465 WindowMus* parent, |
| 464 const ui::mojom::WindowData& window_data) { | 466 const ui::mojom::WindowData& window_data) { |
| 465 // This function is only called for windows coming from other clients. | 467 // This function is only called for windows coming from other clients. |
| 466 std::unique_ptr<WindowPortMus> window_port_mus( | 468 std::unique_ptr<WindowPortMus> window_port_mus( |
| 467 CreateWindowPortMus(window_data, WindowMusType::OTHER)); | 469 CreateWindowPortMus(window_data, WindowMusType::OTHER)); |
| 468 WindowPortMus* window_port_mus_ptr = window_port_mus.get(); | 470 WindowPortMus* window_port_mus_ptr = window_port_mus.get(); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 517 return false; | 519 return false; |
| 518 | 520 |
| 519 const uint32_t change_id = | 521 const uint32_t change_id = |
| 520 ScheduleInFlightChange(base::MakeUnique<InFlightSetModalTypeChange>( | 522 ScheduleInFlightChange(base::MakeUnique<InFlightSetModalTypeChange>( |
| 521 window, static_cast<ui::ModalType>(old_value))); | 523 window, static_cast<ui::ModalType>(old_value))); |
| 522 tree_->SetModalType(change_id, window->server_id(), | 524 tree_->SetModalType(change_id, window->server_id(), |
| 523 window->GetWindow()->GetProperty(client::kModalKey)); | 525 window->GetWindow()->GetProperty(client::kModalKey)); |
| 524 return true; | 526 return true; |
| 525 } | 527 } |
| 526 | 528 |
| 527 void WindowTreeClient::OnEmbedImpl(ui::mojom::WindowTree* window_tree, | 529 void WindowTreeClient::OnEmbedImpl( |
| 528 ClientSpecificId client_id, | 530 ui::mojom::WindowTree* window_tree, |
| 529 ui::mojom::WindowDataPtr root_data, | 531 ClientSpecificId client_id, |
| 530 int64_t display_id, | 532 ui::mojom::WindowDataPtr root_data, |
| 531 Id focused_window_id, | 533 int64_t display_id, |
| 532 bool drawn, | 534 Id focused_window_id, |
| 533 const cc::FrameSinkId& frame_sink_id) { | 535 bool drawn, |
| 536 const cc::FrameSinkId& frame_sink_id, |
| 537 const base::Optional<cc::LocalSurfaceId>& local_surface_id) { |
| 534 // WARNING: this is only called if WindowTreeClient was created as the | 538 // WARNING: this is only called if WindowTreeClient was created as the |
| 535 // result of an embedding. | 539 // result of an embedding. |
| 536 client_id_ = client_id; | 540 client_id_ = client_id; |
| 537 WindowTreeConnectionEstablished(window_tree); | 541 WindowTreeConnectionEstablished(window_tree); |
| 538 | 542 |
| 539 DCHECK(roots_.empty()); | 543 DCHECK(roots_.empty()); |
| 540 std::unique_ptr<WindowTreeHostMus> window_tree_host = CreateWindowTreeHost( | 544 std::unique_ptr<WindowTreeHostMus> window_tree_host = |
| 541 WindowMusType::EMBED, *root_data, display_id, frame_sink_id); | 545 CreateWindowTreeHost(WindowMusType::EMBED, *root_data, display_id, |
| 546 frame_sink_id, local_surface_id); |
| 542 | 547 |
| 543 focus_synchronizer_->SetFocusFromServer( | 548 focus_synchronizer_->SetFocusFromServer( |
| 544 GetWindowByServerId(focused_window_id)); | 549 GetWindowByServerId(focused_window_id)); |
| 545 | 550 |
| 546 delegate_->OnEmbed(std::move(window_tree_host)); | 551 delegate_->OnEmbed(std::move(window_tree_host)); |
| 547 } | 552 } |
| 548 | 553 |
| 549 WindowTreeHostMus* WindowTreeClient::WmNewDisplayAddedImpl( | 554 WindowTreeHostMus* WindowTreeClient::WmNewDisplayAddedImpl( |
| 550 const display::Display& display, | 555 const display::Display& display, |
| 551 ui::mojom::WindowDataPtr root_data, | 556 ui::mojom::WindowDataPtr root_data, |
| 552 bool parent_drawn, | 557 bool parent_drawn, |
| 553 const cc::FrameSinkId& frame_sink_id) { | 558 const cc::FrameSinkId& frame_sink_id, |
| 559 const base::Optional<cc::LocalSurfaceId>& local_surface_id) { |
| 554 DCHECK(window_manager_delegate_); | 560 DCHECK(window_manager_delegate_); |
| 555 | 561 |
| 556 got_initial_displays_ = true; | 562 got_initial_displays_ = true; |
| 557 | 563 |
| 558 window_manager_delegate_->OnWmWillCreateDisplay(display); | 564 window_manager_delegate_->OnWmWillCreateDisplay(display); |
| 559 | 565 |
| 560 std::unique_ptr<WindowTreeHostMus> window_tree_host = CreateWindowTreeHost( | 566 std::unique_ptr<WindowTreeHostMus> window_tree_host = |
| 561 WindowMusType::DISPLAY, *root_data, display.id(), frame_sink_id); | 567 CreateWindowTreeHost(WindowMusType::DISPLAY, *root_data, display.id(), |
| 568 frame_sink_id, local_surface_id); |
| 562 | 569 |
| 563 WindowTreeHostMus* window_tree_host_ptr = window_tree_host.get(); | 570 WindowTreeHostMus* window_tree_host_ptr = window_tree_host.get(); |
| 564 window_manager_delegate_->OnWmNewDisplay(std::move(window_tree_host), | 571 window_manager_delegate_->OnWmNewDisplay(std::move(window_tree_host), |
| 565 display); | 572 display); |
| 566 return window_tree_host_ptr; | 573 return window_tree_host_ptr; |
| 567 } | 574 } |
| 568 | 575 |
| 569 std::unique_ptr<EventResultCallback> | 576 std::unique_ptr<EventResultCallback> |
| 570 WindowTreeClient::CreateEventResultCallback(int32_t event_id) { | 577 WindowTreeClient::CreateEventResultCallback(int32_t event_id) { |
| 571 return base::MakeUnique<EventResultCallback>( | 578 return base::MakeUnique<EventResultCallback>( |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 tree_->SetCanAcceptDrops(window->server_id(), can_accept_drops); | 874 tree_->SetCanAcceptDrops(window->server_id(), can_accept_drops); |
| 868 } | 875 } |
| 869 | 876 |
| 870 void WindowTreeClient::SetEventTargetingPolicy( | 877 void WindowTreeClient::SetEventTargetingPolicy( |
| 871 WindowMus* window, | 878 WindowMus* window, |
| 872 ui::mojom::EventTargetingPolicy policy) { | 879 ui::mojom::EventTargetingPolicy policy) { |
| 873 DCHECK(tree_); | 880 DCHECK(tree_); |
| 874 tree_->SetEventTargetingPolicy(window->server_id(), policy); | 881 tree_->SetEventTargetingPolicy(window->server_id(), policy); |
| 875 } | 882 } |
| 876 | 883 |
| 877 void WindowTreeClient::OnEmbed(ClientSpecificId client_id, | 884 void WindowTreeClient::OnEmbed( |
| 878 ui::mojom::WindowDataPtr root_data, | 885 ClientSpecificId client_id, |
| 879 ui::mojom::WindowTreePtr tree, | 886 ui::mojom::WindowDataPtr root_data, |
| 880 int64_t display_id, | 887 ui::mojom::WindowTreePtr tree, |
| 881 Id focused_window_id, | 888 int64_t display_id, |
| 882 bool drawn, | 889 Id focused_window_id, |
| 883 const cc::FrameSinkId& frame_sink_id) { | 890 bool drawn, |
| 891 const cc::FrameSinkId& frame_sink_id, |
| 892 const base::Optional<cc::LocalSurfaceId>& local_surface_id) { |
| 884 DCHECK(!tree_ptr_); | 893 DCHECK(!tree_ptr_); |
| 885 tree_ptr_ = std::move(tree); | 894 tree_ptr_ = std::move(tree); |
| 886 | 895 |
| 887 is_from_embed_ = true; | 896 is_from_embed_ = true; |
| 888 | 897 |
| 889 if (window_manager_delegate_) { | 898 if (window_manager_delegate_) { |
| 890 tree_ptr_->GetWindowManagerClient( | 899 tree_ptr_->GetWindowManagerClient( |
| 891 MakeRequest(&window_manager_internal_client_)); | 900 MakeRequest(&window_manager_internal_client_)); |
| 892 } | 901 } |
| 893 | 902 |
| 894 OnEmbedImpl(tree_ptr_.get(), client_id, std::move(root_data), display_id, | 903 OnEmbedImpl(tree_ptr_.get(), client_id, std::move(root_data), display_id, |
| 895 focused_window_id, drawn, frame_sink_id); | 904 focused_window_id, drawn, frame_sink_id, local_surface_id); |
| 896 } | 905 } |
| 897 | 906 |
| 898 void WindowTreeClient::OnEmbeddedAppDisconnected(Id window_id) { | 907 void WindowTreeClient::OnEmbeddedAppDisconnected(Id window_id) { |
| 899 WindowMus* window = GetWindowByServerId(window_id); | 908 WindowMus* window = GetWindowByServerId(window_id); |
| 900 if (window) | 909 if (window) |
| 901 window->NotifyEmbeddedAppDisconnected(); | 910 window->NotifyEmbeddedAppDisconnected(); |
| 902 } | 911 } |
| 903 | 912 |
| 904 void WindowTreeClient::OnUnembed(Id window_id) { | 913 void WindowTreeClient::OnUnembed(Id window_id) { |
| 905 WindowMus* window = GetWindowByServerId(window_id); | 914 WindowMus* window = GetWindowByServerId(window_id); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 928 void WindowTreeClient::OnFrameSinkIdAllocated( | 937 void WindowTreeClient::OnFrameSinkIdAllocated( |
| 929 Id window_id, | 938 Id window_id, |
| 930 const cc::FrameSinkId& frame_sink_id) { | 939 const cc::FrameSinkId& frame_sink_id) { |
| 931 WindowMus* window = GetWindowByServerId(window_id); | 940 WindowMus* window = GetWindowByServerId(window_id); |
| 932 if (!window) | 941 if (!window) |
| 933 return; | 942 return; |
| 934 | 943 |
| 935 window->SetFrameSinkIdFromServer(frame_sink_id); | 944 window->SetFrameSinkIdFromServer(frame_sink_id); |
| 936 } | 945 } |
| 937 | 946 |
| 938 void WindowTreeClient::OnTopLevelCreated(uint32_t change_id, | 947 void WindowTreeClient::OnTopLevelCreated( |
| 939 ui::mojom::WindowDataPtr data, | 948 uint32_t change_id, |
| 940 int64_t display_id, | 949 ui::mojom::WindowDataPtr data, |
| 941 bool drawn, | 950 int64_t display_id, |
| 942 const cc::FrameSinkId& frame_sink_id) { | 951 bool drawn, |
| 952 const cc::FrameSinkId& frame_sink_id, |
| 953 const base::Optional<cc::LocalSurfaceId>& local_surface_id) { |
| 943 // The server ack'd the top level window we created and supplied the state | 954 // The server ack'd the top level window we created and supplied the state |
| 944 // of the window at the time the server created it. For properties we do not | 955 // of the window at the time the server created it. For properties we do not |
| 945 // have changes in flight for we can update them immediately. For properties | 956 // have changes in flight for we can update them immediately. For properties |
| 946 // with changes in flight we set the revert value from the server. | 957 // with changes in flight we set the revert value from the server. |
| 947 | 958 |
| 948 if (!in_flight_map_.count(change_id)) { | 959 if (!in_flight_map_.count(change_id)) { |
| 949 // The window may have been destroyed locally before the server could finish | 960 // The window may have been destroyed locally before the server could finish |
| 950 // creating the window, and before the server received the notification that | 961 // creating the window, and before the server received the notification that |
| 951 // the window has been destroyed. | 962 // the window has been destroyed. |
| 952 return; | 963 return; |
| (...skipping 15 matching lines...) Expand all Loading... |
| 968 InFlightChange* current_change = | 979 InFlightChange* current_change = |
| 969 GetOldestInFlightChangeMatching(visible_change); | 980 GetOldestInFlightChangeMatching(visible_change); |
| 970 if (current_change) | 981 if (current_change) |
| 971 current_change->SetRevertValueFrom(visible_change); | 982 current_change->SetRevertValueFrom(visible_change); |
| 972 else | 983 else |
| 973 SetWindowVisibleFromServer(window, true); | 984 SetWindowVisibleFromServer(window, true); |
| 974 } | 985 } |
| 975 | 986 |
| 976 const gfx::Rect bounds(data->bounds); | 987 const gfx::Rect bounds(data->bounds); |
| 977 { | 988 { |
| 978 // TODO(fsamuel): Propagate a cc::LocalSurfaceId through here. | 989 InFlightBoundsChange bounds_change(this, window, bounds, local_surface_id); |
| 979 InFlightBoundsChange bounds_change(this, window, bounds, base::nullopt); | |
| 980 InFlightChange* current_change = | 990 InFlightChange* current_change = |
| 981 GetOldestInFlightChangeMatching(bounds_change); | 991 GetOldestInFlightChangeMatching(bounds_change); |
| 982 if (current_change) | 992 if (current_change) |
| 983 current_change->SetRevertValueFrom(bounds_change); | 993 current_change->SetRevertValueFrom(bounds_change); |
| 984 else if (gfx::ConvertRectToPixel(ScaleFactorForDisplay(window->GetWindow()), | 994 else if (gfx::ConvertRectToPixel(ScaleFactorForDisplay(window->GetWindow()), |
| 985 window->GetWindow()->bounds()) != bounds) | 995 window->GetWindow()->bounds()) != bounds) { |
| 986 SetWindowBoundsFromServer(window, bounds, base::nullopt); | 996 SetWindowBoundsFromServer(window, bounds, local_surface_id); |
| 997 } |
| 987 } | 998 } |
| 988 | 999 |
| 989 // There is currently no API to bulk set properties, so we iterate over each | 1000 // There is currently no API to bulk set properties, so we iterate over each |
| 990 // property individually. | 1001 // property individually. |
| 991 for (const auto& pair : data->properties) { | 1002 for (const auto& pair : data->properties) { |
| 992 std::unique_ptr<std::vector<uint8_t>> revert_value( | 1003 std::unique_ptr<std::vector<uint8_t>> revert_value( |
| 993 base::MakeUnique<std::vector<uint8_t>>(pair.second)); | 1004 base::MakeUnique<std::vector<uint8_t>>(pair.second)); |
| 994 InFlightPropertyChange property_change(window, pair.first, | 1005 InFlightPropertyChange property_change(window, pair.first, |
| 995 std::move(revert_value)); | 1006 std::move(revert_value)); |
| 996 InFlightChange* current_change = | 1007 InFlightChange* current_change = |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1376 // TODO(sky): having to block here is not ideal. http://crbug.com/594852. | 1387 // TODO(sky): having to block here is not ideal. http://crbug.com/594852. |
| 1377 while (!got_initial_displays_ && valid_wait) | 1388 while (!got_initial_displays_ && valid_wait) |
| 1378 valid_wait = binding_.WaitForIncomingMethodCall(); | 1389 valid_wait = binding_.WaitForIncomingMethodCall(); |
| 1379 return valid_wait; | 1390 return valid_wait; |
| 1380 } | 1391 } |
| 1381 | 1392 |
| 1382 void WindowTreeClient::OnConnect(ClientSpecificId client_id) { | 1393 void WindowTreeClient::OnConnect(ClientSpecificId client_id) { |
| 1383 client_id_ = client_id; | 1394 client_id_ = client_id; |
| 1384 } | 1395 } |
| 1385 | 1396 |
| 1386 void WindowTreeClient::WmNewDisplayAdded(const display::Display& display, | 1397 void WindowTreeClient::WmNewDisplayAdded( |
| 1387 ui::mojom::WindowDataPtr root_data, | 1398 const display::Display& display, |
| 1388 bool parent_drawn, | 1399 ui::mojom::WindowDataPtr root_data, |
| 1389 const cc::FrameSinkId& frame_sink_id) { | 1400 bool parent_drawn, |
| 1401 const cc::FrameSinkId& frame_sink_id, |
| 1402 const base::Optional<cc::LocalSurfaceId>& local_surface_id) { |
| 1390 WmNewDisplayAddedImpl(display, std::move(root_data), parent_drawn, | 1403 WmNewDisplayAddedImpl(display, std::move(root_data), parent_drawn, |
| 1391 frame_sink_id); | 1404 frame_sink_id, local_surface_id); |
| 1392 } | 1405 } |
| 1393 | 1406 |
| 1394 void WindowTreeClient::WmDisplayRemoved(int64_t display_id) { | 1407 void WindowTreeClient::WmDisplayRemoved(int64_t display_id) { |
| 1395 DCHECK(window_manager_delegate_); | 1408 DCHECK(window_manager_delegate_); |
| 1396 for (WindowMus* root : roots_) { | 1409 for (WindowMus* root : roots_) { |
| 1397 DCHECK(root->GetWindow()->GetHost()); | 1410 DCHECK(root->GetWindow()->GetHost()); |
| 1398 WindowTreeHostMus* window_tree_host = | 1411 WindowTreeHostMus* window_tree_host = |
| 1399 static_cast<WindowTreeHostMus*>(root->GetWindow()->GetHost()); | 1412 static_cast<WindowTreeHostMus*>(root->GetWindow()->GetHost()); |
| 1400 if (window_tree_host->display_id() == display_id) { | 1413 if (window_tree_host->display_id() == display_id) { |
| 1401 window_manager_delegate_->OnWmDisplayRemoved(window_tree_host); | 1414 window_manager_delegate_->OnWmDisplayRemoved(window_tree_host); |
| (...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1919 return ScheduleInFlightChange(base::MakeUnique<InFlightCaptureChange>( | 1932 return ScheduleInFlightChange(base::MakeUnique<InFlightCaptureChange>( |
| 1920 this, capture_synchronizer_.get(), window)); | 1933 this, capture_synchronizer_.get(), window)); |
| 1921 } | 1934 } |
| 1922 | 1935 |
| 1923 uint32_t WindowTreeClient::CreateChangeIdForFocus(WindowMus* window) { | 1936 uint32_t WindowTreeClient::CreateChangeIdForFocus(WindowMus* window) { |
| 1924 return ScheduleInFlightChange(base::MakeUnique<InFlightFocusChange>( | 1937 return ScheduleInFlightChange(base::MakeUnique<InFlightFocusChange>( |
| 1925 this, focus_synchronizer_.get(), window)); | 1938 this, focus_synchronizer_.get(), window)); |
| 1926 } | 1939 } |
| 1927 | 1940 |
| 1928 } // namespace aura | 1941 } // namespace aura |
| OLD | NEW |