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

Side by Side Diff: cc/blimp/layer_tree_host_remote_unittest.cc

Issue 2445093002: cc/blimp: Add synchronization for scroll/scale state. (Closed)
Patch Set: move application of deltas to push time. Created 4 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/blimp/layer_tree_host_remote.h" 5 #include "cc/blimp/layer_tree_host_remote.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "base/threading/thread_task_runner_handle.h" 9 #include "base/threading/thread_task_runner_handle.h"
10 #include "cc/animation/animation_host.h" 10 #include "cc/animation/animation_host.h"
11 #include "cc/layers/layer.h" 11 #include "cc/layers/layer.h"
12 #include "cc/output/begin_frame_args.h" 12 #include "cc/output/begin_frame_args.h"
13 #include "cc/proto/client_state_update.pb.h"
14 #include "cc/proto/gfx_conversions.h"
13 #include "cc/test/fake_image_serialization_processor.h" 15 #include "cc/test/fake_image_serialization_processor.h"
14 #include "cc/test/fake_remote_compositor_bridge.h" 16 #include "cc/test/fake_remote_compositor_bridge.h"
15 #include "cc/test/stub_layer_tree_host_client.h" 17 #include "cc/test/stub_layer_tree_host_client.h"
16 #include "cc/trees/layer_tree_settings.h" 18 #include "cc/trees/layer_tree_settings.h"
17 #include "testing/gmock/include/gmock/gmock.h" 19 #include "testing/gmock/include/gmock/gmock.h"
18 #include "testing/gtest/include/gtest/gtest.h" 20 #include "testing/gtest/include/gtest/gtest.h"
19 21
20 using testing::InSequence; 22 using testing::InSequence;
21 using testing::Mock; 23 using testing::Mock;
22 using testing::StrictMock; 24 using testing::StrictMock;
23 25
24 #define EXPECT_BEGIN_MAIN_FRAME(client, num) \ 26 #define EXPECT_BEGIN_MAIN_FRAME(client, num) \
25 EXPECT_CALL(client, WillBeginMainFrame()).Times(num); \ 27 EXPECT_CALL(client, WillBeginMainFrame()).Times(num); \
26 EXPECT_CALL(client, DidReceiveBeginMainFrame()).Times(num); \ 28 EXPECT_CALL(client, DidReceiveBeginMainFrame()).Times(num); \
27 EXPECT_CALL(client, DidUpdateLayerTreeHost()).Times(num); \ 29 EXPECT_CALL(client, DidUpdateLayerTreeHost()).Times(num); \
28 EXPECT_CALL(client, WillCommit()).Times(num); \ 30 EXPECT_CALL(client, WillCommit()).Times(num); \
29 EXPECT_CALL(client, DidCommit()).Times(num); \ 31 EXPECT_CALL(client, DidCommit()).Times(num); \
30 EXPECT_CALL(client, DidBeginMainFrame()).Times(num); 32 EXPECT_CALL(client, DidBeginMainFrame()).Times(num);
31 33
32 #define EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(client, num) \ 34 #define EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(client, num) \
33 EXPECT_BEGIN_MAIN_FRAME(client, num) \ 35 EXPECT_BEGIN_MAIN_FRAME(client, num) \
34 EXPECT_CALL(client, DidCommitAndDrawFrame()).Times(num); \ 36 EXPECT_CALL(client, DidCommitAndDrawFrame()).Times(num); \
35 EXPECT_CALL(client, DidReceiveCompositorFrameAck()).Times(num); 37 EXPECT_CALL(client, DidReceiveCompositorFrameAck()).Times(num);
36 38
37 namespace cc { 39 namespace cc {
38 namespace { 40 namespace {
39 41
42 gfx::Vector2d SerializeScrollUpdate(
aelias_OOO_until_Jul13 2016/10/28 03:40:20 gfx::Vector2dF
Khushal 2016/10/31 21:02:01 Done.
43 proto::ClientStateUpdate* client_state_update,
44 Layer* layer,
45 const gfx::ScrollOffset& offset_after_update) {
46 proto::ScrollUpdate* scroll_update =
47 client_state_update->add_scroll_updates();
48 scroll_update->set_layer_id(layer->id());
49 gfx::ScrollOffset scroll_delta = offset_after_update - layer->scroll_offset();
50 gfx::Vector2d scroll_delta_vector(scroll_delta.x(), scroll_delta.y());
51 Vector2dToProto(scroll_delta_vector, scroll_update->mutable_scroll_delta());
52 return scroll_delta_vector;
53 }
54
40 class UpdateTrackingRemoteCompositorBridge : public FakeRemoteCompositorBridge { 55 class UpdateTrackingRemoteCompositorBridge : public FakeRemoteCompositorBridge {
41 public: 56 public:
42 UpdateTrackingRemoteCompositorBridge( 57 UpdateTrackingRemoteCompositorBridge(
43 scoped_refptr<base::SingleThreadTaskRunner> compositor_main_task_runner) 58 scoped_refptr<base::SingleThreadTaskRunner> compositor_main_task_runner)
44 : FakeRemoteCompositorBridge(std::move(compositor_main_task_runner)) {} 59 : FakeRemoteCompositorBridge(std::move(compositor_main_task_runner)) {}
45 60
46 ~UpdateTrackingRemoteCompositorBridge() override = default; 61 ~UpdateTrackingRemoteCompositorBridge() override = default;
47 62
48 void ProcessCompositorStateUpdate( 63 void ProcessCompositorStateUpdate(
49 std::unique_ptr<CompositorProtoState> compositor_proto_state) override { 64 std::unique_ptr<CompositorProtoState> compositor_proto_state) override {
50 num_updates_received_++; 65 num_updates_received_++;
51 }; 66 };
52 67
53 bool SendUpdates(const std::unordered_map<int, gfx::ScrollOffset>& scroll_map, 68 void SendUpdates(const proto::ClientStateUpdate& client_state_update) {
54 float page_scale) { 69 client_->ApplyStateUpdateFromClient(client_state_update);
55 return client_->ApplyScrollAndScaleUpdateFromClient(scroll_map, page_scale);
56 } 70 }
57 71
58 int num_updates_received() const { return num_updates_received_; } 72 int num_updates_received() const { return num_updates_received_; }
59 73
60 private: 74 private:
61 int num_updates_received_ = 0; 75 int num_updates_received_ = 0;
62 }; 76 };
63 77
64 class MockLayerTreeHostClient : public StubLayerTreeHostClient { 78 class MockLayerTreeHostClient : public StubLayerTreeHostClient {
65 public: 79 public:
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 EXPECT_TRUE(root_layer_->did_update()); 371 EXPECT_TRUE(root_layer_->did_update());
358 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received()); 372 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received());
359 } 373 }
360 374
361 TEST_F(LayerTreeHostRemoteTest, ScrollAndScaleSync) { 375 TEST_F(LayerTreeHostRemoteTest, ScrollAndScaleSync) {
362 scoped_refptr<Layer> child_layer1 = make_scoped_refptr(new MockLayer(false)); 376 scoped_refptr<Layer> child_layer1 = make_scoped_refptr(new MockLayer(false));
363 root_layer_->AddChild(child_layer1); 377 root_layer_->AddChild(child_layer1);
364 378
365 scoped_refptr<Layer> child_layer2 = make_scoped_refptr(new MockLayer(false)); 379 scoped_refptr<Layer> child_layer2 = make_scoped_refptr(new MockLayer(false));
366 child_layer1->AddChild(child_layer2); 380 child_layer1->AddChild(child_layer2);
381 child_layer2->SetScrollOffset(gfx::ScrollOffset(3, 9));
367 382
368 scoped_refptr<Layer> inner_viewport_layer = 383 scoped_refptr<Layer> inner_viewport_layer =
369 make_scoped_refptr(new MockLayer(false)); 384 make_scoped_refptr(new MockLayer(false));
370 inner_viewport_layer->SetScrollOffset(gfx::ScrollOffset(5, 10)); 385 inner_viewport_layer->SetScrollOffset(gfx::ScrollOffset(5, 10));
371 root_layer_->AddChild(inner_viewport_layer); 386 root_layer_->AddChild(inner_viewport_layer);
372 layer_tree_host_->GetLayerTree()->RegisterViewportLayers( 387 layer_tree_host_->GetLayerTree()->RegisterViewportLayers(
373 nullptr, nullptr, inner_viewport_layer, nullptr); 388 nullptr, nullptr, inner_viewport_layer, nullptr);
374 389
375 // Send scroll and scale updates from client. 390 // First test case.
376 std::unordered_map<int, gfx::ScrollOffset> scroll_updates; 391 gfx::ScrollOffset expected_child1_offset(4, 5);
377 gfx::ScrollOffset child1_offset(4, 5); 392 gfx::ScrollOffset expected_child2_offset(3, 10);
378 gfx::ScrollOffset child2_offset(3, 10); 393 gfx::ScrollOffset expected_inner_viewport_offset(-2, 5);
379 gfx::Vector2dF inner_viewport_delta(-2, 5); 394 float expected_page_scale = 2.0f;
380 gfx::ScrollOffset inner_viewport_offset = gfx::ScrollOffsetWithDelta(
381 inner_viewport_layer->scroll_offset(), inner_viewport_delta);
382 scroll_updates[child_layer1->id()] = child1_offset;
383 scroll_updates[child_layer2->id()] = child2_offset;
384 scroll_updates[inner_viewport_layer->id()] = inner_viewport_offset;
385 395
386 float page_scale_delta = 0.3f; 396 proto::ClientStateUpdate client_state_update;
387 float current_scale_factor = 0.5f; 397 SerializeScrollUpdate(&client_state_update, child_layer1.get(),
388 layer_tree_host_->GetLayerTree()->SetPageScaleFactorAndLimits( 398 expected_child1_offset);
389 current_scale_factor, 0.0f, 1.0f); 399 SerializeScrollUpdate(&client_state_update, child_layer2.get(),
390 float new_scale_factor = current_scale_factor * page_scale_delta; 400 expected_child2_offset);
401 gfx::Vector2dF inner_viewport_delta =
402 SerializeScrollUpdate(&client_state_update, inner_viewport_layer.get(),
403 expected_inner_viewport_offset);
404 float page_scale_delta =
405 expected_page_scale /
406 layer_tree_host_->GetLayerTree()->page_scale_factor();
407 client_state_update.set_page_scale_delta(page_scale_delta);
391 408
392 EXPECT_CALL(mock_layer_tree_host_client_, 409 EXPECT_CALL(mock_layer_tree_host_client_,
393 ApplyViewportDeltas(inner_viewport_delta, gfx::Vector2dF(), 410 ApplyViewportDeltas(inner_viewport_delta, gfx::Vector2dF(),
394 gfx::Vector2dF(), page_scale_delta, 1.0f)) 411 gfx::Vector2dF(), page_scale_delta, 0.0f))
395 .Times(1); 412 .Times(1);
396 bool updates_applied = 413
397 remote_compositor_bridge_->SendUpdates(scroll_updates, new_scale_factor); 414 remote_compositor_bridge_->SendUpdates(client_state_update);
398 EXPECT_TRUE(updates_applied); 415
399 // The host should have pre-emtively applied the changes. 416 // The host should have pre-emtively applied the changes.
400 EXPECT_EQ(new_scale_factor, 417 EXPECT_EQ(expected_page_scale,
401 layer_tree_host_->GetLayerTree()->page_scale_factor()); 418 layer_tree_host_->GetLayerTree()->page_scale_factor());
402 EXPECT_EQ(child1_offset, child_layer1->scroll_offset()); 419 EXPECT_EQ(expected_child1_offset, child_layer1->scroll_offset());
403 EXPECT_EQ(child2_offset, child_layer2->scroll_offset()); 420 EXPECT_EQ(expected_child2_offset, child_layer2->scroll_offset());
404 EXPECT_EQ(inner_viewport_offset, inner_viewport_layer->scroll_offset()); 421 EXPECT_EQ(expected_inner_viewport_offset,
422 inner_viewport_layer->scroll_offset());
405 423
406 // Destroy a layer and send a scroll update for it. We should be informed that 424 // Remove a layer from the tree and send a scroll update for it.
407 // the update could not be applied successfully.
408 child_layer1->RemoveAllChildren(); 425 child_layer1->RemoveAllChildren();
409 scroll_updates.clear(); 426 proto::ClientStateUpdate client_state_update2;
410 scroll_updates[child_layer2->id()] = gfx::ScrollOffset(3, 2); 427 SerializeScrollUpdate(&client_state_update2, child_layer2.get(),
411 updates_applied = 428 gfx::ScrollOffset(9, 10));
412 remote_compositor_bridge_->SendUpdates(scroll_updates, new_scale_factor); 429 remote_compositor_bridge_->SendUpdates(client_state_update2);
413 EXPECT_FALSE(updates_applied);
414 } 430 }
415 431
416 } // namespace 432 } // namespace
417 } // namespace cc 433 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698