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

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilderTest.cpp

Issue 2173363002: Improve code readibility of PaintPropertyTreeBuilder (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove extra "const" (might be a typo) Created 4 years, 4 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
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "core/layout/LayoutTestHelper.h" 5 #include "core/layout/LayoutTestHelper.h"
6 #include "core/layout/LayoutTreeAsText.h" 6 #include "core/layout/LayoutTreeAsText.h"
7 #include "core/layout/api/LayoutViewItem.h" 7 #include "core/layout/api/LayoutViewItem.h"
8 #include "core/paint/ObjectPaintProperties.h" 8 #include "core/paint/ObjectPaintProperties.h"
9 #include "platform/graphics/paint/GeometryMapper.h" 9 #include "platform/graphics/paint/GeometryMapper.h"
10 #include "platform/graphics/paint/TransformPaintPropertyNode.h" 10 #include "platform/graphics/paint/TransformPaintPropertyNode.h"
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 71
72 TEST_F(PaintPropertyTreeBuilderTest, FixedPosition) 72 TEST_F(PaintPropertyTreeBuilderTest, FixedPosition)
73 { 73 {
74 loadTestData("fixed-position.html"); 74 loadTestData("fixed-position.html");
75 75
76 FrameView* frameView = document().view(); 76 FrameView* frameView = document().view();
77 77
78 // target1 is a fixed-position element inside an absolute-position scrolling element. 78 // target1 is a fixed-position element inside an absolute-position scrolling element.
79 // It should be attached under the viewport to skip scrolling and offset of the parent. 79 // It should be attached under the viewport to skip scrolling and offset of the parent.
80 Element* target1 = document().getElementById("target1"); 80 Element* target1 = document().getElementById("target1");
81 ObjectPaintProperties* target1Properties = target1->layoutObject()->objectPa intProperties(); 81 const ObjectPaintProperties* target1Properties = target1->layoutObject()->ob jectPaintProperties();
82 EXPECT_EQ(TransformationMatrix().translate(200, 150), target1Properties->pai ntOffsetTranslation()->matrix()); 82 EXPECT_EQ(TransformationMatrix().translate(200, 150), target1Properties->pai ntOffsetTranslation()->matrix());
83 EXPECT_EQ(frameView->preTranslation(), target1Properties->paintOffsetTransla tion()->parent()); 83 EXPECT_EQ(frameView->preTranslation(), target1Properties->paintOffsetTransla tion()->parent());
84 EXPECT_EQ(target1Properties->paintOffsetTranslation(), target1Properties->ov erflowClip()->localTransformSpace()); 84 EXPECT_EQ(target1Properties->paintOffsetTranslation(), target1Properties->ov erflowClip()->localTransformSpace());
85 EXPECT_EQ(FloatRoundedRect(0, 0, 100, 100), target1Properties->overflowClip( )->clipRect()); 85 EXPECT_EQ(FloatRoundedRect(0, 0, 100, 100), target1Properties->overflowClip( )->clipRect());
86 // Likewise, it inherits clip from the viewport, skipping overflow clip of t he scroller. 86 // Likewise, it inherits clip from the viewport, skipping overflow clip of t he scroller.
87 EXPECT_EQ(frameView->contentClip(), target1Properties->overflowClip()->paren t()); 87 EXPECT_EQ(frameView->contentClip(), target1Properties->overflowClip()->paren t());
88 88
89 // target2 is a fixed-position element inside a transformed scrolling elemen t. 89 // target2 is a fixed-position element inside a transformed scrolling elemen t.
90 // It should be attached under the scrolled box of the transformed element. 90 // It should be attached under the scrolled box of the transformed element.
91 Element* target2 = document().getElementById("target2"); 91 Element* target2 = document().getElementById("target2");
92 ObjectPaintProperties* target2Properties = target2->layoutObject()->objectPa intProperties(); 92 const ObjectPaintProperties* target2Properties = target2->layoutObject()->ob jectPaintProperties();
93 Element* scroller = document().getElementById("scroller"); 93 Element* scroller = document().getElementById("scroller");
94 ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->object PaintProperties(); 94 const ObjectPaintProperties* scrollerProperties = scroller->layoutObject()-> objectPaintProperties();
95 EXPECT_EQ(TransformationMatrix().translate(200, 150), target2Properties->pai ntOffsetTranslation()->matrix()); 95 EXPECT_EQ(TransformationMatrix().translate(200, 150), target2Properties->pai ntOffsetTranslation()->matrix());
96 EXPECT_EQ(scrollerProperties->scrollTranslation(), target2Properties->paintO ffsetTranslation()->parent()); 96 EXPECT_EQ(scrollerProperties->scrollTranslation(), target2Properties->paintO ffsetTranslation()->parent());
97 EXPECT_EQ(target2Properties->paintOffsetTranslation(), target2Properties->ov erflowClip()->localTransformSpace()); 97 EXPECT_EQ(target2Properties->paintOffsetTranslation(), target2Properties->ov erflowClip()->localTransformSpace());
98 EXPECT_EQ(FloatRoundedRect(0, 0, 100, 100), target2Properties->overflowClip( )->clipRect()); 98 EXPECT_EQ(FloatRoundedRect(0, 0, 100, 100), target2Properties->overflowClip( )->clipRect());
99 EXPECT_EQ(scrollerProperties->overflowClip(), target2Properties->overflowCli p()->parent()); 99 EXPECT_EQ(scrollerProperties->overflowClip(), target2Properties->overflowCli p()->parent());
100 100
101 CHECK_VISUAL_RECT(target1->layoutObject(), frameView->layoutView()); 101 CHECK_VISUAL_RECT(target1->layoutObject(), frameView->layoutView());
102 } 102 }
103 103
104 TEST_F(PaintPropertyTreeBuilderTest, PositionAndScroll) 104 TEST_F(PaintPropertyTreeBuilderTest, PositionAndScroll)
105 { 105 {
106 loadTestData("position-and-scroll.html"); 106 loadTestData("position-and-scroll.html");
107 107
108 Element* scroller = document().getElementById("scroller"); 108 Element* scroller = document().getElementById("scroller");
109 scroller->scrollTo(0, 100); 109 scroller->scrollTo(0, 100);
110 FrameView* frameView = document().view(); 110 FrameView* frameView = document().view();
111 frameView->updateAllLifecyclePhases(); 111 frameView->updateAllLifecyclePhases();
112 ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->object PaintProperties(); 112 const ObjectPaintProperties* scrollerProperties = scroller->layoutObject()-> objectPaintProperties();
113 EXPECT_EQ(TransformationMatrix().translate(0, -100), scrollerProperties->scr ollTranslation()->matrix()); 113 EXPECT_EQ(TransformationMatrix().translate(0, -100), scrollerProperties->scr ollTranslation()->matrix());
114 EXPECT_EQ(frameView->scrollTranslation(), scrollerProperties->scrollTranslat ion()->parent()); 114 EXPECT_EQ(frameView->scrollTranslation(), scrollerProperties->scrollTranslat ion()->parent());
115 EXPECT_EQ(frameView->scrollTranslation(), scrollerProperties->overflowClip() ->localTransformSpace()); 115 EXPECT_EQ(frameView->scrollTranslation(), scrollerProperties->overflowClip() ->localTransformSpace());
116 EXPECT_EQ(FloatRoundedRect(120, 340, 400, 300), scrollerProperties->overflow Clip()->clipRect()); 116 EXPECT_EQ(FloatRoundedRect(120, 340, 400, 300), scrollerProperties->overflow Clip()->clipRect());
117 EXPECT_EQ(frameView->contentClip(), scrollerProperties->overflowClip()->pare nt()); 117 EXPECT_EQ(frameView->contentClip(), scrollerProperties->overflowClip()->pare nt());
118 118
119 // The relative-positioned element should have accumulated box offset (exclu de scrolling), 119 // The relative-positioned element should have accumulated box offset (exclu de scrolling),
120 // and should be affected by ancestor scroll transforms. 120 // and should be affected by ancestor scroll transforms.
121 Element* relPos = document().getElementById("rel-pos"); 121 Element* relPos = document().getElementById("rel-pos");
122 ObjectPaintProperties* relPosProperties = relPos->layoutObject()->objectPain tProperties(); 122 const ObjectPaintProperties* relPosProperties = relPos->layoutObject()->obje ctPaintProperties();
123 EXPECT_EQ(TransformationMatrix().translate(680, 1120), relPosProperties->pai ntOffsetTranslation()->matrix()); 123 EXPECT_EQ(TransformationMatrix().translate(680, 1120), relPosProperties->pai ntOffsetTranslation()->matrix());
124 EXPECT_EQ(scrollerProperties->scrollTranslation(), relPosProperties->paintOf fsetTranslation()->parent()); 124 EXPECT_EQ(scrollerProperties->scrollTranslation(), relPosProperties->paintOf fsetTranslation()->parent());
125 EXPECT_EQ(relPosProperties->transform(), relPosProperties->overflowClip()->l ocalTransformSpace()); 125 EXPECT_EQ(relPosProperties->transform(), relPosProperties->overflowClip()->l ocalTransformSpace());
126 EXPECT_EQ(FloatRoundedRect(0, 0, 400, 0), relPosProperties->overflowClip()-> clipRect()); 126 EXPECT_EQ(FloatRoundedRect(0, 0, 400, 0), relPosProperties->overflowClip()-> clipRect());
127 EXPECT_EQ(scrollerProperties->overflowClip(), relPosProperties->overflowClip ()->parent()); 127 EXPECT_EQ(scrollerProperties->overflowClip(), relPosProperties->overflowClip ()->parent());
128 128
129 // The absolute-positioned element should not be affected by non-positioned scroller at all. 129 // The absolute-positioned element should not be affected by non-positioned scroller at all.
130 Element* absPos = document().getElementById("abs-pos"); 130 Element* absPos = document().getElementById("abs-pos");
131 ObjectPaintProperties* absPosProperties = absPos->layoutObject()->objectPain tProperties(); 131 const ObjectPaintProperties* absPosProperties = absPos->layoutObject()->obje ctPaintProperties();
132 EXPECT_EQ(TransformationMatrix().translate(123, 456), absPosProperties->pain tOffsetTranslation()->matrix()); 132 EXPECT_EQ(TransformationMatrix().translate(123, 456), absPosProperties->pain tOffsetTranslation()->matrix());
133 EXPECT_EQ(frameView->scrollTranslation(), absPosProperties->paintOffsetTrans lation()->parent()); 133 EXPECT_EQ(frameView->scrollTranslation(), absPosProperties->paintOffsetTrans lation()->parent());
134 EXPECT_EQ(absPosProperties->transform(), absPosProperties->overflowClip()->l ocalTransformSpace()); 134 EXPECT_EQ(absPosProperties->transform(), absPosProperties->overflowClip()->l ocalTransformSpace());
135 EXPECT_EQ(FloatRoundedRect(), absPosProperties->overflowClip()->clipRect()); 135 EXPECT_EQ(FloatRoundedRect(), absPosProperties->overflowClip()->clipRect());
136 EXPECT_EQ(frameView->contentClip(), absPosProperties->overflowClip()->parent ()); 136 EXPECT_EQ(frameView->contentClip(), absPosProperties->overflowClip()->parent ());
137 } 137 }
138 138
139 TEST_F(PaintPropertyTreeBuilderTest, FrameScrollingTraditional) 139 TEST_F(PaintPropertyTreeBuilderTest, FrameScrollingTraditional)
140 { 140 {
141 setBodyInnerHTML("<style> body { height: 10000px; } </style>"); 141 setBodyInnerHTML("<style> body { height: 10000px; } </style>");
142 142
143 document().domWindow()->scrollTo(0, 100); 143 document().domWindow()->scrollTo(0, 100);
144 144
145 FrameView* frameView = document().view(); 145 FrameView* frameView = document().view();
146 frameView->updateAllLifecyclePhases(); 146 frameView->updateAllLifecyclePhases();
147 EXPECT_EQ(TransformationMatrix(), frameView->preTranslation()->matrix()); 147 EXPECT_EQ(TransformationMatrix(), frameView->preTranslation()->matrix());
148 EXPECT_EQ(frameView->rootTransform(), frameView->preTranslation()->parent()) ; 148 EXPECT_EQ(frameView->rootTransform(), frameView->preTranslation()->parent()) ;
149 EXPECT_EQ(nullptr, frameView->rootTransform()->parent()); 149 EXPECT_EQ(nullptr, frameView->rootTransform()->parent());
150 EXPECT_EQ(TransformationMatrix().translate(0, -100), frameView->scrollTransl ation()->matrix()); 150 EXPECT_EQ(TransformationMatrix().translate(0, -100), frameView->scrollTransl ation()->matrix());
151 EXPECT_EQ(frameView->preTranslation(), frameView->scrollTranslation()->paren t()); 151 EXPECT_EQ(frameView->preTranslation(), frameView->scrollTranslation()->paren t());
152 EXPECT_EQ(frameView->preTranslation(), frameView->contentClip()->localTransf ormSpace()); 152 EXPECT_EQ(frameView->preTranslation(), frameView->contentClip()->localTransf ormSpace());
153 EXPECT_EQ(FloatRoundedRect(0, 0, 800, 600), frameView->contentClip()->clipRe ct()); 153 EXPECT_EQ(FloatRoundedRect(0, 0, 800, 600), frameView->contentClip()->clipRe ct());
154 EXPECT_EQ(frameView->rootClip(), frameView->contentClip()->parent()); 154 EXPECT_EQ(frameView->rootClip(), frameView->contentClip()->parent());
155 EXPECT_EQ(nullptr, frameView->rootClip()->parent()); 155 EXPECT_EQ(nullptr, frameView->rootClip()->parent());
156 156
157 LayoutViewItem layoutViewItem = document().layoutViewItem(); 157 LayoutViewItem layoutViewItem = document().layoutViewItem();
158 ObjectPaintProperties* layoutViewProperties = layoutViewItem.objectPaintProp erties(); 158 const ObjectPaintProperties* layoutViewProperties = layoutViewItem.objectPai ntProperties();
159 EXPECT_EQ(nullptr, layoutViewProperties->scrollTranslation()); 159 EXPECT_EQ(nullptr, layoutViewProperties->scrollTranslation());
160 } 160 }
161 161
162 // TODO(trchen): Settings::rootLayerScrolls cannot be switched after main frame being created. 162 // TODO(trchen): Settings::rootLayerScrolls cannot be switched after main frame being created.
163 // Need to set it during test setup. Besides that, the test still won't work bec ause 163 // Need to set it during test setup. Besides that, the test still won't work bec ause
164 // root layer scrolling mode is not compatible with SPv2 at this moment. 164 // root layer scrolling mode is not compatible with SPv2 at this moment.
165 // (Duplicate display item ID for FrameView and LayoutView.) 165 // (Duplicate display item ID for FrameView and LayoutView.)
166 TEST_F(PaintPropertyTreeBuilderTest, DISABLED_FrameScrollingRootLayerScrolls) 166 TEST_F(PaintPropertyTreeBuilderTest, DISABLED_FrameScrollingRootLayerScrolls)
167 { 167 {
168 document().settings()->setRootLayerScrolls(true); 168 document().settings()->setRootLayerScrolls(true);
169 169
170 setBodyInnerHTML("<style> body { height: 10000px; } </style>"); 170 setBodyInnerHTML("<style> body { height: 10000px; } </style>");
171 171
172 document().domWindow()->scrollTo(0, 100); 172 document().domWindow()->scrollTo(0, 100);
173 173
174 FrameView* frameView = document().view(); 174 FrameView* frameView = document().view();
175 frameView->updateAllLifecyclePhases(); 175 frameView->updateAllLifecyclePhases();
176 EXPECT_EQ(TransformationMatrix(), frameView->preTranslation()->matrix()); 176 EXPECT_EQ(TransformationMatrix(), frameView->preTranslation()->matrix());
177 EXPECT_EQ(nullptr, frameView->preTranslation()->parent()); 177 EXPECT_EQ(nullptr, frameView->preTranslation()->parent());
178 EXPECT_EQ(TransformationMatrix(), frameView->scrollTranslation()->matrix()); 178 EXPECT_EQ(TransformationMatrix(), frameView->scrollTranslation()->matrix());
179 EXPECT_EQ(frameView->preTranslation(), frameView->scrollTranslation()->paren t()); 179 EXPECT_EQ(frameView->preTranslation(), frameView->scrollTranslation()->paren t());
180 180
181 LayoutViewItem layoutViewItem = document().layoutViewItem(); 181 LayoutViewItem layoutViewItem = document().layoutViewItem();
182 ObjectPaintProperties* layoutViewProperties = layoutViewItem.objectPaintProp erties(); 182 const ObjectPaintProperties* layoutViewProperties = layoutViewItem.objectPai ntProperties();
183 EXPECT_EQ(TransformationMatrix().translate(0, -100), layoutViewProperties->s crollTranslation()->matrix()); 183 EXPECT_EQ(TransformationMatrix().translate(0, -100), layoutViewProperties->s crollTranslation()->matrix());
184 EXPECT_EQ(frameView->scrollTranslation(), layoutViewProperties->scrollTransl ation()->parent()); 184 EXPECT_EQ(frameView->scrollTranslation(), layoutViewProperties->scrollTransl ation()->parent());
185 } 185 }
186 186
187 TEST_F(PaintPropertyTreeBuilderTest, Perspective) 187 TEST_F(PaintPropertyTreeBuilderTest, Perspective)
188 { 188 {
189 loadTestData("perspective.html"); 189 loadTestData("perspective.html");
190 190
191 Element* perspective = document().getElementById("perspective"); 191 Element* perspective = document().getElementById("perspective");
192 ObjectPaintProperties* perspectiveProperties = perspective->layoutObject()-> objectPaintProperties(); 192 const ObjectPaintProperties* perspectiveProperties = perspective->layoutObje ct()->objectPaintProperties();
193 EXPECT_EQ(TransformationMatrix().applyPerspective(100), perspectivePropertie s->perspective()->matrix()); 193 EXPECT_EQ(TransformationMatrix().applyPerspective(100), perspectivePropertie s->perspective()->matrix());
194 // The perspective origin is the center of the border box plus accumulated p aint offset. 194 // The perspective origin is the center of the border box plus accumulated p aint offset.
195 EXPECT_EQ(FloatPoint3D(250, 250, 0), perspectiveProperties->perspective()->o rigin()); 195 EXPECT_EQ(FloatPoint3D(250, 250, 0), perspectiveProperties->perspective()->o rigin());
196 EXPECT_EQ(document().view()->scrollTranslation(), perspectiveProperties->per spective()->parent()); 196 EXPECT_EQ(document().view()->scrollTranslation(), perspectiveProperties->per spective()->parent());
197 197
198 // Adding perspective doesn't clear paint offset. The paint offset will be p assed down to children. 198 // Adding perspective doesn't clear paint offset. The paint offset will be p assed down to children.
199 Element* inner = document().getElementById("inner"); 199 Element* inner = document().getElementById("inner");
200 ObjectPaintProperties* innerProperties = inner->layoutObject()->objectPaintP roperties(); 200 const ObjectPaintProperties* innerProperties = inner->layoutObject()->object PaintProperties();
201 EXPECT_EQ(TransformationMatrix().translate(50, 100), innerProperties->paintO ffsetTranslation()->matrix()); 201 EXPECT_EQ(TransformationMatrix().translate(50, 100), innerProperties->paintO ffsetTranslation()->matrix());
202 EXPECT_EQ(perspectiveProperties->perspective(), innerProperties->paintOffset Translation()->parent()); 202 EXPECT_EQ(perspectiveProperties->perspective(), innerProperties->paintOffset Translation()->parent());
203 } 203 }
204 204
205 TEST_F(PaintPropertyTreeBuilderTest, Transform) 205 TEST_F(PaintPropertyTreeBuilderTest, Transform)
206 { 206 {
207 loadTestData("transform.html"); 207 loadTestData("transform.html");
208 208
209 Element* transform = document().getElementById("transform"); 209 Element* transform = document().getElementById("transform");
210 ObjectPaintProperties* transformProperties = transform->layoutObject()->obje ctPaintProperties(); 210 const ObjectPaintProperties* transformProperties = transform->layoutObject() ->objectPaintProperties();
211 EXPECT_EQ(TransformationMatrix().translate3d(123, 456, 789), transformProper ties->transform()->matrix()); 211 EXPECT_EQ(TransformationMatrix().translate3d(123, 456, 789), transformProper ties->transform()->matrix());
212 EXPECT_EQ(FloatPoint3D(200, 150, 0), transformProperties->transform()->origi n()); 212 EXPECT_EQ(FloatPoint3D(200, 150, 0), transformProperties->transform()->origi n());
213 EXPECT_EQ(transformProperties->paintOffsetTranslation(), transformProperties ->transform()->parent()); 213 EXPECT_EQ(transformProperties->paintOffsetTranslation(), transformProperties ->transform()->parent());
214 EXPECT_EQ(TransformationMatrix().translate(50, 100), transformProperties->pa intOffsetTranslation()->matrix()); 214 EXPECT_EQ(TransformationMatrix().translate(50, 100), transformProperties->pa intOffsetTranslation()->matrix());
215 EXPECT_EQ(document().view()->scrollTranslation(), transformProperties->paint OffsetTranslation()->parent()); 215 EXPECT_EQ(document().view()->scrollTranslation(), transformProperties->paint OffsetTranslation()->parent());
216 } 216 }
217 217
218 TEST_F(PaintPropertyTreeBuilderTest, RelativePositionInline) 218 TEST_F(PaintPropertyTreeBuilderTest, RelativePositionInline)
219 { 219 {
220 loadTestData("relative-position-inline.html"); 220 loadTestData("relative-position-inline.html");
221 221
222 Element* inlineBlock = document().getElementById("inline-block"); 222 Element* inlineBlock = document().getElementById("inline-block");
223 ObjectPaintProperties* inlineBlockProperties = inlineBlock->layoutObject()-> objectPaintProperties(); 223 const ObjectPaintProperties* inlineBlockProperties = inlineBlock->layoutObje ct()->objectPaintProperties();
224 EXPECT_EQ(TransformationMatrix().translate(135, 490), inlineBlockProperties- >paintOffsetTranslation()->matrix()); 224 EXPECT_EQ(TransformationMatrix().translate(135, 490), inlineBlockProperties- >paintOffsetTranslation()->matrix());
225 EXPECT_EQ(document().view()->scrollTranslation(), inlineBlockProperties->pai ntOffsetTranslation()->parent()); 225 EXPECT_EQ(document().view()->scrollTranslation(), inlineBlockProperties->pai ntOffsetTranslation()->parent());
226 } 226 }
227 227
228 TEST_F(PaintPropertyTreeBuilderTest, NestedOpacityEffect) 228 TEST_F(PaintPropertyTreeBuilderTest, NestedOpacityEffect)
229 { 229 {
230 setBodyInnerHTML( 230 setBodyInnerHTML(
231 "<div id='nodeWithoutOpacity'>" 231 "<div id='nodeWithoutOpacity'>"
232 " <div id='childWithOpacity' style='opacity: 0.5'>" 232 " <div id='childWithOpacity' style='opacity: 0.5'>"
233 " <div id='grandChildWithoutOpacity'>" 233 " <div id='grandChildWithoutOpacity'>"
234 " <div id='greatGrandChildWithOpacity' style='opacity: 0.2'/>" 234 " <div id='greatGrandChildWithOpacity' style='opacity: 0.2'/>"
235 " </div>" 235 " </div>"
236 " </div>" 236 " </div>"
237 "</div>"); 237 "</div>");
238 238
239 LayoutObject& nodeWithoutOpacity = *document().getElementById("nodeWithoutOp acity")->layoutObject(); 239 LayoutObject& nodeWithoutOpacity = *document().getElementById("nodeWithoutOp acity")->layoutObject();
240 ObjectPaintProperties* nodeWithoutOpacityProperties = nodeWithoutOpacity.obj ectPaintProperties(); 240 const ObjectPaintProperties* nodeWithoutOpacityProperties = nodeWithoutOpaci ty.objectPaintProperties();
241 EXPECT_NE(nullptr, nodeWithoutOpacityProperties); 241 EXPECT_NE(nullptr, nodeWithoutOpacityProperties);
242 242
243 LayoutObject& childWithOpacity = *document().getElementById("childWithOpacit y")->layoutObject(); 243 LayoutObject& childWithOpacity = *document().getElementById("childWithOpacit y")->layoutObject();
244 ObjectPaintProperties* childWithOpacityProperties = childWithOpacity.objectP aintProperties(); 244 const ObjectPaintProperties* childWithOpacityProperties = childWithOpacity.o bjectPaintProperties();
245 EXPECT_EQ(0.5f, childWithOpacityProperties->effect()->opacity()); 245 EXPECT_EQ(0.5f, childWithOpacityProperties->effect()->opacity());
246 // childWithOpacity is the root effect node. 246 // childWithOpacity is the root effect node.
247 EXPECT_NE(nullptr, childWithOpacityProperties->effect()->parent()); 247 EXPECT_NE(nullptr, childWithOpacityProperties->effect()->parent());
248 248
249 LayoutObject& grandChildWithoutOpacity = *document().getElementById("grandCh ildWithoutOpacity")->layoutObject(); 249 LayoutObject& grandChildWithoutOpacity = *document().getElementById("grandCh ildWithoutOpacity")->layoutObject();
250 EXPECT_NE(nullptr, grandChildWithoutOpacity.objectPaintProperties()); 250 EXPECT_NE(nullptr, grandChildWithoutOpacity.objectPaintProperties());
251 251
252 LayoutObject& greatGrandChildWithOpacity = *document().getElementById("great GrandChildWithOpacity")->layoutObject(); 252 LayoutObject& greatGrandChildWithOpacity = *document().getElementById("great GrandChildWithOpacity")->layoutObject();
253 ObjectPaintProperties* greatGrandChildWithOpacityProperties = greatGrandChil dWithOpacity.objectPaintProperties(); 253 const ObjectPaintProperties* greatGrandChildWithOpacityProperties = greatGra ndChildWithOpacity.objectPaintProperties();
254 EXPECT_EQ(0.2f, greatGrandChildWithOpacityProperties->effect()->opacity()); 254 EXPECT_EQ(0.2f, greatGrandChildWithOpacityProperties->effect()->opacity());
255 EXPECT_EQ(childWithOpacityProperties->effect(), greatGrandChildWithOpacityPr operties->effect()->parent()); 255 EXPECT_EQ(childWithOpacityProperties->effect(), greatGrandChildWithOpacityPr operties->effect()->parent());
256 } 256 }
257 257
258 TEST_F(PaintPropertyTreeBuilderTest, TransformNodeDoesNotAffectEffectNodes) 258 TEST_F(PaintPropertyTreeBuilderTest, TransformNodeDoesNotAffectEffectNodes)
259 { 259 {
260 setBodyInnerHTML( 260 setBodyInnerHTML(
261 "<div id='nodeWithOpacity' style='opacity: 0.6'>" 261 "<div id='nodeWithOpacity' style='opacity: 0.6'>"
262 " <div id='childWithTransform' style='transform: translate3d(10px, 10px , 0px);'>" 262 " <div id='childWithTransform' style='transform: translate3d(10px, 10px , 0px);'>"
263 " <div id='grandChildWithOpacity' style='opacity: 0.4'/>" 263 " <div id='grandChildWithOpacity' style='opacity: 0.4'/>"
264 " </div>" 264 " </div>"
265 "</div>"); 265 "</div>");
266 266
267 LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity" )->layoutObject(); 267 LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity" )->layoutObject();
268 ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPai ntProperties(); 268 const ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.obj ectPaintProperties();
269 EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity()); 269 EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity());
270 EXPECT_NE(nullptr, nodeWithOpacityProperties->effect()->parent()); 270 EXPECT_NE(nullptr, nodeWithOpacityProperties->effect()->parent());
271 EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform()); 271 EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform());
272 272
273 LayoutObject& childWithTransform = *document().getElementById("childWithTran sform")->layoutObject(); 273 LayoutObject& childWithTransform = *document().getElementById("childWithTran sform")->layoutObject();
274 ObjectPaintProperties* childWithTransformProperties = childWithTransform.obj ectPaintProperties(); 274 const ObjectPaintProperties* childWithTransformProperties = childWithTransfo rm.objectPaintProperties();
275 EXPECT_EQ(nullptr, childWithTransformProperties->effect()); 275 EXPECT_EQ(nullptr, childWithTransformProperties->effect());
276 EXPECT_EQ(TransformationMatrix().translate(10, 10), childWithTransformProper ties->transform()->matrix()); 276 EXPECT_EQ(TransformationMatrix().translate(10, 10), childWithTransformProper ties->transform()->matrix());
277 277
278 LayoutObject& grandChildWithOpacity = *document().getElementById("grandChild WithOpacity")->layoutObject(); 278 LayoutObject& grandChildWithOpacity = *document().getElementById("grandChild WithOpacity")->layoutObject();
279 ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpaci ty.objectPaintProperties(); 279 const ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWit hOpacity.objectPaintProperties();
280 EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity()); 280 EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity());
281 EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperti es->effect()->parent()); 281 EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperti es->effect()->parent());
282 EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform()); 282 EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform());
283 } 283 }
284 284
285 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossStackingContext) 285 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossStackingContext)
286 { 286 {
287 setBodyInnerHTML( 287 setBodyInnerHTML(
288 "<div id='nodeWithOpacity' style='opacity: 0.6'>" 288 "<div id='nodeWithOpacity' style='opacity: 0.6'>"
289 " <div id='childWithStackingContext' style='position:absolute;'>" 289 " <div id='childWithStackingContext' style='position:absolute;'>"
290 " <div id='grandChildWithOpacity' style='opacity: 0.4'/>" 290 " <div id='grandChildWithOpacity' style='opacity: 0.4'/>"
291 " </div>" 291 " </div>"
292 "</div>"); 292 "</div>");
293 293
294 LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity" )->layoutObject(); 294 LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity" )->layoutObject();
295 ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPai ntProperties(); 295 const ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.obj ectPaintProperties();
296 EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity()); 296 EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity());
297 EXPECT_NE(nullptr, nodeWithOpacityProperties->effect()->parent()); 297 EXPECT_NE(nullptr, nodeWithOpacityProperties->effect()->parent());
298 EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform()); 298 EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform());
299 299
300 LayoutObject& childWithStackingContext = *document().getElementById("childWi thStackingContext")->layoutObject(); 300 LayoutObject& childWithStackingContext = *document().getElementById("childWi thStackingContext")->layoutObject();
301 ObjectPaintProperties* childWithStackingContextProperties = childWithStackin gContext.objectPaintProperties(); 301 const ObjectPaintProperties* childWithStackingContextProperties = childWithS tackingContext.objectPaintProperties();
302 EXPECT_EQ(nullptr, childWithStackingContextProperties->effect()); 302 EXPECT_EQ(nullptr, childWithStackingContextProperties->effect());
303 EXPECT_EQ(nullptr, childWithStackingContextProperties->transform()); 303 EXPECT_EQ(nullptr, childWithStackingContextProperties->transform());
304 304
305 LayoutObject& grandChildWithOpacity = *document().getElementById("grandChild WithOpacity")->layoutObject(); 305 LayoutObject& grandChildWithOpacity = *document().getElementById("grandChild WithOpacity")->layoutObject();
306 ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpaci ty.objectPaintProperties(); 306 const ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWit hOpacity.objectPaintProperties();
307 EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity()); 307 EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity());
308 EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperti es->effect()->parent()); 308 EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperti es->effect()->parent());
309 EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform()); 309 EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform());
310 } 310 }
311 311
312 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesInSVG) 312 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesInSVG)
313 { 313 {
314 setBodyInnerHTML( 314 setBodyInnerHTML(
315 "<svg id='svgRoot'>" 315 "<svg id='svgRoot'>"
316 " <g id='groupWithOpacity' opacity='0.6'>" 316 " <g id='groupWithOpacity' opacity='0.6'>"
317 " <rect id='rectWithoutOpacity' />" 317 " <rect id='rectWithoutOpacity' />"
318 " <rect id='rectWithOpacity' opacity='0.4' />" 318 " <rect id='rectWithOpacity' opacity='0.4' />"
319 " <text id='textWithOpacity' opacity='0.2'>" 319 " <text id='textWithOpacity' opacity='0.2'>"
320 " <tspan id='tspanWithOpacity' opacity='0.1' />" 320 " <tspan id='tspanWithOpacity' opacity='0.1' />"
321 " </text>" 321 " </text>"
322 " </g>" 322 " </g>"
323 "</svg>"); 323 "</svg>");
324 324
325 LayoutObject& groupWithOpacity = *document().getElementById("groupWithOpacit y")->layoutObject(); 325 LayoutObject& groupWithOpacity = *document().getElementById("groupWithOpacit y")->layoutObject();
326 ObjectPaintProperties* groupWithOpacityProperties = groupWithOpacity.objectP aintProperties(); 326 const ObjectPaintProperties* groupWithOpacityProperties = groupWithOpacity.o bjectPaintProperties();
327 EXPECT_EQ(0.6f, groupWithOpacityProperties->effect()->opacity()); 327 EXPECT_EQ(0.6f, groupWithOpacityProperties->effect()->opacity());
328 EXPECT_NE(nullptr, groupWithOpacityProperties->effect()->parent()); 328 EXPECT_NE(nullptr, groupWithOpacityProperties->effect()->parent());
329 329
330 LayoutObject& rectWithoutOpacity = *document().getElementById("rectWithoutOp acity")->layoutObject(); 330 LayoutObject& rectWithoutOpacity = *document().getElementById("rectWithoutOp acity")->layoutObject();
331 ObjectPaintProperties* rectWithoutOpacityProperties = rectWithoutOpacity.obj ectPaintProperties(); 331 const ObjectPaintProperties* rectWithoutOpacityProperties = rectWithoutOpaci ty.objectPaintProperties();
332 EXPECT_EQ(nullptr, rectWithoutOpacityProperties); 332 EXPECT_EQ(nullptr, rectWithoutOpacityProperties);
333 333
334 LayoutObject& rectWithOpacity = *document().getElementById("rectWithOpacity" )->layoutObject(); 334 LayoutObject& rectWithOpacity = *document().getElementById("rectWithOpacity" )->layoutObject();
335 ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.objectPai ntProperties(); 335 const ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.obj ectPaintProperties();
336 EXPECT_EQ(0.4f, rectWithOpacityProperties->effect()->opacity()); 336 EXPECT_EQ(0.4f, rectWithOpacityProperties->effect()->opacity());
337 EXPECT_EQ(groupWithOpacityProperties->effect(), rectWithOpacityProperties->e ffect()->parent()); 337 EXPECT_EQ(groupWithOpacityProperties->effect(), rectWithOpacityProperties->e ffect()->parent());
338 338
339 // Ensure that opacity nodes are created for LayoutSVGText which inherits fr om LayoutSVGBlock instead of LayoutSVGModelObject. 339 // Ensure that opacity nodes are created for LayoutSVGText which inherits fr om LayoutSVGBlock instead of LayoutSVGModelObject.
340 LayoutObject& textWithOpacity = *document().getElementById("textWithOpacity" )->layoutObject(); 340 LayoutObject& textWithOpacity = *document().getElementById("textWithOpacity" )->layoutObject();
341 ObjectPaintProperties* textWithOpacityProperties = textWithOpacity.objectPai ntProperties(); 341 const ObjectPaintProperties* textWithOpacityProperties = textWithOpacity.obj ectPaintProperties();
342 EXPECT_EQ(0.2f, textWithOpacityProperties->effect()->opacity()); 342 EXPECT_EQ(0.2f, textWithOpacityProperties->effect()->opacity());
343 EXPECT_EQ(groupWithOpacityProperties->effect(), textWithOpacityProperties->e ffect()->parent()); 343 EXPECT_EQ(groupWithOpacityProperties->effect(), textWithOpacityProperties->e ffect()->parent());
344 344
345 // Ensure that opacity nodes are created for LayoutSVGTSpan which inherits f rom LayoutSVGInline instead of LayoutSVGModelObject. 345 // Ensure that opacity nodes are created for LayoutSVGTSpan which inherits f rom LayoutSVGInline instead of LayoutSVGModelObject.
346 LayoutObject& tspanWithOpacity = *document().getElementById("tspanWithOpacit y")->layoutObject(); 346 LayoutObject& tspanWithOpacity = *document().getElementById("tspanWithOpacit y")->layoutObject();
347 ObjectPaintProperties* tspanWithOpacityProperties = tspanWithOpacity.objectP aintProperties(); 347 const ObjectPaintProperties* tspanWithOpacityProperties = tspanWithOpacity.o bjectPaintProperties();
348 EXPECT_EQ(0.1f, tspanWithOpacityProperties->effect()->opacity()); 348 EXPECT_EQ(0.1f, tspanWithOpacityProperties->effect()->opacity());
349 EXPECT_EQ(textWithOpacityProperties->effect(), tspanWithOpacityProperties->e ffect()->parent()); 349 EXPECT_EQ(textWithOpacityProperties->effect(), tspanWithOpacityProperties->e ffect()->parent());
350 } 350 }
351 351
352 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossHTMLSVGBoundary) 352 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossHTMLSVGBoundary)
353 { 353 {
354 setBodyInnerHTML( 354 setBodyInnerHTML(
355 "<div id='divWithOpacity' style='opacity: 0.2;'>" 355 "<div id='divWithOpacity' style='opacity: 0.2;'>"
356 " <svg id='svgRootWithOpacity' style='opacity: 0.3;'>" 356 " <svg id='svgRootWithOpacity' style='opacity: 0.3;'>"
357 " <rect id='rectWithOpacity' opacity='0.4' />" 357 " <rect id='rectWithOpacity' opacity='0.4' />"
358 " </svg>" 358 " </svg>"
359 "</div>"); 359 "</div>");
360 360
361 LayoutObject& divWithOpacity = *document().getElementById("divWithOpacity")- >layoutObject(); 361 LayoutObject& divWithOpacity = *document().getElementById("divWithOpacity")- >layoutObject();
362 ObjectPaintProperties* divWithOpacityProperties = divWithOpacity.objectPaint Properties(); 362 const ObjectPaintProperties* divWithOpacityProperties = divWithOpacity.objec tPaintProperties();
363 EXPECT_EQ(0.2f, divWithOpacityProperties->effect()->opacity()); 363 EXPECT_EQ(0.2f, divWithOpacityProperties->effect()->opacity());
364 EXPECT_NE(nullptr, divWithOpacityProperties->effect()->parent()); 364 EXPECT_NE(nullptr, divWithOpacityProperties->effect()->parent());
365 365
366 LayoutObject& svgRootWithOpacity = *document().getElementById("svgRootWithOp acity")->layoutObject(); 366 LayoutObject& svgRootWithOpacity = *document().getElementById("svgRootWithOp acity")->layoutObject();
367 ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpacity.obj ectPaintProperties(); 367 const ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpaci ty.objectPaintProperties();
368 EXPECT_EQ(0.3f, svgRootWithOpacityProperties->effect()->opacity()); 368 EXPECT_EQ(0.3f, svgRootWithOpacityProperties->effect()->opacity());
369 EXPECT_EQ(divWithOpacityProperties->effect(), svgRootWithOpacityProperties-> effect()->parent()); 369 EXPECT_EQ(divWithOpacityProperties->effect(), svgRootWithOpacityProperties-> effect()->parent());
370 370
371 LayoutObject& rectWithOpacity = *document().getElementById("rectWithOpacity" )->layoutObject(); 371 LayoutObject& rectWithOpacity = *document().getElementById("rectWithOpacity" )->layoutObject();
372 ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.objectPai ntProperties(); 372 const ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.obj ectPaintProperties();
373 EXPECT_EQ(0.4f, rectWithOpacityProperties->effect()->opacity()); 373 EXPECT_EQ(0.4f, rectWithOpacityProperties->effect()->opacity());
374 EXPECT_EQ(svgRootWithOpacityProperties->effect(), rectWithOpacityProperties- >effect()->parent()); 374 EXPECT_EQ(svgRootWithOpacityProperties->effect(), rectWithOpacityProperties- >effect()->parent());
375 } 375 }
376 376
377 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossSVGHTMLBoundary) 377 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossSVGHTMLBoundary)
378 { 378 {
379 setBodyInnerHTML( 379 setBodyInnerHTML(
380 "<svg id='svgRootWithOpacity' style='opacity: 0.3;'>" 380 "<svg id='svgRootWithOpacity' style='opacity: 0.3;'>"
381 " <foreignObject id='foreignObjectWithOpacity' opacity='0.4'>" 381 " <foreignObject id='foreignObjectWithOpacity' opacity='0.4'>"
382 " <body>" 382 " <body>"
383 " <span id='spanWithOpacity' style='opacity: 0.5'/>" 383 " <span id='spanWithOpacity' style='opacity: 0.5'/>"
384 " </body>" 384 " </body>"
385 " </foreignObject>" 385 " </foreignObject>"
386 "</svg>"); 386 "</svg>");
387 387
388 LayoutObject& svgRootWithOpacity = *document().getElementById("svgRootWithOp acity")->layoutObject(); 388 LayoutObject& svgRootWithOpacity = *document().getElementById("svgRootWithOp acity")->layoutObject();
389 ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpacity.obj ectPaintProperties(); 389 const ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpaci ty.objectPaintProperties();
390 EXPECT_EQ(0.3f, svgRootWithOpacityProperties->effect()->opacity()); 390 EXPECT_EQ(0.3f, svgRootWithOpacityProperties->effect()->opacity());
391 EXPECT_NE(nullptr, svgRootWithOpacityProperties->effect()->parent()); 391 EXPECT_NE(nullptr, svgRootWithOpacityProperties->effect()->parent());
392 392
393 LayoutObject& foreignObjectWithOpacity = *document().getElementById("foreign ObjectWithOpacity")->layoutObject(); 393 LayoutObject& foreignObjectWithOpacity = *document().getElementById("foreign ObjectWithOpacity")->layoutObject();
394 ObjectPaintProperties* foreignObjectWithOpacityProperties = foreignObjectWit hOpacity.objectPaintProperties(); 394 const ObjectPaintProperties* foreignObjectWithOpacityProperties = foreignObj ectWithOpacity.objectPaintProperties();
395 EXPECT_EQ(0.4f, foreignObjectWithOpacityProperties->effect()->opacity()); 395 EXPECT_EQ(0.4f, foreignObjectWithOpacityProperties->effect()->opacity());
396 EXPECT_EQ(svgRootWithOpacityProperties->effect(), foreignObjectWithOpacityPr operties->effect()->parent()); 396 EXPECT_EQ(svgRootWithOpacityProperties->effect(), foreignObjectWithOpacityPr operties->effect()->parent());
397 397
398 LayoutObject& spanWithOpacity = *document().getElementById("spanWithOpacity" )->layoutObject(); 398 LayoutObject& spanWithOpacity = *document().getElementById("spanWithOpacity" )->layoutObject();
399 ObjectPaintProperties* spanWithOpacityProperties = spanWithOpacity.objectPai ntProperties(); 399 const ObjectPaintProperties* spanWithOpacityProperties = spanWithOpacity.obj ectPaintProperties();
400 EXPECT_EQ(0.5f, spanWithOpacityProperties->effect()->opacity()); 400 EXPECT_EQ(0.5f, spanWithOpacityProperties->effect()->opacity());
401 EXPECT_EQ(foreignObjectWithOpacityProperties->effect(), spanWithOpacityPrope rties->effect()->parent()); 401 EXPECT_EQ(foreignObjectWithOpacityProperties->effect(), spanWithOpacityPrope rties->effect()->parent());
402 } 402 }
403 403
404 TEST_F(PaintPropertyTreeBuilderTest, TransformNodesInSVG) 404 TEST_F(PaintPropertyTreeBuilderTest, TransformNodesInSVG)
405 { 405 {
406 setBodyInnerHTML( 406 setBodyInnerHTML(
407 "<style>" 407 "<style>"
408 " body {" 408 " body {"
409 " margin: 0px;" 409 " margin: 0px;"
410 " }" 410 " }"
411 " svg {" 411 " svg {"
412 " margin-left: 50px;" 412 " margin-left: 50px;"
413 " transform: translate3d(1px, 2px, 3px);" 413 " transform: translate3d(1px, 2px, 3px);"
414 " position: absolute;" 414 " position: absolute;"
415 " left: 20px;" 415 " left: 20px;"
416 " top: 25px;" 416 " top: 25px;"
417 " }" 417 " }"
418 " rect {" 418 " rect {"
419 " transform: translate(100px, 100px) rotate(45deg);" 419 " transform: translate(100px, 100px) rotate(45deg);"
420 " transform-origin: 50px 25px;" 420 " transform-origin: 50px 25px;"
421 " }" 421 " }"
422 "</style>" 422 "</style>"
423 "<svg id='svgRootWith3dTransform' width='100px' height='100px'>" 423 "<svg id='svgRootWith3dTransform' width='100px' height='100px'>"
424 " <rect id='rectWith2dTransform' width='100px' height='100px' />" 424 " <rect id='rectWith2dTransform' width='100px' height='100px' />"
425 "</svg>"); 425 "</svg>");
426 426
427 LayoutObject& svgRootWith3dTransform = *document().getElementById("svgRootWi th3dTransform")->layoutObject(); 427 LayoutObject& svgRootWith3dTransform = *document().getElementById("svgRootWi th3dTransform")->layoutObject();
428 ObjectPaintProperties* svgRootWith3dTransformProperties = svgRootWith3dTrans form.objectPaintProperties(); 428 const ObjectPaintProperties* svgRootWith3dTransformProperties = svgRootWith3 dTransform.objectPaintProperties();
429 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgRootWith3dTransfor mProperties->transform()->matrix()); 429 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgRootWith3dTransfor mProperties->transform()->matrix());
430 EXPECT_EQ(FloatPoint3D(50, 50, 0), svgRootWith3dTransformProperties->transfo rm()->origin()); 430 EXPECT_EQ(FloatPoint3D(50, 50, 0), svgRootWith3dTransformProperties->transfo rm()->origin());
431 EXPECT_EQ(svgRootWith3dTransformProperties->paintOffsetTranslation(), svgRoo tWith3dTransformProperties->transform()->parent()); 431 EXPECT_EQ(svgRootWith3dTransformProperties->paintOffsetTranslation(), svgRoo tWith3dTransformProperties->transform()->parent());
432 EXPECT_EQ(TransformationMatrix().translate(70, 25), svgRootWith3dTransformPr operties->paintOffsetTranslation()->matrix()); 432 EXPECT_EQ(TransformationMatrix().translate(70, 25), svgRootWith3dTransformPr operties->paintOffsetTranslation()->matrix());
433 EXPECT_EQ(document().view()->scrollTranslation(), svgRootWith3dTransformProp erties->paintOffsetTranslation()->parent()); 433 EXPECT_EQ(document().view()->scrollTranslation(), svgRootWith3dTransformProp erties->paintOffsetTranslation()->parent());
434 434
435 LayoutObject& rectWith2dTransform = *document().getElementById("rectWith2dTr ansform")->layoutObject(); 435 LayoutObject& rectWith2dTransform = *document().getElementById("rectWith2dTr ansform")->layoutObject();
436 ObjectPaintProperties* rectWith2dTransformProperties = rectWith2dTransform.o bjectPaintProperties(); 436 const ObjectPaintProperties* rectWith2dTransformProperties = rectWith2dTrans form.objectPaintProperties();
437 TransformationMatrix matrix; 437 TransformationMatrix matrix;
438 matrix.translate(100, 100); 438 matrix.translate(100, 100);
439 matrix.rotate(45); 439 matrix.rotate(45);
440 // SVG's transform origin is baked into the transform. 440 // SVG's transform origin is baked into the transform.
441 matrix.applyTransformOrigin(50, 25, 0); 441 matrix.applyTransformOrigin(50, 25, 0);
442 EXPECT_EQ(matrix, rectWith2dTransformProperties->transform()->matrix()); 442 EXPECT_EQ(matrix, rectWith2dTransformProperties->transform()->matrix());
443 EXPECT_EQ(FloatPoint3D(0, 0, 0), rectWith2dTransformProperties->transform()- >origin()); 443 EXPECT_EQ(FloatPoint3D(0, 0, 0), rectWith2dTransformProperties->transform()- >origin());
444 // SVG does not use paint offset. 444 // SVG does not use paint offset.
445 EXPECT_EQ(nullptr, rectWith2dTransformProperties->paintOffsetTranslation()); 445 EXPECT_EQ(nullptr, rectWith2dTransformProperties->paintOffsetTranslation());
446 } 446 }
(...skipping 11 matching lines...) Expand all
458 " }" 458 " }"
459 " rect {" 459 " rect {"
460 " transform: translate(100px, 100px);" 460 " transform: translate(100px, 100px);"
461 " }" 461 " }"
462 "</style>" 462 "</style>"
463 "<svg id='svgWithViewBox' width='100px' height='100px' viewBox='50 50 10 0 100'>" 463 "<svg id='svgWithViewBox' width='100px' height='100px' viewBox='50 50 10 0 100'>"
464 " <rect id='rect' width='100px' height='100px' />" 464 " <rect id='rect' width='100px' height='100px' />"
465 "</svg>"); 465 "</svg>");
466 466
467 LayoutObject& svgWithViewBox = *document().getElementById("svgWithViewBox")- >layoutObject(); 467 LayoutObject& svgWithViewBox = *document().getElementById("svgWithViewBox")- >layoutObject();
468 ObjectPaintProperties* svgWithViewBoxProperties = svgWithViewBox.objectPaint Properties(); 468 const ObjectPaintProperties* svgWithViewBoxProperties = svgWithViewBox.objec tPaintProperties();
469 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgWithViewBoxPropert ies->transform()->matrix()); 469 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgWithViewBoxPropert ies->transform()->matrix());
470 EXPECT_EQ(TransformationMatrix().translate(-50, -50), svgWithViewBoxProperti es->svgLocalToBorderBoxTransform()->matrix()); 470 EXPECT_EQ(TransformationMatrix().translate(-50, -50), svgWithViewBoxProperti es->svgLocalToBorderBoxTransform()->matrix());
471 EXPECT_EQ(svgWithViewBoxProperties->svgLocalToBorderBoxTransform()->parent() , svgWithViewBoxProperties->transform()); 471 EXPECT_EQ(svgWithViewBoxProperties->svgLocalToBorderBoxTransform()->parent() , svgWithViewBoxProperties->transform());
472 472
473 LayoutObject& rect = *document().getElementById("rect")->layoutObject(); 473 LayoutObject& rect = *document().getElementById("rect")->layoutObject();
474 ObjectPaintProperties* rectProperties = rect.objectPaintProperties(); 474 const ObjectPaintProperties* rectProperties = rect.objectPaintProperties();
475 EXPECT_EQ(TransformationMatrix().translate(100, 100), rectProperties->transf orm()->matrix()); 475 EXPECT_EQ(TransformationMatrix().translate(100, 100), rectProperties->transf orm()->matrix());
476 EXPECT_EQ(svgWithViewBoxProperties->svgLocalToBorderBoxTransform(), rectProp erties->transform()->parent()); 476 EXPECT_EQ(svgWithViewBoxProperties->svgLocalToBorderBoxTransform(), rectProp erties->transform()->parent());
477 } 477 }
478 478
479 TEST_F(PaintPropertyTreeBuilderTest, SVGRootPaintOffsetTransformNode) 479 TEST_F(PaintPropertyTreeBuilderTest, SVGRootPaintOffsetTransformNode)
480 { 480 {
481 setBodyInnerHTML( 481 setBodyInnerHTML(
482 "<style>body { margin: 0px; } </style>" 482 "<style>body { margin: 0px; } </style>"
483 "<svg id='svg' style='margin-left: 50px; margin-top: 25px; width: 100px; height: 100px;' />"); 483 "<svg id='svg' style='margin-left: 50px; margin-top: 25px; width: 100px; height: 100px;' />");
484 484
485 LayoutObject& svg = *document().getElementById("svg")->layoutObject(); 485 LayoutObject& svg = *document().getElementById("svg")->layoutObject();
486 ObjectPaintProperties* svgProperties = svg.objectPaintProperties(); 486 const ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
487 // Ensure that a paint offset transform is not unnecessarily emitted. 487 // Ensure that a paint offset transform is not unnecessarily emitted.
488 EXPECT_EQ(nullptr, svgProperties->paintOffsetTranslation()); 488 EXPECT_EQ(nullptr, svgProperties->paintOffsetTranslation());
489 EXPECT_EQ(TransformationMatrix().translate(50, 25), svgProperties->svgLocalT oBorderBoxTransform()->matrix()); 489 EXPECT_EQ(TransformationMatrix().translate(50, 25), svgProperties->svgLocalT oBorderBoxTransform()->matrix());
490 EXPECT_EQ(document().view()->scrollTranslation(), svgProperties->svgLocalToB orderBoxTransform()->parent()); 490 EXPECT_EQ(document().view()->scrollTranslation(), svgProperties->svgLocalToB orderBoxTransform()->parent());
491 } 491 }
492 492
493 TEST_F(PaintPropertyTreeBuilderTest, SVGRootLocalToBorderBoxTransformNode) 493 TEST_F(PaintPropertyTreeBuilderTest, SVGRootLocalToBorderBoxTransformNode)
494 { 494 {
495 setBodyInnerHTML( 495 setBodyInnerHTML(
496 "<style>" 496 "<style>"
497 " body { margin: 0px; }" 497 " body { margin: 0px; }"
498 " svg { margin-left: 2px; margin-top: 3px; transform: translate(5px, 7p x); border: 11px solid green; }" 498 " svg { margin-left: 2px; margin-top: 3px; transform: translate(5px, 7p x); border: 11px solid green; }"
499 "</style>" 499 "</style>"
500 "<svg id='svg' width='100px' height='100px' viewBox='0 0 13 13'>" 500 "<svg id='svg' width='100px' height='100px' viewBox='0 0 13 13'>"
501 " <rect id='rect' transform='translate(17 19)' />" 501 " <rect id='rect' transform='translate(17 19)' />"
502 "</svg>"); 502 "</svg>");
503 503
504 LayoutObject& svg = *document().getElementById("svg")->layoutObject(); 504 LayoutObject& svg = *document().getElementById("svg")->layoutObject();
505 ObjectPaintProperties* svgProperties = svg.objectPaintProperties(); 505 const ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
506 EXPECT_EQ(TransformationMatrix().translate(2, 3), svgProperties->paintOffset Translation()->matrix()); 506 EXPECT_EQ(TransformationMatrix().translate(2, 3), svgProperties->paintOffset Translation()->matrix());
507 EXPECT_EQ(TransformationMatrix().translate(5, 7), svgProperties->transform() ->matrix()); 507 EXPECT_EQ(TransformationMatrix().translate(5, 7), svgProperties->transform() ->matrix());
508 EXPECT_EQ(TransformationMatrix().translate(11, 11).scale(100.0 / 13.0), svgP roperties->svgLocalToBorderBoxTransform()->matrix()); 508 EXPECT_EQ(TransformationMatrix().translate(11, 11).scale(100.0 / 13.0), svgP roperties->svgLocalToBorderBoxTransform()->matrix());
509 EXPECT_EQ(svgProperties->paintOffsetTranslation(), svgProperties->transform( )->parent()); 509 EXPECT_EQ(svgProperties->paintOffsetTranslation(), svgProperties->transform( )->parent());
510 EXPECT_EQ(svgProperties->transform(), svgProperties->svgLocalToBorderBoxTran sform()->parent()); 510 EXPECT_EQ(svgProperties->transform(), svgProperties->svgLocalToBorderBoxTran sform()->parent());
511 511
512 // Ensure the rect's transform is a child of the local to border box transfo rm. 512 // Ensure the rect's transform is a child of the local to border box transfo rm.
513 LayoutObject& rect = *document().getElementById("rect")->layoutObject(); 513 LayoutObject& rect = *document().getElementById("rect")->layoutObject();
514 ObjectPaintProperties* rectProperties = rect.objectPaintProperties(); 514 const ObjectPaintProperties* rectProperties = rect.objectPaintProperties();
515 EXPECT_EQ(TransformationMatrix().translate(17, 19), rectProperties->transfor m()->matrix()); 515 EXPECT_EQ(TransformationMatrix().translate(17, 19), rectProperties->transfor m()->matrix());
516 EXPECT_EQ(svgProperties->svgLocalToBorderBoxTransform(), rectProperties->tra nsform()->parent()); 516 EXPECT_EQ(svgProperties->svgLocalToBorderBoxTransform(), rectProperties->tra nsform()->parent());
517 } 517 }
518 518
519 TEST_F(PaintPropertyTreeBuilderTest, SVGNestedViewboxTransforms) 519 TEST_F(PaintPropertyTreeBuilderTest, SVGNestedViewboxTransforms)
520 { 520 {
521 setBodyInnerHTML( 521 setBodyInnerHTML(
522 "<style>body { margin: 0px; } </style>" 522 "<style>body { margin: 0px; } </style>"
523 "<svg id='svg' width='100px' height='100px' viewBox='0 0 50 50' style='t ransform: translate(11px, 11px);'>" 523 "<svg id='svg' width='100px' height='100px' viewBox='0 0 50 50' style='t ransform: translate(11px, 11px);'>"
524 " <svg id='nestedSvg' width='50px' height='50px' viewBox='0 0 5 5'>" 524 " <svg id='nestedSvg' width='50px' height='50px' viewBox='0 0 5 5'>"
525 " <rect id='rect' transform='translate(13 13)' />" 525 " <rect id='rect' transform='translate(13 13)' />"
526 " </svg>" 526 " </svg>"
527 "</svg>"); 527 "</svg>");
528 528
529 LayoutObject& svg = *document().getElementById("svg")->layoutObject(); 529 LayoutObject& svg = *document().getElementById("svg")->layoutObject();
530 ObjectPaintProperties* svgProperties = svg.objectPaintProperties(); 530 const ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
531 EXPECT_EQ(TransformationMatrix().translate(11, 11), svgProperties->transform ()->matrix()); 531 EXPECT_EQ(TransformationMatrix().translate(11, 11), svgProperties->transform ()->matrix());
532 EXPECT_EQ(TransformationMatrix().scale(2), svgProperties->svgLocalToBorderBo xTransform()->matrix()); 532 EXPECT_EQ(TransformationMatrix().scale(2), svgProperties->svgLocalToBorderBo xTransform()->matrix());
533 533
534 LayoutObject& nestedSvg = *document().getElementById("nestedSvg")->layoutObj ect(); 534 LayoutObject& nestedSvg = *document().getElementById("nestedSvg")->layoutObj ect();
535 ObjectPaintProperties* nestedSvgProperties = nestedSvg.objectPaintProperties (); 535 const ObjectPaintProperties* nestedSvgProperties = nestedSvg.objectPaintProp erties();
536 EXPECT_EQ(TransformationMatrix().scale(10), nestedSvgProperties->transform() ->matrix()); 536 EXPECT_EQ(TransformationMatrix().scale(10), nestedSvgProperties->transform() ->matrix());
537 EXPECT_EQ(nullptr, nestedSvgProperties->svgLocalToBorderBoxTransform()); 537 EXPECT_EQ(nullptr, nestedSvgProperties->svgLocalToBorderBoxTransform());
538 EXPECT_EQ(svgProperties->svgLocalToBorderBoxTransform(), nestedSvgProperties ->transform()->parent()); 538 EXPECT_EQ(svgProperties->svgLocalToBorderBoxTransform(), nestedSvgProperties ->transform()->parent());
539 539
540 LayoutObject& rect = *document().getElementById("rect")->layoutObject(); 540 LayoutObject& rect = *document().getElementById("rect")->layoutObject();
541 ObjectPaintProperties* rectProperties = rect.objectPaintProperties(); 541 const ObjectPaintProperties* rectProperties = rect.objectPaintProperties();
542 EXPECT_EQ(TransformationMatrix().translate(13, 13), rectProperties->transfor m()->matrix()); 542 EXPECT_EQ(TransformationMatrix().translate(13, 13), rectProperties->transfor m()->matrix());
543 EXPECT_EQ(nestedSvgProperties->transform(), rectProperties->transform()->par ent()); 543 EXPECT_EQ(nestedSvgProperties->transform(), rectProperties->transform()->par ent());
544 } 544 }
545 545
546 TEST_F(PaintPropertyTreeBuilderTest, TransformNodesAcrossSVGHTMLBoundary) 546 TEST_F(PaintPropertyTreeBuilderTest, TransformNodesAcrossSVGHTMLBoundary)
547 { 547 {
548 setBodyInnerHTML( 548 setBodyInnerHTML(
549 "<style> body { margin: 0px; } </style>" 549 "<style> body { margin: 0px; } </style>"
550 "<svg id='svgWithTransform' style='transform: translate3d(1px, 2px, 3px) ;'>" 550 "<svg id='svgWithTransform' style='transform: translate3d(1px, 2px, 3px) ;'>"
551 " <foreignObject>" 551 " <foreignObject>"
552 " <body>" 552 " <body>"
553 " <div id='divWithTransform' style='transform: translate3d(3px, 4px , 5px);'></div>" 553 " <div id='divWithTransform' style='transform: translate3d(3px, 4px , 5px);'></div>"
554 " </body>" 554 " </body>"
555 " </foreignObject>" 555 " </foreignObject>"
556 "</svg>"); 556 "</svg>");
557 557
558 LayoutObject& svgWithTransform = *document().getElementById("svgWithTransfor m")->layoutObject(); 558 LayoutObject& svgWithTransform = *document().getElementById("svgWithTransfor m")->layoutObject();
559 ObjectPaintProperties* svgWithTransformProperties = svgWithTransform.objectP aintProperties(); 559 const ObjectPaintProperties* svgWithTransformProperties = svgWithTransform.o bjectPaintProperties();
560 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgWithTransformPrope rties->transform()->matrix()); 560 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgWithTransformPrope rties->transform()->matrix());
561 561
562 LayoutObject& divWithTransform = *document().getElementById("divWithTransfor m")->layoutObject(); 562 LayoutObject& divWithTransform = *document().getElementById("divWithTransfor m")->layoutObject();
563 ObjectPaintProperties* divWithTransformProperties = divWithTransform.objectP aintProperties(); 563 const ObjectPaintProperties* divWithTransformProperties = divWithTransform.o bjectPaintProperties();
564 EXPECT_EQ(TransformationMatrix().translate3d(3, 4, 5), divWithTransformPrope rties->transform()->matrix()); 564 EXPECT_EQ(TransformationMatrix().translate3d(3, 4, 5), divWithTransformPrope rties->transform()->matrix());
565 // Ensure the div's transform node is a child of the svg's transform node. 565 // Ensure the div's transform node is a child of the svg's transform node.
566 EXPECT_EQ(svgWithTransformProperties->transform(), divWithTransformPropertie s->transform()->parent()); 566 EXPECT_EQ(svgWithTransformProperties->transform(), divWithTransformPropertie s->transform()->parent());
567 } 567 }
568 568
569 TEST_F(PaintPropertyTreeBuilderTest, FixedTransformAncestorAcrossSVGHTMLBoundary ) 569 TEST_F(PaintPropertyTreeBuilderTest, FixedTransformAncestorAcrossSVGHTMLBoundary )
570 { 570 {
571 setBodyInnerHTML( 571 setBodyInnerHTML(
572 "<style> body { margin: 0px; } </style>" 572 "<style> body { margin: 0px; } </style>"
573 "<svg id='svg' style='transform: translate3d(1px, 2px, 3px);'>" 573 "<svg id='svg' style='transform: translate3d(1px, 2px, 3px);'>"
574 " <g id='container' transform='translate(20 30)'>" 574 " <g id='container' transform='translate(20 30)'>"
575 " <foreignObject>" 575 " <foreignObject>"
576 " <body>" 576 " <body>"
577 " <div id='fixed' style='position: fixed; left: 200px; top: 150px ;'></div>" 577 " <div id='fixed' style='position: fixed; left: 200px; top: 150px ;'></div>"
578 " </body>" 578 " </body>"
579 " </foreignObject>" 579 " </foreignObject>"
580 " </g>" 580 " </g>"
581 "</svg>"); 581 "</svg>");
582 582
583 LayoutObject& svg = *document().getElementById("svg")->layoutObject(); 583 LayoutObject& svg = *document().getElementById("svg")->layoutObject();
584 ObjectPaintProperties* svgProperties = svg.objectPaintProperties(); 584 const ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
585 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgProperties->transf orm()->matrix()); 585 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), svgProperties->transf orm()->matrix());
586 586
587 LayoutObject& container = *document().getElementById("container")->layoutObj ect(); 587 LayoutObject& container = *document().getElementById("container")->layoutObj ect();
588 ObjectPaintProperties* containerProperties = container.objectPaintProperties (); 588 const ObjectPaintProperties* containerProperties = container.objectPaintProp erties();
589 EXPECT_EQ(TransformationMatrix().translate(20, 30), containerProperties->tra nsform()->matrix()); 589 EXPECT_EQ(TransformationMatrix().translate(20, 30), containerProperties->tra nsform()->matrix());
590 EXPECT_EQ(svgProperties->transform(), containerProperties->transform()->pare nt()); 590 EXPECT_EQ(svgProperties->transform(), containerProperties->transform()->pare nt());
591 591
592 Element* fixed = document().getElementById("fixed"); 592 Element* fixed = document().getElementById("fixed");
593 ObjectPaintProperties* fixedProperties = fixed->layoutObject()->objectPaintP roperties(); 593 const ObjectPaintProperties* fixedProperties = fixed->layoutObject()->object PaintProperties();
594 EXPECT_EQ(TransformationMatrix().translate(200, 150), fixedProperties->paint OffsetTranslation()->matrix()); 594 EXPECT_EQ(TransformationMatrix().translate(200, 150), fixedProperties->paint OffsetTranslation()->matrix());
595 // Ensure the fixed position element is rooted at the nearest transform cont ainer. 595 // Ensure the fixed position element is rooted at the nearest transform cont ainer.
596 EXPECT_EQ(containerProperties->transform(), fixedProperties->paintOffsetTran slation()->parent()); 596 EXPECT_EQ(containerProperties->transform(), fixedProperties->paintOffsetTran slation()->parent());
597 } 597 }
598 598
599 TEST_F(PaintPropertyTreeBuilderTest, ControlClip) 599 TEST_F(PaintPropertyTreeBuilderTest, ControlClip)
600 { 600 {
601 setBodyInnerHTML( 601 setBodyInnerHTML(
602 "<style>" 602 "<style>"
603 " body {" 603 " body {"
604 " margin: 0;" 604 " margin: 0;"
605 " }" 605 " }"
606 " input {" 606 " input {"
607 " border-width: 5px;" 607 " border-width: 5px;"
608 " padding: 0;" 608 " padding: 0;"
609 " }" 609 " }"
610 "</style>" 610 "</style>"
611 "<input id='button' type='button' style='width:345px; height:123px' valu e='some text'/>"); 611 "<input id='button' type='button' style='width:345px; height:123px' valu e='some text'/>");
612 612
613 FrameView* frameView = document().view(); 613 FrameView* frameView = document().view();
614 LayoutObject& button = *document().getElementById("button")->layoutObject(); 614 LayoutObject& button = *document().getElementById("button")->layoutObject();
615 ObjectPaintProperties* buttonProperties = button.objectPaintProperties(); 615 const ObjectPaintProperties* buttonProperties = button.objectPaintProperties ();
616 EXPECT_EQ(frameView->scrollTranslation(), buttonProperties->overflowClip()-> localTransformSpace()); 616 EXPECT_EQ(frameView->scrollTranslation(), buttonProperties->overflowClip()-> localTransformSpace());
617 EXPECT_EQ(FloatRoundedRect(5, 5, 335, 113), buttonProperties->overflowClip() ->clipRect()); 617 EXPECT_EQ(FloatRoundedRect(5, 5, 335, 113), buttonProperties->overflowClip() ->clipRect());
618 EXPECT_EQ(frameView->contentClip(), buttonProperties->overflowClip()->parent ()); 618 EXPECT_EQ(frameView->contentClip(), buttonProperties->overflowClip()->parent ());
619 } 619 }
620 620
621 TEST_F(PaintPropertyTreeBuilderTest, BorderRadiusClip) 621 TEST_F(PaintPropertyTreeBuilderTest, BorderRadiusClip)
622 { 622 {
623 setBodyInnerHTML( 623 setBodyInnerHTML(
624 "<style>" 624 "<style>"
625 " body {" 625 " body {"
626 " margin: 0px;" 626 " margin: 0px;"
627 " }" 627 " }"
628 " #div {" 628 " #div {"
629 " border-radius: 12px 34px 56px 78px;" 629 " border-radius: 12px 34px 56px 78px;"
630 " border-top: 45px solid;" 630 " border-top: 45px solid;"
631 " border-right: 50px solid;" 631 " border-right: 50px solid;"
632 " border-bottom: 55px solid;" 632 " border-bottom: 55px solid;"
633 " border-left: 60px solid;" 633 " border-left: 60px solid;"
634 " width: 500px;" 634 " width: 500px;"
635 " height: 400px;" 635 " height: 400px;"
636 " overflow: scroll;" 636 " overflow: scroll;"
637 " }" 637 " }"
638 "</style>" 638 "</style>"
639 "<div id='div'></div>"); 639 "<div id='div'></div>");
640 640
641 FrameView* frameView = document().view(); 641 FrameView* frameView = document().view();
642 LayoutObject& div = *document().getElementById("div")->layoutObject(); 642 LayoutObject& div = *document().getElementById("div")->layoutObject();
643 ObjectPaintProperties* divProperties = div.objectPaintProperties(); 643 const ObjectPaintProperties* divProperties = div.objectPaintProperties();
644 EXPECT_EQ(frameView->scrollTranslation(), divProperties->overflowClip()->loc alTransformSpace()); 644 EXPECT_EQ(frameView->scrollTranslation(), divProperties->overflowClip()->loc alTransformSpace());
645 // The overflow clip rect includes only the padding box. 645 // The overflow clip rect includes only the padding box.
646 // padding box = border box(500+60+50, 400+45+55) - border outset(60+50, 45+ 55) - scrollbars(15, 15) 646 // padding box = border box(500+60+50, 400+45+55) - border outset(60+50, 45+ 55) - scrollbars(15, 15)
647 EXPECT_EQ(FloatRoundedRect(60, 45, 500, 400), divProperties->overflowClip()- >clipRect()); 647 EXPECT_EQ(FloatRoundedRect(60, 45, 500, 400), divProperties->overflowClip()- >clipRect());
648 const ClipPaintPropertyNode* borderRadiusClip = divProperties->overflowClip( )->parent(); 648 const ClipPaintPropertyNode* borderRadiusClip = divProperties->overflowClip( )->parent();
649 EXPECT_EQ(frameView->scrollTranslation(), borderRadiusClip->localTransformSp ace()); 649 EXPECT_EQ(frameView->scrollTranslation(), borderRadiusClip->localTransformSp ace());
650 // The border radius clip is the area enclosed by inner border edge, includi ng the scrollbars. 650 // The border radius clip is the area enclosed by inner border edge, includi ng the scrollbars.
651 // As the border-radius is specified in outer radius, the inner radius is ca lculated by: 651 // As the border-radius is specified in outer radius, the inner radius is ca lculated by:
652 // inner radius = max(outer radius - border width, 0) 652 // inner radius = max(outer radius - border width, 0)
653 // In the case that two adjacent borders have different width, the inner rad ius of the corner 653 // In the case that two adjacent borders have different width, the inner rad ius of the corner
(...skipping 13 matching lines...) Expand all
667 { 667 {
668 setBodyInnerHTML( 668 setBodyInnerHTML(
669 "<style>body { margin: 0; }</style>" 669 "<style>body { margin: 0; }</style>"
670 "<div id='divWithTransform' style='transform: translate3d(1px, 2px, 3px) ;'>" 670 "<div id='divWithTransform' style='transform: translate3d(1px, 2px, 3px) ;'>"
671 " <iframe id='frame'></iframe>" 671 " <iframe id='frame'></iframe>"
672 "</div>"); 672 "</div>");
673 Document& frameDocument = setupChildIframe("frame", "<style>body { margin: 0 ; }</style><div id='transform' style='transform: translate3d(4px, 5px, 6px);'></ div>"); 673 Document& frameDocument = setupChildIframe("frame", "<style>body { margin: 0 ; }</style><div id='transform' style='transform: translate3d(4px, 5px, 6px);'></ div>");
674 document().view()->updateAllLifecyclePhases(); 674 document().view()->updateAllLifecyclePhases();
675 675
676 LayoutObject& divWithTransform = *document().getElementById("divWithTransfor m")->layoutObject(); 676 LayoutObject& divWithTransform = *document().getElementById("divWithTransfor m")->layoutObject();
677 ObjectPaintProperties* divWithTransformProperties = divWithTransform.objectP aintProperties(); 677 const ObjectPaintProperties* divWithTransformProperties = divWithTransform.o bjectPaintProperties();
678 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), divWithTransformPrope rties->transform()->matrix()); 678 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), divWithTransformPrope rties->transform()->matrix());
679 679
680 LayoutObject* innerDivWithTransform = frameDocument.getElementById("transfor m")->layoutObject(); 680 LayoutObject* innerDivWithTransform = frameDocument.getElementById("transfor m")->layoutObject();
681 ObjectPaintProperties* innerDivWithTransformProperties = innerDivWithTransfo rm->objectPaintProperties(); 681 const ObjectPaintProperties* innerDivWithTransformProperties = innerDivWithT ransform->objectPaintProperties();
682 auto* innerDivTransform = innerDivWithTransformProperties->transform(); 682 auto* innerDivTransform = innerDivWithTransformProperties->transform();
683 EXPECT_EQ(TransformationMatrix().translate3d(4, 5, 6), innerDivTransform->ma trix()); 683 EXPECT_EQ(TransformationMatrix().translate3d(4, 5, 6), innerDivTransform->ma trix());
684 684
685 // Ensure that the inner div's transform is correctly rooted in the root fra me's transform tree. 685 // Ensure that the inner div's transform is correctly rooted in the root fra me's transform tree.
686 // This asserts that we have the following tree structure: 686 // This asserts that we have the following tree structure:
687 // ... 687 // ...
688 // Transform transform=translation=1.000000,2.000000,3.000000 688 // Transform transform=translation=1.000000,2.000000,3.000000
689 // PreTranslation transform=translation=2.000000,2.000000,0.000000 689 // PreTranslation transform=translation=2.000000,2.000000,0.000000
690 // ScrollTranslation transform=translation=0.000000,0.000000,0.000000 690 // ScrollTranslation transform=translation=0.000000,0.000000,0.000000
691 // Transform transform=translation=4.000000,5.000000,6.000000 691 // Transform transform=translation=4.000000,5.000000,6.000000
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
744 // the painting ancestors. 744 // the painting ancestors.
745 setBodyInnerHTML( 745 setBodyInnerHTML(
746 "<style>body { margin: 0; }</style>" 746 "<style>body { margin: 0; }</style>"
747 "<div id='scroller' style='overflow:scroll; width:400px; height:300px;'> " 747 "<div id='scroller' style='overflow:scroll; width:400px; height:300px;'> "
748 " <div id='child' style='position:relative;'></div>" 748 " <div id='child' style='position:relative;'></div>"
749 " <div style='height:10000px;'></div>" 749 " <div style='height:10000px;'></div>"
750 "</div>" 750 "</div>"
751 ); 751 );
752 752
753 LayoutObject& scroller = *document().getElementById("scroller")->layoutObjec t(); 753 LayoutObject& scroller = *document().getElementById("scroller")->layoutObjec t();
754 ObjectPaintProperties* scrollerProperties = scroller.objectPaintProperties() ; 754 const ObjectPaintProperties* scrollerProperties = scroller.objectPaintProper ties();
755 LayoutObject& child = *document().getElementById("child")->layoutObject(); 755 LayoutObject& child = *document().getElementById("child")->layoutObject();
756 ObjectPaintProperties* childProperties = child.objectPaintProperties(); 756 const ObjectPaintProperties* childProperties = child.objectPaintProperties() ;
757 757
758 EXPECT_EQ(scrollerProperties->overflowClip(), childProperties->localBorderBo xProperties()->propertyTreeState.clip); 758 EXPECT_EQ(scrollerProperties->overflowClip(), childProperties->localBorderBo xProperties()->propertyTreeState.clip);
759 EXPECT_EQ(scrollerProperties->scrollTranslation(), childProperties->localBor derBoxProperties()->propertyTreeState.transform); 759 EXPECT_EQ(scrollerProperties->scrollTranslation(), childProperties->localBor derBoxProperties()->propertyTreeState.transform);
760 EXPECT_NE(nullptr, childProperties->localBorderBoxProperties()->propertyTree State.effect); 760 EXPECT_NE(nullptr, childProperties->localBorderBoxProperties()->propertyTree State.effect);
761 } 761 }
762 762
763 TEST_F(PaintPropertyTreeBuilderTest, TreeContextUnclipFromParentStackingContext) 763 TEST_F(PaintPropertyTreeBuilderTest, TreeContextUnclipFromParentStackingContext)
764 { 764 {
765 // This test verifies the tree builder correctly computes and records the pr operty tree context 765 // This test verifies the tree builder correctly computes and records the pr operty tree context
766 // for a (pseudo) stacking context that has a scrolling painting ancestor th at is not its 766 // for a (pseudo) stacking context that has a scrolling painting ancestor th at is not its
767 // containing block (thus should not be scrolled by it). 767 // containing block (thus should not be scrolled by it).
768 768
769 setBodyInnerHTML( 769 setBodyInnerHTML(
770 "<style>body { margin: 0; }</style>" 770 "<style>body { margin: 0; }</style>"
771 "<div id='scroller' style='overflow:scroll; opacity:0.5;'>" 771 "<div id='scroller' style='overflow:scroll; opacity:0.5;'>"
772 " <div id='child' style='position:absolute; left:0; top:0;'></div>" 772 " <div id='child' style='position:absolute; left:0; top:0;'></div>"
773 " <div style='height:10000px;'></div>" 773 " <div style='height:10000px;'></div>"
774 "</div>" 774 "</div>"
775 ); 775 );
776 776
777 FrameView* frameView = document().view(); 777 FrameView* frameView = document().view();
778 LayoutObject& scroller = *document().getElementById("scroller")->layoutObjec t(); 778 LayoutObject& scroller = *document().getElementById("scroller")->layoutObjec t();
779 ObjectPaintProperties* scrollerProperties = scroller.objectPaintProperties() ; 779 const ObjectPaintProperties* scrollerProperties = scroller.objectPaintProper ties();
780 LayoutObject& child = *document().getElementById("child")->layoutObject(); 780 LayoutObject& child = *document().getElementById("child")->layoutObject();
781 ObjectPaintProperties* childProperties = child.objectPaintProperties(); 781 const ObjectPaintProperties* childProperties = child.objectPaintProperties() ;
782 782
783 EXPECT_EQ(frameView->contentClip(), childProperties->localBorderBoxPropertie s()->propertyTreeState.clip); 783 EXPECT_EQ(frameView->contentClip(), childProperties->localBorderBoxPropertie s()->propertyTreeState.clip);
784 EXPECT_EQ(frameView->scrollTranslation(), childProperties->localBorderBoxPro perties()->propertyTreeState.transform); 784 EXPECT_EQ(frameView->scrollTranslation(), childProperties->localBorderBoxPro perties()->propertyTreeState.transform);
785 EXPECT_EQ(scrollerProperties->effect(), childProperties->localBorderBoxPrope rties()->propertyTreeState.effect); 785 EXPECT_EQ(scrollerProperties->effect(), childProperties->localBorderBoxPrope rties()->propertyTreeState.effect);
786 } 786 }
787 787
788 TEST_F(PaintPropertyTreeBuilderTest, TableCellLayoutLocation) 788 TEST_F(PaintPropertyTreeBuilderTest, TableCellLayoutLocation)
789 { 789 {
790 // This test verifies that the border box space of a table cell is being cor rectly computed. 790 // This test verifies that the border box space of a table cell is being cor rectly computed.
791 // Table cells have weird location adjustment in our layout/paint implementa tion. 791 // Table cells have weird location adjustment in our layout/paint implementa tion.
(...skipping 20 matching lines...) Expand all
812 " }" 812 " }"
813 "</style>" 813 "</style>"
814 "<table>" 814 "<table>"
815 " <tr><td></td><td></td></tr>" 815 " <tr><td></td><td></td></tr>"
816 " <tr><td></td><td><div id='target'></div></td></tr>" 816 " <tr><td></td><td><div id='target'></div></td></tr>"
817 "</table>" 817 "</table>"
818 ); 818 );
819 819
820 FrameView* frameView = document().view(); 820 FrameView* frameView = document().view();
821 LayoutObject& target = *document().getElementById("target")->layoutObject(); 821 LayoutObject& target = *document().getElementById("target")->layoutObject();
822 ObjectPaintProperties* targetProperties = target.objectPaintProperties(); 822 const ObjectPaintProperties* targetProperties = target.objectPaintProperties ();
823 823
824 EXPECT_EQ(LayoutPoint(170, 170), targetProperties->localBorderBoxProperties( )->paintOffset); 824 EXPECT_EQ(LayoutPoint(170, 170), targetProperties->localBorderBoxProperties( )->paintOffset);
825 EXPECT_EQ(frameView->scrollTranslation(), targetProperties->localBorderBoxPr operties()->propertyTreeState.transform); 825 EXPECT_EQ(frameView->scrollTranslation(), targetProperties->localBorderBoxPr operties()->propertyTreeState.transform);
826 } 826 }
827 827
828 TEST_F(PaintPropertyTreeBuilderTest, CSSClipFixedPositionDescendant) 828 TEST_F(PaintPropertyTreeBuilderTest, CSSClipFixedPositionDescendant)
829 { 829 {
830 // This test verifies that clip tree hierarchy being generated correctly for the hard case 830 // This test verifies that clip tree hierarchy being generated correctly for the hard case
831 // such that a fixed position element getting clipped by an absolute positio n CSS clip. 831 // such that a fixed position element getting clipped by an absolute positio n CSS clip.
832 setBodyInnerHTML( 832 setBodyInnerHTML(
(...skipping 14 matching lines...) Expand all
847 "</style>" 847 "</style>"
848 "<div id='clip'><div id='fixed'></div></div>" 848 "<div id='clip'><div id='fixed'></div></div>"
849 ); 849 );
850 LayoutRect localClipRect(40, 10, 40, 60); 850 LayoutRect localClipRect(40, 10, 40, 60);
851 LayoutRect absoluteClipRect = localClipRect; 851 LayoutRect absoluteClipRect = localClipRect;
852 absoluteClipRect.move(123, 456); 852 absoluteClipRect.move(123, 456);
853 853
854 FrameView* frameView = document().view(); 854 FrameView* frameView = document().view();
855 855
856 LayoutObject& clip = *document().getElementById("clip")->layoutObject(); 856 LayoutObject& clip = *document().getElementById("clip")->layoutObject();
857 ObjectPaintProperties* clipProperties = clip.objectPaintProperties(); 857 const ObjectPaintProperties* clipProperties = clip.objectPaintProperties();
858 EXPECT_EQ(frameView->contentClip(), clipProperties->cssClip()->parent()); 858 EXPECT_EQ(frameView->contentClip(), clipProperties->cssClip()->parent());
859 EXPECT_EQ(frameView->scrollTranslation(), clipProperties->cssClip()->localTr ansformSpace()); 859 EXPECT_EQ(frameView->scrollTranslation(), clipProperties->cssClip()->localTr ansformSpace());
860 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css Clip()->clipRect()); 860 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css Clip()->clipRect());
861 861
862 LayoutObject& fixed = *document().getElementById("fixed")->layoutObject(); 862 LayoutObject& fixed = *document().getElementById("fixed")->layoutObject();
863 ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties(); 863 const ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties() ;
864 EXPECT_EQ(clipProperties->cssClip(), fixedProperties->localBorderBoxProperti es()->propertyTreeState.clip); 864 EXPECT_EQ(clipProperties->cssClip(), fixedProperties->localBorderBoxProperti es()->propertyTreeState.clip);
865 EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProper ties()->propertyTreeState.transform->parent()); 865 EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProper ties()->propertyTreeState.transform->parent());
866 EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->local BorderBoxProperties()->propertyTreeState.transform->matrix()); 866 EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->local BorderBoxProperties()->propertyTreeState.transform->matrix());
867 EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintO ffset); 867 EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintO ffset);
868 } 868 }
869 869
870 TEST_F(PaintPropertyTreeBuilderTest, CSSClipFixedPositionDescendantNonShared) 870 TEST_F(PaintPropertyTreeBuilderTest, CSSClipFixedPositionDescendantNonShared)
871 { 871 {
872 // This test is similar to CSSClipFixedPositionDescendant above, except that 872 // This test is similar to CSSClipFixedPositionDescendant above, except that
873 // now we have a parent overflow clip that should be escaped by the fixed de scendant. 873 // now we have a parent overflow clip that should be escaped by the fixed de scendant.
(...skipping 24 matching lines...) Expand all
898 "</style>" 898 "</style>"
899 "<div id='overflow'><div id='clip'><div id='fixed'></div></div></div>" 899 "<div id='overflow'><div id='clip'><div id='fixed'></div></div></div>"
900 ); 900 );
901 LayoutRect localClipRect(40, 10, 40, 60); 901 LayoutRect localClipRect(40, 10, 40, 60);
902 LayoutRect absoluteClipRect = localClipRect; 902 LayoutRect absoluteClipRect = localClipRect;
903 absoluteClipRect.move(123, 456); 903 absoluteClipRect.move(123, 456);
904 904
905 FrameView* frameView = document().view(); 905 FrameView* frameView = document().view();
906 906
907 LayoutObject& overflow = *document().getElementById("overflow")->layoutObjec t(); 907 LayoutObject& overflow = *document().getElementById("overflow")->layoutObjec t();
908 ObjectPaintProperties* overflowProperties = overflow.objectPaintProperties() ; 908 const ObjectPaintProperties* overflowProperties = overflow.objectPaintProper ties();
909 EXPECT_EQ(frameView->contentClip(), overflowProperties->overflowClip()->pare nt()); 909 EXPECT_EQ(frameView->contentClip(), overflowProperties->overflowClip()->pare nt());
910 EXPECT_EQ(frameView->scrollTranslation(), overflowProperties->scrollTranslat ion()->parent()); 910 EXPECT_EQ(frameView->scrollTranslation(), overflowProperties->scrollTranslat ion()->parent());
911 911
912 LayoutObject& clip = *document().getElementById("clip")->layoutObject(); 912 LayoutObject& clip = *document().getElementById("clip")->layoutObject();
913 ObjectPaintProperties* clipProperties = clip.objectPaintProperties(); 913 const ObjectPaintProperties* clipProperties = clip.objectPaintProperties();
914 EXPECT_EQ(overflowProperties->overflowClip(), clipProperties->cssClip()->par ent()); 914 EXPECT_EQ(overflowProperties->overflowClip(), clipProperties->cssClip()->par ent());
915 EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->cssClip() ->localTransformSpace()); 915 EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->cssClip() ->localTransformSpace());
916 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css Clip()->clipRect()); 916 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css Clip()->clipRect());
917 EXPECT_EQ(frameView->contentClip(), clipProperties->cssClipFixedPosition()-> parent()); 917 EXPECT_EQ(frameView->contentClip(), clipProperties->cssClipFixedPosition()-> parent());
918 EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->cssClipFi xedPosition()->localTransformSpace()); 918 EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->cssClipFi xedPosition()->localTransformSpace());
919 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css ClipFixedPosition()->clipRect()); 919 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css ClipFixedPosition()->clipRect());
920 920
921 LayoutObject& fixed = *document().getElementById("fixed")->layoutObject(); 921 LayoutObject& fixed = *document().getElementById("fixed")->layoutObject();
922 ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties(); 922 const ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties() ;
923 EXPECT_EQ(clipProperties->cssClipFixedPosition(), fixedProperties->localBord erBoxProperties()->propertyTreeState.clip); 923 EXPECT_EQ(clipProperties->cssClipFixedPosition(), fixedProperties->localBord erBoxProperties()->propertyTreeState.clip);
924 EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProper ties()->propertyTreeState.transform->parent()); 924 EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProper ties()->propertyTreeState.transform->parent());
925 EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->local BorderBoxProperties()->propertyTreeState.transform->matrix()); 925 EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->local BorderBoxProperties()->propertyTreeState.transform->matrix());
926 EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintO ffset); 926 EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintO ffset);
927 } 927 }
928 928
929 TEST_F(PaintPropertyTreeBuilderTest, ColumnSpannerUnderRelativePositioned) 929 TEST_F(PaintPropertyTreeBuilderTest, ColumnSpannerUnderRelativePositioned)
930 { 930 {
931 setBodyInnerHTML( 931 setBodyInnerHTML(
932 "<div style='columns: 3; position: absolute; top: 44px; left: 55px;'>" 932 "<div style='columns: 3; position: absolute; top: 44px; left: 55px;'>"
(...skipping 12 matching lines...) Expand all
945 setBodyInnerHTML( 945 setBodyInnerHTML(
946 "<style>" 946 "<style>"
947 " * { margin: 0; }" 947 " * { margin: 0; }"
948 " div { position: absolute; }" 948 " div { position: absolute; }"
949 "</style>" 949 "</style>"
950 "<div id='a' style='width: 70px; height: 70px; left: 0.1px; top: 0.3px;' >" 950 "<div id='a' style='width: 70px; height: 70px; left: 0.1px; top: 0.3px;' >"
951 " <div id='b' style='width: 40px; height: 40px; left: 0.5px; top: 11.1p x;'></div>" 951 " <div id='b' style='width: 40px; height: 40px; left: 0.5px; top: 11.1p x;'></div>"
952 "</div>" 952 "</div>"
953 ); 953 );
954 954
955 ObjectPaintProperties* aProperties = document().getElementById("a")->layoutO bject()->objectPaintProperties(); 955 const ObjectPaintProperties* aProperties = document().getElementById("a")->l ayoutObject()->objectPaintProperties();
956 LayoutPoint aPaintOffset = LayoutPoint(FloatPoint(0.1, 0.3)); 956 LayoutPoint aPaintOffset = LayoutPoint(FloatPoint(0.1, 0.3));
957 EXPECT_EQ(aPaintOffset, aProperties->localBorderBoxProperties()->paintOffset ); 957 EXPECT_EQ(aPaintOffset, aProperties->localBorderBoxProperties()->paintOffset );
958 958
959 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 959 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
960 LayoutPoint bPaintOffset = aPaintOffset + LayoutPoint(FloatPoint(0.5, 11.1)) ; 960 LayoutPoint bPaintOffset = aPaintOffset + LayoutPoint(FloatPoint(0.5, 11.1)) ;
961 EXPECT_EQ(bPaintOffset, bProperties->localBorderBoxProperties()->paintOffset ); 961 EXPECT_EQ(bPaintOffset, bProperties->localBorderBoxProperties()->paintOffset );
962 } 962 }
963 963
964 TEST_F(PaintPropertyTreeBuilderTest, PaintOffsetWithBasicPixelSnapping) 964 TEST_F(PaintPropertyTreeBuilderTest, PaintOffsetWithBasicPixelSnapping)
965 { 965 {
966 setBodyInnerHTML( 966 setBodyInnerHTML(
967 "<style>" 967 "<style>"
968 " * { margin: 0; }" 968 " * { margin: 0; }"
969 " div { position: relative; }" 969 " div { position: relative; }"
970 "</style>" 970 "</style>"
971 "<div id='a' style='width: 70px; height: 70px; left: 0.3px; top: 0.3px;' >" 971 "<div id='a' style='width: 70px; height: 70px; left: 0.3px; top: 0.3px;' >"
972 " <div id='b' style='width: 40px; height: 40px; transform: translateZ(0 );'>" 972 " <div id='b' style='width: 40px; height: 40px; transform: translateZ(0 );'>"
973 " <div id='c' style='width: 40px; height: 40px; left: 0.1px; top: 0.1 px;'></div>" 973 " <div id='c' style='width: 40px; height: 40px; left: 0.1px; top: 0.1 px;'></div>"
974 " </div>" 974 " </div>"
975 "</div>" 975 "</div>"
976 ); 976 );
977 977
978 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 978 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
979 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), bProperties->transfor m()->matrix()); 979 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), bProperties->transfor m()->matrix());
980 // The paint offset transform should be snapped from (0.3,0.3) to (0,0). 980 // The paint offset transform should be snapped from (0.3,0.3) to (0,0).
981 EXPECT_EQ(TransformationMatrix().translate(0, 0), bProperties->transform()-> parent()->matrix()); 981 EXPECT_EQ(TransformationMatrix().translate(0, 0), bProperties->transform()-> parent()->matrix());
982 // The residual subpixel adjustment should be (0.3,0.3) - (0,0) = (0.3,0.3). 982 // The residual subpixel adjustment should be (0.3,0.3) - (0,0) = (0.3,0.3).
983 LayoutPoint subpixelAccumulation = LayoutPoint(FloatPoint(0.3, 0.3)); 983 LayoutPoint subpixelAccumulation = LayoutPoint(FloatPoint(0.3, 0.3));
984 EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->pai ntOffset); 984 EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->pai ntOffset);
985 985
986 // c should be painted starting at subpixelAccumulation + (0.1,0.1) = (0.4,0 .4). 986 // c should be painted starting at subpixelAccumulation + (0.1,0.1) = (0.4,0 .4).
987 LayoutPoint cPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.1 , 0.1)); 987 LayoutPoint cPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.1 , 0.1));
988 ObjectPaintProperties* cProperties = document().getElementById("c")->layoutO bject()->objectPaintProperties(); 988 const ObjectPaintProperties* cProperties = document().getElementById("c")->l ayoutObject()->objectPaintProperties();
989 EXPECT_EQ(cPaintOffset, cProperties->localBorderBoxProperties()->paintOffset ); 989 EXPECT_EQ(cPaintOffset, cProperties->localBorderBoxProperties()->paintOffset );
990 } 990 }
991 991
992 TEST_F(PaintPropertyTreeBuilderTest, PaintOffsetWithPixelSnappingThroughTransfor m) 992 TEST_F(PaintPropertyTreeBuilderTest, PaintOffsetWithPixelSnappingThroughTransfor m)
993 { 993 {
994 setBodyInnerHTML( 994 setBodyInnerHTML(
995 "<style>" 995 "<style>"
996 " * { margin: 0; }" 996 " * { margin: 0; }"
997 " div { position: relative; }" 997 " div { position: relative; }"
998 "</style>" 998 "</style>"
999 "<div id='a' style='width: 70px; height: 70px; left: 0.7px; top: 0.7px;' >" 999 "<div id='a' style='width: 70px; height: 70px; left: 0.7px; top: 0.7px;' >"
1000 " <div id='b' style='width: 40px; height: 40px; transform: translateZ(0 );'>" 1000 " <div id='b' style='width: 40px; height: 40px; transform: translateZ(0 );'>"
1001 " <div id='c' style='width: 40px; height: 40px; left: 0.7px; top: 0.7 px;'></div>" 1001 " <div id='c' style='width: 40px; height: 40px; left: 0.7px; top: 0.7 px;'></div>"
1002 " </div>" 1002 " </div>"
1003 "</div>" 1003 "</div>"
1004 ); 1004 );
1005 1005
1006 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 1006 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
1007 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), bProperties->transfor m()->matrix()); 1007 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), bProperties->transfor m()->matrix());
1008 // The paint offset transform should be snapped from (0.7,0.7) to (1,1). 1008 // The paint offset transform should be snapped from (0.7,0.7) to (1,1).
1009 EXPECT_EQ(TransformationMatrix().translate(1, 1), bProperties->transform()-> parent()->matrix()); 1009 EXPECT_EQ(TransformationMatrix().translate(1, 1), bProperties->transform()-> parent()->matrix());
1010 // The residual subpixel adjustment should be (0.7,0.7) - (1,1) = (-0.3,-0.3 ). 1010 // The residual subpixel adjustment should be (0.7,0.7) - (1,1) = (-0.3,-0.3 ).
1011 LayoutPoint subpixelAccumulation = LayoutPoint(LayoutPoint(FloatPoint(0.7, 0 .7)) - LayoutPoint(1, 1)); 1011 LayoutPoint subpixelAccumulation = LayoutPoint(LayoutPoint(FloatPoint(0.7, 0 .7)) - LayoutPoint(1, 1));
1012 EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->pai ntOffset); 1012 EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->pai ntOffset);
1013 1013
1014 // c should be painted starting at subpixelAccumulation + (0.7,0.7) = (0.4,0 .4). 1014 // c should be painted starting at subpixelAccumulation + (0.7,0.7) = (0.4,0 .4).
1015 LayoutPoint cPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.7 , 0.7)); 1015 LayoutPoint cPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.7 , 0.7));
1016 ObjectPaintProperties* cProperties = document().getElementById("c")->layoutO bject()->objectPaintProperties(); 1016 const ObjectPaintProperties* cProperties = document().getElementById("c")->l ayoutObject()->objectPaintProperties();
1017 EXPECT_EQ(cPaintOffset, cProperties->localBorderBoxProperties()->paintOffset ); 1017 EXPECT_EQ(cPaintOffset, cProperties->localBorderBoxProperties()->paintOffset );
1018 } 1018 }
1019 1019
1020 TEST_F(PaintPropertyTreeBuilderTest, PaintOffsetWithPixelSnappingThroughMultiple Transforms) 1020 TEST_F(PaintPropertyTreeBuilderTest, PaintOffsetWithPixelSnappingThroughMultiple Transforms)
1021 { 1021 {
1022 setBodyInnerHTML( 1022 setBodyInnerHTML(
1023 "<style>" 1023 "<style>"
1024 " * { margin: 0; }" 1024 " * { margin: 0; }"
1025 " div { position: relative; }" 1025 " div { position: relative; }"
1026 "</style>" 1026 "</style>"
1027 "<div id='a' style='width: 70px; height: 70px; left: 0.7px; top: 0.7px;' >" 1027 "<div id='a' style='width: 70px; height: 70px; left: 0.7px; top: 0.7px;' >"
1028 " <div id='b' style='width: 40px; height: 40px; transform: translate3d( 5px, 7px, 0);'>" 1028 " <div id='b' style='width: 40px; height: 40px; transform: translate3d( 5px, 7px, 0);'>"
1029 " <div id='c' style='width: 40px; height: 40px; transform: translate3 d(11px, 13px, 0);'>" 1029 " <div id='c' style='width: 40px; height: 40px; transform: translate3 d(11px, 13px, 0);'>"
1030 " <div id='d' style='width: 40px; height: 40px; left: 0.7px; top: 0 .7px;'></div>" 1030 " <div id='d' style='width: 40px; height: 40px; left: 0.7px; top: 0 .7px;'></div>"
1031 " </div>" 1031 " </div>"
1032 " </div>" 1032 " </div>"
1033 "</div>" 1033 "</div>"
1034 ); 1034 );
1035 1035
1036 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 1036 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
1037 EXPECT_EQ(TransformationMatrix().translate3d(5, 7, 0), bProperties->transfor m()->matrix()); 1037 EXPECT_EQ(TransformationMatrix().translate3d(5, 7, 0), bProperties->transfor m()->matrix());
1038 // The paint offset transform should be snapped from (0.7,0.7) to (1,1). 1038 // The paint offset transform should be snapped from (0.7,0.7) to (1,1).
1039 EXPECT_EQ(TransformationMatrix().translate(1, 1), bProperties->transform()-> parent()->matrix()); 1039 EXPECT_EQ(TransformationMatrix().translate(1, 1), bProperties->transform()-> parent()->matrix());
1040 // The residual subpixel adjustment should be (0.7,0.7) - (1,1) = (-0.3,-0.3 ). 1040 // The residual subpixel adjustment should be (0.7,0.7) - (1,1) = (-0.3,-0.3 ).
1041 LayoutPoint subpixelAccumulation = LayoutPoint(LayoutPoint(FloatPoint(0.7, 0 .7)) - LayoutPoint(1, 1)); 1041 LayoutPoint subpixelAccumulation = LayoutPoint(LayoutPoint(FloatPoint(0.7, 0 .7)) - LayoutPoint(1, 1));
1042 EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->pai ntOffset); 1042 EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->pai ntOffset);
1043 1043
1044 ObjectPaintProperties* cProperties = document().getElementById("c")->layoutO bject()->objectPaintProperties(); 1044 const ObjectPaintProperties* cProperties = document().getElementById("c")->l ayoutObject()->objectPaintProperties();
1045 EXPECT_EQ(TransformationMatrix().translate3d(11, 13, 0), cProperties->transf orm()->matrix()); 1045 EXPECT_EQ(TransformationMatrix().translate3d(11, 13, 0), cProperties->transf orm()->matrix());
1046 // The paint offset should be (-0.3,-0.3) but the paint offset transform sho uld still be at 1046 // The paint offset should be (-0.3,-0.3) but the paint offset transform sho uld still be at
1047 // (0,0) because it should be snapped. 1047 // (0,0) because it should be snapped.
1048 EXPECT_EQ(TransformationMatrix().translate(0, 0), cProperties->transform()-> parent()->matrix()); 1048 EXPECT_EQ(TransformationMatrix().translate(0, 0), cProperties->transform()-> parent()->matrix());
1049 // The residual subpixel adjustment should still be (-0.3,-0.3). 1049 // The residual subpixel adjustment should still be (-0.3,-0.3).
1050 EXPECT_EQ(subpixelAccumulation, cProperties->localBorderBoxProperties()->pai ntOffset); 1050 EXPECT_EQ(subpixelAccumulation, cProperties->localBorderBoxProperties()->pai ntOffset);
1051 1051
1052 // d should be painted starting at subpixelAccumulation + (0.7,0.7) = (0.4,0 .4). 1052 // d should be painted starting at subpixelAccumulation + (0.7,0.7) = (0.4,0 .4).
1053 LayoutPoint dPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.7 , 0.7)); 1053 LayoutPoint dPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.7 , 0.7));
1054 ObjectPaintProperties* dProperties = document().getElementById("d")->layoutO bject()->objectPaintProperties(); 1054 const ObjectPaintProperties* dProperties = document().getElementById("d")->l ayoutObject()->objectPaintProperties();
1055 EXPECT_EQ(dPaintOffset, dProperties->localBorderBoxProperties()->paintOffset ); 1055 EXPECT_EQ(dPaintOffset, dProperties->localBorderBoxProperties()->paintOffset );
1056 } 1056 }
1057 1057
1058 TEST_F(PaintPropertyTreeBuilderTest, PaintOffsetWithPixelSnappingWithFixedPos) 1058 TEST_F(PaintPropertyTreeBuilderTest, PaintOffsetWithPixelSnappingWithFixedPos)
1059 { 1059 {
1060 setBodyInnerHTML( 1060 setBodyInnerHTML(
1061 "<style>" 1061 "<style>"
1062 " * { margin: 0; }" 1062 " * { margin: 0; }"
1063 "</style>" 1063 "</style>"
1064 "<div id='a' style='width: 70px; height: 70px; left: 0.7px; position: re lative;'>" 1064 "<div id='a' style='width: 70px; height: 70px; left: 0.7px; position: re lative;'>"
1065 " <div id='b' style='width: 40px; height: 40px; transform: translateZ(0 ); position: relative;'>" 1065 " <div id='b' style='width: 40px; height: 40px; transform: translateZ(0 ); position: relative;'>"
1066 " <div id='fixed' style='width: 40px; height: 40px; position: fixed;' >" 1066 " <div id='fixed' style='width: 40px; height: 40px; position: fixed;' >"
1067 " <div id='d' style='width: 40px; height: 40px; left: 0.7px; positi on: relative;'></div>" 1067 " <div id='d' style='width: 40px; height: 40px; left: 0.7px; positi on: relative;'></div>"
1068 " </div>" 1068 " </div>"
1069 " </div>" 1069 " </div>"
1070 "</div>" 1070 "</div>"
1071 ); 1071 );
1072 1072
1073 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 1073 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
1074 EXPECT_EQ(TransformationMatrix().translate(0, 0), bProperties->transform()-> matrix()); 1074 EXPECT_EQ(TransformationMatrix().translate(0, 0), bProperties->transform()-> matrix());
1075 // The paint offset transform should be snapped from (0.7,0) to (1,0). 1075 // The paint offset transform should be snapped from (0.7,0) to (1,0).
1076 EXPECT_EQ(TransformationMatrix().translate(1, 0), bProperties->transform()-> parent()->matrix()); 1076 EXPECT_EQ(TransformationMatrix().translate(1, 0), bProperties->transform()-> parent()->matrix());
1077 // The residual subpixel adjustment should be (0.7,0) - (1,0) = (-0.3,0). 1077 // The residual subpixel adjustment should be (0.7,0) - (1,0) = (-0.3,0).
1078 LayoutPoint subpixelAccumulation = LayoutPoint(LayoutPoint(FloatPoint(0.7, 0 )) - LayoutPoint(1, 0)); 1078 LayoutPoint subpixelAccumulation = LayoutPoint(LayoutPoint(FloatPoint(0.7, 0 )) - LayoutPoint(1, 0));
1079 EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->pai ntOffset); 1079 EXPECT_EQ(subpixelAccumulation, bProperties->localBorderBoxProperties()->pai ntOffset);
1080 1080
1081 ObjectPaintProperties* fixedProperties = document().getElementById("fixed")- >layoutObject()->objectPaintProperties(); 1081 const ObjectPaintProperties* fixedProperties = document().getElementById("fi xed")->layoutObject()->objectPaintProperties();
1082 // The residual subpixel adjustment should still be (-0.3,0). 1082 // The residual subpixel adjustment should still be (-0.3,0).
1083 EXPECT_EQ(subpixelAccumulation, fixedProperties->localBorderBoxProperties()- >paintOffset); 1083 EXPECT_EQ(subpixelAccumulation, fixedProperties->localBorderBoxProperties()- >paintOffset);
1084 1084
1085 // d should be painted starting at subpixelAccumulation + (0.7,0) = (0.4,0). 1085 // d should be painted starting at subpixelAccumulation + (0.7,0) = (0.4,0).
1086 LayoutPoint dPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.7 , 0)); 1086 LayoutPoint dPaintOffset = subpixelAccumulation + LayoutPoint(FloatPoint(0.7 , 0));
1087 ObjectPaintProperties* dProperties = document().getElementById("d")->layoutO bject()->objectPaintProperties(); 1087 const ObjectPaintProperties* dProperties = document().getElementById("d")->l ayoutObject()->objectPaintProperties();
1088 EXPECT_EQ(dPaintOffset, dProperties->localBorderBoxProperties()->paintOffset ); 1088 EXPECT_EQ(dPaintOffset, dProperties->localBorderBoxProperties()->paintOffset );
1089 } 1089 }
1090 1090
1091 TEST_F(PaintPropertyTreeBuilderTest, SvgPixelSnappingShouldResetPaintOffset) 1091 TEST_F(PaintPropertyTreeBuilderTest, SvgPixelSnappingShouldResetPaintOffset)
1092 { 1092 {
1093 setBodyInnerHTML( 1093 setBodyInnerHTML(
1094 "<svg id='svg' style='position: relative; left: 0.1px; transform: matrix (1, 0, 0, 1, 0, 0);'>" 1094 "<svg id='svg' style='position: relative; left: 0.1px; transform: matrix (1, 0, 0, 1, 0, 0);'>"
1095 " <rect id='rect' transform='translate(1, 1)'/>" 1095 " <rect id='rect' transform='translate(1, 1)'/>"
1096 "</svg>"); 1096 "</svg>");
1097 1097
1098 LayoutObject& svgWithTransform = *document().getElementById("svg")->layoutOb ject(); 1098 LayoutObject& svgWithTransform = *document().getElementById("svg")->layoutOb ject();
1099 ObjectPaintProperties* svgWithTransformProperties = svgWithTransform.objectP aintProperties(); 1099 const ObjectPaintProperties* svgWithTransformProperties = svgWithTransform.o bjectPaintProperties();
1100 EXPECT_EQ(TransformationMatrix(), svgWithTransformProperties->transform()->m atrix()); 1100 EXPECT_EQ(TransformationMatrix(), svgWithTransformProperties->transform()->m atrix());
1101 EXPECT_EQ(LayoutPoint(FloatPoint(0.1, 0)), svgWithTransformProperties->local BorderBoxProperties()->paintOffset); 1101 EXPECT_EQ(LayoutPoint(FloatPoint(0.1, 0)), svgWithTransformProperties->local BorderBoxProperties()->paintOffset);
1102 EXPECT_EQ(nullptr, svgWithTransformProperties->svgLocalToBorderBoxTransform( )); 1102 EXPECT_EQ(nullptr, svgWithTransformProperties->svgLocalToBorderBoxTransform( ));
1103 1103
1104 LayoutObject& rectWithTransform = *document().getElementById("rect")->layout Object(); 1104 LayoutObject& rectWithTransform = *document().getElementById("rect")->layout Object();
1105 ObjectPaintProperties* rectWithTransformProperties = rectWithTransform.objec tPaintProperties(); 1105 const ObjectPaintProperties* rectWithTransformProperties = rectWithTransform .objectPaintProperties();
1106 EXPECT_EQ(TransformationMatrix().translate(1, 1), rectWithTransformPropertie s->transform()->matrix()); 1106 EXPECT_EQ(TransformationMatrix().translate(1, 1), rectWithTransformPropertie s->transform()->matrix());
1107 1107
1108 // Ensure there is no PaintOffset transform between the rect and the svg's t ransform. 1108 // Ensure there is no PaintOffset transform between the rect and the svg's t ransform.
1109 EXPECT_EQ(svgWithTransformProperties->transform(), rectWithTransformProperti es->transform()->parent()); 1109 EXPECT_EQ(svgWithTransformProperties->transform(), rectWithTransformProperti es->transform()->parent());
1110 } 1110 }
1111 1111
1112 TEST_F(PaintPropertyTreeBuilderTest, NoRenderingContextByDefault) 1112 TEST_F(PaintPropertyTreeBuilderTest, NoRenderingContextByDefault)
1113 { 1113 {
1114 setBodyInnerHTML("<div style=\"transform: translateZ(0)\"></div>"); 1114 setBodyInnerHTML("<div style=\"transform: translateZ(0)\"></div>");
1115 1115
1116 ObjectPaintProperties* properties = document().body()->firstChild()->layoutO bject()->objectPaintProperties(); 1116 const ObjectPaintProperties* properties = document().body()->firstChild()->l ayoutObject()->objectPaintProperties();
1117 ASSERT_TRUE(properties->transform()); 1117 ASSERT_TRUE(properties->transform());
1118 EXPECT_FALSE(properties->transform()->hasRenderingContext()); 1118 EXPECT_FALSE(properties->transform()->hasRenderingContext());
1119 } 1119 }
1120 1120
1121 TEST_F(PaintPropertyTreeBuilderTest, Preserve3DCreatesSharedRenderingContext) 1121 TEST_F(PaintPropertyTreeBuilderTest, Preserve3DCreatesSharedRenderingContext)
1122 { 1122 {
1123 setBodyInnerHTML( 1123 setBodyInnerHTML(
1124 "<div style=\"transform-style: preserve-3d\">" 1124 "<div style=\"transform-style: preserve-3d\">"
1125 " <div id=\"a\" style=\"transform: translateZ(0)\"></div>" 1125 " <div id=\"a\" style=\"transform: translateZ(0)\"></div>"
1126 " <div id=\"b\" style=\"transform: translateZ(0)\"></div>" 1126 " <div id=\"b\" style=\"transform: translateZ(0)\"></div>"
1127 "</div>"); 1127 "</div>");
1128 1128
1129 ObjectPaintProperties* aProperties = document().getElementById("a")->layoutO bject()->objectPaintProperties(); 1129 const ObjectPaintProperties* aProperties = document().getElementById("a")->l ayoutObject()->objectPaintProperties();
1130 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 1130 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
1131 ASSERT_TRUE(aProperties->transform() && bProperties->transform()); 1131 ASSERT_TRUE(aProperties->transform() && bProperties->transform());
1132 EXPECT_NE(aProperties->transform(), bProperties->transform()); 1132 EXPECT_NE(aProperties->transform(), bProperties->transform());
1133 EXPECT_TRUE(aProperties->transform()->hasRenderingContext()); 1133 EXPECT_TRUE(aProperties->transform()->hasRenderingContext());
1134 EXPECT_TRUE(bProperties->transform()->hasRenderingContext()); 1134 EXPECT_TRUE(bProperties->transform()->hasRenderingContext());
1135 EXPECT_EQ(aProperties->transform()->renderingContextID(), bProperties->trans form()->renderingContextID()); 1135 EXPECT_EQ(aProperties->transform()->renderingContextID(), bProperties->trans form()->renderingContextID());
1136 } 1136 }
1137 1137
1138 TEST_F(PaintPropertyTreeBuilderTest, FlatTransformStyleEndsRenderingContext) 1138 TEST_F(PaintPropertyTreeBuilderTest, FlatTransformStyleEndsRenderingContext)
1139 { 1139 {
1140 setBodyInnerHTML( 1140 setBodyInnerHTML(
1141 "<div style=\"transform-style: preserve-3d\">" 1141 "<div style=\"transform-style: preserve-3d\">"
1142 " <div id=\"a\" style=\"transform: translateZ(0)\">" 1142 " <div id=\"a\" style=\"transform: translateZ(0)\">"
1143 " <div id=\"b\" style=\"transform: translateZ(0)\"></div>" 1143 " <div id=\"b\" style=\"transform: translateZ(0)\"></div>"
1144 " </div>" 1144 " </div>"
1145 "</div>"); 1145 "</div>");
1146 1146
1147 ASSERT_FALSE(document().getElementById("a")->layoutObject()->styleRef().pres erves3D()); 1147 ASSERT_FALSE(document().getElementById("a")->layoutObject()->styleRef().pres erves3D());
1148 ObjectPaintProperties* aProperties = document().getElementById("a")->layoutO bject()->objectPaintProperties(); 1148 const ObjectPaintProperties* aProperties = document().getElementById("a")->l ayoutObject()->objectPaintProperties();
1149 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 1149 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
1150 ASSERT_TRUE(aProperties->transform() && bProperties->transform()); 1150 ASSERT_TRUE(aProperties->transform() && bProperties->transform());
1151 1151
1152 // #a should participate in a rendering context (due to its parent), but its 1152 // #a should participate in a rendering context (due to its parent), but its
1153 // child #b should not. 1153 // child #b should not.
1154 EXPECT_TRUE(aProperties->transform()->hasRenderingContext()); 1154 EXPECT_TRUE(aProperties->transform()->hasRenderingContext());
1155 EXPECT_FALSE(bProperties->transform()->hasRenderingContext()); 1155 EXPECT_FALSE(bProperties->transform()->hasRenderingContext());
1156 } 1156 }
1157 1157
1158 TEST_F(PaintPropertyTreeBuilderTest, NestedRenderingContexts) 1158 TEST_F(PaintPropertyTreeBuilderTest, NestedRenderingContexts)
1159 { 1159 {
1160 setBodyInnerHTML( 1160 setBodyInnerHTML(
1161 "<div style=\"transform-style: preserve-3d\">" 1161 "<div style=\"transform-style: preserve-3d\">"
1162 " <div id=\"a\" style=\"transform: translateZ(0)\">" 1162 " <div id=\"a\" style=\"transform: translateZ(0)\">"
1163 " <div style=\"transform-style: preserve-3d\">" 1163 " <div style=\"transform-style: preserve-3d\">"
1164 " <div id=\"b\" style=\"transform: translateZ(0)\">" 1164 " <div id=\"b\" style=\"transform: translateZ(0)\">"
1165 " </div>" 1165 " </div>"
1166 " </div>" 1166 " </div>"
1167 "</div>"); 1167 "</div>");
1168 1168
1169 ASSERT_FALSE(document().getElementById("a")->layoutObject()->styleRef().pres erves3D()); 1169 ASSERT_FALSE(document().getElementById("a")->layoutObject()->styleRef().pres erves3D());
1170 ObjectPaintProperties* aProperties = document().getElementById("a")->layoutO bject()->objectPaintProperties(); 1170 const ObjectPaintProperties* aProperties = document().getElementById("a")->l ayoutObject()->objectPaintProperties();
1171 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 1171 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
1172 ASSERT_TRUE(aProperties->transform() && bProperties->transform()); 1172 ASSERT_TRUE(aProperties->transform() && bProperties->transform());
1173 1173
1174 // #a should participate in a rendering context (due to its parent). Its 1174 // #a should participate in a rendering context (due to its parent). Its
1175 // child does preserve 3D, but since #a does not, #a's rendering context is 1175 // child does preserve 3D, but since #a does not, #a's rendering context is
1176 // not passed on to its children. Thus #b ends up in a separate rendering 1176 // not passed on to its children. Thus #b ends up in a separate rendering
1177 // context rooted at its parent. 1177 // context rooted at its parent.
1178 EXPECT_TRUE(aProperties->transform()->hasRenderingContext()); 1178 EXPECT_TRUE(aProperties->transform()->hasRenderingContext());
1179 EXPECT_TRUE(bProperties->transform()->hasRenderingContext()); 1179 EXPECT_TRUE(bProperties->transform()->hasRenderingContext());
1180 EXPECT_NE(aProperties->transform()->renderingContextID(), bProperties->trans form()->renderingContextID()); 1180 EXPECT_NE(aProperties->transform()->renderingContextID(), bProperties->trans form()->renderingContextID());
1181 } 1181 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1242 TEST_F(PaintPropertyTreeBuilderTest, PerspectiveIsNotFlattened) 1242 TEST_F(PaintPropertyTreeBuilderTest, PerspectiveIsNotFlattened)
1243 { 1243 {
1244 // It's necessary to make nodes from the one that applies perspective to 1244 // It's necessary to make nodes from the one that applies perspective to
1245 // ones that combine with it preserve 3D. Otherwise, the perspective doesn't 1245 // ones that combine with it preserve 3D. Otherwise, the perspective doesn't
1246 // do anything. 1246 // do anything.
1247 setBodyInnerHTML( 1247 setBodyInnerHTML(
1248 "<div id=\"a\" style=\"perspective: 800px\">" 1248 "<div id=\"a\" style=\"perspective: 800px\">"
1249 " <div id=\"b\" style=\"transform: translateZ(0)\"></div>" 1249 " <div id=\"b\" style=\"transform: translateZ(0)\"></div>"
1250 "</div>"); 1250 "</div>");
1251 1251
1252 ObjectPaintProperties* aProperties = document().getElementById("a")->layoutO bject()->objectPaintProperties(); 1252 const ObjectPaintProperties* aProperties = document().getElementById("a")->l ayoutObject()->objectPaintProperties();
1253 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 1253 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
1254 const TransformPaintPropertyNode* aPerspective = aProperties->perspective(); 1254 const TransformPaintPropertyNode* aPerspective = aProperties->perspective();
1255 ASSERT_TRUE(aPerspective); 1255 ASSERT_TRUE(aPerspective);
1256 const TransformPaintPropertyNode* bTransform = bProperties->transform(); 1256 const TransformPaintPropertyNode* bTransform = bProperties->transform();
1257 ASSERT_TRUE(bTransform); 1257 ASSERT_TRUE(bTransform);
1258 ASSERT_TRUE(nodeHasAncestor(bTransform, aPerspective)); 1258 ASSERT_TRUE(nodeHasAncestor(bTransform, aPerspective));
1259 EXPECT_FALSE(someNodeFlattensTransform(bTransform, aPerspective)); 1259 EXPECT_FALSE(someNodeFlattensTransform(bTransform, aPerspective));
1260 } 1260 }
1261 1261
1262 TEST_F(PaintPropertyTreeBuilderTest, PerspectiveDoesNotEstablishRenderingContext ) 1262 TEST_F(PaintPropertyTreeBuilderTest, PerspectiveDoesNotEstablishRenderingContext )
1263 { 1263 {
1264 // It's necessary to make nodes from the one that applies perspective to 1264 // It's necessary to make nodes from the one that applies perspective to
1265 // ones that combine with it preserve 3D. Otherwise, the perspective doesn't 1265 // ones that combine with it preserve 3D. Otherwise, the perspective doesn't
1266 // do anything. 1266 // do anything.
1267 setBodyInnerHTML( 1267 setBodyInnerHTML(
1268 "<div id=\"a\" style=\"perspective: 800px\">" 1268 "<div id=\"a\" style=\"perspective: 800px\">"
1269 " <div id=\"b\" style=\"transform: translateZ(0)\"></div>" 1269 " <div id=\"b\" style=\"transform: translateZ(0)\"></div>"
1270 "</div>"); 1270 "</div>");
1271 1271
1272 ObjectPaintProperties* aProperties = document().getElementById("a")->layoutO bject()->objectPaintProperties(); 1272 const ObjectPaintProperties* aProperties = document().getElementById("a")->l ayoutObject()->objectPaintProperties();
1273 ObjectPaintProperties* bProperties = document().getElementById("b")->layoutO bject()->objectPaintProperties(); 1273 const ObjectPaintProperties* bProperties = document().getElementById("b")->l ayoutObject()->objectPaintProperties();
1274 const TransformPaintPropertyNode* aPerspective = aProperties->perspective(); 1274 const TransformPaintPropertyNode* aPerspective = aProperties->perspective();
1275 ASSERT_TRUE(aPerspective); 1275 ASSERT_TRUE(aPerspective);
1276 EXPECT_FALSE(aPerspective->hasRenderingContext()); 1276 EXPECT_FALSE(aPerspective->hasRenderingContext());
1277 const TransformPaintPropertyNode* bTransform = bProperties->transform(); 1277 const TransformPaintPropertyNode* bTransform = bProperties->transform();
1278 ASSERT_TRUE(bTransform); 1278 ASSERT_TRUE(bTransform);
1279 EXPECT_FALSE(bTransform->hasRenderingContext()); 1279 EXPECT_FALSE(bTransform->hasRenderingContext());
1280 } 1280 }
1281 1281
1282 TEST_F(PaintPropertyTreeBuilderTest, CachedProperties) 1282 TEST_F(PaintPropertyTreeBuilderTest, CachedProperties)
1283 { 1283 {
1284 setBodyInnerHTML( 1284 setBodyInnerHTML(
1285 "<div id='a' style='transform: translate(33px, 44px)'>" 1285 "<div id='a' style='transform: translate(33px, 44px)'>"
1286 " <div id='b' style='transform: translate(55px, 66px)'>" 1286 " <div id='b' style='transform: translate(55px, 66px)'>"
1287 " <div id='c' style='transform: translate(77px, 88px)'>C<div>" 1287 " <div id='c' style='transform: translate(77px, 88px)'>C<div>"
1288 " </div>" 1288 " </div>"
1289 "</div>"); 1289 "</div>");
1290 1290
1291 Element* a = document().getElementById("a"); 1291 Element* a = document().getElementById("a");
1292 ObjectPaintProperties* aProperties = a->layoutObject()->objectPaintPropertie s(); 1292 const ObjectPaintProperties* aProperties = a->layoutObject()->objectPaintPro perties();
1293 TransformPaintPropertyNode* aTransformNode = aProperties->transform(); 1293 const TransformPaintPropertyNode* aTransformNode = aProperties->transform();
1294 EXPECT_EQ(TransformationMatrix().translate(33, 44), aTransformNode->matrix() ); 1294 EXPECT_EQ(TransformationMatrix().translate(33, 44), aTransformNode->matrix() );
1295 1295
1296 Element* b = document().getElementById("b"); 1296 Element* b = document().getElementById("b");
1297 ObjectPaintProperties* bProperties = b->layoutObject()->objectPaintPropertie s(); 1297 const ObjectPaintProperties* bProperties = b->layoutObject()->objectPaintPro perties();
1298 TransformPaintPropertyNode* bTransformNode = bProperties->transform(); 1298 const TransformPaintPropertyNode* bTransformNode = bProperties->transform();
1299 EXPECT_EQ(TransformationMatrix().translate(55, 66), bTransformNode->matrix() ); 1299 EXPECT_EQ(TransformationMatrix().translate(55, 66), bTransformNode->matrix() );
1300 1300
1301 Element* c = document().getElementById("c"); 1301 Element* c = document().getElementById("c");
1302 ObjectPaintProperties* cProperties = c->layoutObject()->objectPaintPropertie s(); 1302 const ObjectPaintProperties* cProperties = c->layoutObject()->objectPaintPro perties();
1303 TransformPaintPropertyNode* cTransformNode = cProperties->transform(); 1303 const TransformPaintPropertyNode* cTransformNode = cProperties->transform();
1304 EXPECT_EQ(TransformationMatrix().translate(77, 88), cTransformNode->matrix() ); 1304 EXPECT_EQ(TransformationMatrix().translate(77, 88), cTransformNode->matrix() );
1305 1305
1306 // Change transform of b. B's transform node should be a new node with the n ew value, 1306 // Change transform of b. B's transform node should be a new node with the n ew value,
1307 // and a and c's transform nodes should be unchanged (with c's parent adjust ed). 1307 // and a and c's transform nodes should be unchanged (with c's parent adjust ed).
1308 b->setAttribute(HTMLNames::styleAttr, "transform: translate(111px, 222px)"); 1308 b->setAttribute(HTMLNames::styleAttr, "transform: translate(111px, 222px)");
1309 document().view()->updateAllLifecyclePhases(); 1309 document().view()->updateAllLifecyclePhases();
1310 1310
1311 EXPECT_EQ(aProperties, a->layoutObject()->objectPaintProperties()); 1311 EXPECT_EQ(aProperties, a->layoutObject()->objectPaintProperties());
1312 EXPECT_EQ(aTransformNode, aProperties->transform()); 1312 EXPECT_EQ(aTransformNode, aProperties->transform());
1313 1313
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1347 bTransformNode = bProperties->transform(); 1347 bTransformNode = bProperties->transform();
1348 EXPECT_EQ(TransformationMatrix().translate(4, 5), bTransformNode->matrix()); 1348 EXPECT_EQ(TransformationMatrix().translate(4, 5), bTransformNode->matrix());
1349 EXPECT_EQ(aTransformNode, bTransformNode->parent()); 1349 EXPECT_EQ(aTransformNode, bTransformNode->parent());
1350 1350
1351 EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties()); 1351 EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties());
1352 EXPECT_EQ(cTransformNode, cProperties->transform()); 1352 EXPECT_EQ(cTransformNode, cProperties->transform());
1353 EXPECT_EQ(bTransformNode, cTransformNode->parent()); 1353 EXPECT_EQ(bTransformNode, cTransformNode->parent());
1354 } 1354 }
1355 1355
1356 } // namespace blink 1356 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698