| Index: Source/core/paint/BlockPainter.cpp
|
| diff --git a/Source/core/paint/BlockPainter.cpp b/Source/core/paint/BlockPainter.cpp
|
| index b14abc26e445cac2cb6b588a480afbd2942c75fd..09c36e7375ae38247ce0629c8f85c77b812bdb6b 100644
|
| --- a/Source/core/paint/BlockPainter.cpp
|
| +++ b/Source/core/paint/BlockPainter.cpp
|
| @@ -16,6 +16,7 @@
|
| #include "core/paint/InlinePainter.h"
|
| #include "core/paint/LayoutObjectDrawingRecorder.h"
|
| #include "core/paint/LineBoxListPainter.h"
|
| +#include "core/paint/PaintDataCache.h"
|
| #include "core/paint/PaintInfo.h"
|
| #include "core/paint/ScopeRecorder.h"
|
| #include "core/paint/ScrollRecorder.h"
|
| @@ -53,7 +54,10 @@ void BlockPainter::paint(const PaintInfo& paintInfo, const LayoutPoint& paintOff
|
| // There are some cases where not all clipped visual overflow is accounted for.
|
| // FIXME: reduce the number of such cases.
|
| ContentsClipBehavior contentsClipBehavior = ForceContentsClip;
|
| - if (m_layoutBlock.hasOverflowClip() && !m_layoutBlock.hasControlClip() && !(m_layoutBlock.shouldPaintSelectionGaps() && originalPhase == PaintPhaseForeground) && !hasCaret())
|
| + if (m_layoutBlock.hasOverflowClip()
|
| + && !m_layoutBlock.hasControlClip()
|
| + && !(m_layoutBlock.shouldPaintSelectionGaps() && originalPhase == PaintPhaseForeground)
|
| + && !hasCaret(paintInfo.paintDataCache()))
|
| contentsClipBehavior = SkipContentsClipIfPossible;
|
|
|
| if (localPaintInfo.phase == PaintPhaseOutline) {
|
| @@ -224,42 +228,26 @@ void BlockPainter::paintObject(const PaintInfo& paintInfo, const LayoutPoint& pa
|
|
|
| // If the caret's node's layout object's containing block is this block, and the paint action is PaintPhaseForeground,
|
| // then paint the caret.
|
| - if (paintPhase == PaintPhaseForeground && hasCaret()) {
|
| + if (paintPhase == PaintPhaseForeground && hasCaret(paintInfo.paintDataCache())) {
|
| LayoutObjectDrawingRecorder recorder(*paintInfo.context, m_layoutBlock, DisplayItem::Caret, visualOverflowRectWithPaintOffset(m_layoutBlock, paintOffset));
|
| if (!recorder.canUseCachedDrawing())
|
| paintCarets(paintInfo, paintOffset);
|
| }
|
| }
|
|
|
| -static inline bool caretBrowsingEnabled(const Frame* frame)
|
| -{
|
| - Settings* settings = frame->settings();
|
| - return settings && settings->caretBrowsingEnabled();
|
| -}
|
| -
|
| -static inline bool hasCursorCaret(const FrameSelection& selection, const LayoutBlock* block, bool caretBrowsing)
|
| -{
|
| - return selection.caretLayoutObject() == block && (selection.hasEditableStyle() || caretBrowsing);
|
| -}
|
| -
|
| -static inline bool hasDragCaret(const DragCaretController& dragCaretController, const LayoutBlock* block, bool caretBrowsing)
|
| -{
|
| - return dragCaretController.caretLayoutObject() == block && (dragCaretController.isContentEditable() || caretBrowsing);
|
| -}
|
| -
|
| void BlockPainter::paintCarets(const PaintInfo& paintInfo, const LayoutPoint& paintOffset)
|
| {
|
| - bool caretBrowsing = caretBrowsingEnabled(m_layoutBlock.frame());
|
| -
|
| - FrameSelection& selection = m_layoutBlock.frame()->selection();
|
| - if (hasCursorCaret(selection, &m_layoutBlock, caretBrowsing)) {
|
| - selection.paintCaret(paintInfo.context, paintOffset, LayoutRect(paintInfo.rect));
|
| - }
|
| -
|
| - DragCaretController& dragCaretController = m_layoutBlock.frame()->page()->dragCaretController();
|
| - if (hasDragCaret(dragCaretController, &m_layoutBlock, caretBrowsing)) {
|
| - dragCaretController.paintDragCaret(m_layoutBlock.frame(), paintInfo.context, paintOffset, LayoutRect(paintInfo.rect));
|
| - }
|
| + bool hasCursorCaret = false;
|
| + bool hasDragCaret = false;
|
| + PaintDataCache localCache;
|
| + PaintDataCache* paintDataCache = paintInfo.paintDataCache() ? paintInfo.paintDataCache() : &localCache;
|
| + paintDataCache->getLayoutBlockCarets(m_layoutBlock, &hasCursorCaret, &hasDragCaret);
|
| + LocalFrame* frame = m_layoutBlock.frame();
|
| +
|
| + if (hasCursorCaret)
|
| + frame->selection().paintCaret(paintInfo.context, paintOffset, LayoutRect(paintInfo.rect));
|
| + if (hasDragCaret)
|
| + frame->page()->dragCaretController().paintDragCaret(frame, paintInfo.context, paintOffset, LayoutRect(paintInfo.rect));
|
| }
|
|
|
| LayoutRect BlockPainter::overflowRectForPaintRejection() const
|
| @@ -273,11 +261,11 @@ LayoutRect BlockPainter::overflowRectForPaintRejection() const
|
| return overflowRect;
|
| }
|
|
|
| -bool BlockPainter::hasCaret() const
|
| +bool BlockPainter::hasCaret(PaintDataCache* paintDataCache) const
|
| {
|
| - bool caretBrowsing = caretBrowsingEnabled(m_layoutBlock.frame());
|
| - return hasCursorCaret(m_layoutBlock.frame()->selection(), &m_layoutBlock, caretBrowsing)
|
| - || hasDragCaret(m_layoutBlock.frame()->page()->dragCaretController(), &m_layoutBlock, caretBrowsing);
|
| + if (paintDataCache)
|
| + return paintDataCache->layoutBlockHasCaret(m_layoutBlock);
|
| + return PaintDataCache().layoutBlockHasCaret(m_layoutBlock);
|
| }
|
|
|
| void BlockPainter::paintContents(const PaintInfo& paintInfo, const LayoutPoint& paintOffset)
|
|
|