summaryrefslogtreecommitdiffstats
path: root/WebCore/dom/Position.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/dom/Position.cpp')
-rw-r--r--WebCore/dom/Position.cpp30
1 files changed, 19 insertions, 11 deletions
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 <stdio.h>
+#include <wtf/text/CString.h>
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())