| Index: Source/WebCore/rendering/RenderTextControl.cpp
|
| ===================================================================
|
| --- Source/WebCore/rendering/RenderTextControl.cpp (revision 88774)
|
| +++ Source/WebCore/rendering/RenderTextControl.cpp (working copy)
|
| @@ -205,7 +205,12 @@
|
| 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 @@
|
| 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 @@
|
| 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 @@
|
| 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 = Range::create(document());
|
| - range->setStart(m_innerText.get(), 0, ec);
|
| + RefPtr<Range> range = Range::create(indexPosition.document());
|
| + range->setStart(innerTextElement, 0, ec);
|
| ASSERT(!ec);
|
| range->setEnd(indexPosition.deprecatedNode(), indexPosition.deprecatedEditingOffset(), ec);
|
| ASSERT(!ec);
|
|
|