Commit 45ebea3c authored by Xiyuan Xia's avatar Xiyuan Xia Committed by Commit Bot

Fix SubframeGestureEventRouting in mash

- Add a ScopedAllow helper class that SystemEventRewriter allows
  event to pass through when there are instances of it;
- Use ScopedAllow helper to allow fake gesture events to pass
  through under mash;

Bug: 884360
Change-Id: I940398b0920505743ad7adbe08e12e1394fb55c0
Reviewed-on: https://chromium-review.googlesource.com/c/1292400Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarKen Buchanan <kenrb@chromium.org>
Commit-Queue: Xiyuan Xia <xiyuan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#605496}
parent f06f925f
......@@ -78,6 +78,7 @@
#include "services/service_manager/public/cpp/connector.h"
#include "services/ws/public/mojom/window_tree_constants.mojom.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/event_injector.h"
#include "ui/aura/test/env_test_helper.h"
#include "ui/base/class_property.h"
#include "ui/base/hit_test.h"
......@@ -238,6 +239,15 @@ class ImmersiveModeTester : public ImmersiveModeController::Observer {
DISALLOW_COPY_AND_ASSIGN(ImmersiveModeTester);
};
// Update mouse location of aura::Env by injecting a mouse move event.
// EventInjector is used so that the Window Service side code under mash sees
// the updated mouse location as well.
void UpdateMouseLocation(aura::Window* window, const gfx::Point& location) {
ui::MouseEvent event(ui::ET_MOUSE_MOVED, location, location,
ui::EventTimeForNow(), ui::EF_NONE, 0);
aura::EventInjector().Inject(window->GetHost(), &event);
}
} // namespace
using views::Widget;
......@@ -304,7 +314,10 @@ IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewAshTest,
}
IN_PROC_BROWSER_TEST_P(BrowserNonClientFrameViewAshTest, ImmersiveFullscreen) {
aura::test::EnvTestHelper().SetAlwaysUseLastMouseLocation(true);
// Move mouse cursor beyond immersive UI to avoid affecting tests.
UpdateMouseLocation(browser()->window()->GetNativeWindow(),
gfx::Point(0, 100));
BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
content::WebContents* web_contents = browser_view->GetActiveWebContents();
BrowserNonClientFrameViewAsh* frame_view = GetFrameViewAsh(browser_view);
......@@ -515,9 +528,14 @@ class ImmersiveModeBrowserViewTest
ImmersiveModeBrowserViewTest() = default;
~ImmersiveModeBrowserViewTest() override = default;
// TopChromeMdParamTest<InProcessBrowserTest>:
void PreRunTestOnMainThread() override {
InProcessBrowserTest::PreRunTestOnMainThread();
aura::test::EnvTestHelper().SetAlwaysUseLastMouseLocation(true);
// Move mouse cursor beyond immersive UI to avoid affecting tests.
UpdateMouseLocation(browser()->window()->GetNativeWindow(),
gfx::Point(0, 100));
BrowserView::SetDisableRevealerDelayForTesting(true);
}
......
......@@ -674,14 +674,37 @@ class SetMouseCaptureInterceptor
// that might otherwise cause unpredictable behaviour in tests.
class SystemEventRewriter : public ui::EventRewriter {
public:
// Helper class to allow events to pass through for the lifetime of the
// object. Use this when tests generate events. This is needed under mash
// because the generate events reach SystemEventRewriter and will be dropped
// if there is no ScopedAllow instance.
// Note that allowing system events can cause flakiness in browser tests that
// don't expect them.
class ScopedAllow {
public:
explicit ScopedAllow(SystemEventRewriter* rewriter) : rewriter_(rewriter) {
++rewriter_->num_of_scoped_allows_;
}
~ScopedAllow() {
DCHECK_GT(rewriter_->num_of_scoped_allows_, 0);
--rewriter_->num_of_scoped_allows_;
}
private:
SystemEventRewriter* const rewriter_;
DISALLOW_COPY_AND_ASSIGN(ScopedAllow);
};
SystemEventRewriter() = default;
~SystemEventRewriter() override {}
~SystemEventRewriter() override = default;
private:
ui::EventRewriteStatus RewriteEvent(
const ui::Event& event,
std::unique_ptr<ui::Event>* new_event) override {
return ui::EVENT_REWRITE_DISCARD;
return num_of_scoped_allows_ ? ui::EVENT_REWRITE_CONTINUE
: ui::EVENT_REWRITE_DISCARD;
}
ui::EventRewriteStatus NextDispatchEvent(
......@@ -691,6 +714,10 @@ class SystemEventRewriter : public ui::EventRewriter {
return ui::EVENT_REWRITE_CONTINUE;
}
// Count of ScopedAllow objects. When it is greater than 0, events are allowed
// to pass. Otherwise, they are discarded.
int num_of_scoped_allows_ = 0;
DISALLOW_COPY_AND_ASSIGN(SystemEventRewriter);
};
#endif
......@@ -707,11 +734,11 @@ class SitePerProcessHitTestBrowserTest
void PreRunTestOnMainThread() override {
SitePerProcessBrowserTest::PreRunTestOnMainThread();
// Disable system mouse events, which can interfere with tests.
shell()->window()->GetHost()->AddEventRewriter(&event_rewriter);
shell()->window()->GetHost()->AddEventRewriter(&event_rewriter_);
}
void PostRunTestOnMainThread() override {
shell()->window()->GetHost()->RemoveEventRewriter(&event_rewriter);
shell()->window()->GetHost()->RemoveEventRewriter(&event_rewriter_);
SitePerProcessBrowserTest::PostRunTestOnMainThread();
}
#endif
......@@ -732,7 +759,7 @@ class SitePerProcessHitTestBrowserTest
base::test::ScopedFeatureList feature_list_;
#if defined(USE_AURA)
SystemEventRewriter event_rewriter;
SystemEventRewriter event_rewriter_;
#endif
};
......@@ -3671,6 +3698,10 @@ IN_PROC_BROWSER_TEST_P(SitePerProcessHitTestBrowserTest,
InputEventAckWaiter ack_waiter(child_frame_host->GetRenderWidgetHost(),
blink::WebInputEvent::kGestureTap);
#if defined(USE_AURA)
// Allows the gesture events to go through under mash.
SystemEventRewriter::ScopedAllow scoped_allow(&event_rewriter_);
#endif
render_widget_host->QueueSyntheticGesture(
std::move(gesture), base::BindOnce([](SyntheticGesture::Result result) {
EXPECT_EQ(SyntheticGesture::GESTURE_FINISHED, result);
......
......@@ -19,7 +19,6 @@
# or RenderWidgetHostMouseEventMonitor::EventWasReceived fails.
# https://crbug.com/884360
-SitePerProcessHitTestBrowserTest.CrossProcessTooltipTest*
-SitePerProcessHitTestBrowserTest.SubframeGestureEventRouting*
# Flaky. https://crbug.com/889878
......
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