Changeset 96187 in webkit


Ignore:
Timestamp:
Sep 27, 2011 10:04:20 PM (13 years ago)
Author:
rniwa@webkit.org
Message:

Simplify ReplaceSelectionCommand::positionAtStartOfInsertedContent
https://bugs.webkit.org/show_bug.cgi?id=68939

Reviewed by Darin Adler.

Simplified ReplaceSelectionCommand::positionAtStartOfInsertedContent.

This change revealed a bug in removeUnrenderedTextNodesAtEnds that text nodes without any visible
text at ends are not removed when it has a render object. Fixed the bug by checking the length of
the rendered text. (Tested by editing/pasteboard/pasting-word-in-div-extra-line.html)

This further revealed that caretMaxRenderedOffset doesn't return an offset and caretMaxRenderedOffset
on InlineBox, InlineTextBox, RenderObject, RenderBR, RenderPlaced are never called. To address this
issue, renamed caretMaxRenderedOffset to renderedTextLength for RenderText and removed the rest.

  • dom/Position.cpp:

(WebCore::Position::rendersInDifferentPosition):

  • editing/ReplaceSelectionCommand.cpp:

(WebCore::nodeHasVisibleRenderText): Added.
(WebCore::ReplaceSelectionCommand::removeUnrenderedTextNodesAtEnds): Calls nodeHasVisibleRenderText.
(WebCore::ReplaceSelectionCommand::positionAtStartOfInsertedContent): Simplified.

  • editing/visible_units.cpp:

(WebCore::startOfParagraph): Calls renderedTextLength.
(WebCore::endOfParagraph): Ditto.

  • rendering/InlineBox.cpp: Removed caretMaxRenderedOffset.
  • rendering/InlineBox.h: Ditto.
  • rendering/InlineTextBox.cpp: Ditto.
  • rendering/InlineTextBox.h: Ditto.
  • rendering/RenderBR.cpp: Ditto.
  • rendering/RenderBR.h: Ditto.
  • rendering/RenderObject.cpp: Ditto.
  • rendering/RenderObject.h: Ditto.
  • rendering/RenderReplaced.cpp: Ditto.
  • rendering/RenderReplaced.h: Ditto.
  • rendering/RenderText.cpp:

(WebCore::RenderText::renderedTextLength): Renamed from caretMaxRenderedOffset.

  • rendering/RenderText.h:
Location:
trunk/Source/WebCore
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r96186 r96187  
     12011-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
    1412011-09-27  James Robinson  <jamesr@chromium.org>
    242
  • trunk/Source/WebCore/dom/Position.cpp

    r89952 r96187  
    897897}
    898898
    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 
    910899bool Position::isRenderedCharacter() const
    911900{
     
    993982    LOG(Editing, "posRenderer:            %p [%p]\n", posRenderer, b2);
    994983    LOG(Editing, "posRenderedOffset:      %d\n", posRenderedOffset);
    995     LOG(Editing, "node min/max:           %d:%d\n", caretMinOffset(deprecatedNode()), caretMaxRenderedOffset(deprecatedNode()));
    996     LOG(Editing, "pos node min/max:       %d:%d\n", caretMinOffset(pos.deprecatedNode()), caretMaxRenderedOffset(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()));
    997986    LOG(Editing, "----------------------------------------------------------------------\n");
    998987
     
    1006995
    1007996    if (nextRenderedEditable(deprecatedNode()) == pos.deprecatedNode()
    1008         && thisRenderedOffset == (int)caretMaxRenderedOffset(deprecatedNode()) && !posRenderedOffset) {
     997        && thisRenderedOffset == caretMaxOffset(deprecatedNode()) && !posRenderedOffset) {
    1009998        return false;
    1010999    }
    10111000   
    10121001    if (previousRenderedEditable(deprecatedNode()) == pos.deprecatedNode()
    1013         && !thisRenderedOffset && posRenderedOffset == (int)caretMaxRenderedOffset(pos.deprecatedNode())) {
     1002        && !thisRenderedOffset && posRenderedOffset == caretMaxOffset(pos.deprecatedNode())) {
    10141003        return false;
    10151004    }
  • trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp

    r96084 r96187  
    4747#include "NodeList.h"
    4848#include "RenderObject.h"
     49#include "RenderText.h"
    4950#include "SmartReplace.h"
    5051#include "TextIterator.h"
     
    554555}
    555556
     557static inline bool nodeHasVisibleRenderText(Text* text)
     558{
     559    return text->renderer() && toRenderText(text->renderer())->renderedTextLength() > 0;
     560}
     561
    556562void ReplaceSelectionCommand::removeUnrenderedTextNodesAtEnds()
    557563{
    558564    document()->updateLayoutIgnorePendingStylesheets();
    559     if (!m_lastLeafInserted->renderer()
    560         && m_lastLeafInserted->isTextNode()
     565    if (m_lastLeafInserted->isTextNode() && !nodeHasVisibleRenderText(static_cast<Text*>(m_lastLeafInserted.get()))
    561566        && !enclosingNodeWithTag(firstPositionInOrBeforeNode(m_lastLeafInserted.get()), selectTag)
    562567        && !enclosingNodeWithTag(firstPositionInOrBeforeNode(m_lastLeafInserted.get()), scriptTag)) {
     
    574579    // We don't have to make sure that m_firstNodeInserted isn't inside a select or script element, because
    575580    // 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()))) {
    578582        if (m_firstNodeInserted == m_lastLeafInserted) {
    579583            removeNode(m_firstNodeInserted.get());
     
    607611VisiblePosition ReplaceSelectionCommand::positionAtStartOfInsertedContent()
    608612{
    609     // Return the inserted content's first VisiblePosition.
    610     return VisiblePosition(nextCandidate(positionInParentBeforeNode(m_firstNodeInserted.get())));
     613    return firstPositionInOrBeforeNode(m_firstNodeInserted.get());
    611614}
    612615
  • trunk/Source/WebCore/editing/visible_units.cpp

    r94988 r96187  
    765765            break;
    766766
    767         if (r->isText() && r->caretMaxRenderedOffset() > 0) {
     767        if (r->isText() && toRenderText(r)->renderedTextLength()) {
    768768            ASSERT(n->isTextNode());
    769769            type = Position::PositionIsOffsetInAnchor;
     
    843843
    844844        // 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()) {
    846846            ASSERT(n->isTextNode());
    847847            int length = toRenderText(r)->textLength();
  • trunk/Source/WebCore/rendering/InlineBox.cpp

    r90869 r96187  
    156156}
    157157
    158 unsigned InlineBox::caretMaxRenderedOffset() const
    159 {
    160     return 1;
    161 }
    162 
    163158void InlineBox::dirtyLineBoxes()
    164159{
  • trunk/Source/WebCore/rendering/InlineBox.h

    r93333 r96187  
    279279    virtual int caretMinOffset() const;
    280280    virtual int caretMaxOffset() const;
    281     virtual unsigned caretMaxRenderedOffset() const;
    282281
    283282    unsigned char bidiLevel() const { return m_bidiEmbeddingLevel; }
  • trunk/Source/WebCore/rendering/InlineTextBox.cpp

    r94640 r96187  
    12101210}
    12111211
    1212 unsigned InlineTextBox::caretMaxRenderedOffset() const
    1213 {
    1214     return m_start + m_len;
    1215 }
    1216 
    12171212float InlineTextBox::textPos() const
    12181213{
  • trunk/Source/WebCore/rendering/InlineTextBox.h

    r94640 r96187  
    147147
    148148private:
    149     virtual unsigned caretMaxRenderedOffset() const;
    150 
    151149    float textPos() const; // returns the x position relative to the left start of the text line.
    152150
  • trunk/Source/WebCore/rendering/RenderBR.cpp

    r90250 r96187  
    6969}
    7070
    71 unsigned RenderBR::caretMaxRenderedOffset() const
    72 {
    73     return 1;
    74 }
    75 
    7671VisiblePosition RenderBR::positionForPoint(const LayoutPoint&)
    7772{
  • trunk/Source/WebCore/rendering/RenderBR.h

    r90596 r96187  
    5151    virtual int caretMinOffset() const;
    5252    virtual int caretMaxOffset() const;
    53     virtual unsigned caretMaxRenderedOffset() const;
    5453
    5554    virtual VisiblePosition positionForPoint(const LayoutPoint&);
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r95985 r96187  
    25512551}
    25522552
    2553 unsigned RenderObject::caretMaxRenderedOffset() const
    2554 {
    2555     return 0;
    2556 }
    2557 
    25582553int RenderObject::previousOffset(int current) const
    25592554{
  • trunk/Source/WebCore/rendering/RenderObject.h

    r95598 r96187  
    792792    virtual int caretMinOffset() const;
    793793    virtual int caretMaxOffset() const;
    794     virtual unsigned caretMaxRenderedOffset() const;
    795794
    796795    virtual int previousOffset(int current) const;
  • trunk/Source/WebCore/rendering/RenderReplaced.cpp

    r95502 r96187  
    411411}
    412412
    413 unsigned RenderReplaced::caretMaxRenderedOffset() const
    414 {
    415     return 1;
    416 }
    417 
    418413VisiblePosition RenderReplaced::positionForPoint(const LayoutPoint& point)
    419414{
  • trunk/Source/WebCore/rendering/RenderReplaced.h

    r92252 r96187  
    7878    virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer) const;
    7979
    80     virtual unsigned caretMaxRenderedOffset() const;
    8180    virtual VisiblePosition positionForPoint(const LayoutPoint&);
    8281   
  • trunk/Source/WebCore/rendering/RenderText.cpp

    r94947 r96187  
    15961596{
    15971597    InlineTextBox* box = lastTextBox();
    1598     if (!box)
     1598    if (!lastTextBox())
    15991599        return textLength();
     1600
    16001601    int maxOffset = box->start() + box->len();
    16011602    for (box = box->prevTextBox(); box; box = box->prevTextBox())
     
    16041605}
    16051606
    1606 unsigned RenderText::caretMaxRenderedOffset() const
     1607unsigned RenderText::renderedTextLength() const
    16071608{
    16081609    int l = 0;
  • trunk/Source/WebCore/rendering/RenderText.h

    r93656 r96187  
    108108    virtual int caretMinOffset() const;
    109109    virtual int caretMaxOffset() const;
    110     virtual unsigned caretMaxRenderedOffset() const;
     110    virtual unsigned renderedTextLength() const;
    111111
    112112    virtual int previousOffset(int current) const;
Note: See TracChangeset for help on using the changeset viewer.