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

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

Issue 2161523002: Isolation of subtrees of stacking contexts and out-of-flow positioned objects (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@CachePaintProperties
Patch Set: - Created 4 years, 5 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
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* htmlProperties = document().documentElement()->layout Object()->objectPaintProperties();
113
112 ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->object PaintProperties(); 114 ObjectPaintProperties* scrollerProperties = scroller->layoutObject()->object PaintProperties();
113 EXPECT_EQ(TransformationMatrix().translate(0, -100), scrollerProperties->scr ollTranslation()->matrix()); 115 EXPECT_EQ(TransformationMatrix().translate(0, -100), scrollerProperties->scr ollTranslation()->matrix());
114 EXPECT_EQ(frameView->scrollTranslation(), scrollerProperties->scrollTranslat ion()->parent()); 116 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), scrollerProperties->scro llTranslation()->parent());
115 EXPECT_EQ(frameView->scrollTranslation(), scrollerProperties->overflowClip() ->localTransformSpace()); 117 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), scrollerProperties->over flowClip()->localTransformSpace());
116 EXPECT_EQ(FloatRoundedRect(120, 340, 400, 300), scrollerProperties->overflow Clip()->clipRect()); 118 EXPECT_EQ(FloatRoundedRect(120, 340, 400, 300), scrollerProperties->overflow Clip()->clipRect());
117 EXPECT_EQ(frameView->contentClip(), scrollerProperties->overflowClip()->pare nt()); 119 EXPECT_EQ(htmlProperties->overflowClip(), scrollerProperties->overflowClip() ->parent());
118 120
119 // The relative-positioned element should have accumulated box offset (exclu de scrolling), 121 // The relative-positioned element should have accumulated box offset (exclu de scrolling),
120 // and should be affected by ancestor scroll transforms. 122 // and should be affected by ancestor scroll transforms.
121 Element* relPos = document().getElementById("rel-pos"); 123 Element* relPos = document().getElementById("rel-pos");
122 ObjectPaintProperties* relPosProperties = relPos->layoutObject()->objectPain tProperties(); 124 ObjectPaintProperties* relPosProperties = relPos->layoutObject()->objectPain tProperties();
123 EXPECT_EQ(TransformationMatrix().translate(680, 1120), relPosProperties->pai ntOffsetTranslation()->matrix()); 125 EXPECT_EQ(TransformationMatrix().translate(680, 1120), relPosProperties->pai ntOffsetTranslation()->matrix());
124 EXPECT_EQ(scrollerProperties->scrollTranslation(), relPosProperties->paintOf fsetTranslation()->parent()); 126 EXPECT_EQ(scrollerProperties->scrollTranslation(), relPosProperties->paintOf fsetTranslation()->parent());
125 EXPECT_EQ(relPosProperties->transform(), relPosProperties->overflowClip()->l ocalTransformSpace()); 127 EXPECT_EQ(relPosProperties->transform(), relPosProperties->overflowClip()->l ocalTransformSpace());
126 EXPECT_EQ(FloatRoundedRect(0, 0, 400, 0), relPosProperties->overflowClip()-> clipRect()); 128 EXPECT_EQ(FloatRoundedRect(0, 0, 400, 0), relPosProperties->overflowClip()-> clipRect());
127 EXPECT_EQ(scrollerProperties->overflowClip(), relPosProperties->overflowClip ()->parent()); 129 EXPECT_EQ(scrollerProperties->overflowClip(), relPosProperties->overflowClip ()->parent());
128 130
129 // The absolute-positioned element should not be affected by non-positioned scroller at all. 131 // The absolute-positioned element should not be affected by non-positioned scroller at all.
130 Element* absPos = document().getElementById("abs-pos"); 132 Element* absPos = document().getElementById("abs-pos");
131 ObjectPaintProperties* absPosProperties = absPos->layoutObject()->objectPain tProperties(); 133 ObjectPaintProperties* absPosProperties = absPos->layoutObject()->objectPain tProperties();
132 EXPECT_EQ(TransformationMatrix().translate(123, 456), absPosProperties->pain tOffsetTranslation()->matrix()); 134 EXPECT_EQ(TransformationMatrix().translate(123, 456), absPosProperties->pain tOffsetTranslation()->matrix());
133 EXPECT_EQ(frameView->scrollTranslation(), absPosProperties->paintOffsetTrans lation()->parent()); 135 EXPECT_EQ(frameView->scrollTranslation(), absPosProperties->paintOffsetTrans lation()->parent());
134 EXPECT_EQ(absPosProperties->transform(), absPosProperties->overflowClip()->l ocalTransformSpace()); 136 EXPECT_EQ(absPosProperties->transform(), absPosProperties->overflowClip()->l ocalTransformSpace());
135 EXPECT_EQ(FloatRoundedRect(), absPosProperties->overflowClip()->clipRect()); 137 EXPECT_EQ(FloatRoundedRect(), absPosProperties->overflowClip()->clipRect());
136 EXPECT_EQ(frameView->contentClip(), absPosProperties->overflowClip()->parent ()); 138 EXPECT_EQ(frameView->contentClip(), absPosProperties->overflowClip()->parent ());
137 } 139 }
138 140
139 TEST_F(PaintPropertyTreeBuilderTest, FrameScrollingTraditional) 141 TEST_F(PaintPropertyTreeBuilderTest, FrameScrollingTraditional)
140 { 142 {
141 setBodyInnerHTML("<style> body { height: 10000px; } </style>"); 143 setBodyInnerHTML("<style> body { height: 10000px; } </style>");
142 144
143 document().domWindow()->scrollTo(0, 100); 145 document().domWindow()->scrollTo(0, 100);
144 146
145 FrameView* frameView = document().view(); 147 FrameView* frameView = document().view();
146 frameView->updateAllLifecyclePhases(); 148 frameView->updateAllLifecyclePhases();
149
147 EXPECT_EQ(TransformationMatrix(), frameView->preTranslation()->matrix()); 150 EXPECT_EQ(TransformationMatrix(), frameView->preTranslation()->matrix());
148 EXPECT_EQ(frameView->rootTransform(), frameView->preTranslation()->parent()) ; 151 EXPECT_EQ(frameView->rootTransform(), frameView->preTranslation()->parent()) ;
149 EXPECT_EQ(nullptr, frameView->rootTransform()->parent()); 152 EXPECT_EQ(nullptr, frameView->rootTransform()->parent());
150 EXPECT_EQ(TransformationMatrix().translate(0, -100), frameView->scrollTransl ation()->matrix()); 153 EXPECT_EQ(TransformationMatrix().translate(0, -100), frameView->scrollTransl ation()->matrix());
151 EXPECT_EQ(frameView->preTranslation(), frameView->scrollTranslation()->paren t()); 154 EXPECT_EQ(frameView->preTranslation(), frameView->scrollTranslation()->paren t());
152 EXPECT_EQ(frameView->preTranslation(), frameView->contentClip()->localTransf ormSpace()); 155 EXPECT_EQ(frameView->preTranslation(), frameView->contentClip()->localTransf ormSpace());
153 EXPECT_EQ(FloatRoundedRect(0, 0, 800, 600), frameView->contentClip()->clipRe ct()); 156 EXPECT_EQ(FloatRoundedRect(0, 0, 800, 600), frameView->contentClip()->clipRe ct());
154 EXPECT_EQ(frameView->rootClip(), frameView->contentClip()->parent()); 157 EXPECT_EQ(frameView->rootClip(), frameView->contentClip()->parent());
155 EXPECT_EQ(nullptr, frameView->rootClip()->parent()); 158 EXPECT_EQ(nullptr, frameView->rootClip()->parent());
156 159
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 Element* inner = document().getElementById("inner"); 202 Element* inner = document().getElementById("inner");
200 ObjectPaintProperties* innerProperties = inner->layoutObject()->objectPaintP roperties(); 203 ObjectPaintProperties* innerProperties = inner->layoutObject()->objectPaintP roperties();
201 EXPECT_EQ(TransformationMatrix().translate(50, 100), innerProperties->paintO ffsetTranslation()->matrix()); 204 EXPECT_EQ(TransformationMatrix().translate(50, 100), innerProperties->paintO ffsetTranslation()->matrix());
202 EXPECT_EQ(perspectiveProperties->perspective(), innerProperties->paintOffset Translation()->parent()); 205 EXPECT_EQ(perspectiveProperties->perspective(), innerProperties->paintOffset Translation()->parent());
203 } 206 }
204 207
205 TEST_F(PaintPropertyTreeBuilderTest, Transform) 208 TEST_F(PaintPropertyTreeBuilderTest, Transform)
206 { 209 {
207 loadTestData("transform.html"); 210 loadTestData("transform.html");
208 211
212 ObjectPaintProperties* htmlProperties = document().documentElement()->layout Object()->objectPaintProperties();
209 Element* transform = document().getElementById("transform"); 213 Element* transform = document().getElementById("transform");
210 ObjectPaintProperties* transformProperties = transform->layoutObject()->obje ctPaintProperties(); 214 ObjectPaintProperties* transformProperties = transform->layoutObject()->obje ctPaintProperties();
211 EXPECT_EQ(TransformationMatrix().translate3d(123, 456, 789), transformProper ties->transform()->matrix()); 215 EXPECT_EQ(TransformationMatrix().translate3d(123, 456, 789), transformProper ties->transform()->matrix());
212 EXPECT_EQ(FloatPoint3D(200, 150, 0), transformProperties->transform()->origi n()); 216 EXPECT_EQ(FloatPoint3D(200, 150, 0), transformProperties->transform()->origi n());
213 EXPECT_EQ(transformProperties->paintOffsetTranslation(), transformProperties ->transform()->parent()); 217 EXPECT_EQ(transformProperties->paintOffsetTranslation(), transformProperties ->transform()->parent());
214 EXPECT_EQ(TransformationMatrix().translate(50, 100), transformProperties->pa intOffsetTranslation()->matrix()); 218 EXPECT_EQ(TransformationMatrix().translate(50, 100), transformProperties->pa intOffsetTranslation()->matrix());
215 EXPECT_EQ(document().view()->scrollTranslation(), transformProperties->paint OffsetTranslation()->parent()); 219 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), transformProperties->pai ntOffsetTranslation()->parent());
216 } 220 }
217 221
218 TEST_F(PaintPropertyTreeBuilderTest, RelativePositionInline) 222 TEST_F(PaintPropertyTreeBuilderTest, RelativePositionInline)
219 { 223 {
220 loadTestData("relative-position-inline.html"); 224 loadTestData("relative-position-inline.html");
221 225
226 ObjectPaintProperties* htmlProperties = document().documentElement()->layout Object()->objectPaintProperties();
222 Element* inlineBlock = document().getElementById("inline-block"); 227 Element* inlineBlock = document().getElementById("inline-block");
223 ObjectPaintProperties* inlineBlockProperties = inlineBlock->layoutObject()-> objectPaintProperties(); 228 ObjectPaintProperties* inlineBlockProperties = inlineBlock->layoutObject()-> objectPaintProperties();
224 EXPECT_EQ(TransformationMatrix().translate(135, 490), inlineBlockProperties- >paintOffsetTranslation()->matrix()); 229 EXPECT_EQ(TransformationMatrix().translate(135, 490), inlineBlockProperties- >paintOffsetTranslation()->matrix());
225 EXPECT_EQ(document().view()->scrollTranslation(), inlineBlockProperties->pai ntOffsetTranslation()->parent()); 230 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), inlineBlockProperties->p aintOffsetTranslation()->parent());
226 } 231 }
227 232
228 TEST_F(PaintPropertyTreeBuilderTest, NestedOpacityEffect) 233 TEST_F(PaintPropertyTreeBuilderTest, NestedOpacityEffect)
229 { 234 {
230 setBodyInnerHTML( 235 setBodyInnerHTML(
231 "<div id='nodeWithoutOpacity'>" 236 "<div id='nodeWithoutOpacity'>"
232 " <div id='childWithOpacity' style='opacity: 0.5'>" 237 " <div id='childWithOpacity' style='opacity: 0.5'>"
233 " <div id='grandChildWithoutOpacity'>" 238 " <div id='grandChildWithoutOpacity'>"
234 " <div id='greatGrandChildWithOpacity' style='opacity: 0.2'/>" 239 " <div id='greatGrandChildWithOpacity' style='opacity: 0.2'/>"
235 " </div>" 240 " </div>"
236 " </div>" 241 " </div>"
237 "</div>"); 242 "</div>");
238 243
239 LayoutObject& nodeWithoutOpacity = *document().getElementById("nodeWithoutOp acity")->layoutObject(); 244 LayoutObject& nodeWithoutOpacity = *document().getElementById("nodeWithoutOp acity")->layoutObject();
240 ObjectPaintProperties* nodeWithoutOpacityProperties = nodeWithoutOpacity.obj ectPaintProperties(); 245 ObjectPaintProperties* nodeWithoutOpacityProperties = nodeWithoutOpacity.obj ectPaintProperties();
241 EXPECT_NE(nullptr, nodeWithoutOpacityProperties); 246 EXPECT_NE(nullptr, nodeWithoutOpacityProperties);
242 247
243 LayoutObject& childWithOpacity = *document().getElementById("childWithOpacit y")->layoutObject(); 248 LayoutObject& childWithOpacity = *document().getElementById("childWithOpacit y")->layoutObject();
244 ObjectPaintProperties* childWithOpacityProperties = childWithOpacity.objectP aintProperties(); 249 ObjectPaintProperties* childWithOpacityProperties = childWithOpacity.objectP aintProperties();
245 EXPECT_EQ(0.5f, childWithOpacityProperties->effect()->opacity()); 250 EXPECT_EQ(0.5f, childWithOpacityProperties->effect()->opacity());
246 // childWithOpacity is the root effect node.
247 EXPECT_NE(nullptr, childWithOpacityProperties->effect()->parent()); 251 EXPECT_NE(nullptr, childWithOpacityProperties->effect()->parent());
248 252
249 LayoutObject& grandChildWithoutOpacity = *document().getElementById("grandCh ildWithoutOpacity")->layoutObject(); 253 LayoutObject& grandChildWithoutOpacity = *document().getElementById("grandCh ildWithoutOpacity")->layoutObject();
250 EXPECT_NE(nullptr, grandChildWithoutOpacity.objectPaintProperties()); 254 EXPECT_NE(nullptr, grandChildWithoutOpacity.objectPaintProperties());
251 255
252 LayoutObject& greatGrandChildWithOpacity = *document().getElementById("great GrandChildWithOpacity")->layoutObject(); 256 LayoutObject& greatGrandChildWithOpacity = *document().getElementById("great GrandChildWithOpacity")->layoutObject();
253 ObjectPaintProperties* greatGrandChildWithOpacityProperties = greatGrandChil dWithOpacity.objectPaintProperties(); 257 ObjectPaintProperties* greatGrandChildWithOpacityProperties = greatGrandChil dWithOpacity.objectPaintProperties();
254 EXPECT_EQ(0.2f, greatGrandChildWithOpacityProperties->effect()->opacity()); 258 EXPECT_EQ(0.2f, greatGrandChildWithOpacityProperties->effect()->opacity());
255 EXPECT_EQ(childWithOpacityProperties->effect(), greatGrandChildWithOpacityPr operties->effect()->parent()); 259 EXPECT_EQ(childWithOpacityProperties->effect(), greatGrandChildWithOpacityPr operties->effect()->parent());
256 } 260 }
257 261
258 TEST_F(PaintPropertyTreeBuilderTest, TransformNodeDoesNotAffectEffectNodes) 262 TEST_F(PaintPropertyTreeBuilderTest, TransformNodeDoesNotAffectEffectNodes)
259 { 263 {
260 setBodyInnerHTML( 264 setBodyInnerHTML(
261 "<div id='nodeWithOpacity' style='opacity: 0.6'>" 265 "<div id='nodeWithOpacity' style='opacity: 0.6'>"
262 " <div id='childWithTransform' style='transform: translate3d(10px, 10px , 0px);'>" 266 " <div id='childWithTransform' style='transform: translate3d(10px, 10px , 0px);'>"
263 " <div id='grandChildWithOpacity' style='opacity: 0.4'/>" 267 " <div id='grandChildWithOpacity' style='opacity: 0.4'/>"
264 " </div>" 268 " </div>"
265 "</div>"); 269 "</div>");
266 270
267 LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity" )->layoutObject(); 271 LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity" )->layoutObject();
268 ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPai ntProperties(); 272 ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPai ntProperties();
269 EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity()); 273 EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity());
270 EXPECT_NE(nullptr, nodeWithOpacityProperties->effect()->parent()); 274 EXPECT_NE(nullptr, nodeWithOpacityProperties->effect()->parent());
271 EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform()); 275 EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform());
272 276
273 LayoutObject& childWithTransform = *document().getElementById("childWithTran sform")->layoutObject(); 277 LayoutObject& childWithTransform = *document().getElementById("childWithTran sform")->layoutObject();
274 ObjectPaintProperties* childWithTransformProperties = childWithTransform.obj ectPaintProperties(); 278 ObjectPaintProperties* childWithTransformProperties = childWithTransform.obj ectPaintProperties();
275 EXPECT_EQ(nullptr, childWithTransformProperties->effect()); 279 EXPECT_TRUE(childWithTransformProperties->effect()->isIsolationNode());
280 EXPECT_EQ(nodeWithOpacityProperties->effect(), childWithTransformProperties- >effect()->parent());
276 EXPECT_EQ(TransformationMatrix().translate(10, 10), childWithTransformProper ties->transform()->matrix()); 281 EXPECT_EQ(TransformationMatrix().translate(10, 10), childWithTransformProper ties->transform()->matrix());
277 282
278 LayoutObject& grandChildWithOpacity = *document().getElementById("grandChild WithOpacity")->layoutObject(); 283 LayoutObject& grandChildWithOpacity = *document().getElementById("grandChild WithOpacity")->layoutObject();
279 ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpaci ty.objectPaintProperties(); 284 ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpaci ty.objectPaintProperties();
280 EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity()); 285 EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity());
281 EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperti es->effect()->parent()); 286 EXPECT_EQ(childWithTransformProperties->effect(), grandChildWithOpacityPrope rties->effect()->parent());
282 EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform()); 287 EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform());
283 } 288 }
284 289
285 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossStackingContext) 290 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossStackingContext)
286 { 291 {
287 setBodyInnerHTML( 292 setBodyInnerHTML(
288 "<div id='nodeWithOpacity' style='opacity: 0.6'>" 293 "<div id='nodeWithOpacity' style='opacity: 0.6'>"
289 " <div id='childWithStackingContext' style='position:absolute;'>" 294 " <div id='childWithStackingContext' style='position:absolute;'>"
290 " <div id='grandChildWithOpacity' style='opacity: 0.4'/>" 295 " <div id='grandChildWithOpacity' style='opacity: 0.4'/>"
291 " </div>" 296 " </div>"
292 "</div>"); 297 "</div>");
293 298
299 ObjectPaintProperties* htmlProperties = document().documentElement()->layout Object()->objectPaintProperties();
294 LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity" )->layoutObject(); 300 LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity" )->layoutObject();
295 ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPai ntProperties(); 301 ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPai ntProperties();
296 EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity()); 302 EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity());
297 EXPECT_NE(nullptr, nodeWithOpacityProperties->effect()->parent()); 303 EXPECT_EQ(htmlProperties->effect(), nodeWithOpacityProperties->effect()->par ent());
298 EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform()); 304 EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform());
299 305
300 LayoutObject& childWithStackingContext = *document().getElementById("childWi thStackingContext")->layoutObject(); 306 LayoutObject& childWithStackingContext = *document().getElementById("childWi thStackingContext")->layoutObject();
301 ObjectPaintProperties* childWithStackingContextProperties = childWithStackin gContext.objectPaintProperties(); 307 ObjectPaintProperties* childWithStackingContextProperties = childWithStackin gContext.objectPaintProperties();
302 EXPECT_EQ(nullptr, childWithStackingContextProperties->effect()); 308 EXPECT_TRUE(childWithStackingContextProperties->effect()->isIsolationNode()) ;
309 EXPECT_EQ(nodeWithOpacityProperties->effect(), childWithStackingContextPrope rties->effect()->parent());
303 EXPECT_EQ(nullptr, childWithStackingContextProperties->transform()); 310 EXPECT_EQ(nullptr, childWithStackingContextProperties->transform());
304 311
305 LayoutObject& grandChildWithOpacity = *document().getElementById("grandChild WithOpacity")->layoutObject(); 312 LayoutObject& grandChildWithOpacity = *document().getElementById("grandChild WithOpacity")->layoutObject();
306 ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpaci ty.objectPaintProperties(); 313 ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpaci ty.objectPaintProperties();
307 EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity()); 314 EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity());
308 EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperti es->effect()->parent()); 315 EXPECT_EQ(childWithStackingContextProperties->effect(), grandChildWithOpacit yProperties->effect()->parent());
309 EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform()); 316 EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform());
310 } 317 }
311 318
312 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesInSVG) 319 TEST_F(PaintPropertyTreeBuilderTest, EffectNodesInSVG)
313 { 320 {
314 setBodyInnerHTML( 321 setBodyInnerHTML(
315 "<svg id='svgRoot'>" 322 "<svg id='svgRoot'>"
316 " <g id='groupWithOpacity' opacity='0.6'>" 323 " <g id='groupWithOpacity' opacity='0.6'>"
317 " <rect id='rectWithoutOpacity' />" 324 " <rect id='rectWithoutOpacity' />"
318 " <rect id='rectWithOpacity' opacity='0.4' />" 325 " <rect id='rectWithOpacity' opacity='0.4' />"
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 EXPECT_EQ(svgWithViewBoxProperties->svgLocalToBorderBoxTransform(), rectProp erties->transform()->parent()); 483 EXPECT_EQ(svgWithViewBoxProperties->svgLocalToBorderBoxTransform(), rectProp erties->transform()->parent());
477 } 484 }
478 485
479 TEST_F(PaintPropertyTreeBuilderTest, SVGRootPaintOffsetTransformNode) 486 TEST_F(PaintPropertyTreeBuilderTest, SVGRootPaintOffsetTransformNode)
480 { 487 {
481 setBodyInnerHTML( 488 setBodyInnerHTML(
482 "<style>body { margin: 0px; } </style>" 489 "<style>body { margin: 0px; } </style>"
483 "<svg id='svg' style='margin-left: 50px; margin-top: 25px; width: 100px; height: 100px;' />"); 490 "<svg id='svg' style='margin-left: 50px; margin-top: 25px; width: 100px; height: 100px;' />");
484 491
485 LayoutObject& svg = *document().getElementById("svg")->layoutObject(); 492 LayoutObject& svg = *document().getElementById("svg")->layoutObject();
493 ObjectPaintProperties* htmlProperties = document().documentElement()->layout Object()->objectPaintProperties();
486 ObjectPaintProperties* svgProperties = svg.objectPaintProperties(); 494 ObjectPaintProperties* svgProperties = svg.objectPaintProperties();
487 // Ensure that a paint offset transform is not unnecessarily emitted. 495 // Ensure that a paint offset transform is not unnecessarily emitted.
488 EXPECT_EQ(nullptr, svgProperties->paintOffsetTranslation()); 496 EXPECT_EQ(nullptr, svgProperties->paintOffsetTranslation());
489 EXPECT_EQ(TransformationMatrix().translate(50, 25), svgProperties->svgLocalT oBorderBoxTransform()->matrix()); 497 EXPECT_EQ(TransformationMatrix().translate(50, 25), svgProperties->svgLocalT oBorderBoxTransform()->matrix());
490 EXPECT_EQ(document().view()->scrollTranslation(), svgProperties->svgLocalToB orderBoxTransform()->parent()); 498 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), svgProperties->svgLocalT oBorderBoxTransform()->parent());
491 } 499 }
492 500
493 TEST_F(PaintPropertyTreeBuilderTest, SVGRootLocalToBorderBoxTransformNode) 501 TEST_F(PaintPropertyTreeBuilderTest, SVGRootLocalToBorderBoxTransformNode)
494 { 502 {
495 setBodyInnerHTML( 503 setBodyInnerHTML(
496 "<style>" 504 "<style>"
497 " body { margin: 0px; }" 505 " body { margin: 0px; }"
498 " svg { margin-left: 2px; margin-top: 3px; transform: translate(5px, 7p x); border: 11px solid green; }" 506 " svg { margin-left: 2px; margin-top: 3px; transform: translate(5px, 7p x); border: 11px solid green; }"
499 "</style>" 507 "</style>"
500 "<svg id='svg' width='100px' height='100px' viewBox='0 0 13 13'>" 508 "<svg id='svg' width='100px' height='100px' viewBox='0 0 13 13'>"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
603 " body {" 611 " body {"
604 " margin: 0;" 612 " margin: 0;"
605 " }" 613 " }"
606 " input {" 614 " input {"
607 " border-width: 5px;" 615 " border-width: 5px;"
608 " padding: 0;" 616 " padding: 0;"
609 " }" 617 " }"
610 "</style>" 618 "</style>"
611 "<input id='button' type='button' style='width:345px; height:123px' valu e='some text'/>"); 619 "<input id='button' type='button' style='width:345px; height:123px' valu e='some text'/>");
612 620
613 FrameView* frameView = document().view(); 621 ObjectPaintProperties* htmlProperties = document().documentElement()->layout Object()->objectPaintProperties();
614 LayoutObject& button = *document().getElementById("button")->layoutObject(); 622 LayoutObject& button = *document().getElementById("button")->layoutObject();
615 ObjectPaintProperties* buttonProperties = button.objectPaintProperties(); 623 ObjectPaintProperties* buttonProperties = button.objectPaintProperties();
616 EXPECT_EQ(frameView->scrollTranslation(), buttonProperties->overflowClip()-> localTransformSpace()); 624 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), buttonProperties->overfl owClip()->localTransformSpace());
617 EXPECT_EQ(FloatRoundedRect(5, 5, 335, 113), buttonProperties->overflowClip() ->clipRect()); 625 EXPECT_EQ(FloatRoundedRect(5, 5, 335, 113), buttonProperties->overflowClip() ->clipRect());
618 EXPECT_EQ(frameView->contentClip(), buttonProperties->overflowClip()->parent ()); 626 EXPECT_EQ(htmlProperties->overflowClip(), buttonProperties->overflowClip()-> parent());
619 } 627 }
620 628
621 TEST_F(PaintPropertyTreeBuilderTest, BorderRadiusClip) 629 TEST_F(PaintPropertyTreeBuilderTest, BorderRadiusClip)
622 { 630 {
623 setBodyInnerHTML( 631 setBodyInnerHTML(
624 "<style>" 632 "<style>"
625 " body {" 633 " body {"
626 " margin: 0px;" 634 " margin: 0px;"
627 " }" 635 " }"
628 " #div {" 636 " #div {"
629 " border-radius: 12px 34px 56px 78px;" 637 " border-radius: 12px 34px 56px 78px;"
630 " border-top: 45px solid;" 638 " border-top: 45px solid;"
631 " border-right: 50px solid;" 639 " border-right: 50px solid;"
632 " border-bottom: 55px solid;" 640 " border-bottom: 55px solid;"
633 " border-left: 60px solid;" 641 " border-left: 60px solid;"
634 " width: 500px;" 642 " width: 500px;"
635 " height: 400px;" 643 " height: 400px;"
636 " overflow: scroll;" 644 " overflow: scroll;"
637 " }" 645 " }"
638 "</style>" 646 "</style>"
639 "<div id='div'></div>"); 647 "<div id='div'></div>");
640 648
641 FrameView* frameView = document().view(); 649 ObjectPaintProperties* htmlProperties = document().documentElement()->layout Object()->objectPaintProperties();
642 LayoutObject& div = *document().getElementById("div")->layoutObject(); 650 LayoutObject& div = *document().getElementById("div")->layoutObject();
643 ObjectPaintProperties* divProperties = div.objectPaintProperties(); 651 ObjectPaintProperties* divProperties = div.objectPaintProperties();
644 EXPECT_EQ(frameView->scrollTranslation(), divProperties->overflowClip()->loc alTransformSpace()); 652 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), divProperties->overflowC lip()->localTransformSpace());
645 // The overflow clip rect includes only the padding box. 653 // 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) 654 // 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()); 655 EXPECT_EQ(FloatRoundedRect(60, 45, 500, 400), divProperties->overflowClip()- >clipRect());
648 const ClipPaintPropertyNode* borderRadiusClip = divProperties->overflowClip( )->parent(); 656 const ClipPaintPropertyNode* borderRadiusClip = divProperties->overflowClip( )->parent();
649 EXPECT_EQ(frameView->scrollTranslation(), borderRadiusClip->localTransformSp ace()); 657 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), borderRadiusClip->localT ransformSpace());
650 // The border radius clip is the area enclosed by inner border edge, includi ng the scrollbars. 658 // 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: 659 // 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) 660 // 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 661 // In the case that two adjacent borders have different width, the inner rad ius of the corner
654 // may transition from one value to the other. i.e. being an ellipse. 662 // may transition from one value to the other. i.e. being an ellipse.
655 EXPECT_EQ( 663 EXPECT_EQ(
656 FloatRoundedRect( 664 FloatRoundedRect(
657 FloatRect(60, 45, 500, 400), // = border box(610, 500) - border outs et(110, 100) 665 FloatRect(60, 45, 500, 400), // = border box(610, 500) - border outs et(110, 100)
658 FloatSize(0, 0), // (top left) = max((12, 12) - (60, 45), (0, 0)) 666 FloatSize(0, 0), // (top left) = max((12, 12) - (60, 45), (0, 0))
659 FloatSize(0, 0), // (top right) = max((34, 34) - (50, 45), (0, 0)) 667 FloatSize(0, 0), // (top right) = max((34, 34) - (50, 45), (0, 0))
660 FloatSize(18, 23), // (bottom left) = max((78, 78) - (60, 55), (0, 0)) 668 FloatSize(18, 23), // (bottom left) = max((78, 78) - (60, 55), (0, 0))
661 FloatSize(6, 1)), // (bottom right) = max((56, 56) - (50, 55), (0, 0)) 669 FloatSize(6, 1)), // (bottom right) = max((56, 56) - (50, 55), (0, 0))
662 borderRadiusClip->clipRect()); 670 borderRadiusClip->clipRect());
663 EXPECT_EQ(frameView->contentClip(), borderRadiusClip->parent()); 671 EXPECT_EQ(htmlProperties->overflowClip(), borderRadiusClip->parent());
664 } 672 }
665 673
666 TEST_F(PaintPropertyTreeBuilderTest, TransformNodesAcrossSubframes) 674 TEST_F(PaintPropertyTreeBuilderTest, TransformNodesAcrossSubframes)
667 { 675 {
668 setBodyInnerHTML( 676 setBodyInnerHTML(
669 "<style>body { margin: 0; }</style>" 677 "<style>body { margin: 0; }</style>"
670 "<div id='divWithTransform' style='transform: translate3d(1px, 2px, 3px) ;'>" 678 "<div id='divWithTransform' style='transform: translate3d(1px, 2px, 3px) ;'>"
671 " <iframe id='frame'></iframe>" 679 " <iframe id='frame'></iframe>"
672 "</div>"); 680 "</div>");
673 Document& frameDocument = setupChildIframe("frame", "<style>body { margin: 0 ; }</style><div id='transform' style='transform: translate3d(4px, 5px, 6px);'></ div>"); 681 Document& frameDocument = setupChildIframe("frame", "<style>body { margin: 0 ; }</style><div id='transform' style='transform: translate3d(4px, 5px, 6px);'></ div>");
674 document().view()->updateAllLifecyclePhases(); 682 document().view()->updateAllLifecyclePhases();
675 683
676 LayoutObject& divWithTransform = *document().getElementById("divWithTransfor m")->layoutObject(); 684 LayoutObject& divWithTransform = *document().getElementById("divWithTransfor m")->layoutObject();
677 ObjectPaintProperties* divWithTransformProperties = divWithTransform.objectP aintProperties(); 685 ObjectPaintProperties* divWithTransformProperties = divWithTransform.objectP aintProperties();
678 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), divWithTransformPrope rties->transform()->matrix()); 686 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), divWithTransformPrope rties->transform()->matrix());
679 687
680 LayoutObject* innerDivWithTransform = frameDocument.getElementById("transfor m")->layoutObject(); 688 LayoutObject* innerDivWithTransform = frameDocument.getElementById("transfor m")->layoutObject();
681 ObjectPaintProperties* innerDivWithTransformProperties = innerDivWithTransfo rm->objectPaintProperties(); 689 ObjectPaintProperties* innerDivWithTransformProperties = innerDivWithTransfo rm->objectPaintProperties();
682 auto* innerDivTransform = innerDivWithTransformProperties->transform(); 690 auto* innerDivTransform = innerDivWithTransformProperties->transform();
683 EXPECT_EQ(TransformationMatrix().translate3d(4, 5, 6), innerDivTransform->ma trix()); 691 EXPECT_EQ(TransformationMatrix().translate3d(4, 5, 6), innerDivTransform->ma trix());
684 692
685 // Ensure that the inner div's transform is correctly rooted in the root fra me's transform tree. 693 // 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: 694 // This asserts that we have the following tree structure:
687 // ... 695 // ...
688 // Transform transform=translation=1.000000,2.000000,3.000000 696 // Transform transform=translation=1.000000,2.000000,3.000000
689 // PreTranslation transform=translation=2.000000,2.000000,0.000000 697 // PreTranslation transform=translation=2.000000,2.000000,0.000000
690 // ScrollTranslation transform=translation=0.000000,0.000000,0.000000 698 // ScrollTranslation transform=translation=0.000000,0.000000,0.000000
691 // Transform transform=translation=4.000000,5.000000,6.000000 699 // PaintOffsetTransform transform=translation=0.000000,0.000000,0.00 0000
692 auto* innerDocumentScrollTranslation = innerDivTransform->parent(); 700 // Transform transform=translation=4.000000,5.000000,6.000000
701 auto* innerDocumentHtmlTranslation = innerDivTransform->parent();
702 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), innerDocumentHtmlTran slation->matrix());
703 auto* innerDocumentScrollTranslation = innerDocumentHtmlTranslation->parent( );
693 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), innerDocumentScrollTr anslation->matrix()); 704 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), innerDocumentScrollTr anslation->matrix());
694 auto* iframePreTranslation = innerDocumentScrollTranslation->parent(); 705 auto* iframePreTranslation = innerDocumentScrollTranslation->parent();
695 EXPECT_EQ(TransformationMatrix().translate3d(2, 2, 0), iframePreTranslation- >matrix()); 706 EXPECT_EQ(TransformationMatrix().translate3d(2, 2, 0), iframePreTranslation- >matrix());
696 EXPECT_EQ(divWithTransformProperties->transform(), iframePreTranslation->par ent()); 707 EXPECT_EQ(divWithTransformProperties->transform(), iframePreTranslation->par ent());
697 } 708 }
698 709
699 TEST_F(PaintPropertyTreeBuilderTest, TransformNodesInTransformedSubframes) 710 TEST_F(PaintPropertyTreeBuilderTest, TransformNodesInTransformedSubframes)
700 { 711 {
701 setBodyInnerHTML( 712 setBodyInnerHTML(
702 "<style>body { margin: 0; }</style>" 713 "<style>body { margin: 0; }</style>"
703 "<div id='divWithTransform' style='transform: translate3d(1px, 2px, 3px) ;'>" 714 "<div id='divWithTransform' style='transform: translate3d(1px, 2px, 3px) ;'>"
704 " <iframe id='frame' style='transform: translate3d(4px, 5px, 6px); bord er: 42px solid; margin: 7px;'></iframe>" 715 " <iframe id='frame' style='transform: translate3d(4px, 5px, 6px); bord er: 42px solid; margin: 7px;'></iframe>"
705 "</div>"); 716 "</div>");
706 Document& frameDocument = setupChildIframe("frame", "<style>body { margin: 3 1px; }</style><div id='transform' style='transform: translate3d(7px, 8px, 9px);' ></div>"); 717 Document& frameDocument = setupChildIframe("frame", "<style>body { margin: 3 1px; }</style><div id='transform' style='transform: translate3d(7px, 8px, 9px);' ></div>");
707 document().view()->updateAllLifecyclePhases(); 718 document().view()->updateAllLifecyclePhases();
708 719
709 // Assert that we have the following tree structure: 720 // Assert that we have the following tree structure:
710 // ... 721 // ...
711 // Transform transform=translation=1.000000,2.000000,3.000000 722 // Transform transform=translation=1.000000,2.000000,3.000000
712 // PaintOffsetTranslation transform=translation=7.000000,7.000000,0.0000 00 723 // PaintOffsetTranslation transform=translation=7.000000,7.000000,0.0000 00
713 // Transform transform=translation=4.000000,5.000000,6.000000 724 // Transform transform=translation=4.000000,5.000000,6.000000
714 // PreTranslation transform=translation=42.000000,42.000000,0.000000 725 // PreTranslation transform=translation=42.000000,42.000000,0.000000
715 // ScrollTranslation transform=translation=0.000000,0.000000,0.000 000 726 // ScrollTranslation transform=translation=0.000000,0.000000,0.000 000
716 // PaintOffsetTranslation transform=translation=31.000000,31.000 000,0.000000 727 // PaintOffssetTransform transform=0.000000,0.000000,0.000000
717 // Transform transform=translation=7.000000,8.000000,9.000000 728 // PaintOffsetTranslation transform=translation=31.000000,31.0 00000,0.000000
729 // Transform transform=translation=7.000000,8.000000,9.00000 0
718 730
719 LayoutObject* innerDivWithTransform = frameDocument.getElementById("transfor m")->layoutObject(); 731 LayoutObject* innerDivWithTransform = frameDocument.getElementById("transfor m")->layoutObject();
720 auto* innerDivTransform = innerDivWithTransform->objectPaintProperties()->tr ansform(); 732 auto* innerDivTransform = innerDivWithTransform->objectPaintProperties()->tr ansform();
721 EXPECT_EQ(TransformationMatrix().translate3d(7, 8, 9), innerDivTransform->ma trix()); 733 EXPECT_EQ(TransformationMatrix().translate3d(7, 8, 9), innerDivTransform->ma trix());
722 734
723 auto* innerDocumentPaintOffsetTranslation = innerDivTransform->parent(); 735 auto* innerDocumentPaintOffsetTranslation = innerDivTransform->parent();
724 EXPECT_EQ(TransformationMatrix().translate3d(31, 31, 0), innerDocumentPaintO ffsetTranslation->matrix()); 736 EXPECT_EQ(TransformationMatrix().translate3d(31, 31, 0), innerDocumentPaintO ffsetTranslation->matrix());
725 auto* innerDocumentScrollTranslation = innerDocumentPaintOffsetTranslation-> parent(); 737 auto* innerDocumentHtmlTranslation = innerDocumentPaintOffsetTranslation->pa rent();
738 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), innerDocumentHtmlTran slation->matrix());
739 auto* innerDocumentScrollTranslation = innerDocumentHtmlTranslation->parent( );
726 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), innerDocumentScrollTr anslation->matrix()); 740 EXPECT_EQ(TransformationMatrix().translate3d(0, 0, 0), innerDocumentScrollTr anslation->matrix());
727 auto* iframePreTranslation = innerDocumentScrollTranslation->parent(); 741 auto* iframePreTranslation = innerDocumentScrollTranslation->parent();
728 EXPECT_EQ(TransformationMatrix().translate3d(42, 42, 0), iframePreTranslatio n->matrix()); 742 EXPECT_EQ(TransformationMatrix().translate3d(42, 42, 0), iframePreTranslatio n->matrix());
729 auto* iframeTransform = iframePreTranslation->parent(); 743 auto* iframeTransform = iframePreTranslation->parent();
730 EXPECT_EQ(TransformationMatrix().translate3d(4, 5, 6), iframeTransform->matr ix()); 744 EXPECT_EQ(TransformationMatrix().translate3d(4, 5, 6), iframeTransform->matr ix());
731 auto* iframePaintOffsetTranslation = iframeTransform->parent(); 745 auto* iframePaintOffsetTranslation = iframeTransform->parent();
732 EXPECT_EQ(TransformationMatrix().translate3d(7, 7, 0), iframePaintOffsetTran slation->matrix()); 746 EXPECT_EQ(TransformationMatrix().translate3d(7, 7, 0), iframePaintOffsetTran slation->matrix());
733 auto* divWithTransformTransform = iframePaintOffsetTranslation->parent(); 747 auto* divWithTransformTransform = iframePaintOffsetTranslation->parent();
734 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), divWithTransformTrans form->matrix()); 748 EXPECT_EQ(TransformationMatrix().translate3d(1, 2, 3), divWithTransformTrans form->matrix());
735 749
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
774 "</div>" 788 "</div>"
775 ); 789 );
776 790
777 FrameView* frameView = document().view(); 791 FrameView* frameView = document().view();
778 LayoutObject& scroller = *document().getElementById("scroller")->layoutObjec t(); 792 LayoutObject& scroller = *document().getElementById("scroller")->layoutObjec t();
779 ObjectPaintProperties* scrollerProperties = scroller.objectPaintProperties() ; 793 ObjectPaintProperties* scrollerProperties = scroller.objectPaintProperties() ;
780 LayoutObject& child = *document().getElementById("child")->layoutObject(); 794 LayoutObject& child = *document().getElementById("child")->layoutObject();
781 ObjectPaintProperties* childProperties = child.objectPaintProperties(); 795 ObjectPaintProperties* childProperties = child.objectPaintProperties();
782 796
783 EXPECT_EQ(frameView->contentClip(), childProperties->localBorderBoxPropertie s()->propertyTreeState.clip); 797 EXPECT_EQ(frameView->contentClip(), childProperties->localBorderBoxPropertie s()->propertyTreeState.clip);
784 EXPECT_EQ(frameView->scrollTranslation(), childProperties->localBorderBoxPro perties()->propertyTreeState.transform); 798
785 EXPECT_EQ(scrollerProperties->effect(), childProperties->localBorderBoxPrope rties()->propertyTreeState.effect); 799 EXPECT_EQ(childProperties->paintOffsetTranslation(), childProperties->localB orderBoxProperties()->propertyTreeState.transform);
800 EXPECT_TRUE(childProperties->paintOffsetTranslation()->isIsolationNode());
801 EXPECT_EQ(frameView->scrollTranslation(), childProperties->paintOffsetTransl ation()->parent());
802
803 EXPECT_EQ(childProperties->effect(), childProperties->localBorderBoxProperti es()->propertyTreeState.effect);
804 EXPECT_TRUE(childProperties->effect()->isIsolationNode());
805 EXPECT_EQ(scrollerProperties->effect(), childProperties->effect()->parent()) ;
786 } 806 }
787 807
788 TEST_F(PaintPropertyTreeBuilderTest, TableCellLayoutLocation) 808 TEST_F(PaintPropertyTreeBuilderTest, TableCellLayoutLocation)
789 { 809 {
790 // This test verifies that the border box space of a table cell is being cor rectly computed. 810 // 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. 811 // Table cells have weird location adjustment in our layout/paint implementa tion.
792 setBodyInnerHTML( 812 setBodyInnerHTML(
793 "<style>" 813 "<style>"
794 " body {" 814 " body {"
795 " margin: 0;" 815 " margin: 0;"
(...skipping 14 matching lines...) Expand all
810 " width: 100px;" 830 " width: 100px;"
811 " height: 100px;" 831 " height: 100px;"
812 " }" 832 " }"
813 "</style>" 833 "</style>"
814 "<table>" 834 "<table>"
815 " <tr><td></td><td></td></tr>" 835 " <tr><td></td><td></td></tr>"
816 " <tr><td></td><td><div id='target'></div></td></tr>" 836 " <tr><td></td><td><div id='target'></div></td></tr>"
817 "</table>" 837 "</table>"
818 ); 838 );
819 839
820 FrameView* frameView = document().view(); 840 ObjectPaintProperties* htmlProperties = document().documentElement()->layout Object()->objectPaintProperties();
821 LayoutObject& target = *document().getElementById("target")->layoutObject(); 841 LayoutObject& target = *document().getElementById("target")->layoutObject();
822 ObjectPaintProperties* targetProperties = target.objectPaintProperties(); 842 ObjectPaintProperties* targetProperties = target.objectPaintProperties();
823 843
824 EXPECT_EQ(LayoutPoint(170, 170), targetProperties->localBorderBoxProperties( )->paintOffset); 844 EXPECT_EQ(LayoutPoint(170, 170), targetProperties->localBorderBoxProperties( )->paintOffset);
825 EXPECT_EQ(frameView->scrollTranslation(), targetProperties->localBorderBoxPr operties()->propertyTreeState.transform); 845 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), targetProperties->localB orderBoxProperties()->propertyTreeState.transform);
826 } 846 }
827 847
828 TEST_F(PaintPropertyTreeBuilderTest, CSSClipFixedPositionDescendant) 848 TEST_F(PaintPropertyTreeBuilderTest, CSSClipFixedPositionDescendant)
829 { 849 {
830 // This test verifies that clip tree hierarchy being generated correctly for the hard case 850 // 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. 851 // such that a fixed position element getting clipped by an absolute positio n CSS clip.
832 setBodyInnerHTML( 852 setBodyInnerHTML(
833 "<style>" 853 "<style>"
834 " #clip {" 854 " #clip {"
835 " position: absolute;" 855 " position: absolute;"
836 " left: 123px;" 856 " left: 123px;"
837 " top: 456px;" 857 " top: 456px;"
838 " clip: rect(10px, 80px, 70px, 40px);" 858 " clip: rect(10px, 80px, 70px, 40px);"
839 " width: 100px;" 859 " width: 100px;"
840 " height: 100px;" 860 " height: 100px;"
841 " }" 861 " }"
842 " #fixed {" 862 " #fixed {"
843 " position: fixed;" 863 " position: fixed;"
844 " left: 654px;" 864 " left: 654px;"
845 " top: 321px;" 865 " top: 321px;"
846 " }" 866 " }"
847 "</style>" 867 "</style>"
848 "<div id='clip'><div id='fixed'></div></div>" 868 "<div id='clip'><div id='fixed'></div></div>"
849 ); 869 );
850 LayoutRect localClipRect(40, 10, 40, 60); 870 LayoutRect localClipRect(40, 10, 40, 60);
851 LayoutRect absoluteClipRect = localClipRect; 871 LayoutRect absoluteClipRect = localClipRect;
852 absoluteClipRect.move(123, 456); 872 absoluteClipRect.move(123, 456);
853 873
854 FrameView* frameView = document().view(); 874 FrameView* frameView = document().view();
855
856 LayoutObject& clip = *document().getElementById("clip")->layoutObject(); 875 LayoutObject& clip = *document().getElementById("clip")->layoutObject();
857 ObjectPaintProperties* clipProperties = clip.objectPaintProperties(); 876 ObjectPaintProperties* clipProperties = clip.objectPaintProperties();
858 EXPECT_EQ(frameView->contentClip(), clipProperties->cssClip()->parent()); 877 EXPECT_EQ(frameView->contentClip(), clipProperties->cssClip()->parent());
859 EXPECT_EQ(frameView->scrollTranslation(), clipProperties->cssClip()->localTr ansformSpace()); 878 EXPECT_EQ(clipProperties->paintOffsetTranslation(), clipProperties->cssClip( )->localTransformSpace());
879 EXPECT_EQ(frameView->scrollTranslation(), clipProperties->paintOffsetTransla tion()->parent());
860 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css Clip()->clipRect()); 880 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css Clip()->clipRect());
861 881
862 LayoutObject& fixed = *document().getElementById("fixed")->layoutObject(); 882 LayoutObject& fixed = *document().getElementById("fixed")->layoutObject();
863 ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties(); 883 ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties();
864 EXPECT_EQ(clipProperties->cssClip(), fixedProperties->localBorderBoxProperti es()->propertyTreeState.clip); 884 EXPECT_EQ(clipProperties->cssClip(), fixedProperties->localBorderBoxProperti es()->propertyTreeState.clip);
865 EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProper ties()->propertyTreeState.transform->parent()); 885 EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProper ties()->propertyTreeState.transform->parent());
866 EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->local BorderBoxProperties()->propertyTreeState.transform->matrix()); 886 EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->local BorderBoxProperties()->propertyTreeState.transform->matrix());
867 EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintO ffset); 887 EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintO ffset);
868 } 888 }
869 889
(...skipping 26 matching lines...) Expand all
896 " top: 321px;" 916 " top: 321px;"
897 " }" 917 " }"
898 "</style>" 918 "</style>"
899 "<div id='overflow'><div id='clip'><div id='fixed'></div></div></div>" 919 "<div id='overflow'><div id='clip'><div id='fixed'></div></div></div>"
900 ); 920 );
901 LayoutRect localClipRect(40, 10, 40, 60); 921 LayoutRect localClipRect(40, 10, 40, 60);
902 LayoutRect absoluteClipRect = localClipRect; 922 LayoutRect absoluteClipRect = localClipRect;
903 absoluteClipRect.move(123, 456); 923 absoluteClipRect.move(123, 456);
904 924
905 FrameView* frameView = document().view(); 925 FrameView* frameView = document().view();
926 ObjectPaintProperties* htmlProperties = document().documentElement()->layout Object()->objectPaintProperties();
906 927
907 LayoutObject& overflow = *document().getElementById("overflow")->layoutObjec t(); 928 LayoutObject& overflow = *document().getElementById("overflow")->layoutObjec t();
908 ObjectPaintProperties* overflowProperties = overflow.objectPaintProperties() ; 929 ObjectPaintProperties* overflowProperties = overflow.objectPaintProperties() ;
909 EXPECT_EQ(frameView->contentClip(), overflowProperties->overflowClip()->pare nt()); 930 EXPECT_EQ(htmlProperties->overflowClip(), overflowProperties->overflowClip() ->parent());
910 EXPECT_EQ(frameView->scrollTranslation(), overflowProperties->scrollTranslat ion()->parent()); 931 EXPECT_EQ(htmlProperties->paintOffsetTranslation(), overflowProperties->scro llTranslation()->parent());
911 932
912 LayoutObject& clip = *document().getElementById("clip")->layoutObject(); 933 LayoutObject& clip = *document().getElementById("clip")->layoutObject();
913 ObjectPaintProperties* clipProperties = clip.objectPaintProperties(); 934 ObjectPaintProperties* clipProperties = clip.objectPaintProperties();
914 EXPECT_EQ(overflowProperties->overflowClip(), clipProperties->cssClip()->par ent()); 935 EXPECT_EQ(overflowProperties->overflowClip(), clipProperties->cssClip()->par ent());
915 EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->cssClip() ->localTransformSpace()); 936 EXPECT_EQ(clipProperties->paintOffsetTranslation(), clipProperties->cssClip( )->localTransformSpace());
937 EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->paintOffs etTranslation()->parent());
916 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css Clip()->clipRect()); 938 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css Clip()->clipRect());
917 EXPECT_EQ(frameView->contentClip(), clipProperties->cssClipFixedPosition()-> parent()); 939 EXPECT_EQ(frameView->contentClip(), clipProperties->cssClipFixedPosition()-> parent());
918 EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->cssClipFi xedPosition()->localTransformSpace()); 940 EXPECT_EQ(clipProperties->paintOffsetTranslation(), clipProperties->cssClipF ixedPosition()->localTransformSpace());
941 EXPECT_EQ(overflowProperties->scrollTranslation(), clipProperties->paintOffs etTranslation()->parent());
919 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css ClipFixedPosition()->clipRect()); 942 EXPECT_EQ(FloatRoundedRect(FloatRect(absoluteClipRect)), clipProperties->css ClipFixedPosition()->clipRect());
920 943
921 LayoutObject& fixed = *document().getElementById("fixed")->layoutObject(); 944 LayoutObject& fixed = *document().getElementById("fixed")->layoutObject();
922 ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties(); 945 ObjectPaintProperties* fixedProperties = fixed.objectPaintProperties();
923 EXPECT_EQ(clipProperties->cssClipFixedPosition(), fixedProperties->localBord erBoxProperties()->propertyTreeState.clip); 946 EXPECT_EQ(clipProperties->cssClipFixedPosition(), fixedProperties->localBord erBoxProperties()->propertyTreeState.clip);
924 EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProper ties()->propertyTreeState.transform->parent()); 947 EXPECT_EQ(frameView->preTranslation(), fixedProperties->localBorderBoxProper ties()->propertyTreeState.transform->parent());
925 EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->local BorderBoxProperties()->propertyTreeState.transform->matrix()); 948 EXPECT_EQ(TransformationMatrix().translate(654, 321), fixedProperties->local BorderBoxProperties()->propertyTreeState.transform->matrix());
926 EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintO ffset); 949 EXPECT_EQ(LayoutPoint(), fixedProperties->localBorderBoxProperties()->paintO ffset);
927 } 950 }
928 951
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1177 EXPECT_EQ(bProperties, b->layoutObject()->objectPaintProperties()); 1200 EXPECT_EQ(bProperties, b->layoutObject()->objectPaintProperties());
1178 bTransformNode = bProperties->transform(); 1201 bTransformNode = bProperties->transform();
1179 EXPECT_EQ(TransformationMatrix().translate(4, 5), bTransformNode->matrix()); 1202 EXPECT_EQ(TransformationMatrix().translate(4, 5), bTransformNode->matrix());
1180 EXPECT_EQ(aTransformNode, bTransformNode->parent()); 1203 EXPECT_EQ(aTransformNode, bTransformNode->parent());
1181 1204
1182 EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties()); 1205 EXPECT_EQ(cProperties, c->layoutObject()->objectPaintProperties());
1183 EXPECT_EQ(cTransformNode, cProperties->transform()); 1206 EXPECT_EQ(cTransformNode, cProperties->transform());
1184 EXPECT_EQ(bTransformNode, cTransformNode->parent()); 1207 EXPECT_EQ(bTransformNode, cTransformNode->parent());
1185 } 1208 }
1186 1209
1210 TEST_F(PaintPropertyTreeBuilderTest, CachedPropertiesStackingContext)
1211 {
1212 setBodyInnerHTML(
1213 "<div id='transform' style='transform: translate(33px, 44px)'>"
1214 " <div id='stacking-context' style='position: absolute; z-index: 0'>Sta cking-context</div>"
1215 "</div>");
1216
1217 Element* transform = document().getElementById("transform");
1218 ObjectPaintProperties* transformProperties = transform->layoutObject()->obje ctPaintProperties();
1219 TransformPaintPropertyNode* transformTransformNode = transformProperties->tr ansform();
1220 ASSERT_TRUE(transformTransformNode);
1221 EXPECT_EQ(TransformationMatrix().translate(33, 44), transformTransformNode-> matrix());
1222
1223 ClipPaintPropertyNode* transformClipNode = transformProperties->overflowClip ();
1224 ASSERT_TRUE(transformClipNode);
1225 EXPECT_TRUE(transformClipNode->isIsolationNode());
1226
1227 EffectPaintPropertyNode* transformEffectNode = transformProperties->effect() ;
1228 ASSERT_TRUE(transformEffectNode);
1229 EXPECT_EQ(1.0, transformEffectNode->opacity());
1230
1231 // The stacking context should have no-op isolation paint property nodes.
1232 Element* stackingContext = document().getElementById("stacking-context");
1233 ObjectPaintProperties* stackingContextProperties = stackingContext->layoutOb ject()->objectPaintProperties();
1234 TransformPaintPropertyNode* stackingContextPaintOffsetTranslationNode = stac kingContextProperties->paintOffsetTranslation();
1235 ASSERT_TRUE(stackingContextPaintOffsetTranslationNode);
1236 EXPECT_EQ(transformTransformNode, stackingContextPaintOffsetTranslationNode- >parent());
1237 EXPECT_TRUE(stackingContextPaintOffsetTranslationNode->isIsolationNode());
1238
1239 EffectPaintPropertyNode* stackingContextEffectNode = stackingContextProperti es->effect();
1240 ASSERT_TRUE(stackingContextEffectNode);
1241 EXPECT_EQ(transformEffectNode, stackingContextEffectNode->parent());
1242 EXPECT_EQ(1.0, stackingContextEffectNode->opacity());
1243
1244 ClipPaintPropertyNode* stackingContextClipNode = stackingContextProperties-> overflowClip();
1245 ASSERT_TRUE(stackingContextClipNode);
1246 EXPECT_EQ(transformClipNode, stackingContextClipNode->parent());
1247 EXPECT_TRUE(stackingContextClipNode->isIsolationNode());
1248
1249 // Change transform. The 'transform' element's transform node should be a ne w node with the new value,
1250 // and 'stacking-context's nodes should be unchanged (with parent adjusted).
1251 transform->setAttribute(HTMLNames::styleAttr, "transform: translate(111px, 2 22px)");
1252 document().view()->updateAllLifecyclePhases();
1253
1254 EXPECT_EQ(transformProperties, transform->layoutObject()->objectPaintPropert ies());
1255 EXPECT_NE(transformTransformNode, transformProperties->transform());
1256 transformTransformNode = transformProperties->transform();
1257 EXPECT_EQ(TransformationMatrix().translate(111, 222), transformTransformNode ->matrix());
1258 EXPECT_EQ(transformClipNode, transformProperties->overflowClip());
1259 EXPECT_EQ(transformEffectNode, transformProperties->effect());
1260
1261 EXPECT_EQ(stackingContextProperties, stackingContext->layoutObject()->object PaintProperties());
1262 EXPECT_EQ(stackingContextPaintOffsetTranslationNode, stackingContextProperti es->paintOffsetTranslation());
1263 EXPECT_EQ(transformTransformNode, stackingContextPaintOffsetTranslationNode- >parent());
1264 EXPECT_EQ(stackingContextClipNode, stackingContextProperties->overflowClip() );
1265 EXPECT_EQ(transformClipNode, stackingContextClipNode->parent());
1266 EXPECT_EQ(stackingContextEffectNode, stackingContextProperties->effect());
1267 EXPECT_EQ(transformEffectNode, stackingContextEffectNode->parent());
1268 }
1269
1187 } // namespace blink 1270 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698