Changeset 96187 in webkit
- Timestamp:
- Sep 27, 2011 10:04:20 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r96186 r96187 1 2011-09-27 Ryosuke Niwa <rniwa@webkit.org> 2 3 Simplify ReplaceSelectionCommand::positionAtStartOfInsertedContent 4 https://bugs.webkit.org/show_bug.cgi?id=68939 5 6 Reviewed by Darin Adler. 7 8 Simplified ReplaceSelectionCommand::positionAtStartOfInsertedContent. 9 10 This change revealed a bug in removeUnrenderedTextNodesAtEnds that text nodes without any visible 11 text at ends are not removed when it has a render object. Fixed the bug by checking the length of 12 the rendered text. (Tested by editing/pasteboard/pasting-word-in-div-extra-line.html) 13 14 This further revealed that caretMaxRenderedOffset doesn't return an offset and caretMaxRenderedOffset 15 on InlineBox, InlineTextBox, RenderObject, RenderBR, RenderPlaced are never called. To address this 16 issue, renamed caretMaxRenderedOffset to renderedTextLength for RenderText and removed the rest. 17 18 * dom/Position.cpp: 19 (WebCore::Position::rendersInDifferentPosition): 20 * editing/ReplaceSelectionCommand.cpp: 21 (WebCore::nodeHasVisibleRenderText): Added. 22 (WebCore::ReplaceSelectionCommand::removeUnrenderedTextNodesAtEnds): Calls nodeHasVisibleRenderText. 23 (WebCore::ReplaceSelectionCommand::positionAtStartOfInsertedContent): Simplified. 24 * editing/visible_units.cpp: 25 (WebCore::startOfParagraph): Calls renderedTextLength. 26 (WebCore::endOfParagraph): Ditto. 27 * rendering/InlineBox.cpp: Removed caretMaxRenderedOffset. 28 * rendering/InlineBox.h: Ditto. 29 * rendering/InlineTextBox.cpp: Ditto. 30 * rendering/InlineTextBox.h: Ditto. 31 * rendering/RenderBR.cpp: Ditto. 32 * rendering/RenderBR.h: Ditto. 33 * rendering/RenderObject.cpp: Ditto. 34 * rendering/RenderObject.h: Ditto. 35 * rendering/RenderReplaced.cpp: Ditto. 36 * rendering/RenderReplaced.h: Ditto. 37 * rendering/RenderText.cpp: 38 (WebCore::RenderText::renderedTextLength): Renamed from caretMaxRenderedOffset. 39 * rendering/RenderText.h: 40 1 41 2011-09-27 James Robinson <jamesr@chromium.org> 2 42 -
trunk/Source/WebCore/dom/Position.cpp
r89952 r96187 897 897 } 898 898 899 static unsigned caretMaxRenderedOffset(const Node* n)900 {901 RenderObject* r = n->renderer();902 if (r)903 return r->caretMaxRenderedOffset();904 905 if (n->isCharacterDataNode())906 return static_cast<const CharacterData*>(n)->length();907 return 1;908 }909 910 899 bool Position::isRenderedCharacter() const 911 900 { … … 993 982 LOG(Editing, "posRenderer: %p [%p]\n", posRenderer, b2); 994 983 LOG(Editing, "posRenderedOffset: %d\n", posRenderedOffset); 995 LOG(Editing, "node min/max: %d:%d\n", caretMinOffset(deprecatedNode()), caretMax RenderedOffset(deprecatedNode()));996 LOG(Editing, "pos node min/max: %d:%d\n", caretMinOffset(pos.deprecatedNode()), caretMax RenderedOffset(pos.deprecatedNode()));984 LOG(Editing, "node min/max: %d:%d\n", caretMinOffset(deprecatedNode()), caretMaxOffset(deprecatedNode())); 985 LOG(Editing, "pos node min/max: %d:%d\n", caretMinOffset(pos.deprecatedNode()), caretMaxOffset(pos.deprecatedNode())); 997 986 LOG(Editing, "----------------------------------------------------------------------\n"); 998 987 … … 1006 995 1007 996 if (nextRenderedEditable(deprecatedNode()) == pos.deprecatedNode() 1008 && thisRenderedOffset == (int)caretMaxRenderedOffset(deprecatedNode()) && !posRenderedOffset) {997 && thisRenderedOffset == caretMaxOffset(deprecatedNode()) && !posRenderedOffset) { 1009 998 return false; 1010 999 } 1011 1000 1012 1001 if (previousRenderedEditable(deprecatedNode()) == pos.deprecatedNode() 1013 && !thisRenderedOffset && posRenderedOffset == (int)caretMaxRenderedOffset(pos.deprecatedNode())) {1002 && !thisRenderedOffset && posRenderedOffset == caretMaxOffset(pos.deprecatedNode())) { 1014 1003 return false; 1015 1004 } -
trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp
r96084 r96187 47 47 #include "NodeList.h" 48 48 #include "RenderObject.h" 49 #include "RenderText.h" 49 50 #include "SmartReplace.h" 50 51 #include "TextIterator.h" … … 554 555 } 555 556 557 static inline bool nodeHasVisibleRenderText(Text* text) 558 { 559 return text->renderer() && toRenderText(text->renderer())->renderedTextLength() > 0; 560 } 561 556 562 void ReplaceSelectionCommand::removeUnrenderedTextNodesAtEnds() 557 563 { 558 564 document()->updateLayoutIgnorePendingStylesheets(); 559 if (!m_lastLeafInserted->renderer() 560 && m_lastLeafInserted->isTextNode() 565 if (m_lastLeafInserted->isTextNode() && !nodeHasVisibleRenderText(static_cast<Text*>(m_lastLeafInserted.get())) 561 566 && !enclosingNodeWithTag(firstPositionInOrBeforeNode(m_lastLeafInserted.get()), selectTag) 562 567 && !enclosingNodeWithTag(firstPositionInOrBeforeNode(m_lastLeafInserted.get()), scriptTag)) { … … 574 579 // We don't have to make sure that m_firstNodeInserted isn't inside a select or script element, because 575 580 // it is a top level node in the fragment and the user can't insert into those elements. 576 if (!m_firstNodeInserted->renderer() && 577 m_firstNodeInserted->isTextNode()) { 581 if (m_firstNodeInserted->isTextNode() && !nodeHasVisibleRenderText(static_cast<Text*>(m_firstNodeInserted.get()))) { 578 582 if (m_firstNodeInserted == m_lastLeafInserted) { 579 583 removeNode(m_firstNodeInserted.get()); … … 607 611 VisiblePosition ReplaceSelectionCommand::positionAtStartOfInsertedContent() 608 612 { 609 // Return the inserted content's first VisiblePosition. 610 return VisiblePosition(nextCandidate(positionInParentBeforeNode(m_firstNodeInserted.get()))); 613 return firstPositionInOrBeforeNode(m_firstNodeInserted.get()); 611 614 } 612 615 -
trunk/Source/WebCore/editing/visible_units.cpp
r94988 r96187 765 765 break; 766 766 767 if (r->isText() && r->caretMaxRenderedOffset() > 0) {767 if (r->isText() && toRenderText(r)->renderedTextLength()) { 768 768 ASSERT(n->isTextNode()); 769 769 type = Position::PositionIsOffsetInAnchor; … … 843 843 844 844 // FIXME: We avoid returning a position where the renderer can't accept the caret. 845 if (r->isText() && r->caretMaxRenderedOffset() > 0) {845 if (r->isText() && toRenderText(r)->renderedTextLength()) { 846 846 ASSERT(n->isTextNode()); 847 847 int length = toRenderText(r)->textLength(); -
trunk/Source/WebCore/rendering/InlineBox.cpp
r90869 r96187 156 156 } 157 157 158 unsigned InlineBox::caretMaxRenderedOffset() const159 {160 return 1;161 }162 163 158 void InlineBox::dirtyLineBoxes() 164 159 { -
trunk/Source/WebCore/rendering/InlineBox.h
r93333 r96187 279 279 virtual int caretMinOffset() const; 280 280 virtual int caretMaxOffset() const; 281 virtual unsigned caretMaxRenderedOffset() const;282 281 283 282 unsigned char bidiLevel() const { return m_bidiEmbeddingLevel; } -
trunk/Source/WebCore/rendering/InlineTextBox.cpp
r94640 r96187 1210 1210 } 1211 1211 1212 unsigned InlineTextBox::caretMaxRenderedOffset() const1213 {1214 return m_start + m_len;1215 }1216 1217 1212 float InlineTextBox::textPos() const 1218 1213 { -
trunk/Source/WebCore/rendering/InlineTextBox.h
r94640 r96187 147 147 148 148 private: 149 virtual unsigned caretMaxRenderedOffset() const;150 151 149 float textPos() const; // returns the x position relative to the left start of the text line. 152 150 -
trunk/Source/WebCore/rendering/RenderBR.cpp
r90250 r96187 69 69 } 70 70 71 unsigned RenderBR::caretMaxRenderedOffset() const72 {73 return 1;74 }75 76 71 VisiblePosition RenderBR::positionForPoint(const LayoutPoint&) 77 72 { -
trunk/Source/WebCore/rendering/RenderBR.h
r90596 r96187 51 51 virtual int caretMinOffset() const; 52 52 virtual int caretMaxOffset() const; 53 virtual unsigned caretMaxRenderedOffset() const;54 53 55 54 virtual VisiblePosition positionForPoint(const LayoutPoint&); -
trunk/Source/WebCore/rendering/RenderObject.cpp
r95985 r96187 2551 2551 } 2552 2552 2553 unsigned RenderObject::caretMaxRenderedOffset() const2554 {2555 return 0;2556 }2557 2558 2553 int RenderObject::previousOffset(int current) const 2559 2554 { -
trunk/Source/WebCore/rendering/RenderObject.h
r95598 r96187 792 792 virtual int caretMinOffset() const; 793 793 virtual int caretMaxOffset() const; 794 virtual unsigned caretMaxRenderedOffset() const;795 794 796 795 virtual int previousOffset(int current) const; -
trunk/Source/WebCore/rendering/RenderReplaced.cpp
r95502 r96187 411 411 } 412 412 413 unsigned RenderReplaced::caretMaxRenderedOffset() const414 {415 return 1;416 }417 418 413 VisiblePosition RenderReplaced::positionForPoint(const LayoutPoint& point) 419 414 { -
trunk/Source/WebCore/rendering/RenderReplaced.h
r92252 r96187 78 78 virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer) const; 79 79 80 virtual unsigned caretMaxRenderedOffset() const;81 80 virtual VisiblePosition positionForPoint(const LayoutPoint&); 82 81 -
trunk/Source/WebCore/rendering/RenderText.cpp
r94947 r96187 1596 1596 { 1597 1597 InlineTextBox* box = lastTextBox(); 1598 if (! box)1598 if (!lastTextBox()) 1599 1599 return textLength(); 1600 1600 1601 int maxOffset = box->start() + box->len(); 1601 1602 for (box = box->prevTextBox(); box; box = box->prevTextBox()) … … 1604 1605 } 1605 1606 1606 unsigned RenderText:: caretMaxRenderedOffset() const1607 unsigned RenderText::renderedTextLength() const 1607 1608 { 1608 1609 int l = 0; -
trunk/Source/WebCore/rendering/RenderText.h
r93656 r96187 108 108 virtual int caretMinOffset() const; 109 109 virtual int caretMaxOffset() const; 110 virtual unsigned caretMaxRenderedOffset() const;110 virtual unsigned renderedTextLength() const; 111 111 112 112 virtual int previousOffset(int current) const;
Note: See TracChangeset
for help on using the changeset viewer.