| Index: Source/core/layout/LayoutBoxModelObject.cpp
 | 
| diff --git a/Source/core/layout/LayoutBoxModelObject.cpp b/Source/core/layout/LayoutBoxModelObject.cpp
 | 
| index 0ede20bb48886f0899303a9591bdc06d1a5b0dd6..6beec09b373f5b2846152a59bf4fedb5b843eb08 100644
 | 
| --- a/Source/core/layout/LayoutBoxModelObject.cpp
 | 
| +++ b/Source/core/layout/LayoutBoxModelObject.cpp
 | 
| @@ -849,6 +849,14 @@ LayoutRect LayoutBoxModelObject::localCaretRectForEmptyElement(LayoutUnit width,
 | 
|      return currentStyle.isHorizontalWritingMode() ? LayoutRect(x, y, caretWidth(), height) : LayoutRect(y, x, height, caretWidth());
 | 
|  }
 | 
|  
 | 
| +LayoutSize LayoutBoxModelObject::offsetFromContainer(const LayoutObject* o) const
 | 
| +{
 | 
| +    LayoutSize offset;
 | 
| +    if (isRelPositioned())
 | 
| +        offset += offsetForInFlowPosition();
 | 
| +    return offset + LayoutObject::offsetFromContainer(o);
 | 
| +}
 | 
| +
 | 
|  void LayoutBoxModelObject::mapAbsoluteToLocalPoint(MapCoordinatesFlags mode, TransformState& transformState) const
 | 
|  {
 | 
|      LayoutObject* o = container();
 | 
| @@ -857,20 +865,7 @@ void LayoutBoxModelObject::mapAbsoluteToLocalPoint(MapCoordinatesFlags mode, Tra
 | 
|  
 | 
|      o->mapAbsoluteToLocalPoint(mode, transformState);
 | 
|  
 | 
| -    LayoutSize containerOffset = offsetFromContainer(o, LayoutPoint());
 | 
| -
 | 
| -    if (o->isLayoutFlowThread()) {
 | 
| -        // Descending into a flow thread. Convert to the local coordinate space, i.e. flow thread coordinates.
 | 
| -        const LayoutFlowThread* flowThread = toLayoutFlowThread(o);
 | 
| -        LayoutPoint visualPoint = LayoutPoint(transformState.mappedPoint());
 | 
| -        transformState.move(visualPoint - flowThread->visualPointToFlowThreadPoint(visualPoint));
 | 
| -        // |containerOffset| is also in visual coordinates. Convert to flow thread coordinates.
 | 
| -        // TODO(mstensho): Wouldn't it be better add a parameter to instruct offsetFromContainer()
 | 
| -        // to return flowthread coordinates in the first place? We're effectively performing two
 | 
| -        // conversions here, when in fact none is needed.
 | 
| -        containerOffset = toLayoutSize(flowThread->visualPointToFlowThreadPoint(toLayoutPoint(containerOffset)));
 | 
| -    }
 | 
| -
 | 
| +    LayoutSize containerOffset = offsetFromContainer(o);
 | 
|      bool preserve3D = mode & UseTransforms && (o->style()->preserves3D() || style()->preserves3D());
 | 
|      if (mode & UseTransforms && shouldUseTransformFromContainer(o)) {
 | 
|          TransformationMatrix t;
 | 
| @@ -901,8 +896,9 @@ const LayoutObject* LayoutBoxModelObject::pushMappingToContainer(const LayoutBox
 | 
|          adjustmentForSkippedAncestor = -ancestorToStopAt->offsetFromAncestorContainer(container);
 | 
|      }
 | 
|  
 | 
| -    bool offsetDependsOnPoint = false;
 | 
| -    LayoutSize containerOffset = offsetFromContainer(container, LayoutPoint(), &offsetDependsOnPoint);
 | 
| +    bool offsetDependsOnPoint = container->isBox() && (container->style()->isFlippedBlocksWritingMode() || container->isLayoutFlowThread());
 | 
| +    LayoutSize containerOffset = offsetFromContainer(container);
 | 
| +    containerOffset += container->columnOffset(toLayoutPoint(containerOffset));
 | 
|  
 | 
|      bool preserve3D = container->style()->preserves3D() || style()->preserves3D();
 | 
|      if (shouldUseTransformFromContainer(container)) {
 | 
| 
 |