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

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: test compile 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
« no previous file with comments | « cc/blimp/layer_tree_host_remote.cc ('k') | cc/blimp/remote_compositor_bridge_client.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <memory> 7 #include <memory>
8 #include <unordered_set> 8 #include <unordered_set>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/run_loop.h" 11 #include "base/run_loop.h"
12 #include "base/threading/thread_task_runner_handle.h" 12 #include "base/threading/thread_task_runner_handle.h"
13 #include "cc/animation/animation_host.h" 13 #include "cc/animation/animation_host.h"
14 #include "cc/layers/layer.h" 14 #include "cc/layers/layer.h"
15 #include "cc/output/begin_frame_args.h" 15 #include "cc/output/begin_frame_args.h"
16 #include "cc/proto/client_state_update.pb.h"
16 #include "cc/proto/compositor_message.pb.h" 17 #include "cc/proto/compositor_message.pb.h"
18 #include "cc/proto/gfx_conversions.h"
17 #include "cc/test/fake_image_serialization_processor.h" 19 #include "cc/test/fake_image_serialization_processor.h"
18 #include "cc/test/fake_remote_compositor_bridge.h" 20 #include "cc/test/fake_remote_compositor_bridge.h"
19 #include "cc/test/stub_layer_tree_host_client.h" 21 #include "cc/test/stub_layer_tree_host_client.h"
20 #include "cc/trees/layer_tree_settings.h" 22 #include "cc/trees/layer_tree_settings.h"
21 #include "testing/gmock/include/gmock/gmock.h" 23 #include "testing/gmock/include/gmock/gmock.h"
22 #include "testing/gtest/include/gtest/gtest.h" 24 #include "testing/gtest/include/gtest/gtest.h"
23 25
24 using testing::InSequence; 26 using testing::InSequence;
25 using testing::Mock; 27 using testing::Mock;
26 using testing::StrictMock; 28 using testing::StrictMock;
27 29
28 #define EXPECT_BEGIN_MAIN_FRAME(client, num) \ 30 #define EXPECT_BEGIN_MAIN_FRAME(client, num) \
29 EXPECT_CALL(client, WillBeginMainFrame()).Times(num); \ 31 EXPECT_CALL(client, WillBeginMainFrame()).Times(num); \
30 EXPECT_CALL(client, DidReceiveBeginMainFrame()).Times(num); \ 32 EXPECT_CALL(client, DidReceiveBeginMainFrame()).Times(num); \
31 EXPECT_CALL(client, DidUpdateLayerTreeHost()).Times(num); \ 33 EXPECT_CALL(client, DidUpdateLayerTreeHost()).Times(num); \
32 EXPECT_CALL(client, WillCommit()).Times(num); \ 34 EXPECT_CALL(client, WillCommit()).Times(num); \
33 EXPECT_CALL(client, DidCommit()).Times(num); \ 35 EXPECT_CALL(client, DidCommit()).Times(num); \
34 EXPECT_CALL(client, DidBeginMainFrame()).Times(num); 36 EXPECT_CALL(client, DidBeginMainFrame()).Times(num);
35 37
36 #define EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(client, num) \ 38 #define EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(client, num) \
37 EXPECT_BEGIN_MAIN_FRAME(client, num) \ 39 EXPECT_BEGIN_MAIN_FRAME(client, num) \
38 EXPECT_CALL(client, DidCommitAndDrawFrame()).Times(num); \ 40 EXPECT_CALL(client, DidCommitAndDrawFrame()).Times(num); \
39 EXPECT_CALL(client, DidReceiveCompositorFrameAck()).Times(num); 41 EXPECT_CALL(client, DidReceiveCompositorFrameAck()).Times(num);
40 42
41 namespace cc { 43 namespace cc {
42 namespace { 44 namespace {
43 45
46 gfx::Vector2dF SerializeScrollUpdate(
47 proto::ClientStateUpdate* client_state_update,
48 Layer* layer,
49 const gfx::ScrollOffset& offset_after_update) {
50 proto::ScrollUpdate* scroll_update =
51 client_state_update->add_scroll_updates();
52 scroll_update->set_layer_id(layer->id());
53 gfx::ScrollOffset scroll_delta = offset_after_update - layer->scroll_offset();
54 gfx::Vector2dF scroll_delta_vector =
55 gfx::ScrollOffsetToVector2dF(scroll_delta);
56 Vector2dFToProto(scroll_delta_vector, scroll_update->mutable_scroll_delta());
57 return scroll_delta_vector;
58 }
59
44 class UpdateTrackingRemoteCompositorBridge : public FakeRemoteCompositorBridge { 60 class UpdateTrackingRemoteCompositorBridge : public FakeRemoteCompositorBridge {
45 public: 61 public:
46 UpdateTrackingRemoteCompositorBridge( 62 UpdateTrackingRemoteCompositorBridge(
47 scoped_refptr<base::SingleThreadTaskRunner> compositor_main_task_runner) 63 scoped_refptr<base::SingleThreadTaskRunner> compositor_main_task_runner)
48 : FakeRemoteCompositorBridge(std::move(compositor_main_task_runner)) {} 64 : FakeRemoteCompositorBridge(std::move(compositor_main_task_runner)) {}
49 65
50 ~UpdateTrackingRemoteCompositorBridge() override = default; 66 ~UpdateTrackingRemoteCompositorBridge() override = default;
51 67
52 void ProcessCompositorStateUpdate( 68 void ProcessCompositorStateUpdate(
53 std::unique_ptr<CompositorProtoState> compositor_proto_state) override { 69 std::unique_ptr<CompositorProtoState> compositor_proto_state) override {
54 num_updates_received_++; 70 num_updates_received_++;
55 compositor_proto_state_ = std::move(compositor_proto_state); 71 compositor_proto_state_ = std::move(compositor_proto_state);
56 }; 72 };
57 73
58 bool SendUpdates(const std::unordered_map<int, gfx::ScrollOffset>& scroll_map, 74 void SendUpdates(const proto::ClientStateUpdate& client_state_update) {
59 float page_scale) { 75 client_->ApplyStateUpdateFromClient(client_state_update);
60 return client_->ApplyScrollAndScaleUpdateFromClient(scroll_map, page_scale);
61 } 76 }
62 77
63 int num_updates_received() const { return num_updates_received_; } 78 int num_updates_received() const { return num_updates_received_; }
64 79
65 CompositorProtoState* compositor_proto_state() { 80 CompositorProtoState* compositor_proto_state() {
66 return compositor_proto_state_.get(); 81 return compositor_proto_state_.get();
67 } 82 }
68 83
69 private: 84 private:
70 int num_updates_received_ = 0; 85 int num_updates_received_ = 0;
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after
373 EXPECT_TRUE(root_layer_->did_update()); 388 EXPECT_TRUE(root_layer_->did_update());
374 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received()); 389 EXPECT_EQ(1, remote_compositor_bridge_->num_updates_received());
375 } 390 }
376 391
377 TEST_F(LayerTreeHostRemoteTest, ScrollAndScaleSync) { 392 TEST_F(LayerTreeHostRemoteTest, ScrollAndScaleSync) {
378 scoped_refptr<Layer> child_layer1 = make_scoped_refptr(new MockLayer(false)); 393 scoped_refptr<Layer> child_layer1 = make_scoped_refptr(new MockLayer(false));
379 root_layer_->AddChild(child_layer1); 394 root_layer_->AddChild(child_layer1);
380 395
381 scoped_refptr<Layer> child_layer2 = make_scoped_refptr(new MockLayer(false)); 396 scoped_refptr<Layer> child_layer2 = make_scoped_refptr(new MockLayer(false));
382 child_layer1->AddChild(child_layer2); 397 child_layer1->AddChild(child_layer2);
398 child_layer2->SetScrollOffset(gfx::ScrollOffset(3, 9));
383 399
384 scoped_refptr<Layer> inner_viewport_layer = 400 scoped_refptr<Layer> inner_viewport_layer =
385 make_scoped_refptr(new MockLayer(false)); 401 make_scoped_refptr(new MockLayer(false));
386 inner_viewport_layer->SetScrollOffset(gfx::ScrollOffset(5, 10)); 402 inner_viewport_layer->SetScrollOffset(gfx::ScrollOffset(5, 10));
387 root_layer_->AddChild(inner_viewport_layer); 403 root_layer_->AddChild(inner_viewport_layer);
388 layer_tree_host_->GetLayerTree()->RegisterViewportLayers( 404 layer_tree_host_->GetLayerTree()->RegisterViewportLayers(
389 nullptr, nullptr, inner_viewport_layer, nullptr); 405 nullptr, nullptr, inner_viewport_layer, nullptr);
390 406
391 // Send scroll and scale updates from client. 407 // First test case.
392 std::unordered_map<int, gfx::ScrollOffset> scroll_updates; 408 gfx::ScrollOffset expected_child1_offset(4, 5);
393 gfx::ScrollOffset child1_offset(4, 5); 409 gfx::ScrollOffset expected_child2_offset(3, 10);
394 gfx::ScrollOffset child2_offset(3, 10); 410 gfx::ScrollOffset expected_inner_viewport_offset(-2, 5);
395 gfx::Vector2dF inner_viewport_delta(-2, 5); 411 float expected_page_scale = 2.0f;
396 gfx::ScrollOffset inner_viewport_offset = gfx::ScrollOffsetWithDelta(
397 inner_viewport_layer->scroll_offset(), inner_viewport_delta);
398 scroll_updates[child_layer1->id()] = child1_offset;
399 scroll_updates[child_layer2->id()] = child2_offset;
400 scroll_updates[inner_viewport_layer->id()] = inner_viewport_offset;
401 412
402 float page_scale_delta = 0.3f; 413 proto::ClientStateUpdate client_state_update;
403 float current_scale_factor = 0.5f; 414 SerializeScrollUpdate(&client_state_update, child_layer1.get(),
404 layer_tree_host_->GetLayerTree()->SetPageScaleFactorAndLimits( 415 expected_child1_offset);
405 current_scale_factor, 0.0f, 1.0f); 416 SerializeScrollUpdate(&client_state_update, child_layer2.get(),
406 float new_scale_factor = current_scale_factor * page_scale_delta; 417 expected_child2_offset);
418 gfx::Vector2dF inner_viewport_delta =
419 SerializeScrollUpdate(&client_state_update, inner_viewport_layer.get(),
420 expected_inner_viewport_offset);
421 float page_scale_delta =
422 expected_page_scale /
423 layer_tree_host_->GetLayerTree()->page_scale_factor();
424 client_state_update.set_page_scale_delta(page_scale_delta);
407 425
408 EXPECT_CALL(mock_layer_tree_host_client_, 426 EXPECT_CALL(mock_layer_tree_host_client_,
409 ApplyViewportDeltas(inner_viewport_delta, gfx::Vector2dF(), 427 ApplyViewportDeltas(inner_viewport_delta, gfx::Vector2dF(),
410 gfx::Vector2dF(), page_scale_delta, 1.0f)) 428 gfx::Vector2dF(), page_scale_delta, 0.0f))
411 .Times(1); 429 .Times(1);
412 bool updates_applied = 430
413 remote_compositor_bridge_->SendUpdates(scroll_updates, new_scale_factor); 431 remote_compositor_bridge_->SendUpdates(client_state_update);
414 EXPECT_TRUE(updates_applied); 432
415 // The host should have pre-emtively applied the changes. 433 // The host should have pre-emtively applied the changes.
416 EXPECT_EQ(new_scale_factor, 434 EXPECT_EQ(expected_page_scale,
417 layer_tree_host_->GetLayerTree()->page_scale_factor()); 435 layer_tree_host_->GetLayerTree()->page_scale_factor());
418 EXPECT_EQ(child1_offset, child_layer1->scroll_offset()); 436 EXPECT_EQ(expected_child1_offset, child_layer1->scroll_offset());
419 EXPECT_EQ(child2_offset, child_layer2->scroll_offset()); 437 EXPECT_EQ(expected_child2_offset, child_layer2->scroll_offset());
420 EXPECT_EQ(inner_viewport_offset, inner_viewport_layer->scroll_offset()); 438 EXPECT_EQ(expected_inner_viewport_offset,
439 inner_viewport_layer->scroll_offset());
421 440
422 // Destroy a layer and send a scroll update for it. We should be informed that 441 // Remove a layer from the tree and send a scroll update for it.
423 // the update could not be applied successfully.
424 child_layer1->RemoveAllChildren(); 442 child_layer1->RemoveAllChildren();
425 scroll_updates.clear(); 443 proto::ClientStateUpdate client_state_update2;
426 scroll_updates[child_layer2->id()] = gfx::ScrollOffset(3, 2); 444 SerializeScrollUpdate(&client_state_update2, child_layer2.get(),
427 updates_applied = 445 gfx::ScrollOffset(9, 10));
428 remote_compositor_bridge_->SendUpdates(scroll_updates, new_scale_factor); 446 remote_compositor_bridge_->SendUpdates(client_state_update2);
429 EXPECT_FALSE(updates_applied);
430 } 447 }
431 448
432 TEST_F(LayerTreeHostRemoteTest, IdentifiedLayersToSkipUpdates) { 449 TEST_F(LayerTreeHostRemoteTest, IdentifiedLayersToSkipUpdates) {
433 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_, 1); 450 EXPECT_BEGIN_MAIN_FRAME_AND_COMMIT(mock_layer_tree_host_client_, 1);
434 451
435 scoped_refptr<MockLayer> non_drawable_layer = new MockLayer(true); 452 scoped_refptr<MockLayer> non_drawable_layer = new MockLayer(true);
436 non_drawable_layer->SetIsDrawable(false); 453 non_drawable_layer->SetIsDrawable(false);
437 non_drawable_layer->SetBounds(gfx::Size(5, 5)); 454 non_drawable_layer->SetBounds(gfx::Size(5, 5));
438 455
439 scoped_refptr<MockLayer> empty_bound_layer = new MockLayer(true); 456 scoped_refptr<MockLayer> empty_bound_layer = new MockLayer(true);
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 DCHECK(compositor_proto_state); 527 DCHECK(compositor_proto_state);
511 const proto::LayerUpdate& layer_updates_second_commit = 528 const proto::LayerUpdate& layer_updates_second_commit =
512 compositor_proto_state->compositor_message->layer_tree_host() 529 compositor_proto_state->compositor_message->layer_tree_host()
513 .layer_updates(); 530 .layer_updates();
514 EXPECT_EQ(1, layer_updates_second_commit.layers_size()); 531 EXPECT_EQ(1, layer_updates_second_commit.layers_size());
515 EXPECT_EQ(child_layer->id(), layer_updates_second_commit.layers(0).id()); 532 EXPECT_EQ(child_layer->id(), layer_updates_second_commit.layers(0).id());
516 } 533 }
517 534
518 } // namespace 535 } // namespace
519 } // namespace cc 536 } // namespace cc
OLDNEW
« no previous file with comments | « cc/blimp/layer_tree_host_remote.cc ('k') | cc/blimp/remote_compositor_bridge_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698