Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(215)

Unified Diff: content/browser/site_per_process_mac_browsertest.mm

Issue 2866523002: Don't drop mouse wheel events with phase ending information in RWHVCF. (Closed)
Patch Set: Add test. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/frame_host/render_widget_host_view_child_frame.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/site_per_process_mac_browsertest.mm
diff --git a/content/browser/site_per_process_mac_browsertest.mm b/content/browser/site_per_process_mac_browsertest.mm
index 43e5f34414b987de76f9124aa52392d28f9db7b4..5cae49a1935527cf51ede78f78318535add96e57 100644
--- a/content/browser/site_per_process_mac_browsertest.mm
+++ b/content/browser/site_per_process_mac_browsertest.mm
@@ -58,6 +58,54 @@ class TextInputClientMacHelper {
DISALLOW_COPY_AND_ASSIGN(TextInputClientMacHelper);
};
+// Class to detect incoming gesture event acks for scrolling tests.
+class InputEventAckWaiter
+ : public content::RenderWidgetHost::InputEventObserver {
+ public:
+ InputEventAckWaiter(blink::WebInputEvent::Type ack_type_waiting_for)
+ : message_loop_runner_(new content::MessageLoopRunner),
+ ack_type_waiting_for_(ack_type_waiting_for),
+ desired_ack_type_received_(false) {}
+ ~InputEventAckWaiter() override {}
+
+ void OnInputEventAck(const blink::WebInputEvent& event) override {
+ if (event.GetType() != ack_type_waiting_for_)
+ return;
+
+ // Ignore synthetic GestureScrollBegin/Ends.
+ if ((event.GetType() == blink::WebInputEvent::kGestureScrollBegin &&
+ static_cast<const blink::WebGestureEvent&>(event)
+ .data.scroll_begin.synthetic) ||
+ (event.GetType() == blink::WebInputEvent::kGestureScrollEnd &&
+ static_cast<const blink::WebGestureEvent&>(event)
+ .data.scroll_end.synthetic)) {
+ return;
+ }
+
+ desired_ack_type_received_ = true;
+ if (message_loop_runner_->loop_running())
+ message_loop_runner_->Quit();
+ }
+
+ void Wait() {
+ if (!desired_ack_type_received_) {
+ message_loop_runner_->Run();
+ }
+ }
+
+ void Reset() {
+ desired_ack_type_received_ = false;
+ message_loop_runner_ = new content::MessageLoopRunner;
+ }
+
+ private:
+ scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
+ blink::WebInputEvent::Type ack_type_waiting_for_;
+ bool desired_ack_type_received_;
+
+ DISALLOW_COPY_AND_ASSIGN(InputEventAckWaiter);
+};
+
} // namespace
// Site per process browser tests inside content which are specific to Mac OSX
@@ -117,4 +165,91 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessMacBrowserTest,
EXPECT_EQ(word, helper.word());
EXPECT_EQ("This", word);
}
+
+// Ensure that the RWHVCF forwards wheel events with phase ending information.
+// RWHVCF may see wheel events with phase ending information that have deltas
+// of 0. These should not be dropped, otherwise MouseWheelEventQueue will not
+// be informed that the user's gesture has ended.
+// See crbug.com/628742
+IN_PROC_BROWSER_TEST_F(SitePerProcessMacBrowserTest,
+ ForwardWheelEventsWithPhaseEndingInformation) {
+ GURL main_url(embedded_test_server()->GetURL(
+ "a.com", "/cross_site_iframe_factory.html?a(b)"));
+ EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+ FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+ ->GetFrameTree()
+ ->root();
+ ASSERT_EQ(1U, root->child_count());
+
+ FrameTreeNode* child_iframe_node = root->child_at(0);
+ RenderWidgetHost* child_rwh =
+ child_iframe_node->current_frame_host()->GetRenderWidgetHost();
+
+ std::unique_ptr<InputEventAckWaiter> gesture_scroll_begin_ack_observer =
+ base::MakeUnique<InputEventAckWaiter>(
+ blink::WebInputEvent::kGestureScrollBegin);
+ std::unique_ptr<InputEventAckWaiter> gesture_scroll_end_ack_observer =
+ base::MakeUnique<InputEventAckWaiter>(
+ blink::WebInputEvent::kGestureScrollEnd);
+ child_rwh->AddInputEventObserver(gesture_scroll_begin_ack_observer.get());
+ child_rwh->AddInputEventObserver(gesture_scroll_end_ack_observer.get());
+
+ RenderWidgetHostViewBase* child_rwhv =
+ static_cast<RenderWidgetHostViewBase*>(child_rwh->GetView());
+
+ blink::WebMouseWheelEvent scroll_event(
+ blink::WebInputEvent::kMouseWheel, blink::WebInputEvent::kNoModifiers,
+ blink::WebInputEvent::kTimeStampForTesting);
+ scroll_event.SetPositionInWidget(1, 1);
+ scroll_event.has_precise_scrolling_deltas = true;
+ scroll_event.delta_x = 0.0f;
+
+ // Have the RWHVCF process a sequence of touchpad scroll events that contain
+ // phase informaiton. We start scrolling normally, then we fling.
+ // We wait for GestureScrollBegin/Ends that result from these wheel events.
+ // If we don't see them, this test will time out indicating failure.
+
+ // Begin scrolling.
+ scroll_event.delta_y = -1.0f;
+ scroll_event.phase = blink::WebMouseWheelEvent::kPhaseBegan;
+ scroll_event.momentum_phase = blink::WebMouseWheelEvent::kPhaseNone;
+ child_rwhv->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo());
+ gesture_scroll_begin_ack_observer->Wait();
+
+ scroll_event.delta_y = -2.0f;
+ scroll_event.phase = blink::WebMouseWheelEvent::kPhaseChanged;
+ scroll_event.momentum_phase = blink::WebMouseWheelEvent::kPhaseNone;
+ child_rwhv->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo());
+
+ // End of non-momentum scrolling.
+ scroll_event.delta_y = 0.0f;
+ scroll_event.phase = blink::WebMouseWheelEvent::kPhaseEnded;
+ scroll_event.momentum_phase = blink::WebMouseWheelEvent::kPhaseNone;
+ child_rwhv->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo());
+ gesture_scroll_end_ack_observer->Wait();
+
+ gesture_scroll_begin_ack_observer->Reset();
+ gesture_scroll_end_ack_observer->Reset();
+
+ // We now go into a fling.
+ scroll_event.delta_y = -2.0f;
+ scroll_event.phase = blink::WebMouseWheelEvent::kPhaseNone;
+ scroll_event.momentum_phase = blink::WebMouseWheelEvent::kPhaseBegan;
+ child_rwhv->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo());
+ gesture_scroll_begin_ack_observer->Wait();
+
+ scroll_event.delta_y = -2.0f;
+ scroll_event.phase = blink::WebMouseWheelEvent::kPhaseNone;
+ scroll_event.momentum_phase = blink::WebMouseWheelEvent::kPhaseChanged;
+ child_rwhv->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo());
+
+ // End of fling momentum.
+ scroll_event.delta_y = 0.0f;
+ scroll_event.phase = blink::WebMouseWheelEvent::kPhaseNone;
+ scroll_event.momentum_phase = blink::WebMouseWheelEvent::kPhaseEnded;
+ child_rwhv->ProcessMouseWheelEvent(scroll_event, ui::LatencyInfo());
+ gesture_scroll_end_ack_observer->Wait();
+}
+
} // namespace content
« no previous file with comments | « content/browser/frame_host/render_widget_host_view_child_frame.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698