| Index: Source/core/editing/Caret.cpp
|
| diff --git a/Source/core/editing/Caret.cpp b/Source/core/editing/Caret.cpp
|
| index 2b3c1d6ccf2ebb25d5d785e3293dcadc09b02066..fb7e9c47681ae4186ffce7369740fa3274d5db3e 100644
|
| --- a/Source/core/editing/Caret.cpp
|
| +++ b/Source/core/editing/Caret.cpp
|
| @@ -179,6 +179,18 @@ IntRect CaretBase::absoluteBoundsForLocalRect(Node* node, const LayoutRect& rect
|
| return caretPainter->localToAbsoluteQuad(FloatRect(localRect)).enclosingBoundingBox();
|
| }
|
|
|
| +void CaretBase::updateDirectionPointer(const RenderObject* renderObject, LayoutRect& rect)
|
| +{
|
| + if (!renderObject)
|
| + return;
|
| +
|
| + // Extra rect are drawn, need to refresh more area.
|
| + TextDirection containerDirection = renderObject->style()->direction();
|
| + rect.setWidth(rect.width() + LayoutUnit(2));
|
| + if (containerDirection == RTL)
|
| + rect.setX(rect.x() - LayoutUnit(2));
|
| +}
|
| +
|
| void CaretBase::repaintCaretForLocalRect(Node* node, const LayoutRect& rect)
|
| {
|
| RenderObject* caretPainter = caretRenderer(node);
|
| @@ -190,6 +202,7 @@ void CaretBase::repaintCaretForLocalRect(Node* node, const LayoutRect& rect)
|
| LayoutRect inflatedRect = rect;
|
| inflatedRect.inflate(1);
|
|
|
| + updateDirectionPointer(caretPainter, inflatedRect);
|
| caretPainter->repaintRectangle(inflatedRect);
|
| }
|
|
|
| @@ -223,8 +236,11 @@ void CaretBase::invalidateCaretRect(Node* node, bool caretRectChanged)
|
| return;
|
|
|
| if (RenderView* view = node->document().renderView()) {
|
| - if (shouldRepaintCaret(view, node->isContentEditable(Node::UserSelectAllIsAlwaysNonEditable)))
|
| - repaintCaretForLocalRect(node, localCaretRectWithoutUpdate());
|
| + if (shouldRepaintCaret(view, node->isContentEditable(Node::UserSelectAllIsAlwaysNonEditable))) {
|
| + LayoutRect drawingRect = localCaretRectWithoutUpdate();
|
| + updateDirectionPointer(caretRenderer(node), drawingRect);
|
| + repaintCaretForLocalRect(node, drawingRect);
|
| + }
|
| }
|
| }
|
|
|
| @@ -242,6 +258,18 @@ void CaretBase::paintCaret(Node* node, GraphicsContext* context, const LayoutPoi
|
| if (caret.isEmpty())
|
| return;
|
|
|
| + TextDirection containerDirection = toRenderBoxModelObject(renderer)->style()->direction();
|
| + LayoutRect directionPointerCaret = caret;
|
| +
|
| + // Drawing different Caret which shows editing style similar to IE.
|
| + if (containerDirection == LTR)
|
| + directionPointerCaret.setX(directionPointerCaret.x() + 1);
|
| + else
|
| + directionPointerCaret.setX(directionPointerCaret.x() - 2);
|
| +
|
| + directionPointerCaret.setWidth(LayoutUnit(2));
|
| + directionPointerCaret.setHeight(LayoutUnit(1));
|
| +
|
| Color caretColor = Color::black;
|
|
|
| Element* element;
|
| @@ -254,6 +282,14 @@ void CaretBase::paintCaret(Node* node, GraphicsContext* context, const LayoutPoi
|
| caretColor = element->renderer()->resolveColor(CSSPropertyColor);
|
|
|
| context->fillRect(caret, caretColor);
|
| + context->fillRect(directionPointerCaret, caretColor);
|
| +
|
| + // Update directionPointerCaret points and lets draw one more small rect to match IE.
|
| + directionPointerCaret.setY(caret.y() + LayoutUnit(1));
|
| + directionPointerCaret.setWidth(LayoutUnit(1));
|
| + if (containerDirection == RTL)
|
| + directionPointerCaret.setX(directionPointerCaret.x() + 1);
|
| + context->fillRect(directionPointerCaret, caretColor);
|
| }
|
|
|
| void DragCaretController::paintDragCaret(LocalFrame* frame, GraphicsContext* p, const LayoutPoint& paintOffset, const LayoutRect& clipRect) const
|
|
|