[CSS Parser] Unprefix -webkit-writing-mode
[WebKit-https.git] / Source / WebCore / rendering / RenderLineBreak.cpp
index 4e5c64a..9d77038 100644 (file)
@@ -30,6 +30,7 @@
 #include "RenderBlock.h"
 #include "RenderView.h"
 #include "RootInlineBox.h"
+#include "SimpleLineLayoutFunctions.h"
 #include "VisiblePosition.h"
 
 #if PLATFORM(IOS)
@@ -40,8 +41,22 @@ namespace WebCore {
 
 static const int invalidLineHeight = -1;
 
-RenderLineBreak::RenderLineBreak(HTMLElement& element, Ref<RenderStyle>&& style)
-    : RenderBoxModelObject(element, WTF::move(style), 0)
+static const SimpleLineLayout::Layout* simpleLineLayout(const RenderLineBreak& renderer)
+{
+    if (!is<RenderBlockFlow>(*renderer.parent()))
+        return nullptr;
+    return downcast<RenderBlockFlow>(*renderer.parent()).simpleLineLayout();
+}
+
+static void ensureLineBoxes(const RenderLineBreak& renderer)
+{
+    if (!is<RenderBlockFlow>(*renderer.parent()))
+        return;
+    downcast<RenderBlockFlow>(*renderer.parent()).ensureLineBoxes();
+}
+
+RenderLineBreak::RenderLineBreak(HTMLElement& element, RenderStyle&& style)
+    : RenderBoxModelObject(element, WTFMove(style), 0)
     , m_inlineBoxWrapper(nullptr)
     , m_cachedLineHeight(invalidLineHeight)
     , m_isWBR(is<HTMLWBRElement>(element))
@@ -56,7 +71,7 @@ RenderLineBreak::~RenderLineBreak()
 
 LayoutUnit RenderLineBreak::lineHeight(bool firstLine, LineDirectionMode /*direction*/, LinePositionMode /*linePositionMode*/) const
 {
-    if (firstLine && document().styleSheetCollection().usesFirstLineRules()) {
+    if (firstLine && view().usesFirstLineRules()) {
         const RenderStyle& firstLineStyle = this->firstLineStyle();
         if (&firstLineStyle != &style())
             return firstLineStyle.computedLineHeight();
@@ -114,6 +129,12 @@ void RenderLineBreak::dirtyLineBoxes(bool fullLayout)
     m_inlineBoxWrapper->dirtyLineBoxes();
 }
 
+void RenderLineBreak::deleteLineBoxesBeforeSimpleLineLayout()
+{
+    delete m_inlineBoxWrapper;
+    m_inlineBoxWrapper = nullptr;
+}
+
 int RenderLineBreak::caretMinOffset() const
 {
     return 0;
@@ -131,18 +152,21 @@ bool RenderLineBreak::canBeSelectionLeaf() const
 
 VisiblePosition RenderLineBreak::positionForPoint(const LayoutPoint&, const RenderRegion*)
 {
+    ensureLineBoxes(*this);
     return createVisiblePosition(0, DOWNSTREAM);
 }
 
 void RenderLineBreak::setSelectionState(SelectionState state)
 {
+    if (state != SelectionNone)
+        ensureLineBoxes(*this);
     RenderBoxModelObject::setSelectionState(state);
     if (!m_inlineBoxWrapper)
         return;
     m_inlineBoxWrapper->root().setHasSelectedChildren(state != SelectionNone);
 }
 
-LayoutRect RenderLineBreak::localCaretRect(InlineBox* inlineBox, int caretOffset, LayoutUnit* extraWidthToEndOfLine)
+LayoutRect RenderLineBreak::localCaretRect(InlineBox* inlineBox, unsigned caretOffset, LayoutUnit* extraWidthToEndOfLine)
 {
     ASSERT_UNUSED(caretOffset, !caretOffset);
     ASSERT_UNUSED(inlineBox, inlineBox == m_inlineBoxWrapper);
@@ -155,6 +179,9 @@ LayoutRect RenderLineBreak::localCaretRect(InlineBox* inlineBox, int caretOffset
 
 IntRect RenderLineBreak::linesBoundingBox() const
 {
+    if (auto* layout = simpleLineLayout(*this))
+        return SimpleLineLayout::computeBoundingBox(*this, *layout);
+
     if (!m_inlineBoxWrapper)
         return IntRect();
 
@@ -172,6 +199,11 @@ IntRect RenderLineBreak::linesBoundingBox() const
 
 void RenderLineBreak::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accumulatedOffset) const
 {
+    if (auto* layout = simpleLineLayout(*this)) {
+        rects.appendVector(SimpleLineLayout::collectAbsoluteRects(*this, *layout, accumulatedOffset));
+        return;
+    }
+
     if (!m_inlineBoxWrapper)
         return;
     rects.append(enclosingIntRect(FloatRect(accumulatedOffset + m_inlineBoxWrapper->topLeft(), m_inlineBoxWrapper->size())));
@@ -179,6 +211,10 @@ void RenderLineBreak::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& a
 
 void RenderLineBreak::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const
 {
+    if (auto* layout = simpleLineLayout(*this)) {
+        quads.appendVector(SimpleLineLayout::collectAbsoluteQuads(*this, *layout, wasFixed));
+        return;
+    }
     if (!m_inlineBoxWrapper)
         return;
     quads.append(localToAbsoluteQuad(FloatRect(m_inlineBoxWrapper->topLeft(), m_inlineBoxWrapper->size()), UseTransforms, wasFixed));
@@ -189,14 +225,10 @@ void RenderLineBreak::updateFromStyle()
     m_cachedLineHeight = invalidLineHeight;
 }
 
-IntRect RenderLineBreak::borderBoundingBox() const
-{
-    return IntRect(IntPoint(), linesBoundingBox().size());
-}
-
 #if PLATFORM(IOS)
 void RenderLineBreak::collectSelectionRects(Vector<SelectionRect>& rects, unsigned, unsigned)
 {
+    ensureLineBoxes(*this);
     InlineElementBox* box = m_inlineBoxWrapper;
     if (!box)
         return;
@@ -209,7 +241,7 @@ void RenderLineBreak::collectSelectionRects(Vector<SelectionRect>& rects, unsign
             rect.shiftXEdgeTo(rootBox.lineTopWithLeading());
     }
 
-    RenderBlock* containingBlock = this->containingBlock();
+    auto* containingBlock = containingBlockForObjectInFlow();
     // Map rect, extended left to leftOffset, and right to rightOffset, through transforms to get minX and maxX.
     LogicalSelectionOffsetCaches cache(*containingBlock);
     LayoutUnit leftOffset = containingBlock->logicalLeftSelectionOffset(*containingBlock, box->logicalTop(), cache);
@@ -232,7 +264,7 @@ void RenderLineBreak::collectSelectionRects(Vector<SelectionRect>& rects, unsign
 
     bool isFixed = false;
     IntRect absRect = localToAbsoluteQuad(FloatRect(rect), UseTransforms, &isFixed).enclosingBoundingBox();
-    bool boxIsHorizontal = !box->isSVGInlineTextBox() ? box->isHorizontal() : !style().svgStyle().isVerticalWritingMode();
+    bool boxIsHorizontal = !box->isSVGInlineTextBox() ? box->isHorizontal() : !style().isVerticalWritingMode();
     // If the containing block is an inline element, we want to check the inlineBoxWrapper orientation
     // to determine the orientation of the block. In this case we also use the inlineBoxWrapper to
     // determine if the element is the last on the line.