diff options
Diffstat (limited to 'Source/WebCore/rendering/RenderTextControl.cpp')
-rw-r--r-- | Source/WebCore/rendering/RenderTextControl.cpp | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/Source/WebCore/rendering/RenderTextControl.cpp b/Source/WebCore/rendering/RenderTextControl.cpp index 0192ee4..40aa4c2 100644 --- a/Source/WebCore/rendering/RenderTextControl.cpp +++ b/Source/WebCore/rendering/RenderTextControl.cpp @@ -33,6 +33,7 @@ #include "HTMLInputElement.h" #include "HTMLNames.h" #include "HitTestResult.h" +#include "Position.h" #include "RenderLayer.h" #include "RenderText.h" #include "ScrollbarTheme.h" @@ -97,8 +98,6 @@ void RenderTextControl::styleDidChange(StyleDifference diff, const RenderStyle* textBlockRenderer->style()->setWidth(Length()); setInnerTextStyle(textBlockStyle); } - - setReplaced(isInline()); } void RenderTextControl::setInnerTextStyle(PassRefPtr<RenderStyle> style) @@ -273,12 +272,49 @@ bool RenderTextControl::isSelectableElement(Node* node) const || (shadowAncestor->hasTagName(inputTag) && static_cast<HTMLInputElement*>(shadowAncestor)->isTextField())); } +static inline void setContainerAndOffsetForRange(Node* node, int offset, Node*& containerNode, int& offsetInContainer) +{ + if (node->isTextNode()) { + containerNode = node; + offsetInContainer = offset; + } else { + containerNode = node->parentNode(); + offsetInContainer = node->nodeIndex() + offset; + } +} + PassRefPtr<Range> RenderTextControl::selection(int start, int end) const { + ASSERT(start <= end); if (!m_innerText) return 0; - return Range::create(document(), m_innerText, start, m_innerText, end); + if (!m_innerText->firstChild()) + return Range::create(document(), m_innerText, 0, m_innerText, 0); + + int offset = 0; + Node* startNode = 0; + Node* endNode = 0; + for (Node* node = m_innerText->firstChild(); node; node = node->traverseNextNode(m_innerText.get())) { + ASSERT(!node->firstChild()); + ASSERT(node->isTextNode() || node->hasTagName(brTag)); + int length = node->isTextNode() ? lastOffsetInNode(node) : 1; + + if (offset <= start && start <= offset + length) + setContainerAndOffsetForRange(node, start - offset, startNode, start); + + if (offset <= end && end <= offset + length) { + setContainerAndOffsetForRange(node, end - offset, endNode, end); + break; + } + + offset += length; + } + + if (!startNode || !endNode) + return 0; + + return Range::create(document(), startNode, start, endNode, end); } VisiblePosition RenderTextControl::visiblePositionForIndex(int index) const |