From dcc8cf2e65d1aa555cce12431a16547e66b469ee Mon Sep 17 00:00:00 2001 From: Steve Block Date: Tue, 27 Apr 2010 16:31:00 +0100 Subject: Merge webkit.org at r58033 : Initial merge by git Change-Id: If006c38561af287c50cd578d251629b51e4d8cd1 --- WebCore/dom/Position.cpp | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) (limited to 'WebCore/dom/Position.cpp') diff --git a/WebCore/dom/Position.cpp b/WebCore/dom/Position.cpp index c0f6fa3..fa994e3 100644 --- a/WebCore/dom/Position.cpp +++ b/WebCore/dom/Position.cpp @@ -27,7 +27,6 @@ #include "Position.h" #include "CSSComputedStyleDeclaration.h" -#include "CString.h" #include "CharacterNames.h" #include "Logging.h" #include "PositionIterator.h" @@ -38,6 +37,7 @@ #include "htmlediting.h" #include "visible_units.h" #include +#include namespace WebCore { @@ -946,14 +946,7 @@ Position Position::trailingWhitespacePosition(EAffinity, bool considerNonCollaps void Position::getInlineBoxAndOffset(EAffinity affinity, InlineBox*& inlineBox, int& caretOffset) const { - TextDirection primaryDirection = LTR; - for (RenderObject* r = node()->renderer(); r; r = r->parent()) { - if (r->isBlockFlow()) { - primaryDirection = r->style()->direction(); - break; - } - } - getInlineBoxAndOffset(affinity, primaryDirection, inlineBox, caretOffset); + getInlineBoxAndOffset(affinity, primaryDirection(), inlineBox, caretOffset); } static bool isNonTextLeafChild(RenderObject* object) @@ -1018,7 +1011,7 @@ void Position::getInlineBoxAndOffset(EAffinity affinity, TextDirection primaryDi inlineBox = toRenderBox(renderer)->inlineBoxWrapper(); if (!inlineBox || (caretOffset > inlineBox->caretMinOffset() && caretOffset < inlineBox->caretMaxOffset())) return; - } else if (node()->isContentEditable()) { + } else if (!node()->isLink() && node()->isContentEditable()) { Position pos = positionInParentBeforeNode(node()).upstream(); pos.getInlineBoxAndOffset(DOWNSTREAM, primaryDirection, inlineBox, caretOffset); return; @@ -1041,7 +1034,8 @@ void Position::getInlineBoxAndOffset(EAffinity affinity, TextDirection primaryDi return; } - if ((caretOffset == caretMinOffset) ^ (affinity == UPSTREAM)) + if (((caretOffset == caretMaxOffset) ^ (affinity == DOWNSTREAM)) + || ((caretOffset == caretMinOffset) ^ (affinity == UPSTREAM))) break; candidate = box; @@ -1146,6 +1140,20 @@ void Position::getInlineBoxAndOffset(EAffinity affinity, TextDirection primaryDi } } +TextDirection Position::primaryDirection() const +{ + TextDirection primaryDirection = LTR; + for (const RenderObject* r = m_anchorNode->renderer(); r; r = r->parent()) { + if (r->isBlockFlow()) { + primaryDirection = r->style()->direction(); + break; + } + } + + return primaryDirection; +} + + void Position::debugPosition(const char* msg) const { if (isNull()) -- cgit v1.1