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;