1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "CCLayerIterator.h"
9 #include "CCLayerTreeHostCommon.h"
10 #include "LayerChromium.h"
11 #include <gmock/gmock.h>
12 #include <gtest/gtest.h>
13 #include <public/WebTransformationMatrix.h>
15 using namespace WebCore
;
16 using WebKit::WebTransformationMatrix
;
17 using ::testing::Mock
;
19 using ::testing::AtLeast
;
20 using ::testing::AnyNumber
;
24 class TestLayerChromium
: public LayerChromium
{
26 static PassRefPtr
<TestLayerChromium
> create() { return adoptRef(new TestLayerChromium()); }
28 int m_countRepresentingTargetSurface
;
29 int m_countRepresentingContributingSurface
;
30 int m_countRepresentingItself
;
32 virtual bool drawsContent() const OVERRIDE
{ return m_drawsContent
; }
33 void setDrawsContent(bool drawsContent
) { m_drawsContent
= drawsContent
; }
38 , m_drawsContent(true)
40 setBounds(IntSize(100, 100));
41 setPosition(IntPoint::zero());
42 setAnchorPoint(IntPoint::zero());
48 #define EXPECT_COUNT(layer, target, contrib, itself) \
49 EXPECT_EQ(target, layer->m_countRepresentingTargetSurface); \
50 EXPECT_EQ(contrib, layer->m_countRepresentingContributingSurface); \
51 EXPECT_EQ(itself, layer->m_countRepresentingItself);
53 typedef CCLayerIterator
<LayerChromium
, Vector
<RefPtr
<LayerChromium
> >, RenderSurfaceChromium
, CCLayerIteratorActions::FrontToBack
> FrontToBack
;
54 typedef CCLayerIterator
<LayerChromium
, Vector
<RefPtr
<LayerChromium
> >, RenderSurfaceChromium
, CCLayerIteratorActions::BackToFront
> BackToFront
;
56 void resetCounts(Vector
<RefPtr
<LayerChromium
> >& renderSurfaceLayerList
)
58 for (unsigned surfaceIndex
= 0; surfaceIndex
< renderSurfaceLayerList
.size(); ++surfaceIndex
) {
59 TestLayerChromium
* renderSurfaceLayer
= static_cast<TestLayerChromium
*>(renderSurfaceLayerList
[surfaceIndex
].get());
60 RenderSurfaceChromium
* renderSurface
= renderSurfaceLayer
->renderSurface();
62 renderSurfaceLayer
->m_countRepresentingTargetSurface
= -1;
63 renderSurfaceLayer
->m_countRepresentingContributingSurface
= -1;
64 renderSurfaceLayer
->m_countRepresentingItself
= -1;
66 for (unsigned layerIndex
= 0; layerIndex
< renderSurface
->layerList().size(); ++layerIndex
) {
67 TestLayerChromium
* layer
= static_cast<TestLayerChromium
*>(renderSurface
->layerList()[layerIndex
].get());
69 layer
->m_countRepresentingTargetSurface
= -1;
70 layer
->m_countRepresentingContributingSurface
= -1;
71 layer
->m_countRepresentingItself
= -1;
76 void iterateFrontToBack(Vector
<RefPtr
<LayerChromium
> >* renderSurfaceLayerList
)
78 resetCounts(*renderSurfaceLayerList
);
80 for (FrontToBack it
= FrontToBack::begin(renderSurfaceLayerList
); it
!= FrontToBack::end(renderSurfaceLayerList
); ++it
, ++count
) {
81 TestLayerChromium
* layer
= static_cast<TestLayerChromium
*>(*it
);
82 if (it
.representsTargetRenderSurface())
83 layer
->m_countRepresentingTargetSurface
= count
;
84 if (it
.representsContributingRenderSurface())
85 layer
->m_countRepresentingContributingSurface
= count
;
86 if (it
.representsItself())
87 layer
->m_countRepresentingItself
= count
;
91 void iterateBackToFront(Vector
<RefPtr
<LayerChromium
> >* renderSurfaceLayerList
)
93 resetCounts(*renderSurfaceLayerList
);
95 for (BackToFront it
= BackToFront::begin(renderSurfaceLayerList
); it
!= BackToFront::end(renderSurfaceLayerList
); ++it
, ++count
) {
96 TestLayerChromium
* layer
= static_cast<TestLayerChromium
*>(*it
);
97 if (it
.representsTargetRenderSurface())
98 layer
->m_countRepresentingTargetSurface
= count
;
99 if (it
.representsContributingRenderSurface())
100 layer
->m_countRepresentingContributingSurface
= count
;
101 if (it
.representsItself())
102 layer
->m_countRepresentingItself
= count
;
106 TEST(CCLayerIteratorTest
, emptyTree
)
108 Vector
<RefPtr
<LayerChromium
> > renderSurfaceLayerList
;
110 iterateBackToFront(&renderSurfaceLayerList
);
111 iterateFrontToBack(&renderSurfaceLayerList
);
114 TEST(CCLayerIteratorTest
, simpleTree
)
116 RefPtr
<TestLayerChromium
> rootLayer
= TestLayerChromium::create();
117 RefPtr
<TestLayerChromium
> first
= TestLayerChromium::create();
118 RefPtr
<TestLayerChromium
> second
= TestLayerChromium::create();
119 RefPtr
<TestLayerChromium
> third
= TestLayerChromium::create();
120 RefPtr
<TestLayerChromium
> fourth
= TestLayerChromium::create();
122 rootLayer
->createRenderSurface();
124 rootLayer
->addChild(first
);
125 rootLayer
->addChild(second
);
126 rootLayer
->addChild(third
);
127 rootLayer
->addChild(fourth
);
129 Vector
<RefPtr
<LayerChromium
> > renderSurfaceLayerList
;
130 CCLayerTreeHostCommon::calculateDrawTransforms(rootLayer
.get(), rootLayer
->bounds(), 1, 256, renderSurfaceLayerList
);
131 CCLayerTreeHostCommon::calculateVisibleRects(renderSurfaceLayerList
);
133 iterateBackToFront(&renderSurfaceLayerList
);
134 EXPECT_COUNT(rootLayer
, 0, -1, 1);
135 EXPECT_COUNT(first
, -1, -1, 2);
136 EXPECT_COUNT(second
, -1, -1, 3);
137 EXPECT_COUNT(third
, -1, -1, 4);
138 EXPECT_COUNT(fourth
, -1, -1, 5);
140 iterateFrontToBack(&renderSurfaceLayerList
);
141 EXPECT_COUNT(rootLayer
, 5, -1, 4);
142 EXPECT_COUNT(first
, -1, -1, 3);
143 EXPECT_COUNT(second
, -1, -1, 2);
144 EXPECT_COUNT(third
, -1, -1, 1);
145 EXPECT_COUNT(fourth
, -1, -1, 0);
149 TEST(CCLayerIteratorTest
, complexTree
)
151 RefPtr
<TestLayerChromium
> rootLayer
= TestLayerChromium::create();
152 RefPtr
<TestLayerChromium
> root1
= TestLayerChromium::create();
153 RefPtr
<TestLayerChromium
> root2
= TestLayerChromium::create();
154 RefPtr
<TestLayerChromium
> root3
= TestLayerChromium::create();
155 RefPtr
<TestLayerChromium
> root21
= TestLayerChromium::create();
156 RefPtr
<TestLayerChromium
> root22
= TestLayerChromium::create();
157 RefPtr
<TestLayerChromium
> root23
= TestLayerChromium::create();
158 RefPtr
<TestLayerChromium
> root221
= TestLayerChromium::create();
159 RefPtr
<TestLayerChromium
> root231
= TestLayerChromium::create();
161 rootLayer
->createRenderSurface();
163 rootLayer
->addChild(root1
);
164 rootLayer
->addChild(root2
);
165 rootLayer
->addChild(root3
);
166 root2
->addChild(root21
);
167 root2
->addChild(root22
);
168 root2
->addChild(root23
);
169 root22
->addChild(root221
);
170 root23
->addChild(root231
);
172 Vector
<RefPtr
<LayerChromium
> > renderSurfaceLayerList
;
173 CCLayerTreeHostCommon::calculateDrawTransforms(rootLayer
.get(), rootLayer
->bounds(), 1, 256, renderSurfaceLayerList
);
174 CCLayerTreeHostCommon::calculateVisibleRects(renderSurfaceLayerList
);
176 iterateBackToFront(&renderSurfaceLayerList
);
177 EXPECT_COUNT(rootLayer
, 0, -1, 1);
178 EXPECT_COUNT(root1
, -1, -1, 2);
179 EXPECT_COUNT(root2
, -1, -1, 3);
180 EXPECT_COUNT(root21
, -1, -1, 4);
181 EXPECT_COUNT(root22
, -1, -1, 5);
182 EXPECT_COUNT(root221
, -1, -1, 6);
183 EXPECT_COUNT(root23
, -1, -1, 7);
184 EXPECT_COUNT(root231
, -1, -1, 8);
185 EXPECT_COUNT(root3
, -1, -1, 9);
187 iterateFrontToBack(&renderSurfaceLayerList
);
188 EXPECT_COUNT(rootLayer
, 9, -1, 8);
189 EXPECT_COUNT(root1
, -1, -1, 7);
190 EXPECT_COUNT(root2
, -1, -1, 6);
191 EXPECT_COUNT(root21
, -1, -1, 5);
192 EXPECT_COUNT(root22
, -1, -1, 4);
193 EXPECT_COUNT(root221
, -1, -1, 3);
194 EXPECT_COUNT(root23
, -1, -1, 2);
195 EXPECT_COUNT(root231
, -1, -1, 1);
196 EXPECT_COUNT(root3
, -1, -1, 0);
200 TEST(CCLayerIteratorTest
, complexTreeMultiSurface
)
202 RefPtr
<TestLayerChromium
> rootLayer
= TestLayerChromium::create();
203 RefPtr
<TestLayerChromium
> root1
= TestLayerChromium::create();
204 RefPtr
<TestLayerChromium
> root2
= TestLayerChromium::create();
205 RefPtr
<TestLayerChromium
> root3
= TestLayerChromium::create();
206 RefPtr
<TestLayerChromium
> root21
= TestLayerChromium::create();
207 RefPtr
<TestLayerChromium
> root22
= TestLayerChromium::create();
208 RefPtr
<TestLayerChromium
> root23
= TestLayerChromium::create();
209 RefPtr
<TestLayerChromium
> root221
= TestLayerChromium::create();
210 RefPtr
<TestLayerChromium
> root231
= TestLayerChromium::create();
212 rootLayer
->createRenderSurface();
213 rootLayer
->renderSurface()->setContentRect(IntRect(IntPoint(), rootLayer
->bounds()));
215 rootLayer
->addChild(root1
);
216 rootLayer
->addChild(root2
);
217 rootLayer
->addChild(root3
);
218 root2
->setDrawsContent(false);
219 root2
->setOpacity(0.5); // Force the layer to own a new surface.
220 root2
->addChild(root21
);
221 root2
->addChild(root22
);
222 root2
->addChild(root23
);
223 root22
->setOpacity(0.5);
224 root22
->addChild(root221
);
225 root23
->setOpacity(0.5);
226 root23
->addChild(root231
);
228 Vector
<RefPtr
<LayerChromium
> > renderSurfaceLayerList
;
229 CCLayerTreeHostCommon::calculateDrawTransforms(rootLayer
.get(), rootLayer
->bounds(), 1, 256, renderSurfaceLayerList
);
230 CCLayerTreeHostCommon::calculateVisibleRects(renderSurfaceLayerList
);
232 iterateBackToFront(&renderSurfaceLayerList
);
233 EXPECT_COUNT(rootLayer
, 0, -1, 1);
234 EXPECT_COUNT(root1
, -1, -1, 2);
235 EXPECT_COUNT(root2
, 4, 3, -1);
236 EXPECT_COUNT(root21
, -1, -1, 5);
237 EXPECT_COUNT(root22
, 7, 6, 8);
238 EXPECT_COUNT(root221
, -1, -1, 9);
239 EXPECT_COUNT(root23
, 11, 10, 12);
240 EXPECT_COUNT(root231
, -1, -1, 13);
241 EXPECT_COUNT(root3
, -1, -1, 14);
243 iterateFrontToBack(&renderSurfaceLayerList
);
244 EXPECT_COUNT(rootLayer
, 14, -1, 13);
245 EXPECT_COUNT(root1
, -1, -1, 12);
246 EXPECT_COUNT(root2
, 10, 11, -1);
247 EXPECT_COUNT(root21
, -1, -1, 9);
248 EXPECT_COUNT(root22
, 7, 8, 6);
249 EXPECT_COUNT(root221
, -1, -1, 5);
250 EXPECT_COUNT(root23
, 3, 4, 2);
251 EXPECT_COUNT(root231
, -1, -1, 1);
252 EXPECT_COUNT(root3
, -1, -1, 0);