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 f9e831815a9ad88fbca2e5966c6d3f674f768b88..7c257895458f21841e6fa0f9e7bfc16236429238 100644 |
--- a/content/browser/site_per_process_browsertest.cc |
+++ b/content/browser/site_per_process_browsertest.cc |
@@ -935,6 +935,41 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, TitleAfterCrossSiteIframe) { |
EXPECT_EQ(expected_title, entry->GetTitle()); |
} |
+// Class to detect incoming GestureScrollEnd acks for bubbling tests. |
+class GestureScrollEndObserver |
+ : public content::RenderWidgetHost::InputEventObserver { |
+ public: |
+ GestureScrollEndObserver() |
+ : message_loop_runner_(new content::MessageLoopRunner), |
+ gesture_scroll_end_ack_received_(false) {} |
+ ~GestureScrollEndObserver() override {} |
+ |
+ void OnInputEventAck(const blink::WebInputEvent& event) override { |
+ if (event.GetType() == blink::WebInputEvent::kGestureScrollEnd) { |
+ gesture_scroll_end_ack_received_ = true; |
+ if (message_loop_runner_->loop_running()) |
+ message_loop_runner_->Quit(); |
+ } |
+ } |
+ |
+ void Wait() { |
+ if (!gesture_scroll_end_ack_received_) { |
+ message_loop_runner_->Run(); |
+ } |
+ } |
+ |
+ void Reset() { |
+ gesture_scroll_end_ack_received_ = false; |
+ message_loop_runner_ = new content::MessageLoopRunner; |
+ } |
+ |
+ private: |
+ scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
+ bool gesture_scroll_end_ack_received_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(GestureScrollEndObserver); |
+}; |
+ |
// Class to sniff incoming IPCs for FrameHostMsg_FrameRectChanged messages. |
class FrameRectChangedMessageFilter : public content::BrowserMessageFilter { |
public: |
@@ -1084,7 +1119,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
// Test that scrolling a nested out-of-process iframe bubbles unused scroll |
// delta to a parent frame. |
-#if defined(OS_ANDROID) || defined(OS_CHROMEOS) |
+#if defined(OS_ANDROID) |
#define MAYBE_ScrollBubblingFromOOPIFTest DISABLED_ScrollBubblingFromOOPIFTest |
#else |
#define MAYBE_ScrollBubblingFromOOPIFTest ScrollBubblingFromOOPIFTest |
@@ -1112,6 +1147,12 @@ 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>(); |
+ parent_iframe_node->current_frame_host() |
+ ->GetRenderWidgetHost() |
+ ->AddInputEventObserver(ack_observer.get()); |
+ |
GURL site_url(embedded_test_server()->GetURL( |
"b.com", "/frame_tree/page_with_positioned_frame.html")); |
NavigateFrameToURL(parent_iframe_node, site_url); |
@@ -1169,6 +1210,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
update_rect = filter->last_rect(); |
EXPECT_LT(update_rect.y(), initial_y); |
filter->Reset(); |
+ ack_observer->Reset(); |
// Now scroll the nested frame upward, which should bubble to the parent. |
// The upscroll exceeds the amount that the frame was initially scrolled |
@@ -1193,6 +1235,14 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
} |
filter->Reset(); |
+ // Once we've sent a wheel to the nested iframe that we expect to turn into |
+ // a bubbling scroll, we need to delay to make sure the GestureScrollBegin |
+ // from this new scroll doesn't hit the RenderWidgetHostImpl before the |
+ // GestureScrollEnd bubbled from the child. |
+ // This timing only seems to be needed for CrOS, but we'll enable it on |
+ // all platforms just to lessen the possibility of tests being flakey |
+ // on non-CrOS platforms. |
+ ack_observer->Wait(); |
// Scroll the parent down again in order to test scroll bubbling from |
// gestures. |