| Index: third_party/WebKit/Source/core/paint/PaintLayer.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
|
| index 1406e435a1bcb5268ffff3a19d821ee131dfda73..234be0cd5a9e72df3e313478b9cb08e276bdee58 100644
|
| --- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
|
| @@ -782,19 +782,19 @@ void PaintLayer::updateLayerPosition() {
|
| }
|
|
|
| if (!layoutObject()->isOutOfFlowPositioned() &&
|
| - !layoutObject()->isColumnSpanAll() && layoutObject()->parent()) {
|
| + !layoutObject()->isColumnSpanAll()) {
|
| // We must adjust our position by walking up the layout tree looking for the
|
| // nearest enclosing object with a layer.
|
| - LayoutObject* curr = layoutObject()->parent();
|
| + LayoutObject* curr = layoutObject()->container();
|
| while (curr && !curr->hasLayer()) {
|
| if (curr->isBox() && !curr->isTableRow()) {
|
| // Rows and cells share the same coordinate space (that of the section).
|
| // Omit them when computing our xpos/ypos.
|
| localPoint.moveBy(toLayoutBox(curr)->physicalLocation());
|
| }
|
| - curr = curr->parent();
|
| + curr = curr->container();
|
| }
|
| - if (curr->isBox() && curr->isTableRow()) {
|
| + if (curr && curr->isTableRow()) {
|
| // Put ourselves into the row coordinate space.
|
| localPoint.moveBy(-toLayoutBox(curr)->physicalLocation());
|
| }
|
| @@ -1418,11 +1418,24 @@ static inline const PaintLayer* accumulateOffsetTowardsAncestor(
|
| return ancestorLayer;
|
| }
|
|
|
| - PaintLayer* parentLayer;
|
| - if (position == AbsolutePosition || position == FixedPosition) {
|
| - bool foundAncestorFirst;
|
| - parentLayer = layer->containingLayerForOutOfFlowPositioned(
|
| - ancestorLayer, &foundAncestorFirst);
|
| + PaintLayer* parentLayer = nullptr;
|
| + if (position == AbsolutePosition || position == FixedPosition ||
|
| + (layoutObject->isFloating() && layoutObject->parent() &&
|
| + !layoutObject->parent()->isLayoutBlockFlow())) {
|
| + bool foundAncestorFirst = false;
|
| + if (layoutObject->isFloating()) {
|
| + Optional<LayoutObject::AncestorSkipInfo> skipInfo;
|
| + if (ancestorLayer)
|
| + skipInfo.emplace(ancestorLayer->layoutObject());
|
| + if (auto* containingBlock = layoutObject->containingBlock(
|
| + ancestorLayer ? &*skipInfo : nullptr)) {
|
| + parentLayer = containingBlock->enclosingLayer();
|
| + foundAncestorFirst = ancestorLayer && skipInfo->ancestorSkipped();
|
| + }
|
| + } else {
|
| + parentLayer = layer->containingLayerForOutOfFlowPositioned(
|
| + ancestorLayer, &foundAncestorFirst);
|
| + }
|
|
|
| if (foundAncestorFirst) {
|
| // Found ancestorLayer before the container of the out-of-flow object, so
|
|
|