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

Side by Side Diff: cc/trees/tree_synchronizer_unittest.cc

Issue 1801853002: Transfer LayerImpl ownership to LayerTreeImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix browser tests Created 4 years, 9 months 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 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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/trees/tree_synchronizer.h" 5 #include "cc/trees/tree_synchronizer.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <set> 10 #include <set>
(...skipping 27 matching lines...) Expand all
38 if (layer_impl_destruction_list_) 38 if (layer_impl_destruction_list_)
39 layer_impl_destruction_list_->push_back(id()); 39 layer_impl_destruction_list_->push_back(id());
40 } 40 }
41 41
42 void SetLayerImplDestructionList(std::vector<int>* list) { 42 void SetLayerImplDestructionList(std::vector<int>* list) {
43 layer_impl_destruction_list_ = list; 43 layer_impl_destruction_list_ = list;
44 } 44 }
45 45
46 private: 46 private:
47 MockLayerImpl(LayerTreeImpl* tree_impl, int layer_id) 47 MockLayerImpl(LayerTreeImpl* tree_impl, int layer_id)
48 : LayerImpl(tree_impl, layer_id), 48 : LayerImpl(tree_impl, layer_id), layer_impl_destruction_list_(NULL) {}
49 layer_impl_destruction_list_(NULL) {}
50 49
51 std::vector<int>* layer_impl_destruction_list_; 50 std::vector<int>* layer_impl_destruction_list_;
52 }; 51 };
53 52
54 class MockLayer : public Layer { 53 class MockLayer : public Layer {
55 public: 54 public:
56 static scoped_refptr<MockLayer> Create( 55 static scoped_refptr<MockLayer> Create(
57 std::vector<int>* layer_impl_destruction_list) { 56 std::vector<int>* layer_impl_destruction_list) {
58 return make_scoped_refptr(new MockLayer(layer_impl_destruction_list)); 57 return make_scoped_refptr(new MockLayer(layer_impl_destruction_list));
59 } 58 }
(...skipping 25 matching lines...) Expand all
85 84
86 EXPECT_EQ(layer->id(), layer_impl->id()); 85 EXPECT_EQ(layer->id(), layer_impl->id());
87 EXPECT_EQ(layer_impl->layer_tree_impl(), tree_impl); 86 EXPECT_EQ(layer_impl->layer_tree_impl(), tree_impl);
88 87
89 EXPECT_EQ(layer->non_fast_scrollable_region(), 88 EXPECT_EQ(layer->non_fast_scrollable_region(),
90 layer_impl->non_fast_scrollable_region()); 89 layer_impl->non_fast_scrollable_region());
91 90
92 ASSERT_EQ(!!layer->mask_layer(), !!layer_impl->mask_layer()); 91 ASSERT_EQ(!!layer->mask_layer(), !!layer_impl->mask_layer());
93 if (layer->mask_layer()) { 92 if (layer->mask_layer()) {
94 SCOPED_TRACE("mask_layer"); 93 SCOPED_TRACE("mask_layer");
95 ExpectTreesAreIdentical( 94 ExpectTreesAreIdentical(layer->mask_layer(), layer_impl->mask_layer(),
96 layer->mask_layer(), layer_impl->mask_layer(), tree_impl); 95 tree_impl);
97 } 96 }
98 97
99 ASSERT_EQ(!!layer->replica_layer(), !!layer_impl->replica_layer()); 98 ASSERT_EQ(!!layer->replica_layer(), !!layer_impl->replica_layer());
100 if (layer->replica_layer()) { 99 if (layer->replica_layer()) {
101 SCOPED_TRACE("replica_layer"); 100 SCOPED_TRACE("replica_layer");
102 ExpectTreesAreIdentical( 101 ExpectTreesAreIdentical(layer->replica_layer(), layer_impl->replica_layer(),
103 layer->replica_layer(), layer_impl->replica_layer(), tree_impl); 102 tree_impl);
104 } 103 }
105 104
106 const LayerList& layer_children = layer->children(); 105 const LayerList& layer_children = layer->children();
107 const OwnedLayerImplList& layer_impl_children = layer_impl->children(); 106 const LayerImplList& layer_impl_children = layer_impl->children();
108 107
109 ASSERT_EQ(layer_children.size(), layer_impl_children.size()); 108 ASSERT_EQ(layer_children.size(), layer_impl_children.size());
110 109
111 const std::set<Layer*>* layer_scroll_children = layer->scroll_children(); 110 const std::set<Layer*>* layer_scroll_children = layer->scroll_children();
112 const std::set<LayerImpl*>* layer_impl_scroll_children = 111 const std::set<LayerImpl*>* layer_impl_scroll_children =
113 layer_impl->scroll_children(); 112 layer_impl->scroll_children();
114 113
115 ASSERT_EQ(!!layer_scroll_children, !!layer_impl_scroll_children); 114 ASSERT_EQ(!!layer_scroll_children, !!layer_impl_scroll_children);
116 115
117 if (layer_scroll_children) { 116 if (layer_scroll_children) {
118 ASSERT_EQ( 117 ASSERT_EQ(layer_scroll_children->size(),
119 layer_scroll_children->size(), 118 layer_impl_scroll_children->size());
120 layer_impl_scroll_children->size());
121 } 119 }
122 120
123 const Layer* layer_scroll_parent = layer->scroll_parent(); 121 const Layer* layer_scroll_parent = layer->scroll_parent();
124 const LayerImpl* layer_impl_scroll_parent = layer_impl->scroll_parent(); 122 const LayerImpl* layer_impl_scroll_parent = layer_impl->scroll_parent();
125 123
126 ASSERT_EQ(!!layer_scroll_parent, !!layer_impl_scroll_parent); 124 ASSERT_EQ(!!layer_scroll_parent, !!layer_impl_scroll_parent);
127 125
128 if (layer_scroll_parent) { 126 if (layer_scroll_parent) {
129 ASSERT_EQ(layer_scroll_parent->id(), layer_impl_scroll_parent->id()); 127 ASSERT_EQ(layer_scroll_parent->id(), layer_impl_scroll_parent->id());
130 ASSERT_TRUE(layer_scroll_parent->scroll_children()->find(layer) != 128 ASSERT_TRUE(layer_scroll_parent->scroll_children()->find(layer) !=
131 layer_scroll_parent->scroll_children()->end()); 129 layer_scroll_parent->scroll_children()->end());
132 ASSERT_TRUE(layer_impl_scroll_parent->scroll_children()->find(layer_impl) != 130 ASSERT_TRUE(layer_impl_scroll_parent->scroll_children()->find(layer_impl) !=
133 layer_impl_scroll_parent->scroll_children()->end()); 131 layer_impl_scroll_parent->scroll_children()->end());
134 } 132 }
135 133
136 const std::set<Layer*>* layer_clip_children = layer->clip_children(); 134 const std::set<Layer*>* layer_clip_children = layer->clip_children();
137 const std::set<LayerImpl*>* layer_impl_clip_children = 135 const std::set<LayerImpl*>* layer_impl_clip_children =
138 layer_impl->clip_children(); 136 layer_impl->clip_children();
139 137
140 ASSERT_EQ(!!layer_clip_children, !!layer_impl_clip_children); 138 ASSERT_EQ(!!layer_clip_children, !!layer_impl_clip_children);
141 139
142 if (layer_clip_children) 140 if (layer_clip_children)
143 ASSERT_EQ(layer_clip_children->size(), layer_impl_clip_children->size()); 141 ASSERT_EQ(layer_clip_children->size(), layer_impl_clip_children->size());
144 142
145 const Layer* layer_clip_parent = layer->clip_parent(); 143 const Layer* layer_clip_parent = layer->clip_parent();
146 const LayerImpl* layer_impl_clip_parent = layer_impl->clip_parent(); 144 const LayerImpl* layer_impl_clip_parent = layer_impl->clip_parent();
147 145
148 ASSERT_EQ(!!layer_clip_parent, !!layer_impl_clip_parent); 146 ASSERT_EQ(!!layer_clip_parent, !!layer_impl_clip_parent);
149 147
150 if (layer_clip_parent) { 148 if (layer_clip_parent) {
151 const std::set<LayerImpl*>* clip_children_impl = 149 const std::set<LayerImpl*>* clip_children_impl =
152 layer_impl_clip_parent->clip_children(); 150 layer_impl_clip_parent->clip_children();
153 const std::set<Layer*>* clip_children = 151 const std::set<Layer*>* clip_children = layer_clip_parent->clip_children();
154 layer_clip_parent->clip_children();
155 ASSERT_EQ(layer_clip_parent->id(), layer_impl_clip_parent->id()); 152 ASSERT_EQ(layer_clip_parent->id(), layer_impl_clip_parent->id());
156 ASSERT_TRUE(clip_children->find(layer) != clip_children->end()); 153 ASSERT_TRUE(clip_children->find(layer) != clip_children->end());
157 ASSERT_TRUE(clip_children_impl->find(layer_impl) != 154 ASSERT_TRUE(clip_children_impl->find(layer_impl) !=
158 clip_children_impl->end()); 155 clip_children_impl->end());
159 } 156 }
160 157
161 for (size_t i = 0; i < layer_children.size(); ++i) { 158 for (size_t i = 0; i < layer_children.size(); ++i) {
162 SCOPED_TRACE(base::StringPrintf("child layer %" PRIuS, i).c_str()); 159 SCOPED_TRACE(base::StringPrintf("child layer %" PRIuS, i).c_str());
163 ExpectTreesAreIdentical(layer_children[i].get(), 160 ExpectTreesAreIdentical(layer_children[i].get(), layer_impl_children[i],
164 layer_impl_children[i].get(), tree_impl); 161 tree_impl);
165 } 162 }
166 } 163 }
167 164
168 class TreeSynchronizerTest : public testing::Test { 165 class TreeSynchronizerTest : public testing::Test {
169 public: 166 public:
170 TreeSynchronizerTest() 167 TreeSynchronizerTest()
171 : client_(FakeLayerTreeHostClient::DIRECT_3D), 168 : client_(FakeLayerTreeHostClient::DIRECT_3D),
172 host_(FakeLayerTreeHost::Create(&client_, &task_graph_runner_)) {} 169 host_(FakeLayerTreeHost::Create(&client_, &task_graph_runner_)) {}
173 170
174 protected: 171 protected:
(...skipping 16 matching lines...) Expand all
191 from_map.PendingDelta().get() != from_other.PendingDelta().get()) 188 from_map.PendingDelta().get() != from_other.PendingDelta().get())
192 return false; 189 return false;
193 } 190 }
194 return true; 191 return true;
195 } 192 }
196 }; 193 };
197 194
198 // Attempts to synchronizes a null tree. This should not crash, and should 195 // Attempts to synchronizes a null tree. This should not crash, and should
199 // return a null tree. 196 // return a null tree.
200 TEST_F(TreeSynchronizerTest, SyncNullTree) { 197 TEST_F(TreeSynchronizerTest, SyncNullTree) {
201 scoped_ptr<LayerImpl> layer_impl_tree_root = 198 TreeSynchronizer::SynchronizeTrees(static_cast<Layer*>(NULL),
202 TreeSynchronizer::SynchronizeTrees( 199 host_->active_tree());
203 static_cast<Layer*>(NULL), nullptr, host_->active_tree()); 200 EXPECT_TRUE(!host_->active_tree()->root_layer());
204
205 EXPECT_TRUE(!layer_impl_tree_root.get());
206 } 201 }
207 202
208 // Constructs a very simple tree and synchronizes it without trying to reuse any 203 // Constructs a very simple tree and synchronizes it without trying to reuse any
209 // preexisting layers. 204 // preexisting layers.
210 TEST_F(TreeSynchronizerTest, SyncSimpleTreeFromEmpty) { 205 TEST_F(TreeSynchronizerTest, SyncSimpleTreeFromEmpty) {
211 scoped_refptr<Layer> layer_tree_root = Layer::Create(); 206 scoped_refptr<Layer> layer_tree_root = Layer::Create();
212 layer_tree_root->AddChild(Layer::Create()); 207 layer_tree_root->AddChild(Layer::Create());
213 layer_tree_root->AddChild(Layer::Create()); 208 layer_tree_root->AddChild(Layer::Create());
214 209
215 host_->SetRootLayer(layer_tree_root); 210 host_->SetRootLayer(layer_tree_root);
216 211
217 scoped_ptr<LayerImpl> layer_impl_tree_root = 212 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
218 TreeSynchronizer::SynchronizeTrees( 213 host_->active_tree());
219 layer_tree_root.get(), nullptr, host_->active_tree());
220 214
221 ExpectTreesAreIdentical(layer_tree_root.get(), 215 ExpectTreesAreIdentical(layer_tree_root.get(),
222 layer_impl_tree_root.get(), 216 host_->active_tree()->root_layer(),
223 host_->active_tree()); 217 host_->active_tree());
224 } 218 }
225 219
226 // Constructs a very simple tree and synchronizes it attempting to reuse some 220 // Constructs a very simple tree and synchronizes it attempting to reuse some
227 // layers 221 // layers
228 TEST_F(TreeSynchronizerTest, SyncSimpleTreeReusingLayers) { 222 TEST_F(TreeSynchronizerTest, SyncSimpleTreeReusingLayers) {
229 std::vector<int> layer_impl_destruction_list; 223 std::vector<int> layer_impl_destruction_list;
230 224
231 scoped_refptr<Layer> layer_tree_root = 225 scoped_refptr<Layer> layer_tree_root =
232 MockLayer::Create(&layer_impl_destruction_list); 226 MockLayer::Create(&layer_impl_destruction_list);
233 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 227 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list));
234 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 228 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list));
235 229
236 host_->SetRootLayer(layer_tree_root); 230 host_->SetRootLayer(layer_tree_root);
237 231
238 scoped_ptr<LayerImpl> layer_impl_tree_root = 232 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
239 TreeSynchronizer::SynchronizeTrees( 233 host_->active_tree());
240 layer_tree_root.get(), nullptr, host_->active_tree()); 234 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
241 ExpectTreesAreIdentical(layer_tree_root.get(), 235 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
242 layer_impl_tree_root.get(),
243 host_->active_tree()); 236 host_->active_tree());
244 237
245 // We have to push properties to pick up the destruction list pointer. 238 // We have to push properties to pick up the destruction list pointer.
246 TreeSynchronizer::PushProperties(layer_tree_root.get(), 239 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
247 layer_impl_tree_root.get());
248 240
249 // Add a new layer to the Layer side 241 // Add a new layer to the Layer side
250 layer_tree_root->children()[0]->AddChild( 242 layer_tree_root->children()[0]->AddChild(
251 MockLayer::Create(&layer_impl_destruction_list)); 243 MockLayer::Create(&layer_impl_destruction_list));
252 // Remove one. 244 // Remove one.
253 layer_tree_root->children()[1]->RemoveFromParent(); 245 layer_tree_root->children()[1]->RemoveFromParent();
254 int second_layer_impl_id = layer_impl_tree_root->children()[1]->id(); 246 int second_layer_impl_id = layer_impl_tree_root->children()[1]->id();
255 247
256 // Synchronize again. After the sync the trees should be equivalent and we 248 // Synchronize again. After the sync the trees should be equivalent and we
257 // should have created and destroyed one LayerImpl. 249 // should have created and destroyed one LayerImpl.
258 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 250 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
259 layer_tree_root.get(), std::move(layer_impl_tree_root), 251 host_->active_tree());
260 host_->active_tree()); 252 layer_impl_tree_root = host_->active_tree()->root_layer();
261 ExpectTreesAreIdentical(layer_tree_root.get(), 253
262 layer_impl_tree_root.get(), 254 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
263 host_->active_tree()); 255 host_->active_tree());
264 256
265 ASSERT_EQ(1u, layer_impl_destruction_list.size()); 257 ASSERT_EQ(1u, layer_impl_destruction_list.size());
266 EXPECT_EQ(second_layer_impl_id, layer_impl_destruction_list[0]); 258 EXPECT_EQ(second_layer_impl_id, layer_impl_destruction_list[0]);
259
260 host_->active_tree()->ClearLayers();
267 } 261 }
268 262
269 // Constructs a very simple tree and checks that a stacking-order change is 263 // Constructs a very simple tree and checks that a stacking-order change is
270 // tracked properly. 264 // tracked properly.
271 TEST_F(TreeSynchronizerTest, SyncSimpleTreeAndTrackStackingOrderChange) { 265 TEST_F(TreeSynchronizerTest, SyncSimpleTreeAndTrackStackingOrderChange) {
272 std::vector<int> layer_impl_destruction_list; 266 std::vector<int> layer_impl_destruction_list;
273 267
274 // Set up the tree and sync once. child2 needs to be synced here, too, even 268 // Set up the tree and sync once. child2 needs to be synced here, too, even
275 // though we remove it to set up the intended scenario. 269 // though we remove it to set up the intended scenario.
276 scoped_refptr<Layer> layer_tree_root = 270 scoped_refptr<Layer> layer_tree_root =
277 MockLayer::Create(&layer_impl_destruction_list); 271 MockLayer::Create(&layer_impl_destruction_list);
278 scoped_refptr<Layer> child2 = MockLayer::Create(&layer_impl_destruction_list); 272 scoped_refptr<Layer> child2 = MockLayer::Create(&layer_impl_destruction_list);
279 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 273 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list));
280 layer_tree_root->AddChild(child2); 274 layer_tree_root->AddChild(child2);
281 275
282 host_->SetRootLayer(layer_tree_root); 276 host_->SetRootLayer(layer_tree_root);
283 277
284 host_->active_tree()->SetRootLayer(TreeSynchronizer::SynchronizeTrees( 278 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
285 layer_tree_root.get(), nullptr, host_->active_tree())); 279 host_->active_tree());
286 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer(); 280 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
287 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, 281 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
288 host_->active_tree()); 282 host_->active_tree());
289 283
290 // We have to push properties to pick up the destruction list pointer. 284 // We have to push properties to pick up the destruction list pointer.
291 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root); 285 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
292 286
293 host_->active_tree()->ResetAllChangeTracking( 287 host_->active_tree()->ResetAllChangeTracking(
294 PropertyTrees::ResetFlags::ALL_TREES); 288 PropertyTrees::ResetFlags::ALL_TREES);
295 289
296 // re-insert the layer and sync again. 290 // re-insert the layer and sync again.
297 child2->RemoveFromParent(); 291 child2->RemoveFromParent();
298 layer_tree_root->AddChild(child2); 292 layer_tree_root->AddChild(child2);
299 host_->active_tree()->SetRootLayer(TreeSynchronizer::SynchronizeTrees( 293 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
300 layer_tree_root.get(), host_->active_tree()->DetachLayerTree(), 294 host_->active_tree());
301 host_->active_tree()));
302 layer_impl_tree_root = host_->active_tree()->root_layer(); 295 layer_impl_tree_root = host_->active_tree()->root_layer();
303 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, 296 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
304 host_->active_tree()); 297 host_->active_tree());
305 298
306 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root); 299 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
307 300
308 // Check that the impl thread properly tracked the change. 301 // Check that the impl thread properly tracked the change.
309 EXPECT_FALSE(layer_impl_tree_root->LayerPropertyChanged()); 302 EXPECT_FALSE(layer_impl_tree_root->LayerPropertyChanged());
310 EXPECT_FALSE(layer_impl_tree_root->children()[0]->LayerPropertyChanged()); 303 EXPECT_FALSE(layer_impl_tree_root->children()[0]->LayerPropertyChanged());
311 EXPECT_TRUE(layer_impl_tree_root->children()[1]->LayerPropertyChanged()); 304 EXPECT_TRUE(layer_impl_tree_root->children()[1]->LayerPropertyChanged());
312 host_->active_tree()->DetachLayerTree(); 305 host_->active_tree()->ClearLayers();
313 } 306 }
314 307
315 TEST_F(TreeSynchronizerTest, SyncSimpleTreeAndProperties) { 308 TEST_F(TreeSynchronizerTest, SyncSimpleTreeAndProperties) {
316 scoped_refptr<Layer> layer_tree_root = Layer::Create(); 309 scoped_refptr<Layer> layer_tree_root = Layer::Create();
317 layer_tree_root->AddChild(Layer::Create()); 310 layer_tree_root->AddChild(Layer::Create());
318 layer_tree_root->AddChild(Layer::Create()); 311 layer_tree_root->AddChild(Layer::Create());
319 312
320 host_->SetRootLayer(layer_tree_root); 313 host_->SetRootLayer(layer_tree_root);
321 314
322 // Pick some random properties to set. The values are not important, we're 315 // Pick some random properties to set. The values are not important, we're
323 // just testing that at least some properties are making it through. 316 // just testing that at least some properties are making it through.
324 gfx::PointF root_position = gfx::PointF(2.3f, 7.4f); 317 gfx::PointF root_position = gfx::PointF(2.3f, 7.4f);
325 layer_tree_root->SetPosition(root_position); 318 layer_tree_root->SetPosition(root_position);
326 319
327 float first_child_opacity = 0.25f; 320 float first_child_opacity = 0.25f;
328 layer_tree_root->children()[0]->SetOpacity(first_child_opacity); 321 layer_tree_root->children()[0]->SetOpacity(first_child_opacity);
329 322
330 gfx::Size second_child_bounds = gfx::Size(25, 53); 323 gfx::Size second_child_bounds = gfx::Size(25, 53);
331 layer_tree_root->children()[1]->SetBounds(second_child_bounds); 324 layer_tree_root->children()[1]->SetBounds(second_child_bounds);
332 layer_tree_root->children()[1]->SavePaintProperties(); 325 layer_tree_root->children()[1]->SavePaintProperties();
333 326
334 scoped_ptr<LayerImpl> layer_impl_tree_root = 327 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
335 TreeSynchronizer::SynchronizeTrees( 328 host_->active_tree());
336 layer_tree_root.get(), nullptr, host_->active_tree()); 329 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
337 ExpectTreesAreIdentical(layer_tree_root.get(), 330 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
338 layer_impl_tree_root.get(),
339 host_->active_tree()); 331 host_->active_tree());
340 332
341 TreeSynchronizer::PushProperties(layer_tree_root.get(), 333 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
342 layer_impl_tree_root.get());
343 334
344 // Check that the property values we set on the Layer tree are reflected in 335 // Check that the property values we set on the Layer tree are reflected in
345 // the LayerImpl tree. 336 // the LayerImpl tree.
346 gfx::PointF root_layer_impl_position = layer_impl_tree_root->position(); 337 gfx::PointF root_layer_impl_position = layer_impl_tree_root->position();
347 EXPECT_EQ(root_position.x(), root_layer_impl_position.x()); 338 EXPECT_EQ(root_position.x(), root_layer_impl_position.x());
348 EXPECT_EQ(root_position.y(), root_layer_impl_position.y()); 339 EXPECT_EQ(root_position.y(), root_layer_impl_position.y());
349 340
350 EXPECT_EQ(first_child_opacity, 341 EXPECT_EQ(first_child_opacity,
351 layer_impl_tree_root->children()[0]->opacity()); 342 layer_impl_tree_root->children()[0]->opacity());
352 343
353 gfx::Size second_layer_impl_child_bounds = 344 gfx::Size second_layer_impl_child_bounds =
354 layer_impl_tree_root->children()[1]->bounds(); 345 layer_impl_tree_root->children()[1]->bounds();
355 EXPECT_EQ(second_child_bounds.width(), 346 EXPECT_EQ(second_child_bounds.width(),
356 second_layer_impl_child_bounds.width()); 347 second_layer_impl_child_bounds.width());
357 EXPECT_EQ(second_child_bounds.height(), 348 EXPECT_EQ(second_child_bounds.height(),
358 second_layer_impl_child_bounds.height()); 349 second_layer_impl_child_bounds.height());
359 } 350 }
360 351
361 TEST_F(TreeSynchronizerTest, ReuseLayerImplsAfterStructuralChange) { 352 TEST_F(TreeSynchronizerTest, ReuseLayerImplsAfterStructuralChange) {
362 std::vector<int> layer_impl_destruction_list; 353 std::vector<int> layer_impl_destruction_list;
363 354
364 // Set up a tree with this sort of structure: 355 // Set up a tree with this sort of structure:
365 // root --- A --- B ---+--- C 356 // root --- A --- B ---+--- C
366 // | 357 // |
367 // +--- D 358 // +--- D
368 scoped_refptr<Layer> layer_tree_root = 359 scoped_refptr<Layer> layer_tree_root =
369 MockLayer::Create(&layer_impl_destruction_list); 360 MockLayer::Create(&layer_impl_destruction_list);
370 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 361 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list));
371 362
372 scoped_refptr<Layer> layer_a = layer_tree_root->children()[0].get(); 363 scoped_refptr<Layer> layer_a = layer_tree_root->children()[0];
373 layer_a->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 364 layer_a->AddChild(MockLayer::Create(&layer_impl_destruction_list));
374 365
375 scoped_refptr<Layer> layer_b = layer_a->children()[0].get(); 366 scoped_refptr<Layer> layer_b = layer_a->children()[0];
376 layer_b->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 367 layer_b->AddChild(MockLayer::Create(&layer_impl_destruction_list));
377 368
378 scoped_refptr<Layer> layer_c = layer_b->children()[0].get(); 369 scoped_refptr<Layer> layer_c = layer_b->children()[0];
379 layer_b->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 370 layer_b->AddChild(MockLayer::Create(&layer_impl_destruction_list));
380 scoped_refptr<Layer> layer_d = layer_b->children()[1].get(); 371 scoped_refptr<Layer> layer_d = layer_b->children()[1];
381 372
382 host_->SetRootLayer(layer_tree_root); 373 host_->SetRootLayer(layer_tree_root);
383 374
384 scoped_ptr<LayerImpl> layer_impl_tree_root = 375 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
385 TreeSynchronizer::SynchronizeTrees( 376 host_->active_tree());
386 layer_tree_root.get(), nullptr, host_->active_tree()); 377 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
387 ExpectTreesAreIdentical(layer_tree_root.get(), 378 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
388 layer_impl_tree_root.get(),
389 host_->active_tree()); 379 host_->active_tree());
390 380
391 // We have to push properties to pick up the destruction list pointer. 381 // We have to push properties to pick up the destruction list pointer.
392 TreeSynchronizer::PushProperties(layer_tree_root.get(), 382 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
393 layer_impl_tree_root.get());
394 383
395 // Now restructure the tree to look like this: 384 // Now restructure the tree to look like this:
396 // root --- D ---+--- A 385 // root --- D ---+--- A
397 // | 386 // |
398 // +--- C --- B 387 // +--- C --- B
399 layer_tree_root->RemoveAllChildren(); 388 layer_tree_root->RemoveAllChildren();
400 layer_d->RemoveAllChildren(); 389 layer_d->RemoveAllChildren();
401 layer_tree_root->AddChild(layer_d); 390 layer_tree_root->AddChild(layer_d);
402 layer_a->RemoveAllChildren(); 391 layer_a->RemoveAllChildren();
403 layer_d->AddChild(layer_a); 392 layer_d->AddChild(layer_a);
404 layer_c->RemoveAllChildren(); 393 layer_c->RemoveAllChildren();
405 layer_d->AddChild(layer_c); 394 layer_d->AddChild(layer_c);
406 layer_b->RemoveAllChildren(); 395 layer_b->RemoveAllChildren();
407 layer_c->AddChild(layer_b); 396 layer_c->AddChild(layer_b);
408 397
409 // After another synchronize our trees should match and we should not have 398 // After another synchronize our trees should match and we should not have
410 // destroyed any LayerImpls 399 // destroyed any LayerImpls
411 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 400 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
412 layer_tree_root.get(), std::move(layer_impl_tree_root), 401 host_->active_tree());
413 host_->active_tree()); 402 layer_impl_tree_root = host_->active_tree()->root_layer();
414 ExpectTreesAreIdentical(layer_tree_root.get(), 403 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
415 layer_impl_tree_root.get(),
416 host_->active_tree()); 404 host_->active_tree());
417 405
418 EXPECT_EQ(0u, layer_impl_destruction_list.size()); 406 EXPECT_EQ(0u, layer_impl_destruction_list.size());
407
408 host_->active_tree()->ClearLayers();
419 } 409 }
420 410
421 // Constructs a very simple tree, synchronizes it, then synchronizes to a 411 // Constructs a very simple tree, synchronizes it, then synchronizes to a
422 // totally new tree. All layers from the old tree should be deleted. 412 // totally new tree. All layers from the old tree should be deleted.
423 TEST_F(TreeSynchronizerTest, SyncSimpleTreeThenDestroy) { 413 TEST_F(TreeSynchronizerTest, SyncSimpleTreeThenDestroy) {
424 std::vector<int> layer_impl_destruction_list; 414 std::vector<int> layer_impl_destruction_list;
425 415
426 scoped_refptr<Layer> old_layer_tree_root = 416 scoped_refptr<Layer> old_layer_tree_root =
427 MockLayer::Create(&layer_impl_destruction_list); 417 MockLayer::Create(&layer_impl_destruction_list);
428 old_layer_tree_root->AddChild( 418 old_layer_tree_root->AddChild(
429 MockLayer::Create(&layer_impl_destruction_list)); 419 MockLayer::Create(&layer_impl_destruction_list));
430 old_layer_tree_root->AddChild( 420 old_layer_tree_root->AddChild(
431 MockLayer::Create(&layer_impl_destruction_list)); 421 MockLayer::Create(&layer_impl_destruction_list));
432 422
433 host_->SetRootLayer(old_layer_tree_root); 423 host_->SetRootLayer(old_layer_tree_root);
434 424
435 int old_tree_root_layer_id = old_layer_tree_root->id(); 425 int old_tree_root_layer_id = old_layer_tree_root->id();
436 int old_tree_first_child_layer_id = old_layer_tree_root->children()[0]->id(); 426 int old_tree_first_child_layer_id = old_layer_tree_root->children()[0]->id();
437 int old_tree_second_child_layer_id = old_layer_tree_root->children()[1]->id(); 427 int old_tree_second_child_layer_id = old_layer_tree_root->children()[1]->id();
438 428
439 scoped_ptr<LayerImpl> layer_impl_tree_root = 429 TreeSynchronizer::SynchronizeTrees(old_layer_tree_root.get(),
440 TreeSynchronizer::SynchronizeTrees( 430 host_->active_tree());
441 old_layer_tree_root.get(), nullptr, host_->active_tree()); 431 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
442 ExpectTreesAreIdentical(old_layer_tree_root.get(), 432 ExpectTreesAreIdentical(old_layer_tree_root.get(), layer_impl_tree_root,
443 layer_impl_tree_root.get(),
444 host_->active_tree()); 433 host_->active_tree());
445 434
446 // We have to push properties to pick up the destruction list pointer. 435 // We have to push properties to pick up the destruction list pointer.
447 TreeSynchronizer::PushProperties(old_layer_tree_root.get(), 436 TreeSynchronizer::PushProperties(old_layer_tree_root.get(),
448 layer_impl_tree_root.get()); 437 layer_impl_tree_root);
449 438
450 // Remove all children on the Layer side. 439 // Remove all children on the Layer side.
451 old_layer_tree_root->RemoveAllChildren(); 440 old_layer_tree_root->RemoveAllChildren();
452 441
453 // Synchronize again. After the sync all LayerImpls from the old tree should 442 // Synchronize again. After the sync all LayerImpls from the old tree should
454 // be deleted. 443 // be deleted.
455 scoped_refptr<Layer> new_layer_tree_root = Layer::Create(); 444 scoped_refptr<Layer> new_layer_tree_root = Layer::Create();
456 host_->SetRootLayer(new_layer_tree_root); 445 host_->SetRootLayer(new_layer_tree_root);
457 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 446
458 new_layer_tree_root.get(), std::move(layer_impl_tree_root), 447 TreeSynchronizer::SynchronizeTrees(new_layer_tree_root.get(),
459 host_->active_tree()); 448 host_->active_tree());
460 ExpectTreesAreIdentical(new_layer_tree_root.get(), 449 layer_impl_tree_root = host_->active_tree()->root_layer();
461 layer_impl_tree_root.get(), 450 ExpectTreesAreIdentical(new_layer_tree_root.get(), layer_impl_tree_root,
462 host_->active_tree()); 451 host_->active_tree());
463 452
464 ASSERT_EQ(3u, layer_impl_destruction_list.size()); 453 ASSERT_EQ(3u, layer_impl_destruction_list.size());
465 454
466 EXPECT_TRUE(std::find(layer_impl_destruction_list.begin(), 455 EXPECT_TRUE(std::find(layer_impl_destruction_list.begin(),
467 layer_impl_destruction_list.end(), 456 layer_impl_destruction_list.end(),
468 old_tree_root_layer_id) != 457 old_tree_root_layer_id) !=
469 layer_impl_destruction_list.end()); 458 layer_impl_destruction_list.end());
470 EXPECT_TRUE(std::find(layer_impl_destruction_list.begin(), 459 EXPECT_TRUE(std::find(layer_impl_destruction_list.begin(),
471 layer_impl_destruction_list.end(), 460 layer_impl_destruction_list.end(),
(...skipping 17 matching lines...) Expand all
489 layer_tree_root->children()[0]->SetMaskLayer(mask_layer.get()); 478 layer_tree_root->children()[0]->SetMaskLayer(mask_layer.get());
490 479
491 // Second child gets a replica layer. 480 // Second child gets a replica layer.
492 scoped_refptr<Layer> replica_layer = Layer::Create(); 481 scoped_refptr<Layer> replica_layer = Layer::Create();
493 layer_tree_root->children()[1]->SetReplicaLayer(replica_layer.get()); 482 layer_tree_root->children()[1]->SetReplicaLayer(replica_layer.get());
494 483
495 // Third child gets a replica layer with a mask layer. 484 // Third child gets a replica layer with a mask layer.
496 scoped_refptr<Layer> replica_layer_with_mask = Layer::Create(); 485 scoped_refptr<Layer> replica_layer_with_mask = Layer::Create();
497 scoped_refptr<Layer> replica_mask_layer = Layer::Create(); 486 scoped_refptr<Layer> replica_mask_layer = Layer::Create();
498 replica_layer_with_mask->SetMaskLayer(replica_mask_layer.get()); 487 replica_layer_with_mask->SetMaskLayer(replica_mask_layer.get());
499 layer_tree_root->children()[2]-> 488 layer_tree_root->children()[2]->SetReplicaLayer(
500 SetReplicaLayer(replica_layer_with_mask.get()); 489 replica_layer_with_mask.get());
501 490
502 host_->SetRootLayer(layer_tree_root); 491 host_->SetRootLayer(layer_tree_root);
503 492
504 scoped_ptr<LayerImpl> layer_impl_tree_root = 493 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
505 TreeSynchronizer::SynchronizeTrees( 494 host_->active_tree());
506 layer_tree_root.get(), nullptr, host_->active_tree()); 495 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
507 496 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
508 ExpectTreesAreIdentical(layer_tree_root.get(),
509 layer_impl_tree_root.get(),
510 host_->active_tree()); 497 host_->active_tree());
511 498
512 // Remove the mask layer. 499 // Remove the mask layer.
513 layer_tree_root->children()[0]->SetMaskLayer(NULL); 500 layer_tree_root->children()[0]->SetMaskLayer(NULL);
514 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 501 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
515 layer_tree_root.get(), std::move(layer_impl_tree_root), 502 host_->active_tree());
516 host_->active_tree()); 503 layer_impl_tree_root = host_->active_tree()->root_layer();
517 ExpectTreesAreIdentical(layer_tree_root.get(), 504 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
518 layer_impl_tree_root.get(),
519 host_->active_tree()); 505 host_->active_tree());
520 506
521 // Remove the replica layer. 507 // Remove the replica layer.
522 layer_tree_root->children()[1]->SetReplicaLayer(NULL); 508 layer_tree_root->children()[1]->SetReplicaLayer(NULL);
523 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 509 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
524 layer_tree_root.get(), std::move(layer_impl_tree_root), 510 host_->active_tree());
525 host_->active_tree()); 511 layer_impl_tree_root = host_->active_tree()->root_layer();
526 ExpectTreesAreIdentical(layer_tree_root.get(), 512 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
527 layer_impl_tree_root.get(),
528 host_->active_tree()); 513 host_->active_tree());
529 514
530 // Remove the replica mask. 515 // Remove the replica mask.
531 replica_layer_with_mask->SetMaskLayer(NULL); 516 replica_layer_with_mask->SetMaskLayer(NULL);
532 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 517 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
533 layer_tree_root.get(), std::move(layer_impl_tree_root), 518 host_->active_tree());
534 host_->active_tree()); 519 layer_impl_tree_root = host_->active_tree()->root_layer();
535 ExpectTreesAreIdentical(layer_tree_root.get(), 520 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
536 layer_impl_tree_root.get(),
537 host_->active_tree()); 521 host_->active_tree());
522
523 host_->active_tree()->ClearLayers();
538 } 524 }
539 525
540 TEST_F(TreeSynchronizerTest, SynchronizeScrollParent) { 526 TEST_F(TreeSynchronizerTest, SynchronizeScrollParent) {
541 LayerTreeSettings settings; 527 LayerTreeSettings settings;
542 FakeImplTaskRunnerProvider task_runner_provider; 528 FakeImplTaskRunnerProvider task_runner_provider;
543 FakeRenderingStatsInstrumentation stats_instrumentation; 529 FakeRenderingStatsInstrumentation stats_instrumentation;
530 FakeLayerTreeHostImplClient impl_client;
544 TestSharedBitmapManager shared_bitmap_manager; 531 TestSharedBitmapManager shared_bitmap_manager;
545 TestTaskGraphRunner task_graph_runner; 532 TestTaskGraphRunner task_graph_runner;
546 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( 533 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
547 settings, nullptr, &task_runner_provider, &stats_instrumentation, 534 settings, &impl_client, &task_runner_provider, &stats_instrumentation,
548 &shared_bitmap_manager, nullptr, &task_graph_runner, 0); 535 &shared_bitmap_manager, nullptr, &task_graph_runner, 0);
549 536
550 scoped_refptr<Layer> layer_tree_root = Layer::Create(); 537 scoped_refptr<Layer> layer_tree_root = Layer::Create();
551 scoped_refptr<Layer> scroll_parent = Layer::Create(); 538 scoped_refptr<Layer> scroll_parent = Layer::Create();
552 layer_tree_root->AddChild(scroll_parent); 539 layer_tree_root->AddChild(scroll_parent);
553 layer_tree_root->AddChild(Layer::Create()); 540 layer_tree_root->AddChild(Layer::Create());
554 layer_tree_root->AddChild(Layer::Create()); 541 layer_tree_root->AddChild(Layer::Create());
555 542
556 host_->SetRootLayer(layer_tree_root); 543 host_->SetRootLayer(layer_tree_root);
557 544
558 // First child is the second and third child's scroll parent. 545 // First child is the second and third child's scroll parent.
559 layer_tree_root->children()[1]->SetScrollParent(scroll_parent.get()); 546 layer_tree_root->children()[1]->SetScrollParent(scroll_parent.get());
560 layer_tree_root->children()[2]->SetScrollParent(scroll_parent.get()); 547 layer_tree_root->children()[2]->SetScrollParent(scroll_parent.get());
561 548
562 scoped_ptr<LayerImpl> layer_impl_tree_root = 549 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
563 TreeSynchronizer::SynchronizeTrees( 550 host_impl->active_tree());
564 layer_tree_root.get(), nullptr, host_impl->active_tree()); 551 LayerImpl* layer_impl_tree_root = host_impl->active_tree()->root_layer();
565 TreeSynchronizer::PushProperties(layer_tree_root.get(), 552 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
566 layer_impl_tree_root.get());
567 { 553 {
568 SCOPED_TRACE("case one"); 554 SCOPED_TRACE("case one");
569 ExpectTreesAreIdentical(layer_tree_root.get(), 555 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
570 layer_impl_tree_root.get(),
571 host_impl->active_tree()); 556 host_impl->active_tree());
572 } 557 }
573 558
574 // Remove the first scroll child. 559 // Remove the first scroll child.
575 layer_tree_root->children()[1]->RemoveFromParent(); 560 layer_tree_root->children()[1]->RemoveFromParent();
576 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 561 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
577 layer_tree_root.get(), std::move(layer_impl_tree_root), 562 host_impl->active_tree());
578 host_impl->active_tree()); 563 layer_impl_tree_root = host_impl->active_tree()->root_layer();
579 TreeSynchronizer::PushProperties(layer_tree_root.get(), 564 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
580 layer_impl_tree_root.get());
581 { 565 {
582 SCOPED_TRACE("case two"); 566 SCOPED_TRACE("case two");
583 ExpectTreesAreIdentical(layer_tree_root.get(), 567 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
584 layer_impl_tree_root.get(),
585 host_impl->active_tree()); 568 host_impl->active_tree());
586 } 569 }
587 570
588 // Add an additional scroll layer. 571 // Add an additional scroll layer.
589 scoped_refptr<Layer> additional_scroll_child = Layer::Create(); 572 scoped_refptr<Layer> additional_scroll_child = Layer::Create();
590 layer_tree_root->AddChild(additional_scroll_child); 573 layer_tree_root->AddChild(additional_scroll_child);
591 additional_scroll_child->SetScrollParent(scroll_parent.get()); 574 additional_scroll_child->SetScrollParent(scroll_parent.get());
592 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 575 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
593 layer_tree_root.get(), std::move(layer_impl_tree_root), 576 host_impl->active_tree());
594 host_impl->active_tree()); 577 layer_impl_tree_root = host_impl->active_tree()->root_layer();
595 TreeSynchronizer::PushProperties(layer_tree_root.get(), 578 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
596 layer_impl_tree_root.get());
597 { 579 {
598 SCOPED_TRACE("case three"); 580 SCOPED_TRACE("case three");
599 ExpectTreesAreIdentical(layer_tree_root.get(), 581 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
600 layer_impl_tree_root.get(),
601 host_impl->active_tree()); 582 host_impl->active_tree());
602 } 583 }
603 } 584 }
604 585
605 TEST_F(TreeSynchronizerTest, SynchronizeClipParent) { 586 TEST_F(TreeSynchronizerTest, SynchronizeClipParent) {
606 LayerTreeSettings settings; 587 LayerTreeSettings settings;
607 FakeImplTaskRunnerProvider task_runner_provider; 588 FakeImplTaskRunnerProvider task_runner_provider;
608 FakeRenderingStatsInstrumentation stats_instrumentation; 589 FakeRenderingStatsInstrumentation stats_instrumentation;
590 FakeLayerTreeHostImplClient impl_client;
609 TestSharedBitmapManager shared_bitmap_manager; 591 TestSharedBitmapManager shared_bitmap_manager;
610 TestTaskGraphRunner task_graph_runner; 592 TestTaskGraphRunner task_graph_runner;
611 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( 593 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
612 settings, nullptr, &task_runner_provider, &stats_instrumentation, 594 settings, &impl_client, &task_runner_provider, &stats_instrumentation,
613 &shared_bitmap_manager, nullptr, &task_graph_runner, 0); 595 &shared_bitmap_manager, nullptr, &task_graph_runner, 0);
614 596
615 scoped_refptr<Layer> layer_tree_root = Layer::Create(); 597 scoped_refptr<Layer> layer_tree_root = Layer::Create();
616 scoped_refptr<Layer> clip_parent = Layer::Create(); 598 scoped_refptr<Layer> clip_parent = Layer::Create();
617 scoped_refptr<Layer> intervening = Layer::Create(); 599 scoped_refptr<Layer> intervening = Layer::Create();
618 scoped_refptr<Layer> clip_child1 = Layer::Create(); 600 scoped_refptr<Layer> clip_child1 = Layer::Create();
619 scoped_refptr<Layer> clip_child2 = Layer::Create(); 601 scoped_refptr<Layer> clip_child2 = Layer::Create();
620 layer_tree_root->AddChild(clip_parent); 602 layer_tree_root->AddChild(clip_parent);
621 clip_parent->AddChild(intervening); 603 clip_parent->AddChild(intervening);
622 intervening->AddChild(clip_child1); 604 intervening->AddChild(clip_child1);
623 intervening->AddChild(clip_child2); 605 intervening->AddChild(clip_child2);
624 606
625 host_->SetRootLayer(layer_tree_root); 607 host_->SetRootLayer(layer_tree_root);
626 608
627 // First child is the second and third child's scroll parent. 609 // First child is the second and third child's scroll parent.
628 clip_child1->SetClipParent(clip_parent.get()); 610 clip_child1->SetClipParent(clip_parent.get());
629 clip_child2->SetClipParent(clip_parent.get()); 611 clip_child2->SetClipParent(clip_parent.get());
630 612
631 scoped_ptr<LayerImpl> layer_impl_tree_root = 613 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
632 TreeSynchronizer::SynchronizeTrees( 614 host_impl->active_tree());
633 layer_tree_root.get(), nullptr, host_impl->active_tree()); 615 LayerImpl* layer_impl_tree_root = host_impl->active_tree()->root_layer();
634 TreeSynchronizer::PushProperties(layer_tree_root.get(), 616 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
635 layer_impl_tree_root.get()); 617
636 ExpectTreesAreIdentical(layer_tree_root.get(), 618 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
637 layer_impl_tree_root.get(),
638 host_impl->active_tree()); 619 host_impl->active_tree());
639 620
640 // Remove the first clip child. 621 // Remove the first clip child.
641 clip_child1->RemoveFromParent(); 622 clip_child1->RemoveFromParent();
642 clip_child1 = NULL; 623 clip_child1 = NULL;
643 624
644 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 625 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
645 layer_tree_root.get(), std::move(layer_impl_tree_root), 626 host_impl->active_tree());
646 host_impl->active_tree()); 627 layer_impl_tree_root = host_impl->active_tree()->root_layer();
647 TreeSynchronizer::PushProperties(layer_tree_root.get(), 628 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
648 layer_impl_tree_root.get()); 629 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
649 ExpectTreesAreIdentical(layer_tree_root.get(),
650 layer_impl_tree_root.get(),
651 host_impl->active_tree()); 630 host_impl->active_tree());
652 631
653 // Add an additional clip child. 632 // Add an additional clip child.
654 scoped_refptr<Layer> additional_clip_child = Layer::Create(); 633 scoped_refptr<Layer> additional_clip_child = Layer::Create();
655 intervening->AddChild(additional_clip_child); 634 intervening->AddChild(additional_clip_child);
656 additional_clip_child->SetClipParent(clip_parent.get()); 635 additional_clip_child->SetClipParent(clip_parent.get());
657 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 636 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
658 layer_tree_root.get(), std::move(layer_impl_tree_root), 637 host_impl->active_tree());
659 host_impl->active_tree()); 638 layer_impl_tree_root = host_impl->active_tree()->root_layer();
660 TreeSynchronizer::PushProperties(layer_tree_root.get(), 639 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
661 layer_impl_tree_root.get()); 640 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
662 ExpectTreesAreIdentical(layer_tree_root.get(),
663 layer_impl_tree_root.get(),
664 host_impl->active_tree()); 641 host_impl->active_tree());
665 642
666 // Remove the nearest clipping ancestor. 643 // Remove the nearest clipping ancestor.
667 clip_parent->RemoveFromParent(); 644 clip_parent->RemoveFromParent();
668 clip_parent = NULL; 645 clip_parent = NULL;
669 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 646 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
670 layer_tree_root.get(), std::move(layer_impl_tree_root), 647 host_impl->active_tree());
671 host_impl->active_tree()); 648 layer_impl_tree_root = host_impl->active_tree()->root_layer();
672 TreeSynchronizer::PushProperties(layer_tree_root.get(), 649 TreeSynchronizer::PushProperties(layer_tree_root.get(), layer_impl_tree_root);
673 layer_impl_tree_root.get()); 650 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
674 ExpectTreesAreIdentical(layer_tree_root.get(),
675 layer_impl_tree_root.get(),
676 host_impl->active_tree()); 651 host_impl->active_tree());
677 652
678 // The clip children should have been unhooked. 653 // The clip children should have been unhooked.
679 EXPECT_EQ(2u, intervening->children().size()); 654 EXPECT_EQ(2u, intervening->children().size());
680 EXPECT_FALSE(clip_child2->clip_parent()); 655 EXPECT_FALSE(clip_child2->clip_parent());
681 EXPECT_FALSE(additional_clip_child->clip_parent()); 656 EXPECT_FALSE(additional_clip_child->clip_parent());
682 } 657 }
683 658
684 TEST_F(TreeSynchronizerTest, SynchronizeCurrentlyScrollingNode) { 659 TEST_F(TreeSynchronizerTest, SynchronizeCurrentlyScrollingNode) {
685 LayerTreeSettings settings; 660 LayerTreeSettings settings;
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
818 scroll_offset_map[scroll_layer->id()]->PullDeltaForMainThread(); 793 scroll_offset_map[scroll_layer->id()]->PullDeltaForMainThread();
819 scroll_offset_map[scroll_layer->id()]->SetCurrent(gfx::ScrollOffset(40, 50)); 794 scroll_offset_map[scroll_layer->id()]->SetCurrent(gfx::ScrollOffset(40, 50));
820 scroll_offset_map[scroll_layer->id()]->PushFromMainThread( 795 scroll_offset_map[scroll_layer->id()]->PushFromMainThread(
821 gfx::ScrollOffset(100, 100)); 796 gfx::ScrollOffset(100, 100));
822 scroll_offset_map[scroll_layer->id()]->PushPendingToActive(); 797 scroll_offset_map[scroll_layer->id()]->PushPendingToActive();
823 EXPECT_TRUE(is_equal(scroll_offset_map, scroll_tree.scroll_offset_map())); 798 EXPECT_TRUE(is_equal(scroll_offset_map, scroll_tree.scroll_offset_map()));
824 } 799 }
825 800
826 } // namespace 801 } // namespace
827 } // namespace cc 802 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698