WebCore:
Reviewed by Darin Adler.
- preparation for https://bugs.webkit.org/show_bug.cgi?id=3729
<rdar://problem/4036353> REGRESSION: arrow keys move insertion bar backwards in RTL text
The three main changes in this patch are:
1) Making all inline boxes know their bidi level, instead of just text
boxes knowing whether their bidi level is odd or even. This is
required for the next change.
2) Replacing RenderObject::inlineBox() with
Position::getInlineBoxAndOffset() in recognition of the fact that the
inline box containing the primary caret for a position in a given
node may belong to a different node's renderer.
3) Changing RenderObject::caretRect() to take an InlineBox parameter,
and changing callers to call VisiblePosition::caretRect(), which
locates the inline box, then calls caretRect() on the renderer for
that box. This, combined with the previous change, ensures that the
primary caret is rendered at the right place for positions that
lie on a directionality boundary.
Test: platform/mac/editing/input/caret-primary-bidi.html
* WebCore.base.exp: Added the VisiblePosition(Node*, int, EAffinity)
constructor and VisiblePosition::caretRect(), and sorted.
* dom/Position.cpp:
(WebCore::nextRenderedEditable): Adjusted for the removal of
RenderObject::inlineBox().
(WebCore::previousRenderedEditable): Ditto.
(WebCore::Position::rendersInDifferentPosition): Ditto.
(WebCore::Position::getInlineBoxAndOffset): Added. Gets the inline box
and the offset within that box at which the primary caret for this
position should render.
* dom/Position.h:
* editing/DeleteSelectionCommand.cpp:
(WebCore::DeleteSelectionCommand::mergeParagraphs): Changed to call
VisiblePosition::caretRect() instead of calling the RenderObject method.
* editing/SelectionController.cpp:
(WebCore::caretY): Ditto.
(WebCore::SelectionController::xPosForVerticalArrowNavigation): Ditto.
(WebCore::SelectionController::layout): Ditto.
* editing/VisiblePosition.cpp:
(WebCore::VisiblePosition::caretRect): Changed to call
getInlineBoxAndOffset() to get the correct inline box and call the
renderer for that box.
* editing/VisiblePosition.h:
(WebCore::VisiblePosition::getInlineBoxAndOffset): Added convenience
methods for getting the inline box and caret offset for a visible
position, accounting for its affinity.
* editing/visible_units.cpp:
(WebCore::rootBoxForLine): Changed to use getInlineBoxAndOffset()
instead of RenderObject::inlineBox().
(WebCore::startPositionForLine):
(WebCore::endPositionForLine):
(WebCore::previousLinePosition): Ditto.
(WebCore::nextLinePosition): Ditto.
* page/AccessibilityObject.cpp:
(WebCore::updateAXLineStartForVisiblePosition): Ditto.
* page/Frame.cpp:
(WebCore::Frame::firstRectForRange): Ditto.
* rendering/InlineBox.cpp:
(WebCore::InlineBox::caretMinOffset): Changed to forward to the
renderer.
(WebCore::InlineBox::caretMaxOffset): Ditto.
* rendering/InlineBox.h: Replaced the m_reversed bit, intended for use
in InlineTextBox only, with six bits of the bidi level of the box,
intended for use in all leaf inline boxes.
(WebCore::InlineBox::InlineBox): Added missing initializer for
m_dirOverride and initialized the bidi level.
(WebCore::InlineBox::bidiLevel): Added this accessor.
(WebCore::InlineBox::setBidiLevel): Ditto.
(WebCore::InlineBox::direction): Ditto.
(WebCore::InlineBox::caretLeftmostOffset): Added this convenience
method.
(WebCore::InlineBox::caretRightmostOffset): Ditto.
* rendering/InlineTextBox.cpp: Replaced all references to m_reversed
with checking of direction().
(WebCore::InlineTextBox::selectionRect):
(WebCore::InlineTextBox::placeEllipsisBox):
(WebCore::InlineTextBox::paint):
(WebCore::InlineTextBox::paintSelection):
(WebCore::InlineTextBox::paintCompositionBackground):
(WebCore::InlineTextBox::paintSpellingOrGrammarMarker):
(WebCore::InlineTextBox::paintTextMatchMarker):
(WebCore::InlineTextBox::textPos):
(WebCore::InlineTextBox::offsetForPosition):
(WebCore::InlineTextBox::positionForOffset):
* rendering/RenderBR.cpp: Removed inlineBox().
* rendering/RenderBR.h: Ditto.
* rendering/RenderBox.cpp:
(WebCore::RenderBox::caretRect): Changed to take an inline box and
account for the direction of the box (or the renderer) in positioning
the caret: in right-to-left boxes, the "before" position is to the right
while "after" is to the left.
* rendering/RenderBox.h:
* rendering/RenderFlow.cpp:
(WebCore::RenderFlow::caretRect): Updated the signature.
* rendering/RenderFlow.h:
* rendering/RenderObject.cpp:
(WebCore::RenderObject::caretRect): Updated the signature.
(WebCore::RenderObject::caretMaxOffset): Changed to return the child
node count (or 1 if there are no children) for replaced elements, such
as <select>s.
* rendering/RenderObject.h:
* rendering/RenderReplaced.cpp: Removed caretMinOffset() and
caretMaxOffset() because the base class implementation does the right
thing for replaced objects now.
* rendering/RenderReplaced.h:
* rendering/RenderSVGInlineText.cpp:
(WebCore::RenderSVGInlineText::caretRect): Updated the signature.
(WebCore::RenderSVGInlineText::positionForCoordinates): Updated for
the change from m_reversed to direction().
* rendering/RenderSVGInlineText.h:
* rendering/RenderText.cpp:
(WebCore::RenderText::caretRect): Changed to take an inline box and
removed the code that used to find the inline for the given position.
Changed use of m_reversed to use direction().
(WebCore::RenderText::position): Changed use of m_reversed to use
direction().
* rendering/RenderText.h:
* rendering/RenderTextControl.cpp:
(WebCore::RenderTextControl::textWithHardLineBreaks): Adjusted for the
removal of RenderObject::inlineBox().
* rendering/RenderTreeAsText.cpp:
(WebCore::writeTextRun): Changed to use direction() instead of
m_reversed.
* rendering/SVGInlineTextBox.cpp: Ditto.
(WebCore::SVGInlineTextBox::calculateGlyphBoundaries):
(WebCore::SVGInlineTextBoxClosestCharacterToPositionWalker::chunkPortionCallback):
(WebCore::SVGInlineTextBox::svgCharacterHitsPosition):
* rendering/SVGRenderTreeAsText.cpp: Ditto.
(WebCore::writeSVGInlineTextBox):
* rendering/SVGRootInlineBox.cpp: Ditto.
(WebCore::svgTextRunForInlineTextBox):
(WebCore::cummulatedWidthOrHeightOfTextChunk):
(WebCore::SVGRootInlineBox::buildLayoutInformationForTextBox):
* rendering/bidi.cpp:
(WebCore::RenderBlock::constructLine): Made this function set the
bidi level on all leaf boxes.
* svg/SVGTextContentElement.cpp: Changed to use direction() instead of
m_reversed.
(WebCore::cumulativeCharacterRangeLength):
(WebCore::SVGInlineTextBoxQueryWalker::chunkPortionCallback):
WebKit/mac:
Reviewed by Darin Adler.
- preparation for https://bugs.webkit.org/show_bug.cgi?id=3729
<rdar://problem/4036353> REGRESSION: arrow keys move insertion bar backwards in RTL text
* WebView/WebFrame.mm:
(-[WebFrame _caretRectAtNode:offset:affinity:]): Changed to use
VisiblePosition::caretRect() instead of the RenderObject method which
was removed.
LayoutTests:
Reviewed by Darin Adler.
- test the visual position of the primary caret in bidirectional text
* platform/mac/editing/input/caret-primary-bidi-expected.txt: Added.
* platform/mac/editing/input/caret-primary-bidi.html: Added.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@32508 268f45cc-cd09-0410-ab3c-d52691b4dbfc
40 files changed