WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-52919-20110209012847.patch (text/plain), 44.00 KB, created by
Levi Weintraub
on 2011-02-09 01:28:48 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Levi Weintraub
Created:
2011-02-09 01:28:48 PST
Size:
44.00 KB
patch
obsolete
>Index: Source/WebCore/ChangeLog >=================================================================== >--- Source/WebCore/ChangeLog (revision 78027) >+++ Source/WebCore/ChangeLog (working copy) >@@ -1,3 +1,88 @@ >+2011-02-08 Levi Weintraub <leviw@chromium.org> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Stop instantiating legacy editing Positions in VisiblePosition >+ https://bugs.webkit.org/show_bug.cgi?id=52919 >+ >+ Changing VisiblePosition completely away from legacy positions. >+ >+ No new tests since this is functionaly equivalent. >+ >+ * WebCore.exp.in: Removing the legacy VisiblePosition constructor and >+ adding the PositionIsOffsetInAnchor symbol. If we must create VisiblePositions >+ outside of WebCore, they should be parent anchored. >+ * accessibility/AXObjectCache.cpp: >+ (WebCore::AXObjectCache::visiblePositionForTextMarkerData): >+ * accessibility/AccessibilityObject.cpp: >+ (WebCore::startOfStyleRange): >+ (WebCore::endOfStyleRange): >+ * accessibility/AccessibilityRenderObject.cpp: >+ (WebCore::AccessibilityRenderObject::visiblePositionForIndex): >+ * accessibility/gtk/AccessibilityObjectWrapperAtk.cpp: >+ (objectAndOffsetUnignored): >+ * dom/Position.cpp: >+ (WebCore::Position::upstream): Fixed to correctly respect PositionIsAfterAnchor >+ (WebCore::Position::downstream): ditto >+ * dom/Range.cpp: >+ (WebCore::Range::editingStartPosition): >+ * editing/Editor.cpp: >+ (WebCore::Editor::canDeleteRange): >+ * editing/ReplaceSelectionCommand.cpp: >+ (WebCore::ReplaceSelectionCommand::doApply): >+ * editing/SelectionController.cpp: >+ (WebCore::SelectionController::selectFrameElementInParentIfFullySelected): >+ (WebCore::SelectionController::setSelectedRange): >+ * editing/TextIterator.cpp: >+ (WebCore::TextIterator::shouldRepresentNodeOffsetZero): >+ * editing/TypingCommand.cpp: >+ (WebCore::TypingCommand::deleteKeyPressed): >+ * editing/VisiblePosition.cpp: >+ (WebCore::VisiblePosition::leftVisuallyDistinctCandidate): >+ (WebCore::VisiblePosition::rightVisuallyDistinctCandidate): >+ (WebCore::VisiblePosition::canonicalPosition): >+ (WebCore::VisiblePosition::characterAfter): >+ (WebCore::VisiblePosition::localCaretRect): >+ (WebCore::makeRange): >+ (WebCore::startVisiblePosition): >+ (WebCore::endVisiblePosition): >+ (WebCore::setStart): >+ (WebCore::setEnd): >+ (WebCore::isFirstVisiblePositionInNode): >+ (WebCore::isLastVisiblePositionInNode): >+ * editing/VisiblePosition.h: >+ (WebCore::VisiblePosition::VisiblePosition): >+ * editing/htmlediting.cpp: >+ (WebCore::firstInSpecialElement): >+ (WebCore::lastInSpecialElement): >+ (WebCore::visiblePositionBeforeNode): >+ (WebCore::visiblePositionAfterNode): >+ * editing/visible_units.cpp: >+ (WebCore::startPositionForLine): >+ (WebCore::endPositionForLine): >+ (WebCore::previousLinePosition): >+ (WebCore::nextLinePosition): >+ (WebCore::startOfParagraph): >+ (WebCore::endOfParagraph): >+ (WebCore::endOfBlock): >+ (WebCore::startOfDocument): >+ (WebCore::endOfDocument): >+ (WebCore::logicalStartPositionForLine): >+ (WebCore::logicalEndPositionForLine): >+ * page/DOMSelection.cpp: >+ (WebCore::DOMSelection::collapse): >+ (WebCore::DOMSelection::setBaseAndExtent): >+ (WebCore::DOMSelection::setPosition): >+ (WebCore::DOMSelection::extend): >+ * page/EventHandler.cpp: >+ (WebCore::EventHandler::handleMousePressEventSingleClick): >+ * rendering/RenderObject.cpp: >+ (WebCore::RenderObject::createVisiblePosition): >+ * rendering/RenderTextControl.cpp: >+ (WebCore::RenderTextControl::visiblePositionForIndex): >+ * svg/SVGTextContentElement.cpp: >+ (WebCore::SVGTextContentElement::selectSubString): >+ > 2011-02-08 Ryosuke Niwa <rniwa@webkit.org> > > Reviewed by Darin Adler. >Index: Source/WebCore/WebCore.exp.in >=================================================================== >--- Source/WebCore/WebCore.exp.in (revision 78027) >+++ Source/WebCore/WebCore.exp.in (working copy) >@@ -402,7 +402,6 @@ __ZN7WebCore15ScrollAlignment19alignToEd > __ZN7WebCore15StringTruncator13rightTruncateERKN3WTF6StringEfRKNS_4FontEb > __ZN7WebCore15StringTruncator14centerTruncateERKN3WTF6StringEfRKNS_4FontEb > __ZN7WebCore15StringTruncator5widthERKN3WTF6StringERKNS_4FontEb >-__ZN7WebCore15VisiblePositionC1EPNS_4NodeEiNS_9EAffinityE > __ZN7WebCore15VisiblePositionC1ERKNS_8PositionENS_9EAffinityE > __ZN7WebCore15defaultLanguageEv > __ZN7WebCore15reportExceptionEPN3JSC9ExecStateENS0_7JSValueE >@@ -785,6 +784,7 @@ __ZN7WebCore8Gradient12addColorStopEfRKN > __ZN7WebCore8GradientC1ERKNS_10FloatPointES3_ > __ZN7WebCore8IntPointC1ERK8_NSPoint > __ZN7WebCore8PositionC1EN3WTF10PassRefPtrINS_4NodeEEEi >+__ZN7WebCore8PositionC1EN3WTF10PassRefPtrINS_4NodeEEEiNS0_10AnchorTypeE > __ZN7WebCore8Settings14setJavaEnabledEb > __ZN7WebCore8Settings15setWebGLEnabledEb > __ZN7WebCore8Settings16setUsesPageCacheEb >Index: Source/WebCore/accessibility/AXObjectCache.cpp >=================================================================== >--- Source/WebCore/accessibility/AXObjectCache.cpp (revision 78027) >+++ Source/WebCore/accessibility/AXObjectCache.cpp (working copy) >@@ -573,7 +573,8 @@ VisiblePosition AXObjectCache::visiblePo > if (!isNodeInUse(textMarkerData.node)) > return VisiblePosition(); > >- VisiblePosition visiblePos = VisiblePosition(textMarkerData.node, textMarkerData.offset, textMarkerData.affinity); >+ // FIXME: Accessability should make it clear these are DOM-compliant offsets or store Position objects. >+ VisiblePosition visiblePos = VisiblePosition(Position(textMarkerData.node, textMarkerData.offset), textMarkerData.affinity); > Position deepPos = visiblePos.deepEquivalent(); > if (deepPos.isNull()) > return VisiblePosition(); >Index: Source/WebCore/accessibility/AccessibilityObject.cpp >=================================================================== >--- Source/WebCore/accessibility/AccessibilityObject.cpp (revision 78027) >+++ Source/WebCore/accessibility/AccessibilityObject.cpp (working copy) >@@ -336,7 +336,7 @@ static VisiblePosition startOfStyleRange > startRenderer = r; > } > >- return VisiblePosition(startRenderer->node(), 0, VP_DEFAULT_AFFINITY); >+ return firstPositionInOrBeforeNode(startRenderer->node()); > } > > static VisiblePosition endOfStyleRange(const VisiblePosition& visiblePos) >@@ -359,7 +359,7 @@ static VisiblePosition endOfStyleRange(c > endRenderer = r; > } > >- return lastDeepEditingPositionForNode(endRenderer->node()); >+ return lastPositionInOrAfterNode(endRenderer->node()); > } > > VisiblePositionRange AccessibilityObject::styleRangeForPosition(const VisiblePosition& visiblePos) const >Index: Source/WebCore/accessibility/AccessibilityRenderObject.cpp >=================================================================== >--- Source/WebCore/accessibility/AccessibilityRenderObject.cpp (revision 78027) >+++ Source/WebCore/accessibility/AccessibilityRenderObject.cpp (working copy) >@@ -2459,14 +2459,14 @@ VisiblePosition AccessibilityRenderObjec > return VisiblePosition(); > > if (index <= 0) >- return VisiblePosition(node, 0, DOWNSTREAM); >+ return VisiblePosition(firstPositionInOrBeforeNode(node), DOWNSTREAM); > > ExceptionCode ec = 0; > RefPtr<Range> range = Range::create(m_renderer->document()); > range->selectNodeContents(node, ec); > CharacterIterator it(range.get()); > it.advance(index - 1); >- return VisiblePosition(it.range()->endContainer(ec), it.range()->endOffset(ec), UPSTREAM); >+ return VisiblePosition(Position(it.range()->endContainer(ec), it.range()->endOffset(ec), Position::PositionIsOffsetInAnchor), UPSTREAM); > } > > int AccessibilityRenderObject::indexForVisiblePosition(const VisiblePosition& pos) const >Index: Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp >=================================================================== >--- Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp (revision 78027) >+++ Source/WebCore/accessibility/gtk/AccessibilityObjectWrapperAtk.cpp (working copy) >@@ -2500,7 +2500,7 @@ AccessibilityObject* objectAndOffsetUnig > > Node* node = realObject->node(); > if (node) { >- VisiblePosition startPosition = VisiblePosition(node, 0, DOWNSTREAM); >+ VisiblePosition startPosition = VisiblePosition(positionBeforeNode(node), DOWNSTREAM); > VisiblePosition endPosition = realObject->selection().visibleEnd(); > > if (startPosition == endPosition) >Index: Source/WebCore/dom/Position.cpp >=================================================================== >--- Source/WebCore/dom/Position.cpp (revision 78027) >+++ Source/WebCore/dom/Position.cpp (working copy) >@@ -513,7 +513,8 @@ Position Position::upstream(EditingBound > > // iterate backward from there, looking for a qualified position > Node* boundary = enclosingVisualBoundary(startNode); >- PositionIterator lastVisible = *this; >+ // FIXME: PositionIterator should respect Before and After positions. >+ PositionIterator lastVisible = m_anchorType == PositionIsAfterAnchor ? Position(m_anchorNode, caretMaxOffset(m_anchorNode.get())) : *this; > PositionIterator currentPos = lastVisible; > bool startEditable = startNode->isContentEditable(); > Node* lastNode = startNode; >@@ -634,7 +635,8 @@ Position Position::downstream(EditingBou > > // iterate forward from there, looking for a qualified position > Node* boundary = enclosingVisualBoundary(startNode); >- PositionIterator lastVisible = *this; >+ // FIXME: PositionIterator should respect Before and After positions. >+ PositionIterator lastVisible = m_anchorType == PositionIsAfterAnchor ? Position(m_anchorNode, caretMaxOffset(m_anchorNode.get())) : *this; > PositionIterator currentPos = lastVisible; > bool startEditable = startNode->isContentEditable(); > Node* lastNode = startNode; >Index: Source/WebCore/dom/Range.cpp >=================================================================== >--- Source/WebCore/dom/Range.cpp (revision 78027) >+++ Source/WebCore/dom/Range.cpp (working copy) >@@ -1570,7 +1570,7 @@ Position Range::editingStartPosition() c > // It is important to skip certain irrelevant content at the start of the selection, so we do not wind up > // with a spurious "mixed" style. > >- VisiblePosition visiblePosition(m_start.container(), m_start.offset(), VP_DEFAULT_AFFINITY); >+ VisiblePosition visiblePosition = Position(m_start.container(), m_start.offset(), Position::PositionIsOffsetInAnchor); > if (visiblePosition.isNull()) > return Position(); > >Index: Source/WebCore/editing/Editor.cpp >=================================================================== >--- Source/WebCore/editing/Editor.cpp (revision 78027) >+++ Source/WebCore/editing/Editor.cpp (working copy) >@@ -293,7 +293,7 @@ bool Editor::canDeleteRange(Range* range > return false; > > if (range->collapsed(ec)) { >- VisiblePosition start(startContainer, range->startOffset(ec), DOWNSTREAM); >+ VisiblePosition start(Position(startContainer, range->startOffset(ec), Position::PositionIsOffsetInAnchor), DOWNSTREAM); > VisiblePosition previous = start.previous(); > // FIXME: We sometimes allow deletions at the start of editable roots, like when the caret is in an empty list item. > if (previous.isNull() || previous.deepEquivalent().node()->rootEditableElement() != startContainer->rootEditableElement()) >Index: Source/WebCore/editing/ReplaceSelectionCommand.cpp >=================================================================== >--- Source/WebCore/editing/ReplaceSelectionCommand.cpp (revision 78027) >+++ Source/WebCore/editing/ReplaceSelectionCommand.cpp (working copy) >@@ -884,7 +884,7 @@ void ReplaceSelectionCommand::doApply() > Node* endBR = insertionPos.downstream().node()->hasTagName(brTag) ? insertionPos.downstream().node() : 0; > VisiblePosition originalVisPosBeforeEndBR; > if (endBR) >- originalVisPosBeforeEndBR = VisiblePosition(endBR, 0, DOWNSTREAM).previous(); >+ originalVisPosBeforeEndBR = VisiblePosition(positionBeforeNode(endBR), DOWNSTREAM).previous(); > > startBlock = enclosingBlock(insertionPos.node()); > >Index: Source/WebCore/editing/SelectionController.cpp >=================================================================== >--- Source/WebCore/editing/SelectionController.cpp (revision 78027) >+++ Source/WebCore/editing/SelectionController.cpp (working copy) >@@ -1315,8 +1315,8 @@ void SelectionController::selectFrameEle > > // Create compute positions before and after the element. > unsigned ownerElementNodeIndex = ownerElement->nodeIndex(); >- VisiblePosition beforeOwnerElement(VisiblePosition(ownerElementParent, ownerElementNodeIndex, SEL_DEFAULT_AFFINITY)); >- VisiblePosition afterOwnerElement(VisiblePosition(ownerElementParent, ownerElementNodeIndex + 1, VP_UPSTREAM_IF_POSSIBLE)); >+ VisiblePosition beforeOwnerElement(VisiblePosition(Position(ownerElementParent, ownerElementNodeIndex, Position::PositionIsOffsetInAnchor))); >+ VisiblePosition afterOwnerElement(VisiblePosition(Position(ownerElementParent, ownerElementNodeIndex + 1, Position::PositionIsOffsetInAnchor), VP_UPSTREAM_IF_POSSIBLE)); > > // Focus on the parent frame, and then select from before this element to after. > VisibleSelection newSelection(beforeOwnerElement, afterOwnerElement); >@@ -1387,8 +1387,8 @@ bool SelectionController::setSelectedRan > return false; > > // FIXME: Can we provide extentAffinity? >- VisiblePosition visibleStart(startContainer, startOffset, collapsed ? affinity : DOWNSTREAM); >- VisiblePosition visibleEnd(endContainer, endOffset, SEL_DEFAULT_AFFINITY); >+ VisiblePosition visibleStart(Position(startContainer, startOffset, Position::PositionIsOffsetInAnchor), collapsed ? affinity : DOWNSTREAM); >+ VisiblePosition visibleEnd(Position(endContainer, endOffset, Position::PositionIsOffsetInAnchor), SEL_DEFAULT_AFFINITY); > setSelection(VisibleSelection(visibleStart, visibleEnd), closeTyping); > return true; > } >Index: Source/WebCore/editing/TextIterator.cpp >=================================================================== >--- Source/WebCore/editing/TextIterator.cpp (revision 78027) >+++ Source/WebCore/editing/TextIterator.cpp (working copy) >@@ -878,8 +878,8 @@ bool TextIterator::shouldRepresentNodeOf > // and in that case we'll get null. We don't want to put in newlines at the start in that case. > // The currPos.isNotNull() check is needed because positions in non-HTML content > // (like SVG) do not have visible positions, and we don't want to emit for them either. >- VisiblePosition startPos = VisiblePosition(m_startContainer, m_startOffset, DOWNSTREAM); >- VisiblePosition currPos = VisiblePosition(m_node, 0, DOWNSTREAM); >+ VisiblePosition startPos = VisiblePosition(Position(m_startContainer, m_startOffset, Position::PositionIsOffsetInAnchor), DOWNSTREAM); >+ VisiblePosition currPos = VisiblePosition(positionBeforeNode(m_node), DOWNSTREAM); > return startPos.isNotNull() && currPos.isNotNull() && !inSameLine(startPos, currPos); > } > >Index: Source/WebCore/editing/TypingCommand.cpp >=================================================================== >--- Source/WebCore/editing/TypingCommand.cpp (revision 78027) >+++ Source/WebCore/editing/TypingCommand.cpp (working copy) >@@ -495,7 +495,7 @@ void TypingCommand::deleteKeyPressed(Tex > selection.modify(SelectionController::AlterationExtend, DirectionBackward, granularity); > // If the caret is just after a table, select the table and don't delete anything. > } else if (Node* table = isFirstPositionAfterTable(visibleStart)) { >- setEndingSelection(VisibleSelection(positionAfterNode(table), endingSelection().start(), DOWNSTREAM)); >+ setEndingSelection(VisibleSelection(positionBeforeNode(table), endingSelection().start(), DOWNSTREAM)); > typingAddedToOpenCommand(DeleteKey); > return; > } >Index: Source/WebCore/editing/VisiblePosition.cpp >=================================================================== >--- Source/WebCore/editing/VisiblePosition.cpp (revision 78027) >+++ Source/WebCore/editing/VisiblePosition.cpp (working copy) >@@ -48,12 +48,6 @@ VisiblePosition::VisiblePosition(const P > init(pos, affinity); > } > >-VisiblePosition::VisiblePosition(Node *node, int offset, EAffinity affinity) >-{ >- ASSERT(offset >= 0); >- init(Position(node, offset), affinity); >-} >- > void VisiblePosition::init(const Position& position, EAffinity affinity) > { > m_affinity = affinity; >@@ -106,7 +100,7 @@ VisiblePosition VisiblePosition::previou > Position VisiblePosition::leftVisuallyDistinctCandidate() const > { > Position p = m_deepPosition; >- if (!p.node()) >+ if (p.isNull()) > return Position(); > > Position downstreamStart = p.downstream(); >@@ -242,7 +236,7 @@ VisiblePosition VisiblePosition::left(bo > Position VisiblePosition::rightVisuallyDistinctCandidate() const > { > Position p = m_deepPosition; >- if (!p.node()) >+ if (p.isNull()) > return Position(); > > Position downstreamStart = p.downstream(); >@@ -451,10 +445,11 @@ Position VisiblePosition::canonicalPosit > // To fix this, we need to either a) add code to all paintCarets to pass the responsibility off to > // the appropriate renderer for VisiblePosition's like these, or b) canonicalize to the rightmost candidate > // unless the affinity is upstream. >- Node* node = position.node(); >- if (!node) >+ if (position.isNull()) > return Position(); > >+ Node* node = position.anchorNode(); >+ > ASSERT(node->document()); > node->document()->updateLayoutIgnorePendingStylesheets(); > >@@ -510,11 +505,12 @@ UChar32 VisiblePosition::characterAfter( > // We canonicalize to the first of two equivalent candidates, but the second of the two candidates > // is the one that will be inside the text node containing the character after this visible position. > Position pos = m_deepPosition.downstream(); >- Node* node = pos.node(); >- if (!node || !node->isTextNode()) >+ Node* node = pos.containerNode(); >+ if (!node || !node->isTextNode() || pos.anchorType() == Position::PositionIsAfterAnchor) > return 0; >- Text* textNode = static_cast<Text*>(pos.node()); >- unsigned offset = pos.deprecatedEditingOffset(); >+ ASSERT(pos.anchorType() == Position::PositionIsBeforeAnchor || pos.anchorType() == Position::PositionIsOffsetInAnchor); >+ Text* textNode = static_cast<Text*>(pos.containerNode()); >+ unsigned offset = pos.anchorType() == Position::PositionIsOffsetInAnchor ? pos.offsetInContainerNode() : 0; > unsigned length = textNode->length(); > if (offset >= length) > return 0; >@@ -527,11 +523,11 @@ UChar32 VisiblePosition::characterAfter( > > IntRect VisiblePosition::localCaretRect(RenderObject*& renderer) const > { >- Node* node = m_deepPosition.node(); >- if (!node) { >+ if (m_deepPosition.isNull()) { > renderer = 0; > return IntRect(); > } >+ Node* node = m_deepPosition.containerNode(); > > renderer = node->renderer(); > if (!renderer) >@@ -599,19 +595,19 @@ PassRefPtr<Range> makeRange(const Visibl > > Position s = start.deepEquivalent().parentAnchoredEquivalent(); > Position e = end.deepEquivalent().parentAnchoredEquivalent(); >- return Range::create(s.node()->document(), s.node(), s.deprecatedEditingOffset(), e.node(), e.deprecatedEditingOffset()); >+ return Range::create(s.containerNode()->document(), s.containerNode(), s.offsetInContainerNode(), e.containerNode(), e.offsetInContainerNode()); > } > > VisiblePosition startVisiblePosition(const Range *r, EAffinity affinity) > { > int exception = 0; >- return VisiblePosition(r->startContainer(exception), r->startOffset(exception), affinity); >+ return VisiblePosition(Position(r->startContainer(exception), r->startOffset(exception), Position::PositionIsOffsetInAnchor), affinity); > } > > VisiblePosition endVisiblePosition(const Range *r, EAffinity affinity) > { > int exception = 0; >- return VisiblePosition(r->endContainer(exception), r->endOffset(exception), affinity); >+ return VisiblePosition(Position(r->endContainer(exception), r->endOffset(exception), Position::PositionIsOffsetInAnchor), affinity); > } > > bool setStart(Range *r, const VisiblePosition &visiblePosition) >@@ -620,7 +616,7 @@ bool setStart(Range *r, const VisiblePos > return false; > Position p = visiblePosition.deepEquivalent().parentAnchoredEquivalent(); > int code = 0; >- r->setStart(p.node(), p.deprecatedEditingOffset(), code); >+ r->setStart(p.containerNode(), p.offsetInContainerNode(), code); > return code == 0; > } > >@@ -630,7 +626,7 @@ bool setEnd(Range *r, const VisiblePosit > return false; > Position p = visiblePosition.deepEquivalent().parentAnchoredEquivalent(); > int code = 0; >- r->setEnd(p.node(), p.deprecatedEditingOffset(), code); >+ r->setEnd(p.containerNode(), p.offsetInContainerNode(), code); > return code == 0; > } > >@@ -646,10 +642,10 @@ bool isFirstVisiblePositionInNode(const > { > if (visiblePosition.isNull()) > return false; >- >- if (!visiblePosition.deepEquivalent().node()->isDescendantOf(node)) >+ >+ if (!visiblePosition.deepEquivalent().containerNode()->isDescendantOf(node)) > return false; >- >+ > VisiblePosition previous = visiblePosition.previous(); > return previous.isNull() || !previous.deepEquivalent().node()->isDescendantOf(node); > } >@@ -658,10 +654,10 @@ bool isLastVisiblePositionInNode(const V > { > if (visiblePosition.isNull()) > return false; >- >- if (!visiblePosition.deepEquivalent().node()->isDescendantOf(node)) >+ >+ if (!visiblePosition.deepEquivalent().containerNode()->isDescendantOf(node)) > return false; >- >+ > VisiblePosition next = visiblePosition.next(); > return next.isNull() || !next.deepEquivalent().node()->isDescendantOf(node); > } >Index: Source/WebCore/editing/VisiblePosition.h >=================================================================== >--- Source/WebCore/editing/VisiblePosition.h (revision 78027) >+++ Source/WebCore/editing/VisiblePosition.h (working copy) >@@ -54,7 +54,6 @@ public: > // NOTE: UPSTREAM affinity will be used only if pos is at end of a wrapped line, > // otherwise it will be converted to DOWNSTREAM > VisiblePosition() : m_affinity(VP_DEFAULT_AFFINITY) { } >- VisiblePosition(Node*, int offset, EAffinity); > VisiblePosition(const Position&, EAffinity = VP_DEFAULT_AFFINITY); > > void clear() { m_deepPosition.clear(); } >Index: Source/WebCore/editing/htmlediting.cpp >=================================================================== >--- Source/WebCore/editing/htmlediting.cpp (revision 78027) >+++ Source/WebCore/editing/htmlediting.cpp (working copy) >@@ -426,7 +426,7 @@ static Node* firstInSpecialElement(const > for (Node* n = pos.node(); n && n->rootEditableElement() == rootEditableElement; n = n->parentNode()) > if (isSpecialElement(n)) { > VisiblePosition vPos = VisiblePosition(pos, DOWNSTREAM); >- VisiblePosition firstInElement = VisiblePosition(n, 0, DOWNSTREAM); >+ VisiblePosition firstInElement = VisiblePosition(firstPositionInOrBeforeNode(n), DOWNSTREAM); > if (isTableElement(n) && vPos == firstInElement.next()) > return n; > if (vPos == firstInElement) >@@ -442,7 +442,7 @@ static Node* lastInSpecialElement(const > for (Node* n = pos.node(); n && n->rootEditableElement() == rootEditableElement; n = n->parentNode()) > if (isSpecialElement(n)) { > VisiblePosition vPos = VisiblePosition(pos, DOWNSTREAM); >- VisiblePosition lastInElement = VisiblePosition(n, n->childNodeCount(), DOWNSTREAM); >+ VisiblePosition lastInElement = VisiblePosition(Position(n, n->childNodeCount(), Position::PositionIsOffsetInAnchor), DOWNSTREAM); > if (isTableElement(n) && vPos == lastInElement.previous()) > return n; > if (vPos == lastInElement) >@@ -519,7 +519,7 @@ VisiblePosition visiblePositionBeforeNod > { > ASSERT(node); > if (node->childNodeCount()) >- return VisiblePosition(node, 0, DOWNSTREAM); >+ return VisiblePosition(firstPositionInOrBeforeNode(node), DOWNSTREAM); > ASSERT(node->parentNode()); > return positionInParentBeforeNode(node); > } >@@ -529,7 +529,7 @@ VisiblePosition visiblePositionAfterNode > { > ASSERT(node); > if (node->childNodeCount()) >- return VisiblePosition(node, node->childNodeCount(), DOWNSTREAM); >+ return VisiblePosition(lastPositionInOrAfterNode(node), DOWNSTREAM); > ASSERT(node->parentNode()); > return positionInParentAfterNode(node); > } >Index: Source/WebCore/editing/visible_units.cpp >=================================================================== >--- Source/WebCore/editing/visible_units.cpp (revision 78027) >+++ Source/WebCore/editing/visible_units.cpp (working copy) >@@ -377,13 +377,8 @@ static VisiblePosition startPositionForL > startBox = startBox->nextLeafChild(); > } > >- int startOffset = 0; >- if (startBox->isInlineTextBox()) { >- InlineTextBox *startTextBox = static_cast<InlineTextBox *>(startBox); >- startOffset = startTextBox->start(); >- } >- >- VisiblePosition visPos = VisiblePosition(startNode, startOffset, DOWNSTREAM); >+ VisiblePosition visPos = startBox->isInlineTextBox() ? VisiblePosition(Position(startNode, static_cast<InlineTextBox *>(startBox)->start(), Position::PositionIsOffsetInAnchor), DOWNSTREAM) >+ : VisiblePosition(positionBeforeNode(startNode), DOWNSTREAM); > return positionAvoidingFirstPositionInTable(visPos); > } > >@@ -429,17 +424,19 @@ static VisiblePosition endPositionForLin > endBox = endBox->prevLeafChild(); > } > >- int endOffset = 1; >+ Position pos; > if (endNode->hasTagName(brTag)) { >- endOffset = 0; >+ pos = positionBeforeNode(endNode); > } else if (endBox->isInlineTextBox()) { > InlineTextBox *endTextBox = static_cast<InlineTextBox *>(endBox); >- endOffset = endTextBox->start(); >+ int endOffset = endTextBox->start(); > if (!endTextBox->isLineBreak()) > endOffset += endTextBox->len(); >- } >+ pos = Position(endNode, endOffset, Position::PositionIsOffsetInAnchor); >+ } else >+ pos = positionAfterNode(endNode); > >- return VisiblePosition(endNode, endOffset, VP_UPSTREAM_IF_POSSIBLE); >+ return VisiblePosition(pos, VP_UPSTREAM_IF_POSSIBLE); > } > > VisiblePosition endOfLine(const VisiblePosition& c) >@@ -575,7 +572,7 @@ VisiblePosition previousLinePosition(con > // Move to the start of the content in this block, which effectively moves us > // to the start of the line we're on. > Element* rootElement = node->isContentEditable() ? node->rootEditableElement() : node->document()->documentElement(); >- return VisiblePosition(rootElement, 0, DOWNSTREAM); >+ return VisiblePosition(firstPositionInNode(rootElement), DOWNSTREAM); > } > > static Node* nextLeafWithSameEditability(Node* node, int offset) >@@ -680,7 +677,7 @@ VisiblePosition nextLinePosition(const V > // Move to the end of the content in this block, which effectively moves us > // to the end of the line we're on. > Element* rootElement = node->isContentEditable() ? node->rootEditableElement() : node->document()->documentElement(); >- return VisiblePosition(rootElement, rootElement ? rootElement->childNodeCount() : 0, DOWNSTREAM); >+ return VisiblePosition(lastPositionInNode(rootElement), DOWNSTREAM); > } > > // --------- >@@ -752,6 +749,7 @@ VisiblePosition startOfParagraph(const V > > Node *node = startNode; > int offset = p.deprecatedEditingOffset(); >+ Position::AnchorType type = p.anchorType(); > > Node *n = startNode; > while (n) { >@@ -772,6 +770,7 @@ VisiblePosition startOfParagraph(const V > break; > > if (r->isText() && r->caretMaxRenderedOffset() > 0) { >+ type = Position::PositionIsOffsetInAnchor; > if (style->preserveNewline()) { > const UChar* chars = toRenderText(r)->characters(); > int i = toRenderText(r)->textLength(); >@@ -780,20 +779,23 @@ VisiblePosition startOfParagraph(const V > i = max(0, o); > while (--i >= 0) > if (chars[i] == '\n') >- return VisiblePosition(n, i + 1, DOWNSTREAM); >+ return VisiblePosition(Position(n, i + 1, Position::PositionIsOffsetInAnchor), DOWNSTREAM); > } > node = n; > offset = 0; > n = n->traversePreviousNodePostOrder(startBlock); > } else if (editingIgnoresContent(n) || isTableElement(n)) { > node = n; >- offset = 0; >+ type = Position::PositionIsBeforeAnchor; > n = n->previousSibling() ? n->previousSibling() : n->traversePreviousNodePostOrder(startBlock); > } else > n = n->traversePreviousNodePostOrder(startBlock); > } > >- return VisiblePosition(node, offset, DOWNSTREAM); >+ if (type == Position::PositionIsOffsetInAnchor) >+ return VisiblePosition(Position(node, offset, type), DOWNSTREAM); >+ >+ return VisiblePosition(Position(node, type), DOWNSTREAM); > } > > VisiblePosition endOfParagraph(const VisiblePosition &c, EditingBoundaryCrossingRule boundaryCrossingRule) >@@ -812,6 +814,7 @@ VisiblePosition endOfParagraph(const Vis > > Node *node = startNode; > int offset = p.deprecatedEditingOffset(); >+ Position::AnchorType type = p.anchorType(); > > Node *n = startNode; > while (n) { >@@ -834,25 +837,29 @@ VisiblePosition endOfParagraph(const Vis > // FIXME: We avoid returning a position where the renderer can't accept the caret. > if (r->isText() && r->caretMaxRenderedOffset() > 0) { > int length = toRenderText(r)->textLength(); >+ type = Position::PositionIsOffsetInAnchor; > if (style->preserveNewline()) { > const UChar* chars = toRenderText(r)->characters(); > int o = n == startNode ? offset : 0; > for (int i = o; i < length; ++i) > if (chars[i] == '\n') >- return VisiblePosition(n, i, DOWNSTREAM); >+ return VisiblePosition(Position(n, i, Position::PositionIsOffsetInAnchor), DOWNSTREAM); > } > node = n; > offset = r->caretMaxOffset(); > n = n->traverseNextNode(stayInsideBlock); > } else if (editingIgnoresContent(n) || isTableElement(n)) { > node = n; >- offset = lastOffsetForEditing(n); >+ type = Position::PositionIsAfterAnchor; > n = n->traverseNextSibling(stayInsideBlock); > } else > n = n->traverseNextNode(stayInsideBlock); > } > >- return VisiblePosition(node, offset, DOWNSTREAM); >+ if (type == Position::PositionIsOffsetInAnchor) >+ return VisiblePosition(Position(node, offset, type), DOWNSTREAM); >+ >+ return VisiblePosition(Position(node, type), DOWNSTREAM); > } > > VisiblePosition startOfNextParagraph(const VisiblePosition& visiblePosition) >@@ -926,7 +933,7 @@ VisiblePosition endOfBlock(const Visible > > Node *startBlock = startNode->enclosingBlockFlowElement(); > >- return VisiblePosition(startBlock, startBlock->childNodeCount(), VP_DEFAULT_AFFINITY); >+ return VisiblePosition(lastPositionInNode(startBlock), VP_DEFAULT_AFFINITY); > } > > bool inSameBlock(const VisiblePosition &a, const VisiblePosition &b) >@@ -951,7 +958,7 @@ VisiblePosition startOfDocument(const No > if (!node) > return VisiblePosition(); > >- return VisiblePosition(node->document()->documentElement(), 0, DOWNSTREAM); >+ return VisiblePosition(firstPositionInNode(node->document()->documentElement()), DOWNSTREAM); > } > > VisiblePosition startOfDocument(const VisiblePosition &c) >@@ -965,7 +972,7 @@ VisiblePosition endOfDocument(const Node > return VisiblePosition(); > > Element* doc = node->document()->documentElement(); >- return VisiblePosition(doc, doc->childNodeCount(), DOWNSTREAM); >+ return VisiblePosition(lastPositionInNode(doc), DOWNSTREAM); > } > > VisiblePosition endOfDocument(const VisiblePosition &c) >@@ -1121,9 +1128,8 @@ static VisiblePosition logicalStartPosit > if (!logicalStartNode) > return VisiblePosition(); > >- int startOffset = logicalStartBox->caretMinOffset(); >- >- VisiblePosition visPos = VisiblePosition(logicalStartNode, startOffset, DOWNSTREAM); >+ VisiblePosition visPos = logicalStartNode->isTextNode() ? VisiblePosition(Position(logicalStartNode, logicalStartBox->caretMinOffset(), Position::PositionIsOffsetInAnchor), DOWNSTREAM) >+ : VisiblePosition(positionBeforeNode(logicalStartNode), DOWNSTREAM); > return positionAvoidingFirstPositionInTable(visPos); > } > >@@ -1157,17 +1163,19 @@ static VisiblePosition logicalEndPositio > if (!logicalEndNode) > return VisiblePosition(); > >- int endOffset = 1; >+ Position pos; > if (logicalEndNode->hasTagName(brTag)) >- endOffset = 0; >+ pos = positionBeforeNode(logicalEndNode); > else if (logicalEndBox->isInlineTextBox()) { > InlineTextBox* endTextBox = static_cast<InlineTextBox*>(logicalEndBox); >- endOffset = endTextBox->start(); >+ int endOffset = endTextBox->start(); > if (!endTextBox->isLineBreak()) > endOffset += endTextBox->len(); >- } >+ pos = Position(logicalEndNode, endOffset, Position::PositionIsOffsetInAnchor); >+ } else >+ pos = positionAfterNode(logicalEndNode); > >- return VisiblePosition(logicalEndNode, endOffset, VP_UPSTREAM_IF_POSSIBLE); >+ return VisiblePosition(pos, VP_UPSTREAM_IF_POSSIBLE); > } > > bool inSameLogicalLine(const VisiblePosition& a, const VisiblePosition& b) >Index: Source/WebCore/page/DOMSelection.cpp >=================================================================== >--- Source/WebCore/page/DOMSelection.cpp (revision 78027) >+++ Source/WebCore/page/DOMSelection.cpp (working copy) >@@ -211,7 +211,8 @@ void DOMSelection::collapse(Node* node, > if (!isValidForPosition(node)) > return; > >- m_frame->selection()->moveTo(VisiblePosition(node, offset, DOWNSTREAM)); >+ // FIXME: Eliminate legacy editing positions >+ m_frame->selection()->moveTo(VisiblePosition(Position(node, offset), DOWNSTREAM)); > } > > void DOMSelection::collapseToEnd(ExceptionCode& ec) >@@ -264,8 +265,9 @@ void DOMSelection::setBaseAndExtent(Node > if (!isValidForPosition(baseNode) || !isValidForPosition(extentNode)) > return; > >- VisiblePosition visibleBase = VisiblePosition(baseNode, baseOffset, DOWNSTREAM); >- VisiblePosition visibleExtent = VisiblePosition(extentNode, extentOffset, DOWNSTREAM); >+ // FIXME: Eliminate legacy editing positions >+ VisiblePosition visibleBase = VisiblePosition(Position(baseNode, baseOffset), DOWNSTREAM); >+ VisiblePosition visibleExtent = VisiblePosition(Position(extentNode, extentOffset), DOWNSTREAM); > > m_frame->selection()->moveTo(visibleBase, visibleExtent); > } >@@ -282,7 +284,8 @@ void DOMSelection::setPosition(Node* nod > if (!isValidForPosition(node)) > return; > >- m_frame->selection()->moveTo(VisiblePosition(node, offset, DOWNSTREAM)); >+ // FIXME: Eliminate legacy editing positions >+ m_frame->selection()->moveTo(VisiblePosition(Position(node, offset), DOWNSTREAM)); > } > > void DOMSelection::modify(const String& alterString, const String& directionString, const String& granularityString) >@@ -353,7 +356,8 @@ void DOMSelection::extend(Node* node, in > if (!isValidForPosition(node)) > return; > >- m_frame->selection()->setExtent(VisiblePosition(node, offset, DOWNSTREAM)); >+ // FIXME: Eliminate legacy editing positions >+ m_frame->selection()->setExtent(VisiblePosition(Position(node, offset), DOWNSTREAM)); > } > > PassRefPtr<Range> DOMSelection::getRangeAt(int index, ExceptionCode& ec) >Index: Source/WebCore/page/EventHandler.cpp >=================================================================== >--- Source/WebCore/page/EventHandler.cpp (revision 78027) >+++ Source/WebCore/page/EventHandler.cpp (working copy) >@@ -373,7 +373,7 @@ bool EventHandler::handleMousePressEvent > > VisiblePosition visiblePos(innerNode->renderer()->positionForPoint(event.localPoint())); > if (visiblePos.isNull()) >- visiblePos = VisiblePosition(innerNode, 0, DOWNSTREAM); >+ visiblePos = VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOWNSTREAM); > Position pos = visiblePos.deepEquivalent(); > > VisibleSelection newSelection = m_frame->selection()->selection(); >Index: Source/WebCore/rendering/RenderObject.cpp >=================================================================== >--- Source/WebCore/rendering/RenderObject.cpp (revision 78027) >+++ Source/WebCore/rendering/RenderObject.cpp (working copy) >@@ -2654,7 +2654,8 @@ VisiblePosition RenderObject::createVisi > if (candidate.node()->isContentEditable()) > return VisiblePosition(candidate, affinity); > } >- return VisiblePosition(node, offset, affinity); >+ // FIXME: Eliminate legacy editing positions >+ return VisiblePosition(Position(node, offset), affinity); > } > > // We don't want to cross the boundary between editable and non-editable >@@ -2669,7 +2670,7 @@ VisiblePosition RenderObject::createVisi > RenderObject* renderer = child; > while ((renderer = renderer->nextInPreOrder(parent))) { > if (Node* node = renderer->node()) >- return VisiblePosition(node, 0, DOWNSTREAM); >+ return VisiblePosition(firstPositionInOrBeforeNode(node), DOWNSTREAM); > } > > // Find non-anonymous content before. >@@ -2678,12 +2679,12 @@ VisiblePosition RenderObject::createVisi > if (renderer == parent) > break; > if (Node* node = renderer->node()) >- return VisiblePosition(lastDeepEditingPositionForNode(node), DOWNSTREAM); >+ return VisiblePosition(lastPositionInOrAfterNode(node), DOWNSTREAM); > } > > // Use the parent itself unless it too is anonymous. > if (Node* node = parent->node()) >- return VisiblePosition(node, 0, DOWNSTREAM); >+ return VisiblePosition(firstPositionInOrBeforeNode(node), DOWNSTREAM); > > // Repeat at the next level up. > child = parent; >Index: Source/WebCore/rendering/RenderTextControl.cpp >=================================================================== >--- Source/WebCore/rendering/RenderTextControl.cpp (revision 78027) >+++ Source/WebCore/rendering/RenderTextControl.cpp (working copy) >@@ -321,7 +321,7 @@ PassRefPtr<Range> RenderTextControl::sel > VisiblePosition RenderTextControl::visiblePositionForIndex(int index) const > { > if (index <= 0) >- return VisiblePosition(m_innerText.get(), 0, DOWNSTREAM); >+ return VisiblePosition(Position(m_innerText.get(), 0, Position::PositionIsOffsetInAnchor), DOWNSTREAM); > ExceptionCode ec = 0; > RefPtr<Range> range = Range::create(document()); > range->selectNodeContents(m_innerText.get(), ec); >@@ -332,7 +332,7 @@ VisiblePosition RenderTextControl::visib > ASSERT(!ec); > int endOffset = it.range()->endOffset(ec); > ASSERT(!ec); >- return VisiblePosition(endContainer, endOffset, UPSTREAM); >+ return VisiblePosition(Position(endContainer, endOffset, Position::PositionIsOffsetInAnchor), UPSTREAM); > } > > int RenderTextControl::indexForVisiblePosition(const VisiblePosition& pos) const >Index: Source/WebCore/svg/SVGTextContentElement.cpp >=================================================================== >--- Source/WebCore/svg/SVGTextContentElement.cpp (revision 78027) >+++ Source/WebCore/svg/SVGTextContentElement.cpp (working copy) >@@ -145,7 +145,7 @@ void SVGTextContentElement::selectSubStr > return; > > // Find selection start >- VisiblePosition start(const_cast<SVGTextContentElement*>(this), 0, SEL_DEFAULT_AFFINITY); >+ VisiblePosition start(firstPositionInNode(const_cast<SVGTextContentElement*>(this))); > for (unsigned i = 0; i < charnum; ++i) > start = start.next(); > >Index: Source/WebKit/mac/ChangeLog >=================================================================== >--- Source/WebKit/mac/ChangeLog (revision 78027) >+++ Source/WebKit/mac/ChangeLog (working copy) >@@ -1,3 +1,19 @@ >+2011-02-08 Levi Weintraub <leviw@chromium.org> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Stop instantiating legacy editing Positions in VisiblePosition >+ https://bugs.webkit.org/show_bug.cgi?id=52919 >+ >+ Changing usage of legacy VisiblePosition constructor. Since we were dealing >+ with positions from DOM Ranges, we're guaranteed a parent-anchored position. >+ >+ * WebView/WebFrame.mm: >+ (-[WebFrame _caretRectAtPosition:affinity:]): >+ * WebView/WebFrameInternal.h: >+ * WebView/WebTextCompletionController.mm: >+ (-[WebTextCompletionController doCompletion]): >+ > 2011-02-08 Dan Bernstein <mitz@apple.com> > > Reviewed by Jon Honeycutt and Maciej Stachowiak. >Index: Source/WebKit/mac/WebView/WebFrame.mm >=================================================================== >--- Source/WebKit/mac/WebView/WebFrame.mm (revision 78027) >+++ Source/WebKit/mac/WebView/WebFrame.mm (working copy) >@@ -660,9 +660,9 @@ - (NSString *)_stringByEvaluatingJavaScr > return ustringToString(result.toString(_private->coreFrame->script()->globalObject(mainThreadNormalWorld())->globalExec())); > } > >-- (NSRect)_caretRectAtNode:(DOMNode *)node offset:(int)offset affinity:(NSSelectionAffinity)affinity >+- (NSRect)_caretRectAtPosition:(const Position&)pos affinity:(NSSelectionAffinity)affinity > { >- VisiblePosition visiblePosition(core(node), offset, static_cast<EAffinity>(affinity)); >+ VisiblePosition visiblePosition(pos, static_cast<EAffinity>(affinity)); > return visiblePosition.absoluteCaretBounds(); > } > >Index: Source/WebKit/mac/WebView/WebFrameInternal.h >=================================================================== >--- Source/WebKit/mac/WebView/WebFrameInternal.h (revision 78027) >+++ Source/WebKit/mac/WebView/WebFrameInternal.h (working copy) >@@ -32,6 +32,7 @@ > #import "WebPreferencesPrivate.h" > #import <WebCore/EditAction.h> > #import <WebCore/FrameLoaderTypes.h> >+#import <WebCore/Position.h> > #import <WebCore/SelectionController.h> > #import <WebCore/Settings.h> > >@@ -134,7 +135,7 @@ @interface WebFrame (WebInternal) > > - (NSString *)_markupStringFromRange:(DOMRange *)range nodes:(NSArray **)nodes; > >-- (NSRect)_caretRectAtNode:(DOMNode *)node offset:(int)offset affinity:(NSSelectionAffinity)affinity; >+- (NSRect)_caretRectAtPosition:(const WebCore::Position&)pos affinity:(NSSelectionAffinity)affinity; > - (NSRect)_firstRectForDOMRange:(DOMRange *)range; > - (void)_scrollDOMRangeToVisible:(DOMRange *)range; > >Index: Source/WebKit/mac/WebView/WebTextCompletionController.mm >=================================================================== >--- Source/WebKit/mac/WebView/WebTextCompletionController.mm (revision 78027) >+++ Source/WebKit/mac/WebView/WebTextCompletionController.mm (working copy) >@@ -28,6 +28,7 @@ > > #import "WebTextCompletionController.h" > >+#import "DOMNodeInternal.h" > #import "DOMRangeInternal.h" > #import "WebFrameInternal.h" > #import "WebHTMLViewInternal.h" >@@ -203,7 +204,7 @@ - (void)doCompletion > ASSERT(!_originalString); // this should only be set IFF we have a popup window > _originalString = [[frame _stringForRange:selection] retain]; > [self _buildUI]; >- NSRect wordRect = [frame _caretRectAtNode:[wholeWord startContainer] offset:[wholeWord startOffset] affinity:NSSelectionAffinityDownstream]; >+ NSRect wordRect = [frame _caretRectAtPosition:Position(core([wholeWord startContainer]), [wholeWord startOffset], Position::PositionIsOffsetInAnchor) affinity:NSSelectionAffinityDownstream]; > // +1 to be under the word, not the caret > // FIXME - 3769652 - Wrong positioning for right to left languages. We should line up the upper > // right corner with the caret instead of upper left, and the +1 would be a -1.
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 52919
:
80139
|
81280
|
81313
|
81315
|
81552
|
81698
|
81769
|
81900