Diff
Modified: trunk/Source/WebCore/ChangeLog (176386 => 176387)
--- trunk/Source/WebCore/ChangeLog 2014-11-20 08:33:07 UTC (rev 176386)
+++ trunk/Source/WebCore/ChangeLog 2014-11-20 08:36:11 UTC (rev 176387)
@@ -1,3 +1,30 @@
+2014-11-20 Andreas Kling <[email protected]>
+
+ Caret renderer is always a RenderBlock.
+ <https://webkit.org/b/138912>
+
+ Reviewed by Chris Dumez.
+
+ Tighten typing in the code that finds and deals with the renderer
+ used to paint the caret (it's always a RenderBlock.)
+
+ * editing/FrameSelection.cpp:
+ (WebCore::CaretBase::updateCaretRect):
+ (WebCore::FrameSelection::caretRendererWithoutUpdatingLayout):
+ (WebCore::DragCaretController::caretRenderer):
+ (WebCore::repaintCaretForLocalRect):
+ (WebCore::CaretBase::paintCaret):
+ * editing/FrameSelection.h:
+ * editing/VisiblePosition.cpp:
+ (WebCore::VisiblePosition::absoluteCaretBounds):
+ * editing/htmlediting.cpp:
+ (WebCore::rendererForCaretPainting):
+ (WebCore::localCaretRectInRendererForCaretPainting):
+ (WebCore::absoluteBoundsForLocalCaretRect):
+ * editing/htmlediting.h:
+ * rendering/RenderBlock.cpp:
+ (WebCore::RenderBlock::paintCaret):
+
2014-11-20 Antti Koivisto <[email protected]>
REGRESSION (r172854): Web Viewer in FileMaker does not render a Base64 encoded animated-GIF
Modified: trunk/Source/WebCore/editing/FrameSelection.cpp (176386 => 176387)
--- trunk/Source/WebCore/editing/FrameSelection.cpp 2014-11-20 08:33:07 UTC (rev 176386)
+++ trunk/Source/WebCore/editing/FrameSelection.cpp 2014-11-20 08:36:11 UTC (rev 176387)
@@ -1327,17 +1327,17 @@
{
document->updateLayoutIgnorePendingStylesheets();
m_caretRectNeedsUpdate = false;
- RenderObject* renderer;
+ RenderBlock* renderer;
m_caretLocalRect = localCaretRectInRendererForCaretPainting(caretPosition, renderer);
return !m_caretLocalRect.isEmpty();
}
-RenderObject* FrameSelection::caretRendererWithoutUpdatingLayout() const
+RenderBlock* FrameSelection::caretRendererWithoutUpdatingLayout() const
{
return rendererForCaretPainting(m_selection.start().deprecatedNode());
}
-RenderObject* DragCaretController::caretRenderer() const
+RenderBlock* DragCaretController::caretRenderer() const
{
return rendererForCaretPainting(m_position.deepEquivalent().deprecatedNode());
}
@@ -1358,11 +1358,8 @@
static void repaintCaretForLocalRect(Node* node, const LayoutRect& rect)
{
- RenderObject* caretPainter = rendererForCaretPainting(node);
- if (!caretPainter)
- return;
-
- caretPainter->repaintRectangle(rect);
+ if (auto* caretPainter = rendererForCaretPainting(node))
+ caretPainter->repaintRectangle(rect);
}
bool FrameSelection::recomputeCaretRect()
@@ -1481,9 +1478,8 @@
return;
LayoutRect drawingRect = localCaretRectWithoutUpdate();
- RenderObject* renderer = rendererForCaretPainting(node);
- if (is<RenderBox>(renderer))
- downcast<RenderBox>(*renderer).flipForWritingMode(drawingRect);
+ if (auto* renderer = rendererForCaretPainting(node))
+ renderer->flipForWritingMode(drawingRect);
drawingRect.moveBy(roundedIntPoint(paintOffset));
LayoutRect caret = intersection(drawingRect, clipRect);
if (caret.isEmpty())
Modified: trunk/Source/WebCore/editing/FrameSelection.h (176386 => 176387)
--- trunk/Source/WebCore/editing/FrameSelection.h 2014-11-20 08:33:07 UTC (rev 176386)
+++ trunk/Source/WebCore/editing/FrameSelection.h 2014-11-20 08:36:11 UTC (rev 176387)
@@ -46,6 +46,7 @@
class GraphicsContext;
class HTMLFormElement;
class MutableStyleProperties;
+class RenderBlock;
class RenderObject;
class RenderView;
class Settings;
@@ -92,7 +93,7 @@
public:
DragCaretController();
- RenderObject* caretRenderer() const;
+ RenderBlock* caretRenderer() const;
void paintDragCaret(Frame*, GraphicsContext*, const LayoutPoint&, const LayoutRect& clipRect) const;
bool isContentEditable() const { return m_position.rootEditableElement(); }
@@ -169,7 +170,7 @@
void setExtent(const Position&, EAffinity, EUserTriggered = NotUserTriggered);
// Return the renderer that is responsible for painting the caret (in the selection start node)
- RenderObject* caretRendererWithoutUpdatingLayout() const;
+ RenderBlock* caretRendererWithoutUpdatingLayout() const;
// Bounds of (possibly transformed) caret in absolute coords
WEBCORE_EXPORT IntRect absoluteCaretBounds();
Modified: trunk/Source/WebCore/editing/VisiblePosition.cpp (176386 => 176387)
--- trunk/Source/WebCore/editing/VisiblePosition.cpp 2014-11-20 08:33:07 UTC (rev 176386)
+++ trunk/Source/WebCore/editing/VisiblePosition.cpp 2014-11-20 08:36:11 UTC (rev 176387)
@@ -618,7 +618,7 @@
IntRect VisiblePosition::absoluteCaretBounds() const
{
- RenderObject* renderer = nullptr;
+ RenderBlock* renderer = nullptr;
LayoutRect localRect = localCaretRectInRendererForCaretPainting(*this, renderer);
return absoluteBoundsForLocalCaretRect(renderer, localRect);
}
Modified: trunk/Source/WebCore/editing/htmlediting.cpp (176386 => 176387)
--- trunk/Source/WebCore/editing/htmlediting.cpp 2014-11-20 08:33:07 UTC (rev 176386)
+++ trunk/Source/WebCore/editing/htmlediting.cpp 2014-11-20 08:36:11 UTC (rev 176387)
@@ -1263,7 +1263,7 @@
return node && !isRenderedTable(node) && !editingIgnoresContent(node);
}
-RenderObject* rendererForCaretPainting(Node* node)
+RenderBlock* rendererForCaretPainting(Node* node)
{
if (!node)
return nullptr;
@@ -1273,11 +1273,11 @@
return nullptr;
// If caretNode is a block and caret is inside it, then caret should be painted by that block.
- bool paintedByBlock = renderer->isRenderBlockFlow() && caretRendersInsideNode(node);
- return paintedByBlock ? renderer : renderer->containingBlock();
+ bool paintedByBlock = is<RenderBlockFlow>(*renderer) && caretRendersInsideNode(node);
+ return paintedByBlock ? downcast<RenderBlock>(renderer) : renderer->containingBlock();
}
-LayoutRect localCaretRectInRendererForCaretPainting(const VisiblePosition& caretPosition, RenderObject*& caretPainter)
+LayoutRect localCaretRectInRendererForCaretPainting(const VisiblePosition& caretPosition, RenderBlock*& caretPainter)
{
if (caretPosition.isNull())
return LayoutRect();
@@ -1304,14 +1304,13 @@
return localRect;
}
-IntRect absoluteBoundsForLocalCaretRect(RenderObject* rendererForCaretPainting, const LayoutRect& rect)
+IntRect absoluteBoundsForLocalCaretRect(RenderBlock* rendererForCaretPainting, const LayoutRect& rect)
{
if (!rendererForCaretPainting || rect.isEmpty())
return IntRect();
LayoutRect localRect(rect);
- if (is<RenderBox>(*rendererForCaretPainting))
- downcast<RenderBox>(*rendererForCaretPainting).flipForWritingMode(localRect);
+ rendererForCaretPainting->flipForWritingMode(localRect);
return rendererForCaretPainting->localToAbsoluteQuad(FloatRect(localRect)).enclosingBoundingBox();
}
Modified: trunk/Source/WebCore/editing/htmlediting.h (176386 => 176387)
--- trunk/Source/WebCore/editing/htmlediting.h 2014-11-20 08:33:07 UTC (rev 176386)
+++ trunk/Source/WebCore/editing/htmlediting.h 2014-11-20 08:36:11 UTC (rev 176387)
@@ -41,6 +41,7 @@
class Node;
class Position;
class Range;
+class RenderBlock;
class VisiblePosition;
class VisibleSelection;
@@ -259,9 +260,9 @@
// Miscellaaneous functions that for caret rendering
-RenderObject* rendererForCaretPainting(Node*);
-LayoutRect localCaretRectInRendererForCaretPainting(const VisiblePosition&, RenderObject*&);
-IntRect absoluteBoundsForLocalCaretRect(RenderObject* rendererForCaretPainting, const LayoutRect&);
+RenderBlock* rendererForCaretPainting(Node*);
+LayoutRect localCaretRectInRendererForCaretPainting(const VisiblePosition&, RenderBlock*&);
+IntRect absoluteBoundsForLocalCaretRect(RenderBlock* rendererForCaretPainting, const LayoutRect&);
}
Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (176386 => 176387)
--- trunk/Source/WebCore/rendering/RenderBlock.cpp 2014-11-20 08:33:07 UTC (rev 176386)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp 2014-11-20 08:36:11 UTC (rev 176387)
@@ -1524,7 +1524,7 @@
{
// Paint the caret if the FrameSelection says so or if caret browsing is enabled
bool caretBrowsing = frame().settings().caretBrowsingEnabled();
- RenderObject* caretPainter;
+ RenderBlock* caretPainter;
bool isContentEditable;
if (type == CursorCaret) {
caretPainter = frame().selection().caretRendererWithoutUpdatingLayout();