Commit 0deeaa65 authored by Jun Mukai's avatar Jun Mukai Committed by Commit Bot

Propagate updates of dipslay to WindowTreeHostMus

So far the display ID was recognizesed on creation of a toplevel,
but moving across displays isn't considered well.

This CL recognizes the timing of a window moving to another
display, and let WindowTreeHostMus updates its own display ID
properly.

BUG=866947
TEST=the new test case covers

Change-Id: I1e859f879a919674e90875a74434bb73e94edd73
Reviewed-on: https://chromium-review.googlesource.com/1234857
Commit-Queue: Jun Mukai <mukai@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#593013}
parent 4a3b740b
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "ash/test/ash_test_base.h" #include "ash/test/ash_test_base.h"
#include "ash/wm/toplevel_window_event_handler.h" #include "ash/wm/toplevel_window_event_handler.h"
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/test/bind_test_util.h" #include "base/test/bind_test_util.h"
#include "base/threading/thread_task_runner_handle.h" #include "base/threading/thread_task_runner_handle.h"
#include "services/ws/test_window_tree_client.h" #include "services/ws/test_window_tree_client.h"
...@@ -14,6 +15,8 @@ ...@@ -14,6 +15,8 @@
#include "ui/aura/client/drag_drop_delegate.h" #include "ui/aura/client/drag_drop_delegate.h"
#include "ui/aura/window.h" #include "ui/aura/window.h"
#include "ui/base/dragdrop/drag_drop_types.h" #include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
#include "ui/events/test/event_generator.h" #include "ui/events/test/event_generator.h"
namespace ash { namespace ash {
...@@ -300,4 +303,38 @@ TEST_F(WindowServiceDelegateImplTest, ObserveTopmostWindow) { ...@@ -300,4 +303,38 @@ TEST_F(WindowServiceDelegateImplTest, ObserveTopmostWindow) {
GetWindowTreeTestHelper()->window_tree()->StopObservingTopmostWindow(); GetWindowTreeTestHelper()->window_tree()->StopObservingTopmostWindow();
} }
TEST_F(WindowServiceDelegateImplTest, MoveAcrossDisplays) {
UpdateDisplay("600x400,600+0-400x300");
GetWindowTreeClientChanges()->clear();
display::Screen* screen = display::Screen::GetScreen();
display::Display display1 = screen->GetPrimaryDisplay();
display::Display display2;
for (const auto& iter : screen->GetAllDisplays()) {
if (iter.id() != display1.id()) {
display2 = iter;
break;
}
}
ASSERT_TRUE(display2.is_valid());
EXPECT_EQ(display1.id(),
screen->GetDisplayNearestWindow(top_level_.get()).id());
GetWindowTreeTestHelper()->window_tree()->PerformWindowMove(
21, GetTopLevelWindowId(), ws::mojom::MoveLoopSource::MOUSE,
gfx::Point());
EXPECT_TRUE(event_handler()->is_drag_in_progress());
GetEventGenerator()->MoveMouseTo(gfx::Point(610, 6));
GetWindowTreeClientChanges()->clear();
GetEventGenerator()->ReleaseLeftButton();
EXPECT_EQ(display2.id(),
screen->GetDisplayNearestWindow(top_level_.get()).id());
EXPECT_TRUE(
ContainsChange(*GetWindowTreeClientChanges(),
std::string("DisplayChanged window_id=0,1 display_id=") +
base::NumberToString(display2.id())));
}
} // namespace ash } // namespace ash
...@@ -299,6 +299,9 @@ void RendererWindowTreeClient::OnWindowOpacityChanged(ws::Id window_id, ...@@ -299,6 +299,9 @@ void RendererWindowTreeClient::OnWindowOpacityChanged(ws::Id window_id,
float old_opacity, float old_opacity,
float new_opacity) {} float new_opacity) {}
void RendererWindowTreeClient::OnWindowDisplayChanged(ws::Id window_id,
int64_t display_id) {}
void RendererWindowTreeClient::OnWindowParentDrawnStateChanged(ws::Id window_id, void RendererWindowTreeClient::OnWindowParentDrawnStateChanged(ws::Id window_id,
bool drawn) {} bool drawn) {}
......
...@@ -159,6 +159,7 @@ class RendererWindowTreeClient : public ws::mojom::WindowTreeClient, ...@@ -159,6 +159,7 @@ class RendererWindowTreeClient : public ws::mojom::WindowTreeClient,
void OnWindowOpacityChanged(ws::Id window_id, void OnWindowOpacityChanged(ws::Id window_id,
float old_opacity, float old_opacity,
float new_opacity) override; float new_opacity) override;
void OnWindowDisplayChanged(ws::Id window_id, int64_t display_id) override;
void OnWindowParentDrawnStateChanged(ws::Id window_id, bool drawn) override; void OnWindowParentDrawnStateChanged(ws::Id window_id, bool drawn) override;
void OnWindowSharedPropertyChanged( void OnWindowSharedPropertyChanged(
ws::Id window_id, ws::Id window_id,
......
...@@ -159,6 +159,9 @@ void ClientRoot::OnWindowAddedToRootWindow(aura::Window* window) { ...@@ -159,6 +159,9 @@ void ClientRoot::OnWindowAddedToRootWindow(aura::Window* window) {
DCHECK(window->GetHost()); DCHECK(window->GetHost());
window->GetHost()->AddObserver(this); window->GetHost()->AddObserver(this);
CheckForScaleFactorChange(); CheckForScaleFactorChange();
window_tree_->window_tree_client_->OnWindowDisplayChanged(
window_tree_->TransportIdForWindow(window),
window->GetHost()->GetDisplayId());
} }
void ClientRoot::OnWindowRemovingFromRootWindow(aura::Window* window, void ClientRoot::OnWindowRemovingFromRootWindow(aura::Window* window,
......
...@@ -483,6 +483,10 @@ interface WindowTreeClient { ...@@ -483,6 +483,10 @@ interface WindowTreeClient {
// Invoked when the opacity of the specified window has changed. // Invoked when the opacity of the specified window has changed.
OnWindowOpacityChanged(uint64 window, float old_opacity, float new_opacity); OnWindowOpacityChanged(uint64 window, float old_opacity, float new_opacity);
// Invoked when the window moves to a new display. This is only called on
// a top-level window or an embedded root.
OnWindowDisplayChanged(uint64 window, int64 display_id);
// Invoked when the drawn state of |window|'s parent changes. The drawn state // Invoked when the drawn state of |window|'s parent changes. The drawn state
// is determined by the visibility of a Window and the Windows ancestors. A // is determined by the visibility of a Window and the Windows ancestors. A
// Window is drawn if all ancestors are visible, not drawn if any ancestor is // Window is drawn if all ancestors are visible, not drawn if any ancestor is
......
...@@ -160,6 +160,11 @@ std::string ChangeToDescription(const Change& change, ...@@ -160,6 +160,11 @@ std::string ChangeToDescription(const Change& change,
case CHANGE_TYPE_TRANSFORM_CHANGED: case CHANGE_TYPE_TRANSFORM_CHANGED:
return base::StringPrintf("TransformChanged window_id=%s", return base::StringPrintf("TransformChanged window_id=%s",
WindowIdToString(change.window_id).c_str()); WindowIdToString(change.window_id).c_str());
case CHANGE_TYPE_DISPLAY_CHANGED:
return base::StringPrintf(
"DisplayChanged window_id=%s display_id=%s",
WindowIdToString(change.window_id).c_str(),
base::NumberToString(change.display_id).c_str());
case CHANGE_TYPE_DRAG_DROP_START: case CHANGE_TYPE_DRAG_DROP_START:
return "DragDropStart"; return "DragDropStart";
case CHANGE_TYPE_DRAG_ENTER: case CHANGE_TYPE_DRAG_ENTER:
...@@ -427,6 +432,15 @@ void TestChangeTracker::OnWindowOpacityChanged(Id window_id, float opacity) { ...@@ -427,6 +432,15 @@ void TestChangeTracker::OnWindowOpacityChanged(Id window_id, float opacity) {
AddChange(change); AddChange(change);
} }
void TestChangeTracker::OnWindowDisplayChanged(Id window_id,
int64_t display_id) {
Change change;
change.type = CHANGE_TYPE_DISPLAY_CHANGED;
change.window_id = window_id;
change.display_id = display_id;
AddChange(change);
}
void TestChangeTracker::OnWindowParentDrawnStateChanged(Id window_id, void TestChangeTracker::OnWindowParentDrawnStateChanged(Id window_id,
bool drawn) { bool drawn) {
Change change; Change change;
......
...@@ -47,6 +47,7 @@ enum ChangeType { ...@@ -47,6 +47,7 @@ enum ChangeType {
CHANGE_TYPE_REQUEST_CLOSE, CHANGE_TYPE_REQUEST_CLOSE,
CHANGE_TYPE_SURFACE_CHANGED, CHANGE_TYPE_SURFACE_CHANGED,
CHANGE_TYPE_TRANSFORM_CHANGED, CHANGE_TYPE_TRANSFORM_CHANGED,
CHANGE_TYPE_DISPLAY_CHANGED,
CHANGE_TYPE_DRAG_DROP_START, CHANGE_TYPE_DRAG_DROP_START,
CHANGE_TYPE_DRAG_ENTER, CHANGE_TYPE_DRAG_ENTER,
CHANGE_TYPE_DRAG_OVER, CHANGE_TYPE_DRAG_OVER,
...@@ -200,6 +201,7 @@ class TestChangeTracker { ...@@ -200,6 +201,7 @@ class TestChangeTracker {
void OnWindowDeleted(Id window_id); void OnWindowDeleted(Id window_id);
void OnWindowVisibilityChanged(Id window_id, bool visible); void OnWindowVisibilityChanged(Id window_id, bool visible);
void OnWindowOpacityChanged(Id window_id, float opacity); void OnWindowOpacityChanged(Id window_id, float opacity);
void OnWindowDisplayChanged(Id window_id, int64_t display_id);
void OnWindowParentDrawnStateChanged(Id window_id, bool drawn); void OnWindowParentDrawnStateChanged(Id window_id, bool drawn);
void OnWindowInputEvent(Id window_id, void OnWindowInputEvent(Id window_id,
const ui::Event& event, const ui::Event& event,
......
...@@ -180,6 +180,11 @@ void TestWindowTreeClient::OnWindowOpacityChanged(Id window, ...@@ -180,6 +180,11 @@ void TestWindowTreeClient::OnWindowOpacityChanged(Id window,
tracker_.OnWindowOpacityChanged(window, new_opacity); tracker_.OnWindowOpacityChanged(window, new_opacity);
} }
void TestWindowTreeClient::OnWindowDisplayChanged(Id window_id,
int64_t display_id) {
tracker_.OnWindowDisplayChanged(window_id, display_id);
}
void TestWindowTreeClient::OnWindowParentDrawnStateChanged(Id window, void TestWindowTreeClient::OnWindowParentDrawnStateChanged(Id window,
bool drawn) { bool drawn) {
tracker_.OnWindowParentDrawnStateChanged(window, drawn); tracker_.OnWindowParentDrawnStateChanged(window, drawn);
......
...@@ -145,6 +145,7 @@ class TestWindowTreeClient : public mojom::WindowTreeClient, ...@@ -145,6 +145,7 @@ class TestWindowTreeClient : public mojom::WindowTreeClient,
void OnWindowOpacityChanged(Id window, void OnWindowOpacityChanged(Id window,
float old_opacity, float old_opacity,
float new_opacity) override; float new_opacity) override;
void OnWindowDisplayChanged(Id window_id, int64_t display_id) override;
void OnWindowParentDrawnStateChanged(Id window, bool drawn) override; void OnWindowParentDrawnStateChanged(Id window, bool drawn) override;
void OnWindowInputEvent(uint32_t event_id, void OnWindowInputEvent(uint32_t event_id,
Id window_id, Id window_id,
......
...@@ -1274,6 +1274,14 @@ void WindowTreeClient::OnWindowOpacityChanged(ws::Id window_id, ...@@ -1274,6 +1274,14 @@ void WindowTreeClient::OnWindowOpacityChanged(ws::Id window_id,
window->SetOpacityFromServer(new_opacity); window->SetOpacityFromServer(new_opacity);
} }
void WindowTreeClient::OnWindowDisplayChanged(ws::Id window_id,
int64_t display_id) {
WindowMus* window = GetWindowByServerId(window_id);
if (!window)
return;
GetWindowTreeHostMus(window->GetWindow())->set_display_id(display_id);
}
void WindowTreeClient::OnWindowParentDrawnStateChanged(ws::Id window_id, void WindowTreeClient::OnWindowParentDrawnStateChanged(ws::Id window_id,
bool drawn) { bool drawn) {
// TODO: route to WindowTreeHost. // TODO: route to WindowTreeHost.
......
...@@ -416,6 +416,7 @@ class AURA_EXPORT WindowTreeClient ...@@ -416,6 +416,7 @@ class AURA_EXPORT WindowTreeClient
void OnWindowOpacityChanged(ws::Id window_id, void OnWindowOpacityChanged(ws::Id window_id,
float old_opacity, float old_opacity,
float new_opacity) override; float new_opacity) override;
void OnWindowDisplayChanged(ws::Id window_id, int64_t display_id) override;
void OnWindowParentDrawnStateChanged(ws::Id window_id, bool drawn) override; void OnWindowParentDrawnStateChanged(ws::Id window_id, bool drawn) override;
void OnWindowSharedPropertyChanged( void OnWindowSharedPropertyChanged(
ws::Id window_id, ws::Id window_id,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment