Commit 603ab6b1 authored by Scott Violet's avatar Scott Violet Committed by Commit Bot

chromeos: fixs easy resize targeter for mash

EasyResizeWindowTargeter only works if a targeter is not installed on the
children of the container. This makes EasyResizeWindowTargeter work by
explicitly checking the parent's WindowTargeter for
SubtreeShouldBeExploredForEvent().

BUG=877099
TEST=covered by test

Change-Id: If5de972623bfbffb87986958010f7c8c51d8b448
Reviewed-on: https://chromium-review.googlesource.com/1187625Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Commit-Queue: Scott Violet <sky@chromium.org>
Cr-Commit-Position: refs/heads/master@{#585891}
parent 762e0a04
...@@ -180,6 +180,7 @@ source_set("tests") { ...@@ -180,6 +180,7 @@ source_set("tests") {
"focus_handler_unittest.cc", "focus_handler_unittest.cc",
"injected_event_handler_unittest.cc", "injected_event_handler_unittest.cc",
"screen_provider_unittest.cc", "screen_provider_unittest.cc",
"server_window_unittest.cc",
"user_activity_monitor_unittest.cc", "user_activity_monitor_unittest.cc",
"window_delegate_impl_unittest.cc", "window_delegate_impl_unittest.cc",
"window_service_observer_unittest.cc", "window_service_observer_unittest.cc",
......
...@@ -93,6 +93,21 @@ class ServerWindowTargeter : public aura::WindowTargeter { ...@@ -93,6 +93,21 @@ class ServerWindowTargeter : public aura::WindowTargeter {
~ServerWindowTargeter() override = default; ~ServerWindowTargeter() override = default;
// aura::WindowTargeter: // aura::WindowTargeter:
bool SubtreeShouldBeExploredForEvent(aura::Window* window,
const ui::LocatedEvent& event) override {
// If the top-level does not have insets, then forward the call to the
// parent's WindowTargeter. This is necessary for targeters such as
// EasyResizeWindowTargeter to work correctly.
if (mouse_extend().IsEmpty() && touch_extend().IsEmpty() &&
server_window_->IsTopLevel() && window->parent()) {
aura::WindowTargeter* parent_targeter =
static_cast<WindowTargeter*>(window->parent()->targeter());
if (parent_targeter)
return parent_targeter->SubtreeShouldBeExploredForEvent(window, event);
}
return aura::WindowTargeter::SubtreeShouldBeExploredForEvent(window, event);
}
ui::EventTarget* FindTargetForEvent(ui::EventTarget* event_target, ui::EventTarget* FindTargetForEvent(ui::EventTarget* event_target,
ui::Event* event) override { ui::Event* event) override {
aura::Window* window = static_cast<aura::Window*>(event_target); aura::Window* window = static_cast<aura::Window*>(event_target);
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/ui/ws2/server_window.h"
#include <memory>
#include "base/run_loop.h"
#include "services/ui/ws2/window_service_test_setup.h"
#include "services/ui/ws2/window_tree.h"
#include "services/ui/ws2/window_tree_test_helper.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/events/event.h"
#include "ui/events/event_constants.h"
#include "ui/wm/core/easy_resize_window_targeter.h"
namespace ui {
namespace ws2 {
TEST(ServerWindow, FindTargetForWindowWithEasyResizeTargeter) {
WindowServiceTestSetup setup;
std::unique_ptr<wm::EasyResizeWindowTargeter> easy_resize_window_targeter =
std::make_unique<wm::EasyResizeWindowTargeter>(
setup.root(), gfx::Insets(-10, -10, -10, -10),
gfx::Insets(-10, -10, -10, -10));
setup.root()->SetEventTargeter(std::move(easy_resize_window_targeter));
aura::Window* top_level =
setup.window_tree_test_helper()->NewTopLevelWindow();
ASSERT_TRUE(top_level);
top_level->SetBounds(gfx::Rect(100, 200, 200, 200));
top_level->Show();
ui::MouseEvent mouse_event(ui::ET_MOUSE_PRESSED, gfx::Point(105, 195),
gfx::Point(105, 195), base::TimeTicks::Now(),
/* flags */ 0,
/* changed_button_flags_ */ 0);
// Even though the mouse is not over |top_level| it should be returned as the
// target because EasyResizeWindowTargeter enlarges the hit area.
EXPECT_EQ(top_level, setup.root()->targeter()->FindTargetForEvent(
setup.root(), &mouse_event));
// Repeat with a location outside the extended hit region and ensure
// |top_level| is not returned.
ui::MouseEvent mouse_event2(ui::ET_MOUSE_PRESSED, gfx::Point(5, 5),
gfx::Point(5, 5), base::TimeTicks::Now(),
/* flags */ 0,
/* changed_button_flags_ */ 0);
EXPECT_NE(top_level, setup.root()->targeter()->FindTargetForEvent(
setup.root(), &mouse_event2));
}
} // namespace ws2
} // namespace ui
...@@ -216,6 +216,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate, ...@@ -216,6 +216,7 @@ class AURA_EXPORT Window : public ui::LayerDelegate,
// event-targeter. // event-targeter.
std::unique_ptr<ui::EventTargeter> SetEventTargeter( std::unique_ptr<ui::EventTargeter> SetEventTargeter(
std::unique_ptr<ui::EventTargeter> targeter); std::unique_ptr<ui::EventTargeter> targeter);
ui::EventTargeter* targeter() { return targeter_.get(); }
// Changes the bounds of the window. If present, the window's parent's // Changes the bounds of the window. If present, the window's parent's
// LayoutManager may adjust the bounds. // LayoutManager may adjust the bounds.
......
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