OLD | NEW |
---|---|
(Empty) | |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "config.h" | |
6 #include "core/layout/compositing/CompositedLayerMapping.h" | |
7 | |
8 #include "core/frame/FrameView.h" | |
9 #include "core/layout/LayoutBoxModelObject.h" | |
10 #include "core/layout/LayoutTestHelper.h" | |
11 #include "core/paint/PaintLayer.h" | |
12 #include <gtest/gtest.h> | |
13 | |
14 namespace blink { | |
15 | |
16 class CompositedLayerMappingTest : public RenderingTest { | |
17 public: | |
18 CompositedLayerMappingTest() | |
19 : m_originalSlimmingPaintSynchronizedPaintingEnabled(RuntimeEnabledFeatu res::slimmingPaintSynchronizedPaintingEnabled()) { } | |
20 | |
21 protected: | |
22 IntRect computeInterestRect(const GraphicsLayer* graphicsLayer, LayoutObject * owningLayoutObject) | |
23 { | |
24 return CompositedLayerMapping::computeInterestRect(graphicsLayer, owning LayoutObject); | |
25 } | |
26 | |
27 private: | |
28 void SetUp() override | |
29 { | |
30 RuntimeEnabledFeatures::setSlimmingPaintSynchronizedPaintingEnabled(true ); | |
31 | |
32 RenderingTest::SetUp(); | |
33 enableCompositing(); | |
34 GraphicsLayer::setDrawDebugRedFillForTesting(false); | |
35 } | |
36 | |
37 void TearDown() override | |
38 { | |
39 GraphicsLayer::setDrawDebugRedFillForTesting(true); | |
40 RuntimeEnabledFeatures::setSlimmingPaintSynchronizedPaintingEnabled(m_or iginalSlimmingPaintSynchronizedPaintingEnabled); | |
41 } | |
42 | |
43 bool m_originalSlimmingPaintSynchronizedPaintingEnabled; | |
44 }; | |
45 | |
46 static void printRect(IntRect rect) | |
47 { | |
48 fprintf(stderr, "[x=%d y=%d maxX=%d maxY=%d]\n", rect.x(), rect.y(), rect.ma xX(), rect.maxY()); | |
49 } | |
50 | |
51 static bool checkRectsEqual(const IntRect& expected, const IntRect& actual) | |
52 { | |
53 if (expected != actual) { | |
54 fprintf(stderr, "Expected: "); | |
55 printRect(expected); | |
56 fprintf(stderr, "Actual: "); | |
57 printRect(actual); | |
58 return false; | |
59 } | |
60 return true; | |
61 } | |
62 | |
63 TEST_F(CompositedLayerMappingTest, SimpleInterestRect) | |
64 { | |
65 setBodyInnerHTML("<div id='target' style='width: 200px; height: 200px; will- change: transform'></div>"); | |
66 | |
67 document().view()->updateAllLifecyclePhases(); | |
68 Element* element = document().getElementById("target"); | |
69 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
70 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | |
71 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 200), computeInterestRect(pai ntLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
72 } | |
73 | |
74 TEST_F(CompositedLayerMappingTest, TallLayerInterestRect) | |
75 { | |
76 setBodyInnerHTML("<div id='target' style='width: 200px; height: 10000px; wil l-change: transform'></div>"); | |
77 | |
78 document().view()->updateAllLifecyclePhases(); | |
79 Element* element = document().getElementById("target"); | |
80 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
81 ASSERT_TRUE(paintLayer->graphicsLayerBacking()); | |
82 // Screen-space visible content rect is [8, 8, 200, 600]. Mapping back to lo cal, adding 4000px in all directions, then | |
83 // clipping, yields this rect. | |
84 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 4592), computeInterestRect(pa intLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
85 } | |
86 | |
87 TEST_F(CompositedLayerMappingTest, RotatedInterestRect) | |
88 { | |
89 setBodyInnerHTML( | |
90 "<div id='target' style='width: 200px; height: 200px; will-change: trans form; transform: rotateZ(45deg)'></div>"); | |
91 | |
92 document().view()->updateAllLifecyclePhases(); | |
93 Element* element = document().getElementById("target"); | |
94 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
95 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | |
96 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 200), computeInterestRect(pai ntLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
97 } | |
98 | |
99 TEST_F(CompositedLayerMappingTest, 3D90DegRotatedTallInterestRect) | |
100 { | |
101 // It's rotated 90 degrees about the X axis, which means its visual content rect is empty, and so the interest rect is the | |
102 // default (0, 0, 4000, 4000) intersected with the layer bounds. | |
103 setBodyInnerHTML( | |
104 "<div id='target' style='width: 200px; height: 10000px; will-change: tra nsform; transform: rotateY(90deg)'></div>"); | |
105 | |
106 document().view()->updateAllLifecyclePhases(); | |
107 Element* element = document().getElementById("target"); | |
108 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
109 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | |
110 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 4000), computeInterestRect(pa intLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
111 } | |
112 | |
113 TEST_F(CompositedLayerMappingTest, 3D45DegRotatedTallInterestRect) | |
114 { | |
115 // It's rotated 90 degrees about the X axis, which means its visual content rect is empty, and so the interest rect is the | |
ajuma
2015/10/09 22:03:55
Comment doesn't match test.
chrishtr
2015/10/09 22:28:19
Fixed.
| |
116 // default (0, 0, 4000, 4000) intersected with the layer bounds. | |
117 setBodyInnerHTML( | |
118 "<div id='target' style='width: 200px; height: 10000px; will-change: tra nsform; transform: rotateY(45deg)'></div>"); | |
119 | |
120 document().view()->updateAllLifecyclePhases(); | |
121 Element* element = document().getElementById("target"); | |
122 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
123 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | |
124 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 4592), computeInterestRect(pa intLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
125 } | |
126 | |
127 TEST_F(CompositedLayerMappingTest, RotatedTallInterestRect) | |
128 { | |
129 setBodyInnerHTML( | |
130 "<div id='target' style='width: 200px; height: 10000px; will-change: tra nsform; transform: rotateZ(45deg)'></div>"); | |
131 | |
132 document().view()->updateAllLifecyclePhases(); | |
133 Element* element = document().getElementById("target"); | |
134 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
135 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | |
136 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 4000), computeInterestRect(pa intLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
137 } | |
138 | |
139 TEST_F(CompositedLayerMappingTest, WideLayerInterestRect) | |
140 { | |
141 setBodyInnerHTML("<div id='target' style='width: 10000px; height: 200px; wil l-change: transform'></div>"); | |
142 | |
143 document().view()->updateAllLifecyclePhases(); | |
144 Element* element = document().getElementById("target"); | |
145 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
146 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | |
147 // Screen-space visible content rect is [8, 8, 800, 200] (the screen is 800x 600). | |
148 // Mapping back to local, adding 4000px in all directions, then clipping, yi elds this rect. | |
149 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 4792, 200), computeInterestRect(pa intLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
150 } | |
151 | |
152 TEST_F(CompositedLayerMappingTest, FixedPositionInterestRect) | |
153 { | |
154 setBodyInnerHTML( | |
155 "<div id='target' style='width: 300px; height: 400px; will-change: trans form; position: fixed; top: 100px; left: 200px;'></div>"); | |
156 | |
157 document().view()->updateAllLifecyclePhases(); | |
158 Element* element = document().getElementById("target"); | |
159 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
160 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | |
161 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 300, 400), computeInterestRect(pai ntLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
162 } | |
163 | |
164 TEST_F(CompositedLayerMappingTest, LayerOffscreenInterestRect) | |
165 { | |
166 setBodyInnerHTML( | |
167 "<div id='target' style='width: 200px; height: 200px; will-change: trans form; position: absolute; top: 9000px; left: 0px;'>" | |
168 "</div>"); | |
169 | |
170 document().view()->updateAllLifecyclePhases(); | |
171 Element* element = document().getElementById("target"); | |
172 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
173 ASSERT_TRUE(!!paintLayer->graphicsLayerBacking()); | |
174 // Offscreen layers are painted as usual. | |
175 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 200), computeInterestRect(pai ntLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
176 } | |
177 | |
178 TEST_F(CompositedLayerMappingTest, ScrollingLayerInterestRect) | |
179 { | |
180 setBodyInnerHTML( | |
181 "<style>div::-webkit-scrollbar{ width: 5px; }</style>" | |
182 "<div id='target' style='width: 200px; height: 200px; will-change: trans form; overflow: scroll'>" | |
183 "<div style='width: 100px; height: 10000px'></div></div>"); | |
184 | |
185 document().view()->updateAllLifecyclePhases(); | |
186 Element* element = document().getElementById("target"); | |
187 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
188 ASSERT_TRUE(paintLayer->graphicsLayerBacking()); | |
189 // Offscreen layers are painted as usual. | |
190 ASSERT_TRUE(paintLayer->compositedLayerMapping()->scrollingLayer()); | |
191 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 195, 4592), computeInterestRect(pa intLayer->graphicsLayerBackingForScrolling(), paintLayer->layoutObject()))); | |
192 } | |
193 | |
194 TEST_F(CompositedLayerMappingTest, ClippedBigLayer) | |
195 { | |
196 setBodyInnerHTML( | |
197 "<div style='width: 1px; height: 1px; overflow: hidden'>" | |
198 "<div id='target' style='width: 10000px; height: 10000px; will-change: t ransform'></div></div>"); | |
199 | |
200 document().view()->updateAllLifecyclePhases(); | |
201 Element* element = document().getElementById("target"); | |
202 PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->la yer(); | |
203 ASSERT_TRUE(paintLayer->graphicsLayerBacking()); | |
204 // Offscreen layers are painted as usual. | |
205 EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 4001, 4001), computeInterestRect(p aintLayer->graphicsLayerBacking(), paintLayer->layoutObject()))); | |
206 } | |
207 | |
208 } // namespace blink | |
OLD | NEW |