From d0147a863b872ecaa451ab0dce2a348760e99e2c Mon Sep 17 00:00:00 2001 From: Ben Murdoch Date: Wed, 13 Jul 2011 10:14:36 +0100 Subject: Merge WebKit at branches/chromium/742 r89068: Initial merge by Git. Take us to top of Chrome 12 release branch (12.0.742.130) Change-Id: I4408a97e343a118cf4a1bb9d71367bcc2c16ae48 --- Source/WebCore/rendering/RenderTextControl.cpp | 32 +++++++++++++++++--------- Source/WebCore/rendering/RenderTextControl.h | 4 ++-- 2 files changed, 23 insertions(+), 13 deletions(-) (limited to 'Source/WebCore/rendering') diff --git a/Source/WebCore/rendering/RenderTextControl.cpp b/Source/WebCore/rendering/RenderTextControl.cpp index 8149f6c..0862df3 100644 --- a/Source/WebCore/rendering/RenderTextControl.cpp +++ b/Source/WebCore/rendering/RenderTextControl.cpp @@ -205,7 +205,12 @@ int RenderTextControl::selectionStart() const Frame* frame = this->frame(); if (!frame) return 0; - return indexForVisiblePosition(frame->selection()->start()); + + HTMLElement* innerText = innerTextElement(); + // Do not call innerTextElement() in the function arguments as creating a VisiblePosition + // from frame->selection->start() can blow us from underneath. Also, function ordering is + // usually dependent on the compiler. + return RenderTextControl::indexForVisiblePosition(innerText, frame->selection()->start()); } int RenderTextControl::selectionEnd() const @@ -213,7 +218,12 @@ int RenderTextControl::selectionEnd() const Frame* frame = this->frame(); if (!frame) return 0; - return indexForVisiblePosition(frame->selection()->end()); + + HTMLElement* innerText = innerTextElement(); + // Do not call innerTextElement() in the function arguments as creating a VisiblePosition + // from frame->selection->end() can blow us from underneath. Also, function ordering is + // usually dependent on the compiler. + return RenderTextControl::indexForVisiblePosition(innerText, frame->selection()->end()); } bool RenderTextControl::hasVisibleTextArea() const @@ -256,15 +266,15 @@ void setSelectionRange(Node* node, int start, int end) frame->selection()->setSelection(newSelection); } -bool RenderTextControl::isSelectableElement(Node* node) const +bool RenderTextControl::isSelectableElement(HTMLElement* innerText, Node* node) { - if (!node || !m_innerText) + if (!node || !innerText) return false; - - if (node->rootEditableElement() == m_innerText) + + if (node->rootEditableElement() == innerText) return true; - if (!m_innerText->contains(node)) + if (!innerText->contains(node)) return false; Node* shadowAncestor = node->shadowAncestorNode(); @@ -334,14 +344,14 @@ VisiblePosition RenderTextControl::visiblePositionForIndex(int index) const return VisiblePosition(Position(endContainer, endOffset, Position::PositionIsOffsetInAnchor), UPSTREAM); } -int RenderTextControl::indexForVisiblePosition(const VisiblePosition& pos) const +int RenderTextControl::indexForVisiblePosition(HTMLElement* innerTextElement, const VisiblePosition& pos) { Position indexPosition = pos.deepEquivalent(); - if (!isSelectableElement(indexPosition.deprecatedNode())) + if (!RenderTextControl::isSelectableElement(innerTextElement, indexPosition.deprecatedNode())) return 0; ExceptionCode ec = 0; - RefPtr range = Range::create(document()); - range->setStart(m_innerText.get(), 0, ec); + RefPtr range = Range::create(indexPosition.document()); + range->setStart(innerTextElement, 0, ec); ASSERT(!ec); range->setEnd(indexPosition.deprecatedNode(), indexPosition.deprecatedEditingOffset(), ec); ASSERT(!ec); diff --git a/Source/WebCore/rendering/RenderTextControl.h b/Source/WebCore/rendering/RenderTextControl.h index 0c30ed6..78b295b 100644 --- a/Source/WebCore/rendering/RenderTextControl.h +++ b/Source/WebCore/rendering/RenderTextControl.h @@ -49,7 +49,7 @@ public: void selectionChanged(bool userTriggered); VisiblePosition visiblePositionForIndex(int index) const; - int indexForVisiblePosition(const VisiblePosition&) const; + static int indexForVisiblePosition(HTMLElement*, const VisiblePosition&); void updatePlaceholderVisibility(bool, bool); @@ -104,7 +104,7 @@ private: bool hasVisibleTextArea() const; friend void setSelectionRange(Node*, int start, int end); - bool isSelectableElement(Node*) const; + static bool isSelectableElement(HTMLElement*, Node*); virtual int textBlockInsetLeft() const = 0; virtual int textBlockInsetRight() const = 0; -- cgit v1.1