TEST_F(PaintPropertyTreeBuilderTest, NestedOpacityEffect) { setBodyInnerHTML( "<div id='nodeWithoutOpacity'>" " <div id='childWithOpacity' style='opacity: 0.5'>" " <div id='grandChildWithoutOpacity'>" " <div id='greatGrandChildWithOpacity' style='opacity: 0.2'/>" " </div>" " </div" "</div>"); LayoutObject& nodeWithoutOpacity = *document().getElementById("nodeWithoutOpacity")->layoutObject(); ObjectPaintProperties* nodeWithoutOpacityProperties = nodeWithoutOpacity.objectPaintProperties(); EXPECT_EQ(nullptr, nodeWithoutOpacityProperties); LayoutObject& childWithOpacity = *document().getElementById("childWithOpacity")->layoutObject(); ObjectPaintProperties* childWithOpacityProperties = childWithOpacity.objectPaintProperties(); EXPECT_EQ(0.5f, childWithOpacityProperties->effect()->opacity()); // childWithOpacity is the root effect node. EXPECT_EQ(nullptr, childWithOpacityProperties->effect()->parent()); LayoutObject& grandChildWithoutOpacity = *document().getElementById("grandChildWithoutOpacity")->layoutObject(); EXPECT_EQ(nullptr, grandChildWithoutOpacity.objectPaintProperties()); LayoutObject& greatGrandChildWithOpacity = *document().getElementById("greatGrandChildWithOpacity")->layoutObject(); ObjectPaintProperties* greatGrandChildWithOpacityProperties = greatGrandChildWithOpacity.objectPaintProperties(); EXPECT_EQ(0.2f, greatGrandChildWithOpacityProperties->effect()->opacity()); EXPECT_EQ(childWithOpacityProperties->effect(), greatGrandChildWithOpacityProperties->effect()->parent()); }
TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossSVGHTMLBoundary) { setBodyInnerHTML( "<svg id='svgRootWithOpacity' style='opacity: 0.3;'>" " <foreignObject id='foreignObjectWithOpacity' opacity='0.4'>" " <body>" " <span id='spanWithOpacity' style='opacity: 0.5'/>" " </body>" " </foreignObject>" "</svg>"); LayoutObject& svgRootWithOpacity = *document().getElementById("svgRootWithOpacity")->layoutObject(); ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpacity.objectPaintProperties(); EXPECT_EQ(0.3f, svgRootWithOpacityProperties->effect()->opacity()); EXPECT_EQ(nullptr, svgRootWithOpacityProperties->effect()->parent()); LayoutObject& foreignObjectWithOpacity = *document().getElementById("foreignObjectWithOpacity")->layoutObject(); ObjectPaintProperties* foreignObjectWithOpacityProperties = foreignObjectWithOpacity.objectPaintProperties(); EXPECT_EQ(0.4f, foreignObjectWithOpacityProperties->effect()->opacity()); EXPECT_EQ(svgRootWithOpacityProperties->effect(), foreignObjectWithOpacityProperties->effect()->parent()); LayoutObject& spanWithOpacity = *document().getElementById("spanWithOpacity")->layoutObject(); ObjectPaintProperties* spanWithOpacityProperties = spanWithOpacity.objectPaintProperties(); EXPECT_EQ(0.5f, spanWithOpacityProperties->effect()->opacity()); EXPECT_EQ(foreignObjectWithOpacityProperties->effect(), spanWithOpacityProperties->effect()->parent()); }
TEST_F(PaintPropertyTreeBuilderTest, TransformNodeDoesNotAffectEffectNodes) { setBodyInnerHTML( "<div id='nodeWithOpacity' style='opacity: 0.6'>" " <div id='childWithTransform' style='transform: translate3d(10px, 10px, 0px);'>" " <div id='grandChildWithOpacity' style='opacity: 0.4'/>" " </div" "</div>"); LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity")->layoutObject(); ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPaintProperties(); EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity()); EXPECT_EQ(nullptr, nodeWithOpacityProperties->effect()->parent()); EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform()); LayoutObject& childWithTransform = *document().getElementById("childWithTransform")->layoutObject(); ObjectPaintProperties* childWithTransformProperties = childWithTransform.objectPaintProperties(); EXPECT_EQ(nullptr, childWithTransformProperties->effect()); EXPECT_EQ(TransformationMatrix().translate(10, 10), childWithTransformProperties->transform()->matrix()); LayoutObject& grandChildWithOpacity = *document().getElementById("grandChildWithOpacity")->layoutObject(); ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpacity.objectPaintProperties(); EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity()); EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperties->effect()->parent()); EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform()); }
TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossStackingContext) { setBodyInnerHTML( "<div id='nodeWithOpacity' style='opacity: 0.6'>" " <div id='childWithStackingContext' style='position:absolute;'>" " <div id='grandChildWithOpacity' style='opacity: 0.4'/>" " </div" "</div>"); LayoutObject& nodeWithOpacity = *document().getElementById("nodeWithOpacity")->layoutObject(); ObjectPaintProperties* nodeWithOpacityProperties = nodeWithOpacity.objectPaintProperties(); EXPECT_EQ(0.6f, nodeWithOpacityProperties->effect()->opacity()); EXPECT_EQ(nullptr, nodeWithOpacityProperties->effect()->parent()); EXPECT_EQ(nullptr, nodeWithOpacityProperties->transform()); LayoutObject& childWithStackingContext = *document().getElementById("childWithStackingContext")->layoutObject(); EXPECT_EQ(nullptr, childWithStackingContext.objectPaintProperties()); LayoutObject& grandChildWithOpacity = *document().getElementById("grandChildWithOpacity")->layoutObject(); ObjectPaintProperties* grandChildWithOpacityProperties = grandChildWithOpacity.objectPaintProperties(); EXPECT_EQ(0.4f, grandChildWithOpacityProperties->effect()->opacity()); EXPECT_EQ(nodeWithOpacityProperties->effect(), grandChildWithOpacityProperties->effect()->parent()); EXPECT_EQ(nullptr, grandChildWithOpacityProperties->transform()); }
TEST_F(PaintPropertyTreeBuilderTest, EffectNodesAcrossHTMLSVGBoundary) { setBodyInnerHTML( "<div id='divWithOpacity' style='opacity: 0.2;'>" " <svg id='svgRootWithOpacity' style='opacity: 0.3;'>" " <rect id='rectWithOpacity' opacity='0.4' />" " </svg>" "</div>"); LayoutObject& divWithOpacity = *document().getElementById("divWithOpacity")->layoutObject(); ObjectPaintProperties* divWithOpacityProperties = divWithOpacity.objectPaintProperties(); EXPECT_EQ(0.2f, divWithOpacityProperties->effect()->opacity()); EXPECT_EQ(nullptr, divWithOpacityProperties->effect()->parent()); LayoutObject& svgRootWithOpacity = *document().getElementById("svgRootWithOpacity")->layoutObject(); ObjectPaintProperties* svgRootWithOpacityProperties = svgRootWithOpacity.objectPaintProperties(); EXPECT_EQ(0.3f, svgRootWithOpacityProperties->effect()->opacity()); EXPECT_EQ(divWithOpacityProperties->effect(), svgRootWithOpacityProperties->effect()->parent()); LayoutObject& rectWithOpacity = *document().getElementById("rectWithOpacity")->layoutObject(); ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.objectPaintProperties(); EXPECT_EQ(0.4f, rectWithOpacityProperties->effect()->opacity()); EXPECT_EQ(svgRootWithOpacityProperties->effect(), rectWithOpacityProperties->effect()->parent()); }
TEST_F(PaintPropertyTreeBuilderTest, EffectNodesInSVG) { setBodyInnerHTML( "<svg id='svgRoot'>" " <g id='groupWithOpacity' opacity='0.6'>" " <rect id='rectWithoutOpacity' />" " <rect id='rectWithOpacity' opacity='0.4' />" " <text id='textWithOpacity' opacity='0.2'>" " <tspan id='tspanWithOpacity' opacity='0.1' />" " </text>" " </g>" "</svg>"); LayoutObject& groupWithOpacity = *document().getElementById("groupWithOpacity")->layoutObject(); ObjectPaintProperties* groupWithOpacityProperties = groupWithOpacity.objectPaintProperties(); EXPECT_EQ(0.6f, groupWithOpacityProperties->effect()->opacity()); EXPECT_EQ(nullptr, groupWithOpacityProperties->effect()->parent()); LayoutObject& rectWithoutOpacity = *document().getElementById("rectWithoutOpacity")->layoutObject(); ObjectPaintProperties* rectWithoutOpacityProperties = rectWithoutOpacity.objectPaintProperties(); EXPECT_EQ(nullptr, rectWithoutOpacityProperties); LayoutObject& rectWithOpacity = *document().getElementById("rectWithOpacity")->layoutObject(); ObjectPaintProperties* rectWithOpacityProperties = rectWithOpacity.objectPaintProperties(); EXPECT_EQ(0.4f, rectWithOpacityProperties->effect()->opacity()); EXPECT_EQ(groupWithOpacityProperties->effect(), rectWithOpacityProperties->effect()->parent()); // Ensure that opacity nodes are created for LayoutSVGText which inherits from LayoutSVGBlock instead of LayoutSVGModelObject. LayoutObject& textWithOpacity = *document().getElementById("textWithOpacity")->layoutObject(); ObjectPaintProperties* textWithOpacityProperties = textWithOpacity.objectPaintProperties(); EXPECT_EQ(0.2f, textWithOpacityProperties->effect()->opacity()); EXPECT_EQ(groupWithOpacityProperties->effect(), textWithOpacityProperties->effect()->parent()); // Ensure that opacity nodes are created for LayoutSVGTSpan which inherits from LayoutSVGInline instead of LayoutSVGModelObject. LayoutObject& tspanWithOpacity = *document().getElementById("tspanWithOpacity")->layoutObject(); ObjectPaintProperties* tspanWithOpacityProperties = tspanWithOpacity.objectPaintProperties(); EXPECT_EQ(0.1f, tspanWithOpacityProperties->effect()->opacity()); EXPECT_EQ(textWithOpacityProperties->effect(), tspanWithOpacityProperties->effect()->parent()); }