Index: cc/trees/layer_tree_host_impl_unittest.cc |
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc |
index 0f396803400483af3f29e14d6a4d7dae1305d505..c944b67fff17e0b907a3ba03b88fb7632ea670aa 100644 |
--- a/cc/trees/layer_tree_host_impl_unittest.cc |
+++ b/cc/trees/layer_tree_host_impl_unittest.cc |
@@ -972,6 +972,24 @@ TEST_F(LayerTreeHostImplTest, ImplPinchZoom) { |
} |
} |
+TEST_F(LayerTreeHostImplTest, ScrollWithSwapPromises) { |
+ ui::LatencyInfo latency_info; |
+ latency_info.trace_id = 1234; |
+ scoped_ptr<SwapPromise> swap_promise( |
+ new LatencyInfoSwapPromise(latency_info)); |
+ |
+ SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
+ EXPECT_EQ(InputHandler::ScrollStarted, |
+ host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture)); |
+ host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10)); |
+ host_impl_->QueueSwapPromiseForMainThreadScrollUpdate(swap_promise.Pass()); |
+ host_impl_->ScrollEnd(); |
+ |
+ scoped_ptr<ScrollAndScaleSet> scroll_info = host_impl_->ProcessScrollDeltas(); |
+ EXPECT_EQ(1u, scroll_info->swap_promises.size()); |
+ EXPECT_EQ(latency_info.trace_id, scroll_info->swap_promises[0]->TraceId()); |
+} |
+ |
TEST_F(LayerTreeHostImplTest, MasksToBoundsDoesntClobberInnerContainerSize) { |
SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
host_impl_->SetViewportSize(gfx::Size(50, 50)); |
@@ -6362,10 +6380,12 @@ class SimpleSwapPromiseMonitor : public SwapPromiseMonitor { |
SimpleSwapPromiseMonitor(LayerTreeHost* layer_tree_host, |
LayerTreeHostImpl* layer_tree_host_impl, |
int* set_needs_commit_count, |
- int* set_needs_redraw_count) |
+ int* set_needs_redraw_count, |
+ int* forward_to_main_count) |
: SwapPromiseMonitor(layer_tree_host, layer_tree_host_impl), |
set_needs_commit_count_(set_needs_commit_count), |
- set_needs_redraw_count_(set_needs_redraw_count) {} |
+ set_needs_redraw_count_(set_needs_redraw_count), |
+ forward_to_main_count_(forward_to_main_count) {} |
virtual ~SimpleSwapPromiseMonitor() {} |
@@ -6377,24 +6397,32 @@ class SimpleSwapPromiseMonitor : public SwapPromiseMonitor { |
(*set_needs_redraw_count_)++; |
} |
+ virtual void OnForwardScrollUpdateToMainThreadOnImpl() OVERRIDE { |
+ (*forward_to_main_count_)++; |
+ } |
+ |
private: |
int* set_needs_commit_count_; |
int* set_needs_redraw_count_; |
+ int* forward_to_main_count_; |
}; |
TEST_F(LayerTreeHostImplTest, SimpleSwapPromiseMonitor) { |
int set_needs_commit_count = 0; |
int set_needs_redraw_count = 0; |
+ int forward_to_main_count = 0; |
{ |
scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor( |
new SimpleSwapPromiseMonitor(NULL, |
host_impl_.get(), |
&set_needs_commit_count, |
- &set_needs_redraw_count)); |
+ &set_needs_redraw_count, |
+ &forward_to_main_count)); |
host_impl_->SetNeedsRedraw(); |
EXPECT_EQ(0, set_needs_commit_count); |
EXPECT_EQ(1, set_needs_redraw_count); |
+ EXPECT_EQ(0, forward_to_main_count); |
} |
// Now the monitor is destroyed, SetNeedsRedraw() is no longer being |
@@ -6402,16 +6430,19 @@ TEST_F(LayerTreeHostImplTest, SimpleSwapPromiseMonitor) { |
host_impl_->SetNeedsRedraw(); |
EXPECT_EQ(0, set_needs_commit_count); |
EXPECT_EQ(1, set_needs_redraw_count); |
+ EXPECT_EQ(0, forward_to_main_count); |
{ |
scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor( |
new SimpleSwapPromiseMonitor(NULL, |
host_impl_.get(), |
&set_needs_commit_count, |
- &set_needs_redraw_count)); |
+ &set_needs_redraw_count, |
+ &forward_to_main_count)); |
host_impl_->SetNeedsRedrawRect(gfx::Rect(10, 10)); |
EXPECT_EQ(0, set_needs_commit_count); |
EXPECT_EQ(2, set_needs_redraw_count); |
+ EXPECT_EQ(0, forward_to_main_count); |
} |
{ |
@@ -6419,11 +6450,48 @@ TEST_F(LayerTreeHostImplTest, SimpleSwapPromiseMonitor) { |
new SimpleSwapPromiseMonitor(NULL, |
host_impl_.get(), |
&set_needs_commit_count, |
- &set_needs_redraw_count)); |
+ &set_needs_redraw_count, |
+ &forward_to_main_count)); |
// Empty damage rect won't signal the monitor. |
host_impl_->SetNeedsRedrawRect(gfx::Rect()); |
EXPECT_EQ(0, set_needs_commit_count); |
EXPECT_EQ(2, set_needs_redraw_count); |
+ EXPECT_EQ(0, forward_to_main_count); |
+ } |
+ |
+ { |
+ set_needs_commit_count = 0; |
+ set_needs_redraw_count = 0; |
+ forward_to_main_count = 0; |
+ scoped_ptr<SimpleSwapPromiseMonitor> swap_promise_monitor( |
+ new SimpleSwapPromiseMonitor(NULL, |
+ host_impl_.get(), |
+ &set_needs_commit_count, |
+ &set_needs_redraw_count, |
+ &forward_to_main_count)); |
+ LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
+ |
+ // Scrolling normally should not trigger any forwarding. |
+ EXPECT_EQ(InputHandler::ScrollStarted, |
+ host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture)); |
+ EXPECT_TRUE(host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10))); |
+ host_impl_->ScrollEnd(); |
+ |
+ EXPECT_EQ(0, set_needs_commit_count); |
+ EXPECT_EQ(1, set_needs_redraw_count); |
+ EXPECT_EQ(0, forward_to_main_count); |
+ |
+ // Scrolling with a scroll handler should defer the swap to the main |
+ // thread. |
+ scroll_layer->SetHaveScrollEventHandlers(true); |
+ EXPECT_EQ(InputHandler::ScrollStarted, |
+ host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture)); |
+ EXPECT_TRUE(host_impl_->ScrollBy(gfx::Point(), gfx::Vector2d(0, 10))); |
+ host_impl_->ScrollEnd(); |
+ |
+ EXPECT_EQ(0, set_needs_commit_count); |
+ EXPECT_EQ(2, set_needs_redraw_count); |
+ EXPECT_EQ(1, forward_to_main_count); |
} |
} |