Commit 4a69b3b0 authored by oshima's avatar oshima Committed by Commit bot

Filter all events in SystemModalContainerEventHandler

BUG=620406
TEST=covered by unit test, manual

Review-Url: https://codereview.chromium.org/2071423003
Cr-Commit-Position: refs/heads/master@{#400750}
parent f34caa12
......@@ -18,14 +18,7 @@ SystemModalContainerEventFilter::SystemModalContainerEventFilter(
SystemModalContainerEventFilter::~SystemModalContainerEventFilter() {
}
void SystemModalContainerEventFilter::OnKeyEvent(ui::KeyEvent* event) {
aura::Window* target = static_cast<aura::Window*>(event->target());
if (!delegate_->CanWindowReceiveEvents(target))
event->StopPropagation();
}
void SystemModalContainerEventFilter::OnMouseEvent(
ui::MouseEvent* event) {
void SystemModalContainerEventFilter::OnEvent(ui::Event* event) {
aura::Window* target = static_cast<aura::Window*>(event->target());
if (!delegate_->CanWindowReceiveEvents(target))
event->StopPropagation();
......
......@@ -20,9 +20,8 @@ class ASH_EXPORT SystemModalContainerEventFilter : public ui::EventHandler {
SystemModalContainerEventFilterDelegate* delegate);
~SystemModalContainerEventFilter() override;
// Overridden from ui::EventHandler:
void OnKeyEvent(ui::KeyEvent* event) override;
void OnMouseEvent(ui::MouseEvent* event) override;
// ui::EventHandler:
void OnEvent(ui::Event* event) override;
private:
SystemModalContainerEventFilterDelegate* delegate_;
......
......@@ -686,49 +686,93 @@ class InputTestDelegate : public aura::test::TestWindowDelegate {
InputTestDelegate() {}
~InputTestDelegate() override {}
void RunTest(test::AshTestBase* test_base) {
std::unique_ptr<aura::Window> window(
test_base->CreateTestWindowInShellWithDelegate(
this, 0, gfx::Rect(0, 0, 100, 100)));
window->Show();
GenerateEvents(window.get());
EXPECT_EQ(2, mouse_event_count_);
EXPECT_EQ(3, scroll_event_count_);
EXPECT_EQ(4, touch_event_count_);
EXPECT_EQ(10, gesture_event_count_);
Reset();
views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds(
new TestWindow(true), Shell::GetPrimaryRootWindow(),
gfx::Rect(200, 200, 100, 100));
widget->Show();
EXPECT_TRUE(WmShell::Get()->IsSystemModalWindowOpen());
// Events should be blocked.
GenerateEvents(window.get());
EXPECT_EQ(0, mouse_event_count_);
EXPECT_EQ(0, scroll_event_count_);
EXPECT_EQ(0, touch_event_count_);
EXPECT_EQ(0, gesture_event_count_);
Reset();
widget->Close();
EXPECT_FALSE(WmShell::Get()->IsSystemModalWindowOpen());
GenerateEvents(window.get());
EXPECT_EQ(2, mouse_event_count_);
EXPECT_EQ(3, scroll_event_count_);
EXPECT_EQ(4, touch_event_count_);
EXPECT_EQ(10, gesture_event_count_);
}
private:
// ui::EventHandler:
void OnMouseEvent(ui::MouseEvent* event) override { mouse_event_count_++; }
void OnScrollEvent(ui::ScrollEvent* event) override { scroll_event_count_++; }
void OnTouchEvent(ui::TouchEvent* event) override { touch_event_count_++; }
void OnGestureEvent(ui::GestureEvent* event) override {
gesture_event_count_++;
}
int mouse_event_count() const { return mouse_event_count_; }
void GenerateEvents(aura::Window* window) {
ui::test::EventGenerator event_generator(Shell::GetPrimaryRootWindow(),
window);
event_generator.ClickLeftButton();
event_generator.ScrollSequence(window->bounds().CenterPoint(),
base::TimeDelta(), 0, 10, 1, 2);
event_generator.PressTouch();
event_generator.ReleaseTouch();
event_generator.GestureTapAt(window->bounds().CenterPoint());
}
void Reset() {
mouse_event_count_ = 0;
scroll_event_count_ = 0;
touch_event_count_ = 0;
gesture_event_count_ = 0;
}
private:
int mouse_event_count_ = 0;
int scroll_event_count_ = 0;
int touch_event_count_ = 0;
int gesture_event_count_ = 0;
DISALLOW_COPY_AND_ASSIGN(InputTestDelegate);
};
} // namespace
TEST_F(SystemModalContainerLayoutManagerTest, BlockAllEvents) {
InputTestDelegate delegate;
delegate.RunTest(this);
}
// Make sure that events are properly blocked in multi displays environment.
TEST_F(SystemModalContainerLayoutManagerTest, BlockEvent) {
TEST_F(SystemModalContainerLayoutManagerTest, BlockEventsInMultiDisplays) {
UpdateDisplay("500x500, 500x500");
InputTestDelegate delegate;
std::unique_ptr<aura::Window> window(CreateTestWindowInShellWithDelegate(
&delegate, 0, gfx::Rect(0, 0, 100, 100)));
window->Show();
ui::test::EventGenerator event_generator(Shell::GetPrimaryRootWindow(),
window.get());
event_generator.ClickLeftButton();
EXPECT_EQ(2, delegate.mouse_event_count());
views::Widget* widget = views::Widget::CreateWindowWithContextAndBounds(
new TestWindow(true), Shell::GetPrimaryRootWindow(),
gfx::Rect(200, 200, 100, 100));
widget->Show();
EXPECT_TRUE(WmShell::Get()->IsSystemModalWindowOpen());
// Events should be blocked.
event_generator.ClickLeftButton();
EXPECT_EQ(2, delegate.mouse_event_count());
widget->Close();
EXPECT_FALSE(WmShell::Get()->IsSystemModalWindowOpen());
event_generator.ClickLeftButton();
EXPECT_EQ(4, delegate.mouse_event_count());
// We need to delete window here because delegate is on the stack.
window.reset();
delegate.RunTest(this);
}
} // namespace test
......
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