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

Side by Side Diff: services/ui/surfaces/display_compositor_unittest.cc

Issue 2541683004: Add/remove surface references via MojoCompositorFrameSink. (Closed)
Patch Set: WIP Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "services/ui/surfaces/display_compositor.h" 5 #include "services/ui/surfaces/display_compositor.h"
6 6
7 #include <inttypes.h> 7 #include <inttypes.h>
8 8
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/memory/ref_counted.h" 14 #include "base/memory/ref_counted.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "cc/ipc/display_compositor.mojom.h" 16 #include "cc/ipc/display_compositor.mojom.h"
17 #include "cc/surfaces/surface_id.h" 17 #include "cc/surfaces/surface_id.h"
18 #include "cc/surfaces/surface_observer.h" 18 #include "cc/surfaces/surface_observer.h"
19 #include "cc/surfaces/surface_reference.h"
19 #include "mojo/public/cpp/bindings/binding.h" 20 #include "mojo/public/cpp/bindings/binding.h"
20 #include "mojo/public/cpp/bindings/interface_request.h" 21 #include "mojo/public/cpp/bindings/interface_request.h"
21 #include "services/ui/common/task_runner_test_base.h" 22 #include "services/ui/common/task_runner_test_base.h"
22 #include "testing/gtest/include/gtest/gtest.h" 23 #include "testing/gtest/include/gtest/gtest.h"
23 #include "ui/gfx/geometry/size.h" 24 #include "ui/gfx/geometry/size.h"
24 25
25 namespace ui { 26 namespace ui {
26 namespace test { 27 namespace test {
27 namespace { 28 namespace {
28 29
(...skipping 29 matching lines...) Expand all
58 } 59 }
59 60
60 private: 61 private:
61 void AddEvent(const std::string& text) { 62 void AddEvent(const std::string& text) {
62 if (!events_.empty()) 63 if (!events_.empty())
63 events_ += ";"; 64 events_ += ";";
64 events_ += text; 65 events_ += text;
65 } 66 }
66 67
67 // cc::mojom::DisplayCompositorClient: 68 // cc::mojom::DisplayCompositorClient:
69 void OnRootSurfaceId(const cc::SurfaceId& root_surface_id) override {
70 got_root_surface_id_ = true;
71 }
72
68 void OnSurfaceCreated(const cc::SurfaceId& surface_id, 73 void OnSurfaceCreated(const cc::SurfaceId& surface_id,
69 const gfx::Size& frame_size, 74 const gfx::Size& frame_size,
70 float device_scale_factor) override { 75 float device_scale_factor) override {
71 AddEvent(base::StringPrintf("OnSurfaceCreated(%s)", 76 AddEvent(base::StringPrintf("OnSurfaceCreated(%s)",
72 SurfaceIdString(surface_id).c_str())); 77 SurfaceIdString(surface_id).c_str()));
73 } 78 }
74 79
75 mojo::Binding<cc::mojom::DisplayCompositorClient> binding_; 80 mojo::Binding<cc::mojom::DisplayCompositorClient> binding_;
76 std::string events_; 81 std::string events_;
82 bool got_root_surface_id_ = false;
77 83
78 DISALLOW_COPY_AND_ASSIGN(TestDisplayCompositorClient); 84 DISALLOW_COPY_AND_ASSIGN(TestDisplayCompositorClient);
79 }; 85 };
80 86
81 // Test SurfaceReferenceManager that records AddSurfaceReference() and 87 // Test SurfaceReferenceManager that records AddSurfaceReference() and
82 // RemoveSurfaceReference() events. 88 // RemoveSurfaceReference() events.
83 class TestSurfaceReferenceManager : public cc::SurfaceReferenceManager { 89 class TestSurfaceReferenceManager : public cc::SurfaceReferenceManager {
84 public: 90 public:
85 ~TestSurfaceReferenceManager() override {} 91 ~TestSurfaceReferenceManager() override {}
86 92
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
141 147
142 // Returns the total number of temporary references held by DisplayCompositor. 148 // Returns the total number of temporary references held by DisplayCompositor.
143 size_t CountTempReferences() { 149 size_t CountTempReferences() {
144 size_t size = 0; 150 size_t size = 0;
145 for (auto& map_entry : display_compositor_->temp_references_) { 151 for (auto& map_entry : display_compositor_->temp_references_) {
146 size += map_entry.second.size(); 152 size += map_entry.second.size();
147 } 153 }
148 return size; 154 return size;
149 } 155 }
150 156
157 const cc::SurfaceId& GetRootSurfaceId() const {
158 return reference_manager_.GetRootSurfaceId();
159 }
160
151 // TaskRunnerTestBase: 161 // TaskRunnerTestBase:
152 void SetUp() override { 162 void SetUp() override {
153 TaskRunnerTestBase::SetUp(); 163 TaskRunnerTestBase::SetUp();
154 display_compositor_ = base::MakeUnique<DisplayCompositor>( 164 display_compositor_ = base::MakeUnique<DisplayCompositor>(
155 nullptr, nullptr, nullptr, nullptr, client_.GetPtr()); 165 nullptr, nullptr, nullptr, nullptr, client_.GetPtr());
156 display_compositor_->reference_manager_ = &reference_manager_; 166 display_compositor_->reference_manager_ = &reference_manager_;
157 } 167 }
158 168
159 void TearDown() override { 169 void TearDown() override {
160 // Clear any events before the next test. 170 // Clear any events before the next test.
(...skipping 14 matching lines...) Expand all
175 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1); 185 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1);
176 const cc::SurfaceId surface_id = MakeSurfaceId(2, 1, 1); 186 const cc::SurfaceId surface_id = MakeSurfaceId(2, 1, 1);
177 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f); 187 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f);
178 RunUntilIdle(); 188 RunUntilIdle();
179 189
180 // Client should get OnSurfaceCreated call and temporary reference added. 190 // Client should get OnSurfaceCreated call and temporary reference added.
181 EXPECT_EQ("OnSurfaceCreated(2:1:1)", client_.events()); 191 EXPECT_EQ("OnSurfaceCreated(2:1:1)", client_.events());
182 EXPECT_EQ("Add(0:0:0-2:1:1)", reference_manager_.events()); 192 EXPECT_EQ("Add(0:0:0-2:1:1)", reference_manager_.events());
183 EXPECT_EQ(1u, CountTempReferences()); 193 EXPECT_EQ(1u, CountTempReferences());
184 194
185 display_compositor_->AddSurfaceReference(parent_id, surface_id); 195 display_compositor_->AddSurfaceReference(
196 cc::SurfaceReference(parent_id, surface_id));
186 RunUntilIdle(); 197 RunUntilIdle();
187 198
188 // Real reference is added then temporary reference removed. 199 // Real reference is added then temporary reference removed.
189 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)", 200 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)",
190 reference_manager_.events()); 201 reference_manager_.events());
191 EXPECT_EQ(0u, CountTempReferences()); 202 EXPECT_EQ(0u, CountTempReferences());
192 } 203 }
193 204
194 TEST_F(DisplayCompositorTest, AddSurfaceThenRootReference) { 205 TEST_F(DisplayCompositorTest, AddSurfaceThenRootReference) {
195 const cc::SurfaceId surface_id = MakeSurfaceId(1, 1, 1); 206 const cc::SurfaceId surface_id = MakeSurfaceId(1, 1, 1);
196 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f); 207 surface_observer()->OnSurfaceCreated(surface_id, gfx::Size(1, 1), 1.0f);
197 RunUntilIdle(); 208 RunUntilIdle();
198 209
199 // Temporary reference should be added. 210 // Temporary reference should be added.
200 EXPECT_EQ("Add(0:0:0-1:1:1)", reference_manager_.events()); 211 EXPECT_EQ("Add(0:0:0-1:1:1)", reference_manager_.events());
201 EXPECT_EQ(1u, CountTempReferences()); 212 EXPECT_EQ(1u, CountTempReferences());
202 213
203 display_compositor_->AddRootSurfaceReference(surface_id); 214 display_compositor_->AddSurfaceReference(
215 cc::SurfaceReference(GetRootSurfaceId(), surface_id));
204 RunUntilIdle(); 216 RunUntilIdle();
205 217
206 // Adding real reference doesn't need to change anything in 218 // Adding real reference doesn't need to change anything in
207 // SurfaceReferenceManager does remove the temporary reference marker. 219 // SurfaceReferenceManager does remove the temporary reference marker.
208 EXPECT_EQ("", reference_manager_.events()); 220 EXPECT_EQ("", reference_manager_.events());
209 EXPECT_EQ(0u, CountTempReferences()); 221 EXPECT_EQ(0u, CountTempReferences());
210 } 222 }
211 223
212 TEST_F(DisplayCompositorTest, AddTwoSurfacesThenOneReference) { 224 TEST_F(DisplayCompositorTest, AddTwoSurfacesThenOneReference) {
213 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1); 225 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1);
214 const cc::SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1); 226 const cc::SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1);
215 const cc::SurfaceId surface_id2 = MakeSurfaceId(3, 1, 1); 227 const cc::SurfaceId surface_id2 = MakeSurfaceId(3, 1, 1);
216 228
217 // Add two surfaces with different FrameSinkIds. 229 // Add two surfaces with different FrameSinkIds.
218 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f); 230 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f);
219 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f); 231 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f);
220 RunUntilIdle(); 232 RunUntilIdle();
221 233
222 // Temporary reference should be added for both surfaces. 234 // Temporary reference should be added for both surfaces.
223 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-3:1:1)", reference_manager_.events()); 235 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-3:1:1)", reference_manager_.events());
224 EXPECT_EQ(2u, CountTempReferences()); 236 EXPECT_EQ(2u, CountTempReferences());
225 237
226 display_compositor_->AddSurfaceReference(parent_id, surface_id1); 238 display_compositor_->AddSurfaceReference(
239 cc::SurfaceReference(parent_id, surface_id1));
227 RunUntilIdle(); 240 RunUntilIdle();
228 241
229 // Real reference is added then temporary reference removed for 2:1:1. There 242 // Real reference is added then temporary reference removed for 2:1:1. There
230 // should still be a temporary reference left to 3:1:1 243 // should still be a temporary reference left to 3:1:1
231 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)", 244 EXPECT_EQ("Add(1:1:1-2:1:1);Remove(0:0:0-2:1:1)",
232 reference_manager_.events()); 245 reference_manager_.events());
233 EXPECT_EQ(1u, CountTempReferences()); 246 EXPECT_EQ(1u, CountTempReferences());
234 } 247 }
235 248
236 TEST_F(DisplayCompositorTest, AddSurfacesSkipReference) { 249 TEST_F(DisplayCompositorTest, AddSurfacesSkipReference) {
237 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1); 250 const cc::SurfaceId parent_id = MakeSurfaceId(1, 1, 1);
238 const cc::SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1); 251 const cc::SurfaceId surface_id1 = MakeSurfaceId(2, 1, 1);
239 const cc::SurfaceId surface_id2 = MakeSurfaceId(2, 1, 2); 252 const cc::SurfaceId surface_id2 = MakeSurfaceId(2, 1, 2);
240 253
241 // Add two surfaces that have the same FrameSinkId. This would happen when a 254 // Add two surfaces that have the same FrameSinkId. This would happen when a
242 // client submits two CFs before parent submits a new CF. 255 // client submits two CFs before parent submits a new CF.
243 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f); 256 surface_observer()->OnSurfaceCreated(surface_id1, gfx::Size(1, 1), 1.0f);
244 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f); 257 surface_observer()->OnSurfaceCreated(surface_id2, gfx::Size(1, 1), 1.0f);
245 RunUntilIdle(); 258 RunUntilIdle();
246 259
247 // Client should get OnSurfaceCreated call and temporary reference added for 260 // Client should get OnSurfaceCreated call and temporary reference added for
248 // both surfaces. 261 // both surfaces.
249 EXPECT_EQ("OnSurfaceCreated(2:1:1);OnSurfaceCreated(2:1:2)", 262 EXPECT_EQ("OnSurfaceCreated(2:1:1);OnSurfaceCreated(2:1:2)",
250 client_.events()); 263 client_.events());
251 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-2:1:2)", reference_manager_.events()); 264 EXPECT_EQ("Add(0:0:0-2:1:1);Add(0:0:0-2:1:2)", reference_manager_.events());
252 EXPECT_EQ(2u, CountTempReferences()); 265 EXPECT_EQ(2u, CountTempReferences());
253 266
254 // Add a reference to the surface with the later LocalFrameId. 267 // Add a reference to the surface with the later LocalFrameId.
255 display_compositor_->AddSurfaceReference(parent_id, surface_id2); 268 display_compositor_->AddSurfaceReference(
269 cc::SurfaceReference(parent_id, surface_id2));
256 RunUntilIdle(); 270 RunUntilIdle();
257 271
258 // The real reference should be added for 2:1:2 and both temporary references 272 // The real reference should be added for 2:1:2 and both temporary references
259 // should be removed. 273 // should be removed.
260 EXPECT_EQ("Add(1:1:1-2:1:2);Remove(0:0:0-2:1:2);Remove(0:0:0-2:1:1)", 274 EXPECT_EQ("Add(1:1:1-2:1:2);Remove(0:0:0-2:1:2);Remove(0:0:0-2:1:1)",
261 reference_manager_.events()); 275 reference_manager_.events());
262 EXPECT_EQ(0u, CountTempReferences()); 276 EXPECT_EQ(0u, CountTempReferences());
263 } 277 }
264 278
265 } // namespace test 279 } // namespace test
266 } // namespace ui 280 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698