| Index: third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
|
| index 04079d830f31481b29bd36686aac7c6bbd082ebe..a8f38436c8a03481a379a56aea0e1beeb63f1694 100644
|
| --- a/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/PaintPropertyTreeBuilder.cpp
|
| @@ -79,21 +79,26 @@ void PaintPropertyTreeBuilder::walk(FrameView& frameView, const PaintPropertyTre
|
| walk(*layoutView, localContext);
|
| }
|
|
|
| -static void deriveBorderBoxFromContainerContext(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context)
|
| +static void deriveBorderBoxFromContainerContext(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| {
|
| + if (!object.isBoxModelObject())
|
| + return;
|
| +
|
| + const LayoutBoxModelObject& boxModelObject = toLayoutBoxModelObject(object);
|
| +
|
| // TODO(trchen): There is some insanity going on with tables. Double check results.
|
| switch (object.styleRef().position()) {
|
| case StaticPosition:
|
| break;
|
| case RelativePosition:
|
| - context.paintOffset += object.offsetForInFlowPosition();
|
| + context.paintOffset += boxModelObject.offsetForInFlowPosition();
|
| break;
|
| case AbsolutePosition:
|
| context.currentTransform = context.transformForOutOfFlowPositioned;
|
| context.paintOffset = context.paintOffsetForOutOfFlowPositioned;
|
| break;
|
| case StickyPosition:
|
| - context.paintOffset += object.offsetForInFlowPosition();
|
| + context.paintOffset += boxModelObject.offsetForInFlowPosition();
|
| break;
|
| case FixedPosition:
|
| context.currentTransform = context.transformForFixedPositioned;
|
| @@ -102,14 +107,21 @@ static void deriveBorderBoxFromContainerContext(const LayoutBoxModelObject& obje
|
| default:
|
| ASSERT_NOT_REACHED();
|
| }
|
| - if (object.isBox())
|
| - context.paintOffset += toLayoutBox(object).locationOffset();
|
| + if (boxModelObject.isBox())
|
| + context.paintOffset += toLayoutBox(boxModelObject).locationOffset();
|
| }
|
|
|
| -static PassRefPtr<TransformPaintPropertyNode> createPaintOffsetTranslationIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context)
|
| +static PassRefPtr<TransformPaintPropertyNode> createPaintOffsetTranslationIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| {
|
| - // TODO(trchen): Eliminate PaintLayer dependency.
|
| - bool shouldCreatePaintOffsetTranslationNode = object.layer() && object.layer()->paintsWithTransform(GlobalPaintNormalPhase);
|
| + bool shouldCreatePaintOffsetTranslationNode = false;
|
| + if (object.isSVGRoot()) {
|
| + // SVG doesn't use paint offset internally so emit a paint offset at the html->svg boundary.
|
| + shouldCreatePaintOffsetTranslationNode = true;
|
| + } else if (object.isBoxModelObject()) {
|
| + // TODO(trchen): Eliminate PaintLayer dependency.
|
| + PaintLayer* layer = toLayoutBoxModelObject(object).layer();
|
| + shouldCreatePaintOffsetTranslationNode = layer && layer->paintsWithTransform(GlobalPaintNormalPhase);
|
| + }
|
|
|
| if (context.paintOffset == LayoutPoint() || !shouldCreatePaintOffsetTranslationNode)
|
| return nullptr;
|
| @@ -134,8 +146,20 @@ static FloatPoint3D transformOrigin(const LayoutBox& box)
|
| style.transformOriginZ());
|
| }
|
|
|
| -static PassRefPtr<TransformPaintPropertyNode> createTransformIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context)
|
| +static PassRefPtr<TransformPaintPropertyNode> createTransformIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| {
|
| + if (object.isSVG() && !object.isSVGRoot()) {
|
| + const AffineTransform& transform = object.localToParentTransform();
|
| + if (transform.isIdentity())
|
| + return nullptr;
|
| +
|
| + // SVG's transform origin is baked into the localToParentTransform.
|
| + RefPtr<TransformPaintPropertyNode> newTransformNodeForTransform = TransformPaintPropertyNode::create(
|
| + transform, FloatPoint3D(0, 0, 0), context.currentTransform);
|
| + context.currentTransform = newTransformNodeForTransform.get();
|
| + return newTransformNodeForTransform.release();
|
| + }
|
| +
|
| const ComputedStyle& style = object.styleRef();
|
| if (!object.isBox() || !style.hasTransform())
|
| return nullptr;
|
| @@ -151,10 +175,10 @@ static PassRefPtr<TransformPaintPropertyNode> createTransformIfNeeded(const Layo
|
| return newTransformNodeForTransform.release();
|
| }
|
|
|
| -static PassRefPtr<EffectPaintPropertyNode> createEffectIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context)
|
| +static PassRefPtr<EffectPaintPropertyNode> createEffectIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| {
|
| const ComputedStyle& style = object.styleRef();
|
| - if (!object.isBox() || !style.hasOpacity())
|
| + if (!style.hasOpacity())
|
| return nullptr;
|
| RefPtr<EffectPaintPropertyNode> newEffectNode = EffectPaintPropertyNode::create(style.opacity(), context.currentEffect);
|
| context.currentEffect = newEffectNode.get();
|
| @@ -170,7 +194,7 @@ static FloatPoint perspectiveOrigin(const LayoutBox& box)
|
| floatValueForLength(style.perspectiveOriginY(), borderBoxSize.height()));
|
| }
|
|
|
| -static PassRefPtr<TransformPaintPropertyNode> createPerspectiveIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context)
|
| +static PassRefPtr<TransformPaintPropertyNode> createPerspectiveIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| {
|
| const ComputedStyle& style = object.styleRef();
|
| if (!object.isBox() || !style.hasPerspective())
|
| @@ -183,12 +207,12 @@ static PassRefPtr<TransformPaintPropertyNode> createPerspectiveIfNeeded(const La
|
| return newTransformNodeForPerspective.release();
|
| }
|
|
|
| -static PassRefPtr<TransformPaintPropertyNode> createScrollTranslationIfNeeded(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context)
|
| +static PassRefPtr<TransformPaintPropertyNode> createScrollTranslationIfNeeded(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| {
|
| - if (!object.hasOverflowClip())
|
| + if (!object.isBoxModelObject() || !object.hasOverflowClip())
|
| return nullptr;
|
|
|
| - PaintLayer* layer = object.layer();
|
| + PaintLayer* layer = toLayoutBoxModelObject(object).layer();
|
| ASSERT(layer);
|
| DoubleSize scrollOffset = layer->scrollableArea()->scrollOffset();
|
| if (scrollOffset.isZero() && !layer->scrollsOverflow())
|
| @@ -201,7 +225,7 @@ static PassRefPtr<TransformPaintPropertyNode> createScrollTranslationIfNeeded(co
|
| return newTransformNodeForScrollTranslation.release();
|
| }
|
|
|
| -static void updateOutOfFlowContext(const LayoutBoxModelObject& object, PaintPropertyTreeBuilderContext& context)
|
| +static void updateOutOfFlowContext(const LayoutObject& object, PaintPropertyTreeBuilderContext& context)
|
| {
|
| const ComputedStyle& style = object.styleRef();
|
| bool hasTransform = object.isBox() && style.hasTransform();
|
| @@ -215,10 +239,8 @@ static void updateOutOfFlowContext(const LayoutBoxModelObject& object, PaintProp
|
| }
|
| }
|
|
|
| -void PaintPropertyTreeBuilder::walk(LayoutBoxModelObject& object, const PaintPropertyTreeBuilderContext& context)
|
| +void PaintPropertyTreeBuilder::walk(LayoutObject& object, const PaintPropertyTreeBuilderContext& context)
|
| {
|
| - ASSERT(object.isBox() != object.isLayoutInline()); // Either or.
|
| -
|
| PaintPropertyTreeBuilderContext localContext(context);
|
|
|
| deriveBorderBoxFromContainerContext(object, localContext);
|
| @@ -243,15 +265,9 @@ void PaintPropertyTreeBuilder::walk(LayoutBoxModelObject& object, const PaintPro
|
|
|
| // TODO(trchen): Walk subframes for LayoutFrame.
|
|
|
| - // TODO(trchen): Implement SVG walk.
|
| - if (object.isSVGRoot()) {
|
| - return;
|
| - }
|
| -
|
| for (LayoutObject* child = object.slowFirstChild(); child; child = child->nextSibling()) {
|
| - if (child->isText())
|
| - continue;
|
| - walk(toLayoutBoxModelObject(*child), localContext);
|
| + if (child->isBoxModelObject() || child->isSVG())
|
| + walk(*child, localContext);
|
| }
|
| }
|
|
|
|
|