Chromium Code Reviews| Index: third_party/WebKit/Source/core/editing/CaretBase.cpp |
| diff --git a/third_party/WebKit/Source/core/editing/CaretBase.cpp b/third_party/WebKit/Source/core/editing/CaretBase.cpp |
| index 07e9ed7ed1df99b069ee9a4c4d4110394684be87..9b357d8158a9c5be01f14c43842b65fc7e363c67 100644 |
| --- a/third_party/WebKit/Source/core/editing/CaretBase.cpp |
| +++ b/third_party/WebKit/Source/core/editing/CaretBase.cpp |
| @@ -47,10 +47,6 @@ CaretBase::~CaretBase() = default; |
| DEFINE_TRACE(CaretBase) {} |
| -void CaretBase::clearCaretRect() { |
| - m_caretLocalRect = LayoutRect(); |
| -} |
| - |
| static inline bool caretRendersInsideNode(Node* node) { |
| return node && !isDisplayInsideTable(node) && !editingIgnoresContent(*node); |
| } |
| @@ -77,53 +73,50 @@ LayoutBlock* CaretBase::caretLayoutObject(Node* node) { |
| : layoutObject->containingBlock(); |
| } |
| -static void mapCaretRectToCaretPainter(LayoutItem caretLayoutItem, |
| - LayoutBlockItem caretPainterItem, |
| - LayoutRect& caretRect) { |
| +static LayoutRect mapCaretRectToCaretPainter( |
| + LayoutItem caretLayoutItem, |
| + LayoutBlockItem caretPainterItem, |
| + const LayoutRect& passedCaretRect) { |
| // FIXME: This shouldn't be called on un-rooted subtrees. |
| // FIXME: This should probably just use mapLocalToAncestor. |
| // Compute an offset between the caretLayoutItem and the caretPainterItem. |
| DCHECK(caretLayoutItem.isDescendantOf(caretPainterItem)); |
| - bool unrooted = false; |
| + LayoutRect caretRect = passedCaretRect; |
| while (caretLayoutItem != caretPainterItem) { |
| LayoutItem containerItem = caretLayoutItem.container(); |
| - if (containerItem.isNull()) { |
| - unrooted = true; |
| - break; |
| - } |
| + if (containerItem.isNull()) |
| + return LayoutRect(); |
| caretRect.move(caretLayoutItem.offsetFromContainer(containerItem)); |
| caretLayoutItem = containerItem; |
| } |
| - |
| - if (unrooted) |
| - caretRect = LayoutRect(); |
| + return caretRect; |
| } |
| -void CaretBase::updateCaretRect(const PositionWithAffinity& caretPosition) { |
| - m_caretLocalRect = LayoutRect(); |
| - |
| +LayoutRect CaretBase::computeCaretRect( |
| + const PositionWithAffinity& caretPosition) { |
| if (caretPosition.isNull()) |
| - return; |
| + return LayoutRect(); |
| DCHECK(caretPosition.anchorNode()->layoutObject()); |
| // First compute a rect local to the layoutObject at the selection start. |
| LayoutObject* layoutObject; |
| - m_caretLocalRect = localCaretRectOfPosition(caretPosition, layoutObject); |
| + LayoutRect caretLocalRect = |
|
yoichio
2017/01/12 09:22:22
nit: const LayoutRect
|
| + localCaretRectOfPosition(caretPosition, layoutObject); |
| // Get the layoutObject that will be responsible for painting the caret |
| // (which is either the layoutObject we just found, or one of its containers). |
| LayoutBlockItem caretPainterItem = |
| LayoutBlockItem(caretLayoutObject(caretPosition.anchorNode())); |
| - mapCaretRectToCaretPainter(LayoutItem(layoutObject), caretPainterItem, |
| - m_caretLocalRect); |
| + return mapCaretRectToCaretPainter(LayoutItem(layoutObject), caretPainterItem, |
| + caretLocalRect); |
| } |
| -void CaretBase::updateCaretRect(const VisiblePosition& caretPosition) { |
| - updateCaretRect(caretPosition.toPositionWithAffinity()); |
| +LayoutRect CaretBase::computeCaretRect(const VisiblePosition& caretPosition) { |
| + return computeCaretRect(caretPosition.toPositionWithAffinity()); |
| } |
| IntRect CaretBase::absoluteBoundsForLocalRect(Node* node, |
| @@ -168,21 +161,24 @@ bool CaretBase::shouldRepaintCaret(Node& node) const { |
| (node.parentNode() && hasEditableStyle(*node.parentNode())); |
| } |
| -void CaretBase::invalidateCaretRect(Node* node) { |
| +void CaretBase::invalidateCaretRect(Node* node, |
| + const LayoutRect& caretLocalRect) { |
| node->document().updateStyleAndLayoutTree(); |
| if (hasEditableStyle(*node)) |
| - invalidateLocalCaretRect(node, localCaretRectWithoutUpdate()); |
| + invalidateLocalCaretRect(node, caretLocalRect); |
| } |
| void CaretBase::paintCaret(Node* node, |
| GraphicsContext& context, |
| + const DisplayItemClient& client, |
| + const LayoutRect& caretLocalRect, |
| const LayoutPoint& paintOffset, |
| - DisplayItem::Type displayItemType) const { |
| - if (DrawingRecorder::useCachedDrawingIfPossible(context, *this, |
| + DisplayItem::Type displayItemType) { |
| + if (DrawingRecorder::useCachedDrawingIfPossible(context, client, |
| displayItemType)) |
| return; |
| - LayoutRect drawingRect = localCaretRectWithoutUpdate(); |
| + LayoutRect drawingRect = caretLocalRect; |
| if (LayoutBlock* layoutObject = caretLayoutObject(node)) |
| layoutObject->flipForWritingMode(drawingRect); |
| drawingRect.moveBy(paintOffset); |
| @@ -190,7 +186,7 @@ void CaretBase::paintCaret(Node* node, |
| const Color caretColor = |
| node->layoutObject()->resolveColor(CSSPropertyCaretColor); |
| IntRect paintRect = pixelSnappedIntRect(drawingRect); |
| - DrawingRecorder drawingRecorder(context, *this, DisplayItem::kCaret, |
| + DrawingRecorder drawingRecorder(context, client, DisplayItem::kCaret, |
| paintRect); |
| context.fillRect(paintRect, caretColor); |
| } |