InlineBox* InlineBox::prevLeafChildIgnoringLineBreak() const { InlineBox* leaf = prevLeafChild(); if (leaf && leaf->isLineBreak()) return 0; return leaf; }
InlineBox* RootInlineBox::closestLeafChildForLogicalLeftPosition(int leftPosition, bool onlyEditableLeaves) { InlineBox* firstLeaf = firstLeafChild(); InlineBox* lastLeaf = lastLeafChild(); if (firstLeaf != lastLeaf) { if (firstLeaf->isLineBreak()) firstLeaf = firstLeaf->nextLeafChildIgnoringLineBreak(); else if (lastLeaf->isLineBreak()) lastLeaf = lastLeaf->prevLeafChildIgnoringLineBreak(); } if (firstLeaf == lastLeaf && (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) return firstLeaf; // Avoid returning a list marker when possible. if (leftPosition <= firstLeaf->logicalLeft() && !firstLeaf->renderer().isListMarker() && (!onlyEditableLeaves || isEditableLeaf(firstLeaf))) // The leftPosition coordinate is less or equal to left edge of the firstLeaf. // Return it. return firstLeaf; if (leftPosition >= lastLeaf->logicalRight() && !lastLeaf->renderer().isListMarker() && (!onlyEditableLeaves || isEditableLeaf(lastLeaf))) // The leftPosition coordinate is greater or equal to right edge of the lastLeaf. // Return it. return lastLeaf; InlineBox* closestLeaf = 0; for (InlineBox* leaf = firstLeaf; leaf; leaf = leaf->nextLeafChildIgnoringLineBreak()) { if (!leaf->renderer().isListMarker() && (!onlyEditableLeaves || isEditableLeaf(leaf))) { closestLeaf = leaf; if (leftPosition < leaf->logicalRight()) // The x coordinate is less than the right edge of the box. // Return it. return leaf; } } return closestLeaf ? closestLeaf : lastLeaf; }
InlineBox* InlineBox::prevLeafChildIgnoringLineBreak() const { InlineBox* leaf = prevLeafChild(); return (leaf && leaf->isLineBreak()) ? nullptr : leaf; }