Chromium Code Reviews| Index: content/browser/site_per_process_browsertest.cc |
| diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc |
| index fdf7ab570a71aca6ab23acee05238327fdda4a6a..670f358515fe7a03766b93e0b1d1db96bd3a5273 100644 |
| --- a/content/browser/site_per_process_browsertest.cc |
| +++ b/content/browser/site_per_process_browsertest.cc |
| @@ -938,38 +938,40 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, TitleAfterCrossSiteIframe) { |
| } |
| // Class to detect incoming GestureScrollEnd acks for bubbling tests. |
| -class GestureScrollEndObserver |
| +class InputEventAckWaiter |
| : public content::RenderWidgetHost::InputEventObserver { |
| public: |
| - GestureScrollEndObserver() |
| + InputEventAckWaiter(blink::WebInputEvent::Type ack_type_waiting_for) |
| : message_loop_runner_(new content::MessageLoopRunner), |
| - gesture_scroll_end_ack_received_(false) {} |
| - ~GestureScrollEndObserver() override {} |
| + 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() == blink::WebInputEvent::kGestureScrollEnd) { |
| - gesture_scroll_end_ack_received_ = true; |
| + if (event.GetType() == ack_type_waiting_for_) { |
| + desired_ack_type_received_ = true; |
| if (message_loop_runner_->loop_running()) |
| message_loop_runner_->Quit(); |
| } |
| } |
| void Wait() { |
| - if (!gesture_scroll_end_ack_received_) { |
| + if (!desired_ack_type_received_) { |
| message_loop_runner_->Run(); |
| } |
| } |
| void Reset() { |
| - gesture_scroll_end_ack_received_ = false; |
| + desired_ack_type_received_ = false; |
| message_loop_runner_ = new content::MessageLoopRunner; |
| } |
| private: |
| scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
| - bool gesture_scroll_end_ack_received_; |
| + blink::WebInputEvent::Type ack_type_waiting_for_; |
| + bool desired_ack_type_received_; |
| - DISALLOW_COPY_AND_ASSIGN(GestureScrollEndObserver); |
| + DISALLOW_COPY_AND_ASSIGN(InputEventAckWaiter); |
| }; |
| // Class to sniff incoming IPCs for FrameHostMsg_FrameRectChanged messages. |
| @@ -1119,6 +1121,70 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
| EXPECT_LT(update_rect.y(), bounds.y() - rwhv_root->GetViewBounds().y()); |
| } |
| +IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
|
kenrb
2017/04/27 20:47:23
This test should have a description.
|
| + GestureFlingStartEventsBubble) { |
| + 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); |
| + |
| + std::unique_ptr<InputEventAckWaiter> gesture_fling_start_ack_observer = |
| + base::MakeUnique<InputEventAckWaiter>( |
| + blink::WebInputEvent::kGestureFlingStart); |
| + root->current_frame_host()->GetRenderWidgetHost()->AddInputEventObserver( |
| + gesture_fling_start_ack_observer.get()); |
| + |
| + RenderWidgetHost* child_rwh = |
| + child_iframe_node->current_frame_host()->GetRenderWidgetHost(); |
| + |
| + WaitForChildFrameSurfaceReady(child_iframe_node->current_frame_host()); |
| + |
| + gesture_fling_start_ack_observer->Reset(); |
| + // Send a GSB, GSU, GFS sequence and verify that the GFS bubbles. |
| + blink::WebGestureEvent gesture_scroll_begin( |
| + blink::WebGestureEvent::kGestureScrollBegin, |
| + blink::WebInputEvent::kNoModifiers, |
| + blink::WebInputEvent::kTimeStampForTesting); |
| + gesture_scroll_begin.source_device = blink::kWebGestureDeviceTouchscreen; |
| + gesture_scroll_begin.data.scroll_begin.delta_hint_units = |
| + blink::WebGestureEvent::ScrollUnits::kPrecisePixels; |
| + gesture_scroll_begin.data.scroll_begin.delta_x_hint = 0.f; |
| + gesture_scroll_begin.data.scroll_begin.delta_y_hint = 5.f; |
| + |
| + child_rwh->ForwardGestureEvent(gesture_scroll_begin); |
| + |
| + blink::WebGestureEvent gesture_scroll_update( |
| + blink::WebGestureEvent::kGestureScrollUpdate, |
| + blink::WebInputEvent::kNoModifiers, |
| + blink::WebInputEvent::kTimeStampForTesting); |
| + gesture_scroll_update.source_device = blink::kWebGestureDeviceTouchscreen; |
| + gesture_scroll_update.data.scroll_update.delta_units = |
| + blink::WebGestureEvent::ScrollUnits::kPrecisePixels; |
| + gesture_scroll_update.data.scroll_update.delta_x = 0.f; |
| + gesture_scroll_update.data.scroll_update.delta_y = 5.f; |
| + gesture_scroll_update.data.scroll_update.velocity_y = 5.f; |
| + |
| + child_rwh->ForwardGestureEvent(gesture_scroll_update); |
| + |
| + blink::WebGestureEvent gesture_fling_start( |
| + blink::WebGestureEvent::kGestureFlingStart, |
| + blink::WebInputEvent::kNoModifiers, |
| + blink::WebInputEvent::kTimeStampForTesting); |
| + gesture_fling_start.source_device = blink::kWebGestureDeviceTouchscreen; |
| + gesture_fling_start.data.fling_start.velocity_x = 0.f; |
| + gesture_fling_start.data.fling_start.velocity_y = 5.f; |
| + |
| + child_rwh->ForwardGestureEvent(gesture_fling_start); |
| + |
| + gesture_fling_start_ack_observer->Wait(); |
|
kenrb
2017/04/27 20:47:23
Since there are no EXPECT statements in the later
|
| +} |
| + |
| // Test that scrolling a nested out-of-process iframe bubbles unused scroll |
| // delta to a parent frame. |
| #if defined(OS_ANDROID) |
| @@ -1149,8 +1215,9 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
| parent_iframe_node->current_frame_host()->GetProcess()->AddFilter( |
| filter.get()); |
| - std::unique_ptr<GestureScrollEndObserver> ack_observer = |
| - base::MakeUnique<GestureScrollEndObserver>(); |
| + std::unique_ptr<InputEventAckWaiter> ack_observer = |
| + base::MakeUnique<InputEventAckWaiter>( |
| + blink::WebInputEvent::kGestureScrollEnd); |
| parent_iframe_node->current_frame_host() |
| ->GetRenderWidgetHost() |
| ->AddInputEventObserver(ack_observer.get()); |