| Index: third_party/WebKit/Source/core/editing/VisibleUnits.cpp | 
| diff --git a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp | 
| index fc81732adfaf8acc405ae4f963d6ee809e21ae40..557660cf5633aad6329cc58e37d77d3aeee5ca59 100644 | 
| --- a/third_party/WebKit/Source/core/editing/VisibleUnits.cpp | 
| +++ b/third_party/WebKit/Source/core/editing/VisibleUnits.cpp | 
| @@ -977,90 +977,90 @@ InlineBoxPosition ComputeInlineBoxPosition(const PositionInFlatTree& position, | 
| position, affinity, primary_direction); | 
| } | 
|  | 
| -template <typename Strategy> | 
| -LayoutRect LocalCaretRectOfPositionTemplate( | 
| -    const PositionWithAffinityTemplate<Strategy>& position, | 
| -    LayoutObject*& layout_object) { | 
| -  if (position.IsNull()) { | 
| -    layout_object = nullptr; | 
| -    return LayoutRect(); | 
| -  } | 
| -  Node* node = position.AnchorNode(); | 
| +// TODO(editing-dev): Once we mark |LayoutObject::LocalCaretRect()| |const|, | 
| +// we should make this function to take |const LayoutObject&|. | 
| +static LocalCaretRect ComputeLocalCaretRect( | 
| +    LayoutObject* layout_object, | 
| +    const InlineBoxPosition box_position) { | 
| +  return LocalCaretRect( | 
| +      layout_object, layout_object->LocalCaretRect(box_position.inline_box, | 
| +                                                   box_position.offset_in_box)); | 
| +} | 
|  | 
| -  layout_object = node->GetLayoutObject(); | 
| +template <typename Strategy> | 
| +LocalCaretRect LocalCaretRectOfPositionTemplate( | 
| +    const PositionWithAffinityTemplate<Strategy>& position) { | 
| +  if (position.IsNull()) | 
| +    return LocalCaretRect(); | 
| +  Node* const node = position.AnchorNode(); | 
| +  LayoutObject* const layout_object = node->GetLayoutObject(); | 
| if (!layout_object) | 
| -    return LayoutRect(); | 
| +    return LocalCaretRect(); | 
|  | 
| -  InlineBoxPosition box_position = | 
| +  const InlineBoxPosition& box_position = | 
| ComputeInlineBoxPosition(position.GetPosition(), position.Affinity()); | 
|  | 
| -  if (box_position.inline_box) | 
| -    layout_object = LineLayoutAPIShim::LayoutObjectFrom( | 
| -        box_position.inline_box->GetLineLayoutItem()); | 
| - | 
| -  return layout_object->LocalCaretRect(box_position.inline_box, | 
| -                                       box_position.offset_in_box); | 
| +  if (box_position.inline_box) { | 
| +    return ComputeLocalCaretRect( | 
| +        LineLayoutAPIShim::LayoutObjectFrom( | 
| +            box_position.inline_box->GetLineLayoutItem()), | 
| +        box_position); | 
| +  } | 
| +  return ComputeLocalCaretRect(layout_object, box_position); | 
| } | 
|  | 
| // This function was added because the caret rect that is calculated by | 
| // using the line top value instead of the selection top. | 
| template <typename Strategy> | 
| -LayoutRect LocalSelectionRectOfPositionTemplate( | 
| -    const PositionWithAffinityTemplate<Strategy>& position, | 
| -    LayoutObject*& layout_object) { | 
| -  if (position.IsNull()) { | 
| -    layout_object = nullptr; | 
| -    return LayoutRect(); | 
| -  } | 
| -  Node* node = position.AnchorNode(); | 
| -  layout_object = node->GetLayoutObject(); | 
| -  if (!layout_object) | 
| -    return LayoutRect(); | 
| +LocalCaretRect LocalSelectionRectOfPositionTemplate( | 
| +    const PositionWithAffinityTemplate<Strategy>& position) { | 
| +  if (position.IsNull()) | 
| +    return LocalCaretRect(); | 
| +  Node* const node = position.AnchorNode(); | 
| +  if (!node->GetLayoutObject()) | 
| +    return LocalCaretRect(); | 
|  | 
| -  InlineBoxPosition box_position = | 
| +  const InlineBoxPosition& box_position = | 
| ComputeInlineBoxPosition(position.GetPosition(), position.Affinity()); | 
|  | 
| if (!box_position.inline_box) | 
| -    return LayoutRect(); | 
| +    return LocalCaretRect(); | 
|  | 
| -  layout_object = LineLayoutAPIShim::LayoutObjectFrom( | 
| +  LayoutObject* const layout_object = LineLayoutAPIShim::LayoutObjectFrom( | 
| box_position.inline_box->GetLineLayoutItem()); | 
|  | 
| -  LayoutRect rect = layout_object->LocalCaretRect(box_position.inline_box, | 
| -                                                  box_position.offset_in_box); | 
| +  const LayoutRect& rect = layout_object->LocalCaretRect( | 
| +      box_position.inline_box, box_position.offset_in_box); | 
|  | 
| if (rect.IsEmpty()) | 
| -    return rect; | 
| +    return LocalCaretRect(); | 
|  | 
| InlineBox* const box = box_position.inline_box; | 
| if (layout_object->Style()->IsHorizontalWritingMode()) { | 
| -    rect.SetY(box->Root().SelectionTop()); | 
| -    rect.SetHeight(box->Root().SelectionHeight()); | 
| -    return rect; | 
| +    return LocalCaretRect( | 
| +        layout_object, | 
| +        LayoutRect(LayoutPoint(rect.X(), box->Root().SelectionTop()), | 
| +                   LayoutSize(rect.Width(), box->Root().SelectionHeight()))); | 
| } | 
|  | 
| -  rect.SetX(box->Root().SelectionTop()); | 
| -  rect.SetWidth(box->Root().SelectionHeight()); | 
| -  return rect; | 
| +  return LocalCaretRect( | 
| +      layout_object, | 
| +      LayoutRect(LayoutPoint(box->Root().SelectionTop(), rect.Y()), | 
| +                 LayoutSize(box->Root().SelectionHeight(), rect.Height()))); | 
| } | 
|  | 
| -LayoutRect LocalCaretRectOfPosition(const PositionWithAffinity& position, | 
| -                                    LayoutObject*& layout_object) { | 
| -  return LocalCaretRectOfPositionTemplate<EditingStrategy>(position, | 
| -                                                           layout_object); | 
| +LocalCaretRect LocalCaretRectOfPosition(const PositionWithAffinity& position) { | 
| +  return LocalCaretRectOfPositionTemplate<EditingStrategy>(position); | 
| } | 
|  | 
| -LayoutRect LocalSelectionRectOfPosition(const PositionWithAffinity& position, | 
| -                                        LayoutObject*& layout_object) { | 
| -  return LocalSelectionRectOfPositionTemplate<EditingStrategy>(position, | 
| -                                                               layout_object); | 
| +static LocalCaretRect LocalSelectionRectOfPosition( | 
| +    const PositionWithAffinity& position) { | 
| +  return LocalSelectionRectOfPositionTemplate<EditingStrategy>(position); | 
| } | 
|  | 
| -LayoutRect LocalCaretRectOfPosition( | 
| -    const PositionInFlatTreeWithAffinity& position, | 
| -    LayoutObject*& layout_object) { | 
| -  return LocalCaretRectOfPositionTemplate<EditingInFlatTreeStrategy>( | 
| -      position, layout_object); | 
| +LocalCaretRect LocalCaretRectOfPosition( | 
| +    const PositionInFlatTreeWithAffinity& position) { | 
| +  return LocalCaretRectOfPositionTemplate<EditingInFlatTreeStrategy>(position); | 
| } | 
|  | 
| static LayoutUnit BoundingBoxLogicalHeight(LayoutObject* o, | 
| @@ -1200,20 +1200,23 @@ static bool InRenderedText(const PositionTemplate<Strategy>& position) { | 
| return false; | 
| } | 
|  | 
| +static FloatQuad LocalToAbsoluteQuadOf(const LocalCaretRect& caret_rect) { | 
| +  return caret_rect.layout_object->LocalToAbsoluteQuad( | 
| +      FloatRect(caret_rect.rect)); | 
| +} | 
| + | 
| bool RendersInDifferentPosition(const Position& position1, | 
| const Position& position2) { | 
| if (position1.IsNull() || position2.IsNull()) | 
| return false; | 
| -  LayoutObject* layout_object1; | 
| -  const LayoutRect& rect1 = | 
| -      LocalCaretRectOfPosition(PositionWithAffinity(position1), layout_object1); | 
| -  LayoutObject* layout_object2; | 
| -  const LayoutRect& rect2 = | 
| -      LocalCaretRectOfPosition(PositionWithAffinity(position2), layout_object2); | 
| -  if (!layout_object1 || !layout_object2) | 
| -    return layout_object1 != layout_object2; | 
| -  return layout_object1->LocalToAbsoluteQuad(FloatRect(rect1)) != | 
| -         layout_object2->LocalToAbsoluteQuad(FloatRect(rect2)); | 
| +  const LocalCaretRect& caret_rect1 = | 
| +      LocalCaretRectOfPosition(PositionWithAffinity(position1)); | 
| +  const LocalCaretRect& caret_rect2 = | 
| +      LocalCaretRectOfPosition(PositionWithAffinity(position2)); | 
| +  if (!caret_rect1.layout_object || !caret_rect2.layout_object) | 
| +    return caret_rect1.layout_object != caret_rect2.layout_object; | 
| +  return LocalToAbsoluteQuadOf(caret_rect1) != | 
| +         LocalToAbsoluteQuadOf(caret_rect2); | 
| } | 
|  | 
| static bool IsVisuallyEmpty(const LayoutObject* layout) { | 
| @@ -1725,14 +1728,11 @@ template <typename Strategy> | 
| static IntRect AbsoluteCaretBoundsOfAlgorithm( | 
| const VisiblePositionTemplate<Strategy>& visible_position) { | 
| DCHECK(visible_position.IsValid()) << visible_position; | 
| -  LayoutObject* layout_object; | 
| -  LayoutRect local_rect = LocalCaretRectOfPosition( | 
| -      visible_position.ToPositionWithAffinity(), layout_object); | 
| -  if (local_rect.IsEmpty() || !layout_object) | 
| +  const LocalCaretRect& caret_rect = | 
| +      LocalCaretRectOfPosition(visible_position.ToPositionWithAffinity()); | 
| +  if (caret_rect.IsEmpty()) | 
| return IntRect(); | 
| - | 
| -  return layout_object->LocalToAbsoluteQuad(FloatRect(local_rect)) | 
| -      .EnclosingBoundingBox(); | 
| +  return LocalToAbsoluteQuadOf(caret_rect).EnclosingBoundingBox(); | 
| } | 
|  | 
| IntRect AbsoluteCaretBoundsOf(const VisiblePosition& visible_position) { | 
| @@ -1743,14 +1743,11 @@ template <typename Strategy> | 
| static IntRect AbsoluteSelectionBoundsOfAlgorithm( | 
| const VisiblePositionTemplate<Strategy>& visible_position) { | 
| DCHECK(visible_position.IsValid()) << visible_position; | 
| -  LayoutObject* layout_object; | 
| -  LayoutRect local_rect = LocalSelectionRectOfPosition( | 
| -      visible_position.ToPositionWithAffinity(), layout_object); | 
| -  if (local_rect.IsEmpty() || !layout_object) | 
| +  const LocalCaretRect& caret_rect = | 
| +      LocalSelectionRectOfPosition(visible_position.ToPositionWithAffinity()); | 
| +  if (caret_rect.IsEmpty()) | 
| return IntRect(); | 
| - | 
| -  return layout_object->LocalToAbsoluteQuad(FloatRect(local_rect)) | 
| -      .EnclosingBoundingBox(); | 
| +  return LocalToAbsoluteQuadOf(caret_rect).EnclosingBoundingBox(); | 
| } | 
|  | 
| IntRect AbsoluteSelectionBoundsOf(const VisiblePosition& visible_position) { | 
|  |