Diff
Modified: trunk/Source/WebCore/ChangeLog (96186 => 96187)
--- trunk/Source/WebCore/ChangeLog 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/ChangeLog 2011-09-28 05:04:20 UTC (rev 96187)
@@ -1,3 +1,43 @@
+2011-09-27 Ryosuke Niwa <[email protected]>
+
+ 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:
+
2011-09-27 James Robinson <[email protected]>
[chromium] LayerRenderChromium asserts about leaking textures.
Modified: trunk/Source/WebCore/dom/Position.cpp (96186 => 96187)
--- trunk/Source/WebCore/dom/Position.cpp 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/dom/Position.cpp 2011-09-28 05:04:20 UTC (rev 96187)
@@ -896,17 +896,6 @@
return false;
}
-static unsigned caretMaxRenderedOffset(const Node* n)
-{
- RenderObject* r = n->renderer();
- if (r)
- return r->caretMaxRenderedOffset();
-
- if (n->isCharacterDataNode())
- return static_cast<const CharacterData*>(n)->length();
- return 1;
-}
-
bool Position::isRenderedCharacter() const
{
if (isNull() || !deprecatedNode()->isTextNode())
@@ -992,8 +981,8 @@
LOG(Editing, "thisRenderedOffset: %d\n", thisRenderedOffset);
LOG(Editing, "posRenderer: %p [%p]\n", posRenderer, b2);
LOG(Editing, "posRenderedOffset: %d\n", posRenderedOffset);
- LOG(Editing, "node min/max: %d:%d\n", caretMinOffset(deprecatedNode()), caretMaxRenderedOffset(deprecatedNode()));
- LOG(Editing, "pos node min/max: %d:%d\n", caretMinOffset(pos.deprecatedNode()), caretMaxRenderedOffset(pos.deprecatedNode()));
+ LOG(Editing, "node min/max: %d:%d\n", caretMinOffset(deprecatedNode()), caretMaxOffset(deprecatedNode()));
+ LOG(Editing, "pos node min/max: %d:%d\n", caretMinOffset(pos.deprecatedNode()), caretMaxOffset(pos.deprecatedNode()));
LOG(Editing, "----------------------------------------------------------------------\n");
if (!b1 || !b2) {
@@ -1005,12 +994,12 @@
}
if (nextRenderedEditable(deprecatedNode()) == pos.deprecatedNode()
- && thisRenderedOffset == (int)caretMaxRenderedOffset(deprecatedNode()) && !posRenderedOffset) {
+ && thisRenderedOffset == caretMaxOffset(deprecatedNode()) && !posRenderedOffset) {
return false;
}
if (previousRenderedEditable(deprecatedNode()) == pos.deprecatedNode()
- && !thisRenderedOffset && posRenderedOffset == (int)caretMaxRenderedOffset(pos.deprecatedNode())) {
+ && !thisRenderedOffset && posRenderedOffset == caretMaxOffset(pos.deprecatedNode())) {
return false;
}
Modified: trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp (96186 => 96187)
--- trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/editing/ReplaceSelectionCommand.cpp 2011-09-28 05:04:20 UTC (rev 96187)
@@ -46,6 +46,7 @@
#include "HTMLNames.h"
#include "NodeList.h"
#include "RenderObject.h"
+#include "RenderText.h"
#include "SmartReplace.h"
#include "TextIterator.h"
#include "htmlediting.h"
@@ -553,11 +554,15 @@
}
}
+static inline bool nodeHasVisibleRenderText(Text* text)
+{
+ return text->renderer() && toRenderText(text->renderer())->renderedTextLength() > 0;
+}
+
void ReplaceSelectionCommand::removeUnrenderedTextNodesAtEnds()
{
document()->updateLayoutIgnorePendingStylesheets();
- if (!m_lastLeafInserted->renderer()
- && m_lastLeafInserted->isTextNode()
+ if (m_lastLeafInserted->isTextNode() && !nodeHasVisibleRenderText(static_cast<Text*>(m_lastLeafInserted.get()))
&& !enclosingNodeWithTag(firstPositionInOrBeforeNode(m_lastLeafInserted.get()), selectTag)
&& !enclosingNodeWithTag(firstPositionInOrBeforeNode(m_lastLeafInserted.get()), scriptTag)) {
if (m_firstNodeInserted == m_lastLeafInserted) {
@@ -573,8 +578,7 @@
// We don't have to make sure that m_firstNodeInserted isn't inside a select or script element, because
// it is a top level node in the fragment and the user can't insert into those elements.
- if (!m_firstNodeInserted->renderer() &&
- m_firstNodeInserted->isTextNode()) {
+ if (m_firstNodeInserted->isTextNode() && !nodeHasVisibleRenderText(static_cast<Text*>(m_firstNodeInserted.get()))) {
if (m_firstNodeInserted == m_lastLeafInserted) {
removeNode(m_firstNodeInserted.get());
m_firstNodeInserted = 0;
@@ -606,8 +610,7 @@
VisiblePosition ReplaceSelectionCommand::positionAtStartOfInsertedContent()
{
- // Return the inserted content's first VisiblePosition.
- return VisiblePosition(nextCandidate(positionInParentBeforeNode(m_firstNodeInserted.get())));
+ return firstPositionInOrBeforeNode(m_firstNodeInserted.get());
}
static void removeHeadContents(ReplacementFragment& fragment)
Modified: trunk/Source/WebCore/editing/visible_units.cpp (96186 => 96187)
--- trunk/Source/WebCore/editing/visible_units.cpp 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/editing/visible_units.cpp 2011-09-28 05:04:20 UTC (rev 96187)
@@ -764,7 +764,7 @@
if (r->isBR() || isBlock(n))
break;
- if (r->isText() && r->caretMaxRenderedOffset() > 0) {
+ if (r->isText() && toRenderText(r)->renderedTextLength()) {
ASSERT(n->isTextNode());
type = Position::PositionIsOffsetInAnchor;
if (style->preserveNewline()) {
@@ -842,7 +842,7 @@
break;
// FIXME: We avoid returning a position where the renderer can't accept the caret.
- if (r->isText() && r->caretMaxRenderedOffset() > 0) {
+ if (r->isText() && toRenderText(r)->renderedTextLength()) {
ASSERT(n->isTextNode());
int length = toRenderText(r)->textLength();
type = Position::PositionIsOffsetInAnchor;
Modified: trunk/Source/WebCore/rendering/InlineBox.cpp (96186 => 96187)
--- trunk/Source/WebCore/rendering/InlineBox.cpp 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/InlineBox.cpp 2011-09-28 05:04:20 UTC (rev 96187)
@@ -155,11 +155,6 @@
return m_renderer->caretMaxOffset();
}
-unsigned InlineBox::caretMaxRenderedOffset() const
-{
- return 1;
-}
-
void InlineBox::dirtyLineBoxes()
{
markDirty();
Modified: trunk/Source/WebCore/rendering/InlineBox.h (96186 => 96187)
--- trunk/Source/WebCore/rendering/InlineBox.h 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/InlineBox.h 2011-09-28 05:04:20 UTC (rev 96187)
@@ -278,7 +278,6 @@
virtual int caretMinOffset() const;
virtual int caretMaxOffset() const;
- virtual unsigned caretMaxRenderedOffset() const;
unsigned char bidiLevel() const { return m_bidiEmbeddingLevel; }
void setBidiLevel(unsigned char level) { m_bidiEmbeddingLevel = level; }
Modified: trunk/Source/WebCore/rendering/InlineTextBox.cpp (96186 => 96187)
--- trunk/Source/WebCore/rendering/InlineTextBox.cpp 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/InlineTextBox.cpp 2011-09-28 05:04:20 UTC (rev 96187)
@@ -1209,11 +1209,6 @@
return m_start + m_len;
}
-unsigned InlineTextBox::caretMaxRenderedOffset() const
-{
- return m_start + m_len;
-}
-
float InlineTextBox::textPos() const
{
// When computing the width of a text run, RenderBlock::computeInlineDirectionPositionsForLine() doesn't include the actual offset
Modified: trunk/Source/WebCore/rendering/InlineTextBox.h (96186 => 96187)
--- trunk/Source/WebCore/rendering/InlineTextBox.h 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/InlineTextBox.h 2011-09-28 05:04:20 UTC (rev 96187)
@@ -146,8 +146,6 @@
virtual int caretMaxOffset() const;
private:
- virtual unsigned caretMaxRenderedOffset() const;
-
float textPos() const; // returns the x position relative to the left start of the text line.
public:
Modified: trunk/Source/WebCore/rendering/RenderBR.cpp (96186 => 96187)
--- trunk/Source/WebCore/rendering/RenderBR.cpp 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/RenderBR.cpp 2011-09-28 05:04:20 UTC (rev 96187)
@@ -68,11 +68,6 @@
return 1;
}
-unsigned RenderBR::caretMaxRenderedOffset() const
-{
- return 1;
-}
-
VisiblePosition RenderBR::positionForPoint(const LayoutPoint&)
{
return createVisiblePosition(0, DOWNSTREAM);
Modified: trunk/Source/WebCore/rendering/RenderBR.h (96186 => 96187)
--- trunk/Source/WebCore/rendering/RenderBR.h 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/RenderBR.h 2011-09-28 05:04:20 UTC (rev 96187)
@@ -50,7 +50,6 @@
virtual int caretMinOffset() const;
virtual int caretMaxOffset() const;
- virtual unsigned caretMaxRenderedOffset() const;
virtual VisiblePosition positionForPoint(const LayoutPoint&);
Modified: trunk/Source/WebCore/rendering/RenderObject.cpp (96186 => 96187)
--- trunk/Source/WebCore/rendering/RenderObject.cpp 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/RenderObject.cpp 2011-09-28 05:04:20 UTC (rev 96187)
@@ -2550,11 +2550,6 @@
return 0;
}
-unsigned RenderObject::caretMaxRenderedOffset() const
-{
- return 0;
-}
-
int RenderObject::previousOffset(int current) const
{
return current - 1;
Modified: trunk/Source/WebCore/rendering/RenderObject.h (96186 => 96187)
--- trunk/Source/WebCore/rendering/RenderObject.h 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/RenderObject.h 2011-09-28 05:04:20 UTC (rev 96187)
@@ -791,7 +791,6 @@
virtual int caretMinOffset() const;
virtual int caretMaxOffset() const;
- virtual unsigned caretMaxRenderedOffset() const;
virtual int previousOffset(int current) const;
virtual int previousOffsetForBackwardDeletion(int current) const;
Modified: trunk/Source/WebCore/rendering/RenderReplaced.cpp (96186 => 96187)
--- trunk/Source/WebCore/rendering/RenderReplaced.cpp 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/RenderReplaced.cpp 2011-09-28 05:04:20 UTC (rev 96187)
@@ -410,11 +410,6 @@
setPreferredLogicalWidthsDirty(false);
}
-unsigned RenderReplaced::caretMaxRenderedOffset() const
-{
- return 1;
-}
-
VisiblePosition RenderReplaced::positionForPoint(const LayoutPoint& point)
{
// FIXME: This code is buggy if the replaced element is relative positioned.
Modified: trunk/Source/WebCore/rendering/RenderReplaced.h (96186 => 96187)
--- trunk/Source/WebCore/rendering/RenderReplaced.h 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/RenderReplaced.h 2011-09-28 05:04:20 UTC (rev 96187)
@@ -77,7 +77,6 @@
virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer) const;
- virtual unsigned caretMaxRenderedOffset() const;
virtual VisiblePosition positionForPoint(const LayoutPoint&);
virtual bool canBeSelectionLeaf() const { return true; }
Modified: trunk/Source/WebCore/rendering/RenderText.cpp (96186 => 96187)
--- trunk/Source/WebCore/rendering/RenderText.cpp 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/RenderText.cpp 2011-09-28 05:04:20 UTC (rev 96187)
@@ -1595,15 +1595,16 @@
int RenderText::caretMaxOffset() const
{
InlineTextBox* box = lastTextBox();
- if (!box)
+ if (!lastTextBox())
return textLength();
+
int maxOffset = box->start() + box->len();
for (box = box->prevTextBox(); box; box = box->prevTextBox())
maxOffset = max<int>(maxOffset, box->start() + box->len());
return maxOffset;
}
-unsigned RenderText::caretMaxRenderedOffset() const
+unsigned RenderText::renderedTextLength() const
{
int l = 0;
for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox())
Modified: trunk/Source/WebCore/rendering/RenderText.h (96186 => 96187)
--- trunk/Source/WebCore/rendering/RenderText.h 2011-09-28 04:56:31 UTC (rev 96186)
+++ trunk/Source/WebCore/rendering/RenderText.h 2011-09-28 05:04:20 UTC (rev 96187)
@@ -107,7 +107,7 @@
virtual int caretMinOffset() const;
virtual int caretMaxOffset() const;
- virtual unsigned caretMaxRenderedOffset() const;
+ virtual unsigned renderedTextLength() const;
virtual int previousOffset(int current) const;
virtual int previousOffsetForBackwardDeletion(int current) const;