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) |