Diff
Modified: trunk/Source/WebCore/ChangeLog (157516 => 157517)
--- trunk/Source/WebCore/ChangeLog 2013-10-16 13:03:32 UTC (rev 157516)
+++ trunk/Source/WebCore/ChangeLog 2013-10-16 14:33:31 UTC (rev 157517)
@@ -1,3 +1,21 @@
+2013-10-16 Antti Koivisto <[email protected]>
+
+ 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 <[email protected]>
RenderElement::removeChild() should take child as a reference.
Modified: trunk/Source/WebCore/dom/Position.cpp (157516 => 157517)
--- trunk/Source/WebCore/dom/Position.cpp 2013-10-16 13:03:32 UTC (rev 157516)
+++ trunk/Source/WebCore/dom/Position.cpp 2013-10-16 14:33:31 UTC (rev 157517)
@@ -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;
Modified: trunk/Source/WebCore/dom/Position.h (157516 => 157517)
--- trunk/Source/WebCore/dom/Position.h 2013-10-16 13:03:32 UTC (rev 157516)
+++ trunk/Source/WebCore/dom/Position.h 2013-10-16 14:33:31 UTC (rev 157517)
@@ -207,9 +207,6 @@
private:
int offsetForPositionAfterAnchor() const;
-
- int renderedOffset() const;
-
Position previousCharacterPosition(EAffinity) const;
Position nextCharacterPosition(EAffinity) const;
Modified: trunk/Source/WebCore/rendering/RenderText.cpp (157516 => 157517)
--- trunk/Source/WebCore/rendering/RenderText.cpp 2013-10-16 13:03:32 UTC (rev 157516)
+++ trunk/Source/WebCore/rendering/RenderText.cpp 2013-10-16 14:33:31 UTC (rev 157517)
@@ -1151,8 +1151,13 @@
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);
}
Modified: trunk/Source/WebCore/rendering/RenderText.h (157516 => 157517)
--- trunk/Source/WebCore/rendering/RenderText.h 2013-10-16 13:03:32 UTC (rev 157516)
+++ trunk/Source/WebCore/rendering/RenderText.h 2013-10-16 14:33:31 UTC (rev 157517)
@@ -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;
Modified: trunk/Source/WebCore/rendering/RenderTextLineBoxes.cpp (157516 => 157517)
--- trunk/Source/WebCore/rendering/RenderTextLineBoxes.cpp 2013-10-16 13:03:32 UTC (rev 157516)
+++ trunk/Source/WebCore/rendering/RenderTextLineBoxes.cpp 2013-10-16 14:33:31 UTC (rev 157517)
@@ -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)
Modified: trunk/Source/WebCore/rendering/RenderTextLineBoxes.h (157516 => 157517)
--- trunk/Source/WebCore/rendering/RenderTextLineBoxes.h 2013-10-16 13:03:32 UTC (rev 157516)
+++ trunk/Source/WebCore/rendering/RenderTextLineBoxes.h 2013-10-16 14:33:31 UTC (rev 157517)
@@ -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;