| Index: components/mus/ws/window_finder.cc
|
| diff --git a/components/mus/ws/window_finder.cc b/components/mus/ws/window_finder.cc
|
| index 5f41121b9179cbb5b0c2b2b9ffe7c2a5a847a343..6596a3e1326885baa9d5bb4c55a68a718eb48a12 100644
|
| --- a/components/mus/ws/window_finder.cc
|
| +++ b/components/mus/ws/window_finder.cc
|
| @@ -19,20 +19,34 @@ namespace mus {
|
| namespace ws {
|
| namespace {
|
|
|
| +bool IsValidWindowForEvents(ServerWindow* window) {
|
| + ServerWindowSurfaceManager* surface_manager = window->surface_manager();
|
| + return surface_manager &&
|
| + surface_manager->HasSurfaceOfType(mojom::SURFACE_TYPE_DEFAULT);
|
| +}
|
| +
|
| ServerWindow* FindDeepestVisibleWindowNonSurface(ServerWindow* window,
|
| gfx::Point* location) {
|
| - for (ServerWindow* child : window->GetChildren()) {
|
| + const ServerWindow::Windows children(window->GetChildren());
|
| + for (auto iter = children.rbegin(); iter != children.rend(); ++iter) {
|
| + ServerWindow* child = *iter;
|
| if (!child->visible())
|
| continue;
|
|
|
| // TODO(sky): support transform.
|
| gfx::Point child_location(location->x() - child->bounds().x(),
|
| location->y() - child->bounds().y());
|
| - if (child_location.x() >= 0 && child_location.y() >= 0 &&
|
| - child_location.x() < child->bounds().width() &&
|
| - child_location.y() < child->bounds().height()) {
|
| + gfx::Rect child_bounds(child->bounds().size());
|
| + child_bounds.Inset(-child->extended_hit_test_region().left(),
|
| + -child->extended_hit_test_region().top(),
|
| + -child->extended_hit_test_region().right(),
|
| + -child->extended_hit_test_region().bottom());
|
| + if (child_bounds.Contains(child_location)) {
|
| *location = child_location;
|
| - return FindDeepestVisibleWindowNonSurface(child, location);
|
| + ServerWindow* result =
|
| + FindDeepestVisibleWindowNonSurface(child, location);
|
| + if (IsValidWindowForEvents(result))
|
| + return result;
|
| }
|
| }
|
| return window;
|
| @@ -65,9 +79,13 @@ bool HitTestSurfaceOfType(cc::SurfaceId display_surface_id,
|
|
|
| } // namespace
|
|
|
| -ServerWindow* FindDeepestVisibleWindow(ServerWindow* root_window,
|
| - cc::SurfaceId display_surface_id,
|
| - gfx::Point* location) {
|
| +ServerWindow* FindDeepestVisibleWindowForEvents(
|
| + ServerWindow* root_window,
|
| + cc::SurfaceId display_surface_id,
|
| + gfx::Point* location) {
|
| + // TODO(sky): remove this when insets can be set on surface.
|
| + display_surface_id = cc::SurfaceId();
|
| +
|
| if (display_surface_id.is_null()) {
|
| // Surface-based hit-testing will not return a valid target if no
|
| // CompositorFrame has been submitted (e.g. in unit-tests).
|
|
|