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

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: more asan. 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
« no previous file with comments | « cc/trees/tree_synchronizer.cc ('k') | chrome/browser/android/compositor/compositor_view.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 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::PushLayerProperties(layer_tree_root->layer_tree_host(), 239 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
247 host_->active_tree()); 240 host_->active_tree());
248 241
249 // Add a new layer to the Layer side 242 // Add a new layer to the Layer side
250 layer_tree_root->children()[0]->AddChild( 243 layer_tree_root->children()[0]->AddChild(
251 MockLayer::Create(&layer_impl_destruction_list)); 244 MockLayer::Create(&layer_impl_destruction_list));
252 // Remove one. 245 // Remove one.
253 layer_tree_root->children()[1]->RemoveFromParent(); 246 layer_tree_root->children()[1]->RemoveFromParent();
254 int second_layer_impl_id = layer_impl_tree_root->children()[1]->id(); 247 int second_layer_impl_id = layer_impl_tree_root->children()[1]->id();
255 248
256 // Synchronize again. After the sync the trees should be equivalent and we 249 // Synchronize again. After the sync the trees should be equivalent and we
257 // should have created and destroyed one LayerImpl. 250 // should have created and destroyed one LayerImpl.
258 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 251 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
259 layer_tree_root.get(), std::move(layer_impl_tree_root), 252 host_->active_tree());
260 host_->active_tree()); 253 layer_impl_tree_root = host_->active_tree()->root_layer();
261 ExpectTreesAreIdentical(layer_tree_root.get(), 254
262 layer_impl_tree_root.get(), 255 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
263 host_->active_tree()); 256 host_->active_tree());
264 257
265 ASSERT_EQ(1u, layer_impl_destruction_list.size()); 258 ASSERT_EQ(1u, layer_impl_destruction_list.size());
266 EXPECT_EQ(second_layer_impl_id, layer_impl_destruction_list[0]); 259 EXPECT_EQ(second_layer_impl_id, layer_impl_destruction_list[0]);
260
261 host_->active_tree()->ClearLayers();
267 } 262 }
268 263
269 // Constructs a very simple tree and checks that a stacking-order change is 264 // Constructs a very simple tree and checks that a stacking-order change is
270 // tracked properly. 265 // tracked properly.
271 TEST_F(TreeSynchronizerTest, SyncSimpleTreeAndTrackStackingOrderChange) { 266 TEST_F(TreeSynchronizerTest, SyncSimpleTreeAndTrackStackingOrderChange) {
272 std::vector<int> layer_impl_destruction_list; 267 std::vector<int> layer_impl_destruction_list;
273 268
274 // Set up the tree and sync once. child2 needs to be synced here, too, even 269 // 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. 270 // though we remove it to set up the intended scenario.
276 scoped_refptr<Layer> layer_tree_root = 271 scoped_refptr<Layer> layer_tree_root =
277 MockLayer::Create(&layer_impl_destruction_list); 272 MockLayer::Create(&layer_impl_destruction_list);
278 scoped_refptr<Layer> child2 = MockLayer::Create(&layer_impl_destruction_list); 273 scoped_refptr<Layer> child2 = MockLayer::Create(&layer_impl_destruction_list);
279 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 274 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list));
280 layer_tree_root->AddChild(child2); 275 layer_tree_root->AddChild(child2);
281 276
282 host_->SetRootLayer(layer_tree_root); 277 host_->SetRootLayer(layer_tree_root);
283 278
284 host_->active_tree()->SetRootLayer(TreeSynchronizer::SynchronizeTrees( 279 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
285 layer_tree_root.get(), nullptr, host_->active_tree())); 280 host_->active_tree());
286 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer(); 281 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
287 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, 282 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
288 host_->active_tree()); 283 host_->active_tree());
289 284
290 // We have to push properties to pick up the destruction list pointer. 285 // We have to push properties to pick up the destruction list pointer.
291 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 286 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
292 host_->active_tree()); 287 host_->active_tree());
293 288
294 host_->active_tree()->ResetAllChangeTracking( 289 host_->active_tree()->ResetAllChangeTracking(
295 PropertyTrees::ResetFlags::ALL_TREES); 290 PropertyTrees::ResetFlags::ALL_TREES);
296 291
297 // re-insert the layer and sync again. 292 // re-insert the layer and sync again.
298 child2->RemoveFromParent(); 293 child2->RemoveFromParent();
299 layer_tree_root->AddChild(child2); 294 layer_tree_root->AddChild(child2);
300 host_->active_tree()->SetRootLayer(TreeSynchronizer::SynchronizeTrees( 295 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
301 layer_tree_root.get(), host_->active_tree()->DetachLayerTree(), 296 host_->active_tree());
302 host_->active_tree()));
303 layer_impl_tree_root = host_->active_tree()->root_layer(); 297 layer_impl_tree_root = host_->active_tree()->root_layer();
304 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root, 298 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
305 host_->active_tree()); 299 host_->active_tree());
306 300
307 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 301 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
308 host_->active_tree()); 302 host_->active_tree());
309 303
310 // Check that the impl thread properly tracked the change. 304 // Check that the impl thread properly tracked the change.
311 EXPECT_FALSE(layer_impl_tree_root->LayerPropertyChanged()); 305 EXPECT_FALSE(layer_impl_tree_root->LayerPropertyChanged());
312 EXPECT_FALSE(layer_impl_tree_root->children()[0]->LayerPropertyChanged()); 306 EXPECT_FALSE(layer_impl_tree_root->children()[0]->LayerPropertyChanged());
313 EXPECT_TRUE(layer_impl_tree_root->children()[1]->LayerPropertyChanged()); 307 EXPECT_TRUE(layer_impl_tree_root->children()[1]->LayerPropertyChanged());
314 host_->active_tree()->DetachLayerTree(); 308 host_->active_tree()->ClearLayers();
315 } 309 }
316 310
317 TEST_F(TreeSynchronizerTest, SyncSimpleTreeAndProperties) { 311 TEST_F(TreeSynchronizerTest, SyncSimpleTreeAndProperties) {
318 scoped_refptr<Layer> layer_tree_root = Layer::Create(); 312 scoped_refptr<Layer> layer_tree_root = Layer::Create();
319 layer_tree_root->AddChild(Layer::Create()); 313 layer_tree_root->AddChild(Layer::Create());
320 layer_tree_root->AddChild(Layer::Create()); 314 layer_tree_root->AddChild(Layer::Create());
321 315
322 host_->SetRootLayer(layer_tree_root); 316 host_->SetRootLayer(layer_tree_root);
323 317
324 // Pick some random properties to set. The values are not important, we're 318 // Pick some random properties to set. The values are not important, we're
325 // just testing that at least some properties are making it through. 319 // just testing that at least some properties are making it through.
326 gfx::PointF root_position = gfx::PointF(2.3f, 7.4f); 320 gfx::PointF root_position = gfx::PointF(2.3f, 7.4f);
327 layer_tree_root->SetPosition(root_position); 321 layer_tree_root->SetPosition(root_position);
328 322
329 float first_child_opacity = 0.25f; 323 float first_child_opacity = 0.25f;
330 layer_tree_root->children()[0]->SetOpacity(first_child_opacity); 324 layer_tree_root->children()[0]->SetOpacity(first_child_opacity);
331 325
332 gfx::Size second_child_bounds = gfx::Size(25, 53); 326 gfx::Size second_child_bounds = gfx::Size(25, 53);
333 layer_tree_root->children()[1]->SetBounds(second_child_bounds); 327 layer_tree_root->children()[1]->SetBounds(second_child_bounds);
334 layer_tree_root->children()[1]->SavePaintProperties(); 328 layer_tree_root->children()[1]->SavePaintProperties();
335 329
336 scoped_ptr<LayerImpl> layer_impl_tree_root = 330 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
337 TreeSynchronizer::SynchronizeTrees( 331 host_->active_tree());
338 layer_tree_root.get(), nullptr, host_->active_tree()); 332 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
339 ExpectTreesAreIdentical(layer_tree_root.get(), 333 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
340 layer_impl_tree_root.get(),
341 host_->active_tree()); 334 host_->active_tree());
342 335
343 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 336 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
344 host_->active_tree()); 337 host_->active_tree());
345 338
346 // Check that the property values we set on the Layer tree are reflected in 339 // Check that the property values we set on the Layer tree are reflected in
347 // the LayerImpl tree. 340 // the LayerImpl tree.
348 gfx::PointF root_layer_impl_position = layer_impl_tree_root->position(); 341 gfx::PointF root_layer_impl_position = layer_impl_tree_root->position();
349 EXPECT_EQ(root_position.x(), root_layer_impl_position.x()); 342 EXPECT_EQ(root_position.x(), root_layer_impl_position.x());
350 EXPECT_EQ(root_position.y(), root_layer_impl_position.y()); 343 EXPECT_EQ(root_position.y(), root_layer_impl_position.y());
(...skipping 13 matching lines...) Expand all
364 std::vector<int> layer_impl_destruction_list; 357 std::vector<int> layer_impl_destruction_list;
365 358
366 // Set up a tree with this sort of structure: 359 // Set up a tree with this sort of structure:
367 // root --- A --- B ---+--- C 360 // root --- A --- B ---+--- C
368 // | 361 // |
369 // +--- D 362 // +--- D
370 scoped_refptr<Layer> layer_tree_root = 363 scoped_refptr<Layer> layer_tree_root =
371 MockLayer::Create(&layer_impl_destruction_list); 364 MockLayer::Create(&layer_impl_destruction_list);
372 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 365 layer_tree_root->AddChild(MockLayer::Create(&layer_impl_destruction_list));
373 366
374 scoped_refptr<Layer> layer_a = layer_tree_root->children()[0].get(); 367 scoped_refptr<Layer> layer_a = layer_tree_root->children()[0];
375 layer_a->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 368 layer_a->AddChild(MockLayer::Create(&layer_impl_destruction_list));
376 369
377 scoped_refptr<Layer> layer_b = layer_a->children()[0].get(); 370 scoped_refptr<Layer> layer_b = layer_a->children()[0];
378 layer_b->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 371 layer_b->AddChild(MockLayer::Create(&layer_impl_destruction_list));
379 372
380 scoped_refptr<Layer> layer_c = layer_b->children()[0].get(); 373 scoped_refptr<Layer> layer_c = layer_b->children()[0];
381 layer_b->AddChild(MockLayer::Create(&layer_impl_destruction_list)); 374 layer_b->AddChild(MockLayer::Create(&layer_impl_destruction_list));
382 scoped_refptr<Layer> layer_d = layer_b->children()[1].get(); 375 scoped_refptr<Layer> layer_d = layer_b->children()[1];
383 376
384 host_->SetRootLayer(layer_tree_root); 377 host_->SetRootLayer(layer_tree_root);
385 378
386 scoped_ptr<LayerImpl> layer_impl_tree_root = 379 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
387 TreeSynchronizer::SynchronizeTrees( 380 host_->active_tree());
388 layer_tree_root.get(), nullptr, host_->active_tree()); 381 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
389 ExpectTreesAreIdentical(layer_tree_root.get(), 382 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
390 layer_impl_tree_root.get(),
391 host_->active_tree()); 383 host_->active_tree());
392 384
393 // We have to push properties to pick up the destruction list pointer. 385 // We have to push properties to pick up the destruction list pointer.
394 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 386 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
395 host_->active_tree()); 387 host_->active_tree());
396 388
397 // Now restructure the tree to look like this: 389 // Now restructure the tree to look like this:
398 // root --- D ---+--- A 390 // root --- D ---+--- A
399 // | 391 // |
400 // +--- C --- B 392 // +--- C --- B
401 layer_tree_root->RemoveAllChildren(); 393 layer_tree_root->RemoveAllChildren();
402 layer_d->RemoveAllChildren(); 394 layer_d->RemoveAllChildren();
403 layer_tree_root->AddChild(layer_d); 395 layer_tree_root->AddChild(layer_d);
404 layer_a->RemoveAllChildren(); 396 layer_a->RemoveAllChildren();
405 layer_d->AddChild(layer_a); 397 layer_d->AddChild(layer_a);
406 layer_c->RemoveAllChildren(); 398 layer_c->RemoveAllChildren();
407 layer_d->AddChild(layer_c); 399 layer_d->AddChild(layer_c);
408 layer_b->RemoveAllChildren(); 400 layer_b->RemoveAllChildren();
409 layer_c->AddChild(layer_b); 401 layer_c->AddChild(layer_b);
410 402
411 // After another synchronize our trees should match and we should not have 403 // After another synchronize our trees should match and we should not have
412 // destroyed any LayerImpls 404 // destroyed any LayerImpls
413 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 405 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
414 layer_tree_root.get(), std::move(layer_impl_tree_root), 406 host_->active_tree());
415 host_->active_tree()); 407 layer_impl_tree_root = host_->active_tree()->root_layer();
416 ExpectTreesAreIdentical(layer_tree_root.get(), 408 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
417 layer_impl_tree_root.get(),
418 host_->active_tree()); 409 host_->active_tree());
419 410
420 EXPECT_EQ(0u, layer_impl_destruction_list.size()); 411 EXPECT_EQ(0u, layer_impl_destruction_list.size());
412
413 host_->active_tree()->ClearLayers();
421 } 414 }
422 415
423 // Constructs a very simple tree, synchronizes it, then synchronizes to a 416 // Constructs a very simple tree, synchronizes it, then synchronizes to a
424 // totally new tree. All layers from the old tree should be deleted. 417 // totally new tree. All layers from the old tree should be deleted.
425 TEST_F(TreeSynchronizerTest, SyncSimpleTreeThenDestroy) { 418 TEST_F(TreeSynchronizerTest, SyncSimpleTreeThenDestroy) {
426 std::vector<int> layer_impl_destruction_list; 419 std::vector<int> layer_impl_destruction_list;
427 420
428 scoped_refptr<Layer> old_layer_tree_root = 421 scoped_refptr<Layer> old_layer_tree_root =
429 MockLayer::Create(&layer_impl_destruction_list); 422 MockLayer::Create(&layer_impl_destruction_list);
430 old_layer_tree_root->AddChild( 423 old_layer_tree_root->AddChild(
431 MockLayer::Create(&layer_impl_destruction_list)); 424 MockLayer::Create(&layer_impl_destruction_list));
432 old_layer_tree_root->AddChild( 425 old_layer_tree_root->AddChild(
433 MockLayer::Create(&layer_impl_destruction_list)); 426 MockLayer::Create(&layer_impl_destruction_list));
434 427
435 host_->SetRootLayer(old_layer_tree_root); 428 host_->SetRootLayer(old_layer_tree_root);
436 429
437 int old_tree_root_layer_id = old_layer_tree_root->id(); 430 int old_tree_root_layer_id = old_layer_tree_root->id();
438 int old_tree_first_child_layer_id = old_layer_tree_root->children()[0]->id(); 431 int old_tree_first_child_layer_id = old_layer_tree_root->children()[0]->id();
439 int old_tree_second_child_layer_id = old_layer_tree_root->children()[1]->id(); 432 int old_tree_second_child_layer_id = old_layer_tree_root->children()[1]->id();
440 433
441 scoped_ptr<LayerImpl> layer_impl_tree_root = 434 TreeSynchronizer::SynchronizeTrees(old_layer_tree_root.get(),
442 TreeSynchronizer::SynchronizeTrees( 435 host_->active_tree());
443 old_layer_tree_root.get(), nullptr, host_->active_tree()); 436 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
444 ExpectTreesAreIdentical(old_layer_tree_root.get(), 437 ExpectTreesAreIdentical(old_layer_tree_root.get(), layer_impl_tree_root,
445 layer_impl_tree_root.get(),
446 host_->active_tree()); 438 host_->active_tree());
447 439
448 // We have to push properties to pick up the destruction list pointer. 440 // We have to push properties to pick up the destruction list pointer.
449 TreeSynchronizer::PushLayerProperties(old_layer_tree_root->layer_tree_host(), 441 TreeSynchronizer::PushLayerProperties(old_layer_tree_root->layer_tree_host(),
450 host_->active_tree()); 442 host_->active_tree());
451 443
452 // Remove all children on the Layer side. 444 // Remove all children on the Layer side.
453 old_layer_tree_root->RemoveAllChildren(); 445 old_layer_tree_root->RemoveAllChildren();
454 446
455 // Synchronize again. After the sync all LayerImpls from the old tree should 447 // Synchronize again. After the sync all LayerImpls from the old tree should
456 // be deleted. 448 // be deleted.
457 scoped_refptr<Layer> new_layer_tree_root = Layer::Create(); 449 scoped_refptr<Layer> new_layer_tree_root = Layer::Create();
458 host_->SetRootLayer(new_layer_tree_root); 450 host_->SetRootLayer(new_layer_tree_root);
459 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 451
460 new_layer_tree_root.get(), std::move(layer_impl_tree_root), 452 TreeSynchronizer::SynchronizeTrees(new_layer_tree_root.get(),
461 host_->active_tree()); 453 host_->active_tree());
462 ExpectTreesAreIdentical(new_layer_tree_root.get(), 454 layer_impl_tree_root = host_->active_tree()->root_layer();
463 layer_impl_tree_root.get(), 455 ExpectTreesAreIdentical(new_layer_tree_root.get(), layer_impl_tree_root,
464 host_->active_tree()); 456 host_->active_tree());
465 457
466 ASSERT_EQ(3u, layer_impl_destruction_list.size()); 458 ASSERT_EQ(3u, layer_impl_destruction_list.size());
467 459
468 EXPECT_TRUE(std::find(layer_impl_destruction_list.begin(), 460 EXPECT_TRUE(std::find(layer_impl_destruction_list.begin(),
469 layer_impl_destruction_list.end(), 461 layer_impl_destruction_list.end(),
470 old_tree_root_layer_id) != 462 old_tree_root_layer_id) !=
471 layer_impl_destruction_list.end()); 463 layer_impl_destruction_list.end());
472 EXPECT_TRUE(std::find(layer_impl_destruction_list.begin(), 464 EXPECT_TRUE(std::find(layer_impl_destruction_list.begin(),
473 layer_impl_destruction_list.end(), 465 layer_impl_destruction_list.end(),
(...skipping 17 matching lines...) Expand all
491 layer_tree_root->children()[0]->SetMaskLayer(mask_layer.get()); 483 layer_tree_root->children()[0]->SetMaskLayer(mask_layer.get());
492 484
493 // Second child gets a replica layer. 485 // Second child gets a replica layer.
494 scoped_refptr<Layer> replica_layer = Layer::Create(); 486 scoped_refptr<Layer> replica_layer = Layer::Create();
495 layer_tree_root->children()[1]->SetReplicaLayer(replica_layer.get()); 487 layer_tree_root->children()[1]->SetReplicaLayer(replica_layer.get());
496 488
497 // Third child gets a replica layer with a mask layer. 489 // Third child gets a replica layer with a mask layer.
498 scoped_refptr<Layer> replica_layer_with_mask = Layer::Create(); 490 scoped_refptr<Layer> replica_layer_with_mask = Layer::Create();
499 scoped_refptr<Layer> replica_mask_layer = Layer::Create(); 491 scoped_refptr<Layer> replica_mask_layer = Layer::Create();
500 replica_layer_with_mask->SetMaskLayer(replica_mask_layer.get()); 492 replica_layer_with_mask->SetMaskLayer(replica_mask_layer.get());
501 layer_tree_root->children()[2]-> 493 layer_tree_root->children()[2]->SetReplicaLayer(
502 SetReplicaLayer(replica_layer_with_mask.get()); 494 replica_layer_with_mask.get());
503 495
504 host_->SetRootLayer(layer_tree_root); 496 host_->SetRootLayer(layer_tree_root);
505 497
506 scoped_ptr<LayerImpl> layer_impl_tree_root = 498 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
507 TreeSynchronizer::SynchronizeTrees( 499 host_->active_tree());
508 layer_tree_root.get(), nullptr, host_->active_tree()); 500 LayerImpl* layer_impl_tree_root = host_->active_tree()->root_layer();
509 501 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
510 ExpectTreesAreIdentical(layer_tree_root.get(),
511 layer_impl_tree_root.get(),
512 host_->active_tree()); 502 host_->active_tree());
513 503
514 // Remove the mask layer. 504 // Remove the mask layer.
515 layer_tree_root->children()[0]->SetMaskLayer(NULL); 505 layer_tree_root->children()[0]->SetMaskLayer(NULL);
516 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 506 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
517 layer_tree_root.get(), std::move(layer_impl_tree_root), 507 host_->active_tree());
518 host_->active_tree()); 508 layer_impl_tree_root = host_->active_tree()->root_layer();
519 ExpectTreesAreIdentical(layer_tree_root.get(), 509 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
520 layer_impl_tree_root.get(),
521 host_->active_tree()); 510 host_->active_tree());
522 511
523 // Remove the replica layer. 512 // Remove the replica layer.
524 layer_tree_root->children()[1]->SetReplicaLayer(NULL); 513 layer_tree_root->children()[1]->SetReplicaLayer(NULL);
525 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 514 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
526 layer_tree_root.get(), std::move(layer_impl_tree_root), 515 host_->active_tree());
527 host_->active_tree()); 516 layer_impl_tree_root = host_->active_tree()->root_layer();
528 ExpectTreesAreIdentical(layer_tree_root.get(), 517 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
529 layer_impl_tree_root.get(),
530 host_->active_tree()); 518 host_->active_tree());
531 519
532 // Remove the replica mask. 520 // Remove the replica mask.
533 replica_layer_with_mask->SetMaskLayer(NULL); 521 replica_layer_with_mask->SetMaskLayer(NULL);
534 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 522 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
535 layer_tree_root.get(), std::move(layer_impl_tree_root), 523 host_->active_tree());
536 host_->active_tree()); 524 layer_impl_tree_root = host_->active_tree()->root_layer();
537 ExpectTreesAreIdentical(layer_tree_root.get(), 525 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
538 layer_impl_tree_root.get(),
539 host_->active_tree()); 526 host_->active_tree());
527
528 host_->active_tree()->ClearLayers();
540 } 529 }
541 530
542 TEST_F(TreeSynchronizerTest, SynchronizeScrollParent) { 531 TEST_F(TreeSynchronizerTest, SynchronizeScrollParent) {
543 LayerTreeSettings settings; 532 LayerTreeSettings settings;
544 FakeImplTaskRunnerProvider task_runner_provider; 533 FakeImplTaskRunnerProvider task_runner_provider;
545 FakeRenderingStatsInstrumentation stats_instrumentation; 534 FakeRenderingStatsInstrumentation stats_instrumentation;
535 FakeLayerTreeHostImplClient impl_client;
546 TestSharedBitmapManager shared_bitmap_manager; 536 TestSharedBitmapManager shared_bitmap_manager;
547 TestTaskGraphRunner task_graph_runner; 537 TestTaskGraphRunner task_graph_runner;
548 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( 538 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
549 settings, nullptr, &task_runner_provider, &stats_instrumentation, 539 settings, &impl_client, &task_runner_provider, &stats_instrumentation,
550 &shared_bitmap_manager, nullptr, &task_graph_runner, 0); 540 &shared_bitmap_manager, nullptr, &task_graph_runner, 0);
551 541
552 scoped_refptr<Layer> layer_tree_root = Layer::Create(); 542 scoped_refptr<Layer> layer_tree_root = Layer::Create();
553 scoped_refptr<Layer> scroll_parent = Layer::Create(); 543 scoped_refptr<Layer> scroll_parent = Layer::Create();
554 layer_tree_root->AddChild(scroll_parent); 544 layer_tree_root->AddChild(scroll_parent);
555 layer_tree_root->AddChild(Layer::Create()); 545 layer_tree_root->AddChild(Layer::Create());
556 layer_tree_root->AddChild(Layer::Create()); 546 layer_tree_root->AddChild(Layer::Create());
557 547
558 host_->SetRootLayer(layer_tree_root); 548 host_->SetRootLayer(layer_tree_root);
559 549
560 // First child is the second and third child's scroll parent. 550 // First child is the second and third child's scroll parent.
561 layer_tree_root->children()[1]->SetScrollParent(scroll_parent.get()); 551 layer_tree_root->children()[1]->SetScrollParent(scroll_parent.get());
562 layer_tree_root->children()[2]->SetScrollParent(scroll_parent.get()); 552 layer_tree_root->children()[2]->SetScrollParent(scroll_parent.get());
563 553
564 scoped_ptr<LayerImpl> layer_impl_tree_root = 554 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
565 TreeSynchronizer::SynchronizeTrees( 555 host_impl->active_tree());
566 layer_tree_root.get(), nullptr, host_impl->active_tree()); 556 LayerImpl* layer_impl_tree_root = host_impl->active_tree()->root_layer();
567 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 557 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
568 host_impl->active_tree()); 558 host_impl->active_tree());
569 { 559 {
570 SCOPED_TRACE("case one"); 560 SCOPED_TRACE("case one");
571 ExpectTreesAreIdentical(layer_tree_root.get(), 561 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
572 layer_impl_tree_root.get(),
573 host_impl->active_tree()); 562 host_impl->active_tree());
574 } 563 }
575 564
576 // Remove the first scroll child. 565 // Remove the first scroll child.
577 layer_tree_root->children()[1]->RemoveFromParent(); 566 layer_tree_root->children()[1]->RemoveFromParent();
578 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 567 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
579 layer_tree_root.get(), std::move(layer_impl_tree_root), 568 host_impl->active_tree());
580 host_impl->active_tree());
581 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 569 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
582 host_impl->active_tree()); 570 host_impl->active_tree());
583 { 571 {
584 SCOPED_TRACE("case two"); 572 SCOPED_TRACE("case two");
585 ExpectTreesAreIdentical(layer_tree_root.get(), 573 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
586 layer_impl_tree_root.get(),
587 host_impl->active_tree()); 574 host_impl->active_tree());
588 } 575 }
589 576
590 // Add an additional scroll layer. 577 // Add an additional scroll layer.
591 scoped_refptr<Layer> additional_scroll_child = Layer::Create(); 578 scoped_refptr<Layer> additional_scroll_child = Layer::Create();
592 layer_tree_root->AddChild(additional_scroll_child); 579 layer_tree_root->AddChild(additional_scroll_child);
593 additional_scroll_child->SetScrollParent(scroll_parent.get()); 580 additional_scroll_child->SetScrollParent(scroll_parent.get());
594 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 581 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
595 layer_tree_root.get(), std::move(layer_impl_tree_root), 582 host_impl->active_tree());
596 host_impl->active_tree());
597 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 583 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
598 host_impl->active_tree()); 584 host_impl->active_tree());
599 { 585 {
600 SCOPED_TRACE("case three"); 586 SCOPED_TRACE("case three");
601 ExpectTreesAreIdentical(layer_tree_root.get(), 587 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
602 layer_impl_tree_root.get(),
603 host_impl->active_tree()); 588 host_impl->active_tree());
604 } 589 }
605 } 590 }
606 591
607 TEST_F(TreeSynchronizerTest, SynchronizeClipParent) { 592 TEST_F(TreeSynchronizerTest, SynchronizeClipParent) {
608 LayerTreeSettings settings; 593 LayerTreeSettings settings;
609 FakeImplTaskRunnerProvider task_runner_provider; 594 FakeImplTaskRunnerProvider task_runner_provider;
610 FakeRenderingStatsInstrumentation stats_instrumentation; 595 FakeRenderingStatsInstrumentation stats_instrumentation;
596 FakeLayerTreeHostImplClient impl_client;
611 TestSharedBitmapManager shared_bitmap_manager; 597 TestSharedBitmapManager shared_bitmap_manager;
612 TestTaskGraphRunner task_graph_runner; 598 TestTaskGraphRunner task_graph_runner;
613 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( 599 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
614 settings, nullptr, &task_runner_provider, &stats_instrumentation, 600 settings, &impl_client, &task_runner_provider, &stats_instrumentation,
615 &shared_bitmap_manager, nullptr, &task_graph_runner, 0); 601 &shared_bitmap_manager, nullptr, &task_graph_runner, 0);
616 602
617 scoped_refptr<Layer> layer_tree_root = Layer::Create(); 603 scoped_refptr<Layer> layer_tree_root = Layer::Create();
618 scoped_refptr<Layer> clip_parent = Layer::Create(); 604 scoped_refptr<Layer> clip_parent = Layer::Create();
619 scoped_refptr<Layer> intervening = Layer::Create(); 605 scoped_refptr<Layer> intervening = Layer::Create();
620 scoped_refptr<Layer> clip_child1 = Layer::Create(); 606 scoped_refptr<Layer> clip_child1 = Layer::Create();
621 scoped_refptr<Layer> clip_child2 = Layer::Create(); 607 scoped_refptr<Layer> clip_child2 = Layer::Create();
622 layer_tree_root->AddChild(clip_parent); 608 layer_tree_root->AddChild(clip_parent);
623 clip_parent->AddChild(intervening); 609 clip_parent->AddChild(intervening);
624 intervening->AddChild(clip_child1); 610 intervening->AddChild(clip_child1);
625 intervening->AddChild(clip_child2); 611 intervening->AddChild(clip_child2);
626 612
627 host_->SetRootLayer(layer_tree_root); 613 host_->SetRootLayer(layer_tree_root);
628 614
629 // First child is the second and third child's scroll parent. 615 // First child is the second and third child's scroll parent.
630 clip_child1->SetClipParent(clip_parent.get()); 616 clip_child1->SetClipParent(clip_parent.get());
631 clip_child2->SetClipParent(clip_parent.get()); 617 clip_child2->SetClipParent(clip_parent.get());
632 618
633 scoped_ptr<LayerImpl> layer_impl_tree_root = 619 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
634 TreeSynchronizer::SynchronizeTrees( 620 host_impl->active_tree());
635 layer_tree_root.get(), nullptr, host_impl->active_tree()); 621 LayerImpl* layer_impl_tree_root = host_impl->active_tree()->root_layer();
636 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 622 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
637 host_impl->active_tree()); 623 host_impl->active_tree());
638 ExpectTreesAreIdentical(layer_tree_root.get(), 624 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
639 layer_impl_tree_root.get(),
640 host_impl->active_tree()); 625 host_impl->active_tree());
641 626
642 // Remove the first clip child. 627 // Remove the first clip child.
643 clip_child1->RemoveFromParent(); 628 clip_child1->RemoveFromParent();
644 clip_child1 = NULL; 629 clip_child1 = NULL;
645 630
646 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 631 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
647 layer_tree_root.get(), std::move(layer_impl_tree_root), 632 host_impl->active_tree());
648 host_impl->active_tree());
649 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 633 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
650 host_impl->active_tree()); 634 host_impl->active_tree());
651 ExpectTreesAreIdentical(layer_tree_root.get(), 635 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
652 layer_impl_tree_root.get(),
653 host_impl->active_tree()); 636 host_impl->active_tree());
654 637
655 // Add an additional clip child. 638 // Add an additional clip child.
656 scoped_refptr<Layer> additional_clip_child = Layer::Create(); 639 scoped_refptr<Layer> additional_clip_child = Layer::Create();
657 intervening->AddChild(additional_clip_child); 640 intervening->AddChild(additional_clip_child);
658 additional_clip_child->SetClipParent(clip_parent.get()); 641 additional_clip_child->SetClipParent(clip_parent.get());
659 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 642 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
660 layer_tree_root.get(), std::move(layer_impl_tree_root), 643 host_impl->active_tree());
661 host_impl->active_tree());
662 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 644 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
663 host_impl->active_tree()); 645 host_impl->active_tree());
664 ExpectTreesAreIdentical(layer_tree_root.get(), 646 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
665 layer_impl_tree_root.get(),
666 host_impl->active_tree()); 647 host_impl->active_tree());
667 648
668 // Remove the nearest clipping ancestor. 649 // Remove the nearest clipping ancestor.
669 clip_parent->RemoveFromParent(); 650 clip_parent->RemoveFromParent();
670 clip_parent = NULL; 651 clip_parent = NULL;
671 layer_impl_tree_root = TreeSynchronizer::SynchronizeTrees( 652 TreeSynchronizer::SynchronizeTrees(layer_tree_root.get(),
672 layer_tree_root.get(), std::move(layer_impl_tree_root), 653 host_impl->active_tree());
673 host_impl->active_tree());
674 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(), 654 TreeSynchronizer::PushLayerProperties(layer_tree_root->layer_tree_host(),
675 host_impl->active_tree()); 655 host_impl->active_tree());
676 ExpectTreesAreIdentical(layer_tree_root.get(), 656 ExpectTreesAreIdentical(layer_tree_root.get(), layer_impl_tree_root,
677 layer_impl_tree_root.get(),
678 host_impl->active_tree()); 657 host_impl->active_tree());
679 658
680 // The clip children should have been unhooked. 659 // The clip children should have been unhooked.
681 EXPECT_EQ(2u, intervening->children().size()); 660 EXPECT_EQ(2u, intervening->children().size());
682 EXPECT_FALSE(clip_child2->clip_parent()); 661 EXPECT_FALSE(clip_child2->clip_parent());
683 EXPECT_FALSE(additional_clip_child->clip_parent()); 662 EXPECT_FALSE(additional_clip_child->clip_parent());
684 } 663 }
685 664
686 TEST_F(TreeSynchronizerTest, SynchronizeCurrentlyScrollingNode) { 665 TEST_F(TreeSynchronizerTest, SynchronizeCurrentlyScrollingNode) {
687 LayerTreeSettings settings; 666 LayerTreeSettings settings;
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
820 scroll_offset_map[scroll_layer->id()]->PullDeltaForMainThread(); 799 scroll_offset_map[scroll_layer->id()]->PullDeltaForMainThread();
821 scroll_offset_map[scroll_layer->id()]->SetCurrent(gfx::ScrollOffset(40, 50)); 800 scroll_offset_map[scroll_layer->id()]->SetCurrent(gfx::ScrollOffset(40, 50));
822 scroll_offset_map[scroll_layer->id()]->PushFromMainThread( 801 scroll_offset_map[scroll_layer->id()]->PushFromMainThread(
823 gfx::ScrollOffset(100, 100)); 802 gfx::ScrollOffset(100, 100));
824 scroll_offset_map[scroll_layer->id()]->PushPendingToActive(); 803 scroll_offset_map[scroll_layer->id()]->PushPendingToActive();
825 EXPECT_TRUE(is_equal(scroll_offset_map, scroll_tree.scroll_offset_map())); 804 EXPECT_TRUE(is_equal(scroll_offset_map, scroll_tree.scroll_offset_map()));
826 } 805 }
827 806
828 } // namespace 807 } // namespace
829 } // namespace cc 808 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/tree_synchronizer.cc ('k') | chrome/browser/android/compositor/compositor_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698