Move code for finding rendered character offset to RenderTextLineBoxes
https://bugs.webkit.org/show_bug.cgi?id=122892
Reviewed by Andreas Kling.
* rendering/RenderText.cpp:
(WebCore::RenderText::countRenderedCharacterOffsets):
(WebCore::RenderText::containsRenderedCharacterOffset):
Renamed for consistency.
* rendering/RenderTextLineBoxes.cpp:
(WebCore::RenderTextLineBoxes::countCharacterOffsets):
This used to be Position::renderedPosition.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@157517 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 72df90f8..a2d9c19 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,21 @@
+2013-10-16 Antti Koivisto <antti@apple.com>
+
+ Move code for finding rendered character offset to RenderTextLineBoxes
+ https://bugs.webkit.org/show_bug.cgi?id=122892
+
+ Reviewed by Andreas Kling.
+
+ * rendering/RenderText.cpp:
+ (WebCore::RenderText::countRenderedCharacterOffsets):
+ (WebCore::RenderText::containsRenderedCharacterOffset):
+
+ Renamed for consistency.
+
+ * rendering/RenderTextLineBoxes.cpp:
+ (WebCore::RenderTextLineBoxes::countCharacterOffsets):
+
+ This used to be Position::renderedPosition.
+
2013-10-16 Andreas Kling <akling@apple.com>
RenderElement::removeChild() should take child as a reference.
diff --git a/Source/WebCore/dom/Position.cpp b/Source/WebCore/dom/Position.cpp
index 33eb366..14f172a 100644
--- a/Source/WebCore/dom/Position.cpp
+++ b/Source/WebCore/dom/Position.cpp
@@ -479,30 +479,6 @@
return !findParent(deprecatedNode()) && m_offset >= lastOffsetForEditing(deprecatedNode());
}
-int Position::renderedOffset() const
-{
- if (!deprecatedNode()->isTextNode())
- return m_offset;
-
- if (!deprecatedNode()->renderer())
- return m_offset;
-
- int result = 0;
- RenderText* textRenderer = toText(deprecatedNode())->renderer();
- for (InlineTextBox *box = textRenderer->firstTextBox(); box; box = box->nextTextBox()) {
- int start = box->start();
- int end = box->start() + box->len();
- if (m_offset < start)
- return result;
- if (m_offset <= end) {
- result += m_offset - start;
- return result;
- }
- result += box->len();
- }
- return result;
-}
-
// return first preceding DOM position rendered at a different location, or "this"
Position Position::previousCharacterPosition(EAffinity affinity) const
{
@@ -975,7 +951,7 @@
if (!renderer)
return false;
- return renderer->containsCharacterOffset(m_offset);
+ return renderer->containsRenderedCharacterOffset(m_offset);
}
static bool inSameEnclosingBlockFlowElement(Node* a, Node* b)
@@ -1028,8 +1004,8 @@
if (posRenderer->isText() && !toRenderText(posRenderer)->containsCaretOffset(pos.m_offset))
return false;
- int thisRenderedOffset = renderedOffset();
- int posRenderedOffset = pos.renderedOffset();
+ int thisRenderedOffset = renderer->isText() ? toRenderText(renderer)->countRenderedCharacterOffsetsUntil(m_offset) : m_offset;
+ int posRenderedOffset = posRenderer->isText() ? toRenderText(posRenderer)->countRenderedCharacterOffsetsUntil(pos.m_offset) : pos.m_offset;
if (renderer == posRenderer && thisRenderedOffset == posRenderedOffset)
return false;
diff --git a/Source/WebCore/dom/Position.h b/Source/WebCore/dom/Position.h
index 072e1bc..c13412e 100644
--- a/Source/WebCore/dom/Position.h
+++ b/Source/WebCore/dom/Position.h
@@ -207,9 +207,6 @@
private:
int offsetForPositionAfterAnchor() const;
-
- int renderedOffset() const;
-
Position previousCharacterPosition(EAffinity) const;
Position nextCharacterPosition(EAffinity) const;
diff --git a/Source/WebCore/rendering/RenderText.cpp b/Source/WebCore/rendering/RenderText.cpp
index 0e75579..e33205d 100644
--- a/Source/WebCore/rendering/RenderText.cpp
+++ b/Source/WebCore/rendering/RenderText.cpp
@@ -1151,7 +1151,12 @@
return m_lineBoxes.caretMaxOffset(*this);
}
-bool RenderText::containsCharacterOffset(unsigned offset) const
+unsigned RenderText::countRenderedCharacterOffsetsUntil(unsigned offset) const
+{
+ return m_lineBoxes.countCharacterOffsetsUntil(offset);
+}
+
+bool RenderText::containsRenderedCharacterOffset(unsigned offset) const
{
return m_lineBoxes.containsOffset(*this, offset, RenderTextLineBoxes::CharacterOffset);
}
diff --git a/Source/WebCore/rendering/RenderText.h b/Source/WebCore/rendering/RenderText.h
index 41322f2..73106cc 100644
--- a/Source/WebCore/rendering/RenderText.h
+++ b/Source/WebCore/rendering/RenderText.h
@@ -120,7 +120,8 @@
virtual int caretMinOffset() const OVERRIDE;
virtual int caretMaxOffset() const OVERRIDE;
- bool containsCharacterOffset(unsigned) const;
+ unsigned countRenderedCharacterOffsetsUntil(unsigned) const;
+ bool containsRenderedCharacterOffset(unsigned) const;
bool containsCaretOffset(unsigned) const;
bool hasRenderedText() const;
diff --git a/Source/WebCore/rendering/RenderTextLineBoxes.cpp b/Source/WebCore/rendering/RenderTextLineBoxes.cpp
index f2c73e9..a3f32f4 100644
--- a/Source/WebCore/rendering/RenderTextLineBoxes.cpp
+++ b/Source/WebCore/rendering/RenderTextLineBoxes.cpp
@@ -243,6 +243,21 @@
return false;
}
+unsigned RenderTextLineBoxes::countCharacterOffsetsUntil(unsigned offset) const
+{
+ unsigned result = 0;
+ for (auto box = m_first; box; box = box->nextTextBox()) {
+ if (offset < box->start())
+ return result;
+ if (offset <= box->start() + box->len()) {
+ result += offset - box->start();
+ return result;
+ }
+ result += box->len();
+ }
+ return result;
+}
+
enum ShouldAffinityBeDownstream { AlwaysDownstream, AlwaysUpstream, UpstreamIfPositionIsNotAtStart };
static bool lineDirectionPointFitsInBox(int pointLineDirection, const InlineTextBox& box, ShouldAffinityBeDownstream& shouldAffinityBeDownstream)
diff --git a/Source/WebCore/rendering/RenderTextLineBoxes.h b/Source/WebCore/rendering/RenderTextLineBoxes.h
index 9584213..835b82f 100644
--- a/Source/WebCore/rendering/RenderTextLineBoxes.h
+++ b/Source/WebCore/rendering/RenderTextLineBoxes.h
@@ -62,6 +62,7 @@
int caretMaxOffset(const RenderText&) const;
enum OffsetType { CaretOffset, CharacterOffset };
bool containsOffset(const RenderText&, unsigned, OffsetType) const;
+ unsigned countCharacterOffsetsUntil(unsigned) const;
VisiblePosition positionForPoint(const RenderText&, const LayoutPoint&) const;