| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "base/memory/ptr_util.h" |
| 6 #include "cc/surfaces/display_compositor_lock_manager.h" |
| 5 #include "cc/surfaces/surface.h" | 7 #include "cc/surfaces/surface.h" |
| 6 #include "cc/surfaces/surface_factory.h" | 8 #include "cc/surfaces/surface_factory.h" |
| 7 #include "cc/surfaces/surface_factory_client.h" | 9 #include "cc/surfaces/surface_factory_client.h" |
| 8 #include "cc/surfaces/surface_id_allocator.h" | 10 #include "cc/surfaces/surface_id_allocator.h" |
| 9 #include "cc/surfaces/surface_manager.h" | 11 #include "cc/surfaces/surface_manager.h" |
| 12 #include "cc/test/begin_frame_args_test.h" |
| 13 #include "cc/test/fake_external_begin_frame_source.h" |
| 10 #include "cc/test/scheduler_test_common.h" | 14 #include "cc/test/scheduler_test_common.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 12 #include "ui/gfx/geometry/size.h" | 16 #include "ui/gfx/geometry/size.h" |
| 13 | 17 |
| 14 namespace cc { | 18 namespace cc { |
| 15 namespace { | 19 namespace { |
| 16 | 20 |
| 17 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); | 21 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); |
| 18 | 22 |
| 23 CompositorFrame MakeCompositorFrame( |
| 24 std::vector<SurfaceId> referenced_surfaces) { |
| 25 CompositorFrame compositor_frame; |
| 26 compositor_frame.metadata.referenced_surfaces = |
| 27 std::move(referenced_surfaces); |
| 28 return compositor_frame; |
| 29 } |
| 30 |
| 19 class FakeSurfaceFactoryClient : public SurfaceFactoryClient { | 31 class FakeSurfaceFactoryClient : public SurfaceFactoryClient { |
| 20 public: | 32 public: |
| 21 FakeSurfaceFactoryClient() : begin_frame_source_(nullptr) {} | 33 FakeSurfaceFactoryClient() : begin_frame_source_(nullptr) {} |
| 22 | 34 |
| 23 void ReturnResources(const ReturnedResourceArray& resources) override {} | 35 void ReturnResources(const ReturnedResourceArray& resources) override {} |
| 24 | 36 |
| 25 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override { | 37 void SetBeginFrameSource(BeginFrameSource* begin_frame_source) override { |
| 26 begin_frame_source_ = begin_frame_source; | 38 begin_frame_source_ = begin_frame_source; |
| 27 } | 39 } |
| 28 | 40 |
| 29 BeginFrameSource* begin_frame_source() { return begin_frame_source_; } | 41 BeginFrameSource* begin_frame_source() { return begin_frame_source_; } |
| 30 | 42 |
| 31 private: | 43 private: |
| 32 BeginFrameSource* begin_frame_source_; | 44 BeginFrameSource* begin_frame_source_; |
| 33 }; | 45 }; |
| 34 | 46 |
| 47 // Surface 1 is blocked on Surface 2 and Surface 3. |
| 48 TEST(SurfaceTest, DisplayCompositorLocking1) { |
| 49 SurfaceManager manager; |
| 50 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source( |
| 51 new FakeExternalBeginFrameSource(0.f, false)); |
| 52 |
| 53 std::unique_ptr<DisplayCompositorLockManager> lock_manager( |
| 54 new DisplayCompositorLockManager(&manager, begin_frame_source.get())); |
| 55 manager.SetLockManager(std::move(lock_manager)); |
| 56 |
| 57 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create()); |
| 58 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1); |
| 59 |
| 60 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create()); |
| 61 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2); |
| 62 |
| 63 LocalFrameId local_frame_id3(8, base::UnguessableToken::Create()); |
| 64 SurfaceId surface_id3(FrameSinkId(3, 3), local_frame_id3); |
| 65 |
| 66 FakeSurfaceFactoryClient surface_factory_client1; |
| 67 SurfaceFactory factory1(FrameSinkId(1, 1), &manager, |
| 68 &surface_factory_client1); |
| 69 factory1.SubmitCompositorFrame( |
| 70 local_frame_id1, MakeCompositorFrame({surface_id2, surface_id3}), |
| 71 SurfaceFactory::DrawCallback()); |
| 72 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames()); |
| 73 |
| 74 // |factory1| is blocked on |surface_id2| and |surface_id3|. |
| 75 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame()); |
| 76 EXPECT_TRUE( |
| 77 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 78 |
| 79 FakeSurfaceFactoryClient surface_factory_client2; |
| 80 SurfaceFactory factory2(FrameSinkId(2, 2), &manager, |
| 81 &surface_factory_client2); |
| 82 factory2.SubmitCompositorFrame(local_frame_id2, |
| 83 MakeCompositorFrame(std::vector<SurfaceId>()), |
| 84 SurfaceFactory::DrawCallback()); |
| 85 |
| 86 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames()); |
| 87 EXPECT_TRUE(factory2.current_surface_for_testing()->HasFrame()); |
| 88 EXPECT_FALSE( |
| 89 factory2.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 90 |
| 91 // |factory1| is blocked on just |surface_id3|. |
| 92 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame()); |
| 93 EXPECT_TRUE( |
| 94 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 95 |
| 96 FakeSurfaceFactoryClient surface_factory_client3; |
| 97 SurfaceFactory factory3(FrameSinkId(3, 3), &manager, |
| 98 &surface_factory_client3); |
| 99 factory3.SubmitCompositorFrame(local_frame_id3, |
| 100 MakeCompositorFrame(std::vector<SurfaceId>()), |
| 101 SurfaceFactory::DrawCallback()); |
| 102 EXPECT_FALSE(manager.lock_manager()->observing_begin_frames()); |
| 103 |
| 104 // |factory1|'s Frame is now active. |
| 105 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame()); |
| 106 EXPECT_FALSE( |
| 107 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 108 |
| 109 factory1.EvictSurface(); |
| 110 factory2.EvictSurface(); |
| 111 factory3.EvictSurface(); |
| 112 } |
| 113 |
| 114 // Surface 1 is blocked on Surface 2 which is blocked on Surface 3. |
| 115 TEST(SurfaceTest, DisplayCompositorLocking2) { |
| 116 SurfaceManager manager; |
| 117 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source( |
| 118 new FakeExternalBeginFrameSource(0.f, false)); |
| 119 |
| 120 std::unique_ptr<DisplayCompositorLockManager> lock_manager( |
| 121 new DisplayCompositorLockManager(&manager, begin_frame_source.get())); |
| 122 manager.SetLockManager(std::move(lock_manager)); |
| 123 |
| 124 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create()); |
| 125 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1); |
| 126 |
| 127 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create()); |
| 128 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2); |
| 129 |
| 130 LocalFrameId local_frame_id3(8, base::UnguessableToken::Create()); |
| 131 SurfaceId surface_id3(FrameSinkId(3, 3), local_frame_id3); |
| 132 |
| 133 FakeSurfaceFactoryClient surface_factory_client1; |
| 134 SurfaceFactory factory1(FrameSinkId(1, 1), &manager, |
| 135 &surface_factory_client1); |
| 136 factory1.SubmitCompositorFrame(local_frame_id1, |
| 137 MakeCompositorFrame({surface_id2}), |
| 138 SurfaceFactory::DrawCallback()); |
| 139 |
| 140 // |factory1| is blocked on |surface_id2|. |
| 141 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame()); |
| 142 EXPECT_TRUE( |
| 143 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 144 |
| 145 FakeSurfaceFactoryClient surface_factory_client2; |
| 146 SurfaceFactory factory2(FrameSinkId(2, 2), &manager, |
| 147 &surface_factory_client2); |
| 148 factory2.SubmitCompositorFrame(local_frame_id2, |
| 149 MakeCompositorFrame({surface_id3}), |
| 150 SurfaceFactory::DrawCallback()); |
| 151 |
| 152 // |factory2| is blocked on |surface_id3|. |
| 153 EXPECT_FALSE(factory2.current_surface_for_testing()->HasFrame()); |
| 154 EXPECT_TRUE( |
| 155 factory2.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 156 |
| 157 // |factory1| is still blocked on just |surface_id2|. |
| 158 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame()); |
| 159 EXPECT_TRUE( |
| 160 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 161 |
| 162 FakeSurfaceFactoryClient surface_factory_client3; |
| 163 SurfaceFactory factory3(FrameSinkId(3, 3), &manager, |
| 164 &surface_factory_client3); |
| 165 CompositorFrame frame3; |
| 166 factory3.SubmitCompositorFrame(local_frame_id3, |
| 167 MakeCompositorFrame(std::vector<SurfaceId>()), |
| 168 SurfaceFactory::DrawCallback()); |
| 169 |
| 170 // |factory1|'s Frame is now active. |
| 171 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame()); |
| 172 EXPECT_FALSE( |
| 173 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 174 |
| 175 // |factory2|'s Frame is now active. |
| 176 EXPECT_TRUE(factory2.current_surface_for_testing()->HasFrame()); |
| 177 EXPECT_FALSE( |
| 178 factory2.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 179 |
| 180 factory1.EvictSurface(); |
| 181 factory2.EvictSurface(); |
| 182 factory3.EvictSurface(); |
| 183 } |
| 184 |
| 185 // Surface 1 and Surface 2 are blocked on Surface 3. |
| 186 TEST(SurfaceTest, DisplayCompositorLocking3) { |
| 187 SurfaceManager manager; |
| 188 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source( |
| 189 new FakeExternalBeginFrameSource(0.f, false)); |
| 190 |
| 191 std::unique_ptr<DisplayCompositorLockManager> lock_manager( |
| 192 new DisplayCompositorLockManager(&manager, begin_frame_source.get())); |
| 193 manager.SetLockManager(std::move(lock_manager)); |
| 194 |
| 195 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create()); |
| 196 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1); |
| 197 |
| 198 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create()); |
| 199 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2); |
| 200 |
| 201 LocalFrameId local_frame_id3(8, base::UnguessableToken::Create()); |
| 202 SurfaceId surface_id3(FrameSinkId(3, 3), local_frame_id3); |
| 203 |
| 204 FakeSurfaceFactoryClient surface_factory_client1; |
| 205 SurfaceFactory factory1(FrameSinkId(1, 1), &manager, |
| 206 &surface_factory_client1); |
| 207 factory1.SubmitCompositorFrame(local_frame_id1, |
| 208 MakeCompositorFrame({surface_id3}), |
| 209 SurfaceFactory::DrawCallback()); |
| 210 |
| 211 // |factory1| is blocked on |surface_id3|. |
| 212 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame()); |
| 213 EXPECT_TRUE( |
| 214 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 215 |
| 216 FakeSurfaceFactoryClient surface_factory_client2; |
| 217 SurfaceFactory factory2(FrameSinkId(2, 2), &manager, |
| 218 &surface_factory_client2); |
| 219 factory2.SubmitCompositorFrame(local_frame_id2, |
| 220 MakeCompositorFrame({surface_id3}), |
| 221 SurfaceFactory::DrawCallback()); |
| 222 |
| 223 // |factory2| is blocked on |surface_id3|. |
| 224 EXPECT_FALSE(factory2.current_surface_for_testing()->HasFrame()); |
| 225 EXPECT_TRUE( |
| 226 factory2.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 227 |
| 228 // |factory1| is still blocked on |surface_id3|. |
| 229 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame()); |
| 230 EXPECT_TRUE( |
| 231 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 232 |
| 233 FakeSurfaceFactoryClient surface_factory_client3; |
| 234 SurfaceFactory factory3(FrameSinkId(3, 3), &manager, |
| 235 &surface_factory_client3); |
| 236 factory3.SubmitCompositorFrame(local_frame_id3, |
| 237 MakeCompositorFrame(std::vector<SurfaceId>()), |
| 238 SurfaceFactory::DrawCallback()); |
| 239 |
| 240 // |factory1|'s Frame is now active. |
| 241 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame()); |
| 242 EXPECT_FALSE( |
| 243 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 244 |
| 245 // |factory2|'s Frame is now active. |
| 246 EXPECT_TRUE(factory2.current_surface_for_testing()->HasFrame()); |
| 247 EXPECT_FALSE( |
| 248 factory2.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 249 |
| 250 factory1.EvictSurface(); |
| 251 factory2.EvictSurface(); |
| 252 factory3.EvictSurface(); |
| 253 } |
| 254 |
| 255 // |factory1| is blocked on |surface_id2| but the deadline hits. |
| 256 TEST(SurfaceTest, DisplayCompositorLocking4) { |
| 257 SurfaceManager manager; |
| 258 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source( |
| 259 new FakeExternalBeginFrameSource(0.f, false)); |
| 260 |
| 261 std::unique_ptr<DisplayCompositorLockManager> lock_manager( |
| 262 new DisplayCompositorLockManager(&manager, begin_frame_source.get())); |
| 263 manager.SetLockManager(std::move(lock_manager)); |
| 264 |
| 265 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create()); |
| 266 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1); |
| 267 |
| 268 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create()); |
| 269 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2); |
| 270 |
| 271 LocalFrameId local_frame_id3(8, base::UnguessableToken::Create()); |
| 272 SurfaceId surface_id3(FrameSinkId(3, 3), local_frame_id3); |
| 273 |
| 274 FakeSurfaceFactoryClient surface_factory_client1; |
| 275 SurfaceFactory factory1(FrameSinkId(1, 1), &manager, |
| 276 &surface_factory_client1); |
| 277 CompositorFrame frame; |
| 278 factory1.SubmitCompositorFrame(local_frame_id1, |
| 279 MakeCompositorFrame({surface_id2}), |
| 280 SurfaceFactory::DrawCallback()); |
| 281 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames()); |
| 282 |
| 283 // |factory1| is blocked on |surface_id2|. |
| 284 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame()); |
| 285 EXPECT_TRUE( |
| 286 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 287 |
| 288 FakeSurfaceFactoryClient surface_factory_client2; |
| 289 SurfaceFactory factory2(FrameSinkId(2, 2), &manager, |
| 290 &surface_factory_client2); |
| 291 factory2.SubmitCompositorFrame(local_frame_id2, |
| 292 MakeCompositorFrame({surface_id3}), |
| 293 SurfaceFactory::DrawCallback()); |
| 294 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames()); |
| 295 |
| 296 // |factory2| is blocked on |surface_id3|. |
| 297 EXPECT_FALSE(factory2.current_surface_for_testing()->HasFrame()); |
| 298 EXPECT_TRUE( |
| 299 factory2.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 300 |
| 301 BeginFrameArgs args = |
| 302 CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, 0, 1); |
| 303 begin_frame_source->TestOnBeginFrame(args); |
| 304 |
| 305 // |factory1| is still blocked on |surface_id2|. |
| 306 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame()); |
| 307 EXPECT_TRUE( |
| 308 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 309 |
| 310 // |factory2| is still blcoked on |surface_id3|. |
| 311 EXPECT_FALSE(factory2.current_surface_for_testing()->HasFrame()); |
| 312 EXPECT_TRUE( |
| 313 factory2.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 314 |
| 315 begin_frame_source->TestOnBeginFrame(args); |
| 316 begin_frame_source->TestOnBeginFrame(args); |
| 317 begin_frame_source->TestOnBeginFrame(args); |
| 318 |
| 319 // |factory1| and |factory2| are no longer blocked. |
| 320 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame()); |
| 321 EXPECT_FALSE( |
| 322 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 323 EXPECT_TRUE(factory2.current_surface_for_testing()->HasFrame()); |
| 324 EXPECT_FALSE( |
| 325 factory2.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 326 EXPECT_FALSE(manager.lock_manager()->observing_begin_frames()); |
| 327 |
| 328 factory1.EvictSurface(); |
| 329 factory2.EvictSurface(); |
| 330 } |
| 331 |
| 332 // Frame activates once a new frame is submitted. |
| 333 TEST(SurfaceTest, DisplayCompositorLocking5) { |
| 334 SurfaceManager manager; |
| 335 std::unique_ptr<FakeExternalBeginFrameSource> begin_frame_source( |
| 336 new FakeExternalBeginFrameSource(0.f, false)); |
| 337 |
| 338 manager.SetLockManager(base::MakeUnique<DisplayCompositorLockManager>( |
| 339 &manager, begin_frame_source.get())); |
| 340 |
| 341 LocalFrameId local_frame_id1(6, base::UnguessableToken::Create()); |
| 342 SurfaceId surface_id1(FrameSinkId(1, 1), local_frame_id1); |
| 343 |
| 344 LocalFrameId local_frame_id2(7, base::UnguessableToken::Create()); |
| 345 SurfaceId surface_id2(FrameSinkId(2, 2), local_frame_id2); |
| 346 |
| 347 FakeSurfaceFactoryClient surface_factory_client1; |
| 348 SurfaceFactory factory1(FrameSinkId(1, 1), &manager, |
| 349 &surface_factory_client1); |
| 350 factory1.SubmitCompositorFrame(local_frame_id1, |
| 351 MakeCompositorFrame({surface_id2}), |
| 352 SurfaceFactory::DrawCallback()); |
| 353 |
| 354 // |factory1|'s Frame is blocked on |surface_id2|. |
| 355 EXPECT_FALSE(factory1.current_surface_for_testing()->HasFrame()); |
| 356 EXPECT_TRUE( |
| 357 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 358 EXPECT_TRUE(manager.lock_manager()->observing_begin_frames()); |
| 359 |
| 360 // Another frame is submitted to |factory1| that has no dependencies. |
| 361 factory1.SubmitCompositorFrame(local_frame_id1, |
| 362 MakeCompositorFrame(std::vector<SurfaceId>()), |
| 363 SurfaceFactory::DrawCallback()); |
| 364 EXPECT_TRUE(factory1.current_surface_for_testing()->HasFrame()); |
| 365 EXPECT_FALSE( |
| 366 factory1.current_surface_for_testing()->GetPendingFrame().has_value()); |
| 367 EXPECT_FALSE(manager.lock_manager()->observing_begin_frames()); |
| 368 |
| 369 factory1.EvictSurface(); |
| 370 } |
| 371 |
| 35 TEST(SurfaceTest, SurfaceLifetime) { | 372 TEST(SurfaceTest, SurfaceLifetime) { |
| 36 SurfaceManager manager; | 373 SurfaceManager manager; |
| 37 FakeSurfaceFactoryClient surface_factory_client; | 374 FakeSurfaceFactoryClient surface_factory_client; |
| 38 SurfaceFactory factory(kArbitraryFrameSinkId, &manager, | 375 SurfaceFactory factory(kArbitraryFrameSinkId, &manager, |
| 39 &surface_factory_client); | 376 &surface_factory_client); |
| 40 | 377 |
| 41 LocalFrameId local_frame_id(6, base::UnguessableToken::Create()); | 378 LocalFrameId local_frame_id(6, base::UnguessableToken::Create()); |
| 42 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id); | 379 SurfaceId surface_id(kArbitraryFrameSinkId, local_frame_id); |
| 43 factory.SubmitCompositorFrame(local_frame_id, CompositorFrame(), | 380 factory.SubmitCompositorFrame(local_frame_id, CompositorFrame(), |
| 44 SurfaceFactory::DrawCallback()); | 381 SurfaceFactory::DrawCallback()); |
| 45 EXPECT_TRUE(manager.GetSurfaceForId(surface_id)); | 382 EXPECT_TRUE(manager.GetSurfaceForId(surface_id)); |
| 46 factory.EvictSurface(); | 383 factory.EvictSurface(); |
| 47 | 384 |
| 48 EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id)); | 385 EXPECT_EQ(NULL, manager.GetSurfaceForId(surface_id)); |
| 49 } | 386 } |
| 50 | 387 |
| 51 TEST(SurfaceTest, SurfaceIds) { | 388 TEST(SurfaceTest, SurfaceIds) { |
| 52 for (size_t i = 0; i < 3; ++i) { | 389 for (size_t i = 0; i < 3; ++i) { |
| 53 SurfaceIdAllocator allocator; | 390 SurfaceIdAllocator allocator; |
| 54 LocalFrameId id1 = allocator.GenerateId(); | 391 LocalFrameId id1 = allocator.GenerateId(); |
| 55 LocalFrameId id2 = allocator.GenerateId(); | 392 LocalFrameId id2 = allocator.GenerateId(); |
| 56 EXPECT_NE(id1, id2); | 393 EXPECT_NE(id1, id2); |
| 57 } | 394 } |
| 58 } | 395 } |
| 59 | 396 |
| 60 } // namespace | 397 } // namespace |
| 61 } // namespace cc | 398 } // namespace cc |
| OLD | NEW |