From be7b27d10c4358b10aca7f608f38eefb4872ebe9 Mon Sep 17 00:00:00 2001 From: "jberlin@webkit.org" Date: Thu, 24 Dec 2009 13:46:30 +0000 Subject: [PATCH] Fix for WebKit bug 29968 - Selecting text with text-overflow ellipsis should not show cut off text https://bugs.webkit.org/show_bug.cgi?id=29968 Reviewed by Dan Bernstein. Also fixes the issue on both Mac OS X and Windows where the highlight would extend only partway into the ellipsis based on the size of the characters being truncated. Test: editing/selection/select-text-overflow-ellipsis.html WebCore: * rendering/EllipsisBox.cpp: (WebCore::EllipsisBox::paint): When the ellipsis have been selected, paints them with the color for selected text. (WebCore::EllipsisBox::selectionRect): Returns the selection rect for the ellipsis text. (WebCore::EllipsisBox::paintSelection): Paints the selection highlight around the ellipsis text. * rendering/EllipsisBox.h: (WebCore::EllipsisBox::EllipsisBox): Default the selection state of the EllipsisBox to SelectionNone. (WebCore::EllipsisBox::setSelectionState): Allow the selection state to be explicitly set by the InlineTextBox that it is associated with, since the selection state depends on the position of the selection within the truncated text. (WebCore::EllipsisBox::selectionState): Return the cached selection state. * rendering/InlineTextBox.cpp: (WebCore::InlineTextBox::selectionState): If the text is truncated and the selection extends into the truncation where there are ellipsis, set the selection state on the EllipsisBox. (WebCore::paintTextWithShadows): Allow for an upper bound to be specified on the maximum length of the text to be painted. (WebCore::InlineTextBox::paint): Make sure the text that is drawn gets appropriately truncated. This was not an issue before on Mac OS X because it wasn't necessary to draw the selected text separately (the selected text had the same color as the non-selected text). (WebCore::InlineTextBox::paintSelection): If the text is being truncated, let whatever is being painted in the space after the truncated text paint its own highlight. * rendering/InlineTextBox.h: (WebCore::InlineTextBox::truncation): Allow RenderText to access the truncation status. * rendering/RenderText.cpp: (WebCore::RenderText::selectionRectForRepaint): Make sure that any ellipsis box that falls within the selection also gets repainted. Places the expected results under the mac and win platforms separately because they are pixel test results and also the size of the RenderBlocks are showing up as slightly different between mac and win. LayoutTests: * editing/selection/select-text-overflow-ellipsis.html: Added. * platform/mac/editing/selection/select-text-overflow-ellipsis-expected.checksum: Added. * platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png: Added. * platform/mac/editing/selection/select-text-overflow-ellipsis-expected.txt: Added. * platform/win/editing/selection/select-text-overflow-ellipsis-expected.checksum: Added. * platform/win/editing/selection/select-text-overflow-ellipsis-expected.png: Added. * platform/win/editing/selection/select-text-overflow-ellipsis-expected.txt: Added. git-svn-id: https://svn.webkit.org/repository/webkit/trunk@52548 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- LayoutTests/ChangeLog | 24 +++++++++ .../selection/select-text-overflow-ellipsis.html | 19 +++++++ ...select-text-overflow-ellipsis-expected.checksum | 1 + .../select-text-overflow-ellipsis-expected.png | Bin 0 -> 22731 bytes .../select-text-overflow-ellipsis-expected.txt | 19 +++++++ ...select-text-overflow-ellipsis-expected.checksum | 1 + .../select-text-overflow-ellipsis-expected.png | Bin 0 -> 21694 bytes .../select-text-overflow-ellipsis-expected.txt | 19 +++++++ WebCore/ChangeLog | 58 +++++++++++++++++++++ WebCore/rendering/EllipsisBox.cpp | 43 +++++++++++++++ WebCore/rendering/EllipsisBox.h | 6 +++ WebCore/rendering/InlineTextBox.cpp | 42 ++++++++++++--- WebCore/rendering/InlineTextBox.h | 2 + WebCore/rendering/RenderText.cpp | 19 ++++++- 14 files changed, 245 insertions(+), 8 deletions(-) create mode 100644 LayoutTests/editing/selection/select-text-overflow-ellipsis.html create mode 100644 LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.checksum create mode 100644 LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png create mode 100644 LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.txt create mode 100644 LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.checksum create mode 100644 LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.png create mode 100644 LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.txt diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog index 51c25b1..323fba0 100644 --- a/LayoutTests/ChangeLog +++ b/LayoutTests/ChangeLog @@ -1,3 +1,27 @@ +2009-12-24 Jessie Berlin + + Reviewed by Dan Bernstein. + + Fix for WebKit bug 29968 - Selecting text with text-overflow ellipsis + should not show cut off text + https://bugs.webkit.org/show_bug.cgi?id=29968 + + Also fixes the issue on both Mac OS X and Windows where the highlight + would extend only partway into the ellipsis based on the size of the + characters being truncated. + + Places the expected results under the mac and win platforms separately + because they are pixel test results and also the size of the + RenderBlocks are showing up as slightly different between mac and win. + + * editing/selection/select-text-overflow-ellipsis.html: Added. + * platform/mac/editing/selection/select-text-overflow-ellipsis-expected.checksum: Added. + * platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png: Added. + * platform/mac/editing/selection/select-text-overflow-ellipsis-expected.txt: Added. + * platform/win/editing/selection/select-text-overflow-ellipsis-expected.checksum: Added. + * platform/win/editing/selection/select-text-overflow-ellipsis-expected.png: Added. + * platform/win/editing/selection/select-text-overflow-ellipsis-expected.txt: Added. + 2009-12-21 Pavel Feldman Reviewed by Timothy Hatcher. diff --git a/LayoutTests/editing/selection/select-text-overflow-ellipsis.html b/LayoutTests/editing/selection/select-text-overflow-ellipsis.html new file mode 100644 index 0000000..f94fde3 --- /dev/null +++ b/LayoutTests/editing/selection/select-text-overflow-ellipsis.html @@ -0,0 +1,19 @@ + + + Test for WebKit bug 29968: Selecting text with text-overflow ellipsis should not show cut off text</head> + <style type="text/css"> + .cutoff { + width: 95px; + white-space: pre; + overflow: hidden; + text-overflow: ellipsis; + } + </style> + <body> + <h3>Test for <a href='https://bugs.webkit.org/show_bug.cgi?id=29968'>WebKit bug 29968</a>: Selecting text with text-overflow ellipsis should not show cut off text</h3> + <div id="selection_with_ellipsis" class="cutoff">Lorem ipsum dolor</div> + <script type="text/javascript"> + getSelection().setBaseAndExtent(selection_with_ellipsis.firstChild, 0, selection_with_ellipsis.firstChild, 11); + </script> + </body> +</html> diff --git a/LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.checksum b/LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.checksum new file mode 100644 index 0000000..3009007 --- /dev/null +++ b/LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.checksum @@ -0,0 +1 @@ +e2c2782746a40e3a5a17462dfb23e934 \ No newline at end of file diff --git a/LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png b/LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..92bdb57a147883d75b0b9e6976e6ca9942a3e60c GIT binary patch literal 22731 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 literal 0 HcmV?d00001 diff --git a/LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.txt b/LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.txt new file mode 100644 index 0000000..65c7676 --- /dev/null +++ b/LayoutTests/platform/mac/editing/selection/select-text-overflow-ellipsis-expected.txt @@ -0,0 +1,19 @@ +layer at (0,0) size 800x600 + RenderView at (0,0) size 800x600 +layer at (0,0) size 800x600 + RenderBlock {HTML} at (0,0) size 800x600 + RenderBody {BODY} at (8,8) size 784x584 + RenderBlock {H3} at (0,0) size 784x22 + RenderText {#text} at (0,0) size 68x22 + text run at (0,0) width 68: "Test for " + RenderInline {A} at (0,0) size 156x22 [color=#0000EE] + RenderText {#text} at (68,0) size 156x22 + text run at (68,0) width 156: "WebKit bug 29968" + RenderText {#text} at (224,0) size 560x22 + text run at (224,0) width 560: ": Selecting text with text-overflow ellipsis should not show cut off text" +layer at (8,48) size 95x18 scrollWidth 121 + RenderBlock {DIV} at (0,40) size 95x18 + RenderText {#text} at (0,0) size 121x18 + text run at (0,0) width 121: "Lorem ipsum dolor" +selection start: position 0 of child 0 {#text} of child 3 {DIV} of child 1 {BODY} of child 0 {HTML} of document +selection end: position 11 of child 0 {#text} of child 3 {DIV} of child 1 {BODY} of child 0 {HTML} of document diff --git a/LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.checksum b/LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.checksum new file mode 100644 index 0000000..c8cdc53 --- /dev/null +++ b/LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.checksum @@ -0,0 +1 @@ +af7503d3c725ac726fc10b9ddc00a55a \ No newline at end of file diff --git a/LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.png b/LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.png new file mode 100644 index 0000000000000000000000000000000000000000..7265b71e928a948eef295381a30aa958d764f416 GIT binary patch literal 21694 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 K1@gkJ2mcE`?JlGM literal 0 HcmV?d00001 diff --git a/LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.txt b/LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.txt new file mode 100644 index 0000000..7ebb1a8 --- /dev/null +++ b/LayoutTests/platform/win/editing/selection/select-text-overflow-ellipsis-expected.txt @@ -0,0 +1,19 @@ +layer at (0,0) size 800x600 + RenderView at (0,0) size 800x600 +layer at (0,0) size 800x600 + RenderBlock {HTML} at (0,0) size 800x600 + RenderBody {BODY} at (8,8) size 784x584 + RenderBlock {H3} at (0,0) size 784x25 + RenderText {#text} at (0,0) size 68x24 + text run at (0,0) width 68: "Test for " + RenderInline {A} at (0,0) size 156x24 [color=#0000EE] + RenderText {#text} at (68,0) size 156x24 + text run at (68,0) width 156: "WebKit bug 29968" + RenderText {#text} at (224,0) size 560x24 + text run at (224,0) width 560: ": Selecting text with text-overflow ellipsis should not show cut off text" +layer at (8,51) size 95x21 scrollWidth 121 + RenderBlock {DIV} at (0,43) size 95x21 + RenderText {#text} at (0,0) size 121x20 + text run at (0,0) width 121: "Lorem ipsum dolor" +selection start: position 0 of child 0 {#text} of child 3 {DIV} of child 1 {BODY} of child 0 {HTML} of document +selection end: position 11 of child 0 {#text} of child 3 {DIV} of child 1 {BODY} of child 0 {HTML} of document diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog index 50dd919..f4b0a39 100644 --- a/WebCore/ChangeLog +++ b/WebCore/ChangeLog @@ -1,3 +1,61 @@ +2009-12-24 Jessie Berlin <jberlin@webkit.org> + + Reviewed by Dan Bernstein. + + Fix for WebKit bug 29968 - Selecting text with text-overflow ellipsis + should not show cut off text + https://bugs.webkit.org/show_bug.cgi?id=29968 + + Also fixes the issue on both Mac OS X and Windows where the highlight + would extend only partway into the ellipsis based on the size of the + characters being truncated. + + Test: editing/selection/select-text-overflow-ellipsis.html + + * rendering/EllipsisBox.cpp: + (WebCore::EllipsisBox::paint): + When the ellipsis have been selected, paints them with the color for + selected text. + (WebCore::EllipsisBox::selectionRect): + Returns the selection rect for the ellipsis text. + (WebCore::EllipsisBox::paintSelection): + Paints the selection highlight around the ellipsis text. + + * rendering/EllipsisBox.h: + (WebCore::EllipsisBox::EllipsisBox): + Default the selection state of the EllipsisBox to SelectionNone. + (WebCore::EllipsisBox::setSelectionState): + Allow the selection state to be explicitly set by the InlineTextBox + that it is associated with, since the selection state depends on the + position of the selection within the truncated text. + (WebCore::EllipsisBox::selectionState): + Return the cached selection state. + + * rendering/InlineTextBox.cpp: + (WebCore::InlineTextBox::selectionState): + If the text is truncated and the selection extends into the truncation + where there are ellipsis, set the selection state on the EllipsisBox. + (WebCore::paintTextWithShadows): + Allow for an upper bound to be specified on the maximum length of the + text to be painted. + (WebCore::InlineTextBox::paint): + Make sure the text that is drawn gets appropriately truncated. This was + not an issue before on Mac OS X because it wasn't necessary to draw the + selected text separately (the selected text had the same color as the + non-selected text). + (WebCore::InlineTextBox::paintSelection): + If the text is being truncated, let whatever is being painted in the + space after the truncated text paint its own highlight. + + * rendering/InlineTextBox.h: + (WebCore::InlineTextBox::truncation): + Allow RenderText to access the truncation status. + + * rendering/RenderText.cpp: + (WebCore::RenderText::selectionRectForRepaint): + Make sure that any ellipsis box that falls within the selection also + gets repainted. + 2009-12-24 Pavel Feldman <pfeldman@chromium.org> Reviewed by Timothy Hatcher. diff --git a/WebCore/rendering/EllipsisBox.cpp b/WebCore/rendering/EllipsisBox.cpp index bea9d73..6ec3195 100644 --- a/WebCore/rendering/EllipsisBox.cpp +++ b/WebCore/rendering/EllipsisBox.cpp @@ -23,6 +23,7 @@ #include "Document.h" #include "GraphicsContext.h" #include "HitTestResult.h" +#include "RootInlineBox.h" namespace WebCore { @@ -40,9 +41,22 @@ void EllipsisBox::paint(RenderObject::PaintInfo& paintInfo, int tx, int ty) setShadow = true; } + if (selectionState() != RenderObject::SelectionNone) { + paintSelection(context, tx, ty, style, style->font()); + + // Select the correct color for painting the text. + Color foreground = paintInfo.forceBlackText ? Color::black : renderer()->selectionForegroundColor(); + if (foreground.isValid() && foreground != textColor) + context->setFillColor(foreground, style->colorSpace()); + } + const String& str = m_str; context->drawText(style->font(), TextRun(str.characters(), str.length(), false, 0, 0, false, style->visuallyOrdered()), IntPoint(m_x + tx, m_y + ty + style->font().ascent())); + // Restore the regular fill color. + if (textColor != context->fillColor()) + context->setFillColor(textColor, style->colorSpace()); + if (setShadow) context->clearShadow(); @@ -54,6 +68,35 @@ void EllipsisBox::paint(RenderObject::PaintInfo& paintInfo, int tx, int ty) } } +IntRect EllipsisBox::selectionRect(int tx, int ty) +{ + RenderStyle* style = m_renderer->style(m_firstLine); + const Font& f = style->font(); + return enclosingIntRect(f.selectionRectForText(TextRun(m_str.characters(), m_str.length(), false, 0, 0, false, style->visuallyOrdered()), + IntPoint(m_x + tx, m_y + ty + root()->selectionTop()), root()->selectionHeight())); +} + +void EllipsisBox::paintSelection(GraphicsContext* context, int tx, int ty, RenderStyle* style, const Font& font) +{ + Color textColor = style->color(); + Color c = m_renderer->selectionBackgroundColor(); + if (!c.isValid() || !c.alpha()) + return; + + // If the text color ends up being the same as the selection background, invert the selection + // background. + if (textColor == c) + c = Color(0xff - c.red(), 0xff - c.green(), 0xff - c.blue()); + + context->save(); + int y = root()->selectionTop(); + int h = root()->selectionHeight(); + context->clip(IntRect(m_x + tx, y + ty, m_width, h)); + context->drawHighlightForText(font, TextRun(m_str.characters(), m_str.length(), false, 0, 0, false, style->visuallyOrdered()), + IntPoint(m_x + tx, m_y + ty + y), h, c, style->colorSpace()); + context->restore(); +} + bool EllipsisBox::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, int x, int y, int tx, int ty) { tx += m_x; diff --git a/WebCore/rendering/EllipsisBox.h b/WebCore/rendering/EllipsisBox.h index a228d7a..087fc72 100644 --- a/WebCore/rendering/EllipsisBox.h +++ b/WebCore/rendering/EllipsisBox.h @@ -35,18 +35,24 @@ public: , m_height(height) , m_str(ellipsisStr) , m_markupBox(markupBox) + , m_selectionState(RenderObject::SelectionNone) { } virtual void paint(RenderObject::PaintInfo&, int tx, int ty); virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, int x, int y, int tx, int ty); + void setSelectionState(RenderObject::SelectionState s) { m_selectionState = s; } + IntRect selectionRect(int tx, int ty); private: virtual int height() const { return m_height; } + virtual RenderObject::SelectionState selectionState() { return m_selectionState; } + void paintSelection(GraphicsContext*, int tx, int ty, RenderStyle*, const Font&); int m_height; AtomicString m_str; InlineBox* m_markupBox; + RenderObject::SelectionState m_selectionState; }; } // namespace WebCore diff --git a/WebCore/rendering/InlineTextBox.cpp b/WebCore/rendering/InlineTextBox.cpp index b44c5e0..234bb18 100644 --- a/WebCore/rendering/InlineTextBox.cpp +++ b/WebCore/rendering/InlineTextBox.cpp @@ -27,6 +27,7 @@ #include "ChromeClient.h" #include "Document.h" #include "Editor.h" +#include "EllipsisBox.h" #include "Frame.h" #include "GraphicsContext.h" #include "HitTestResult.h" @@ -82,6 +83,23 @@ RenderObject::SelectionState InlineTextBox::selectionState() else if (state == RenderObject::SelectionBoth) state = RenderObject::SelectionNone; } + + // If there are ellipsis following, make sure their selection is updated. + if (m_truncation != cNoTruncation && root()->ellipsisBox()) { + EllipsisBox* ellipsis = root()->ellipsisBox(); + if (state != RenderObject::SelectionNone) { + int start, end; + selectionStartEnd(start, end); + // The ellipsis should be considered to be selected if the end of + // the selection is past the beginning of the truncation and the + // beginning of the selection is before or at the beginning of the + // truncation. + ellipsis->setSelectionState(end >= m_truncation && start <= m_truncation ? + RenderObject::SelectionInside : RenderObject::SelectionNone); + } else + ellipsis->setSelectionState(RenderObject::SelectionNone); + } + return state; } @@ -255,7 +273,7 @@ bool InlineTextBox::nodeAtPoint(const HitTestRequest&, HitTestResult& result, in return false; } -static void paintTextWithShadows(GraphicsContext* context, const Font& font, const TextRun& textRun, int startOffset, int endOffset, const IntPoint& textOrigin, int x, int y, int w, int h, ShadowData* shadow, bool stroked) +static void paintTextWithShadows(GraphicsContext* context, const Font& font, const TextRun& textRun, int startOffset, int endOffset, int truncationPoint, const IntPoint& textOrigin, int x, int y, int w, int h, ShadowData* shadow, bool stroked) { Color fillColor = context->fillColor(); ColorSpace fillColorSpace = context->fillColorSpace(); @@ -290,8 +308,8 @@ static void paintTextWithShadows(GraphicsContext* context, const Font& font, con else { if (endOffset > 0) context->drawText(font, textRun, textOrigin + extraOffset, 0, endOffset); - if (startOffset < textRun.length()) - context->drawText(font, textRun, textOrigin + extraOffset, startOffset); + if (startOffset < truncationPoint) + context->drawText(font, textRun, textOrigin + extraOffset, startOffset, truncationPoint); } if (!shadow) @@ -461,6 +479,13 @@ void InlineTextBox::paint(RenderObject::PaintInfo& paintInfo, int tx, int ty) if (paintSelectedTextOnly || paintSelectedTextSeparately) selectionStartEnd(sPos, ePos); + int length = m_len; + if (m_truncation != cNoTruncation) { + sPos = min<int>(sPos, m_truncation); + ePos = min<int>(ePos, m_truncation); + length = m_truncation; + } + if (!paintSelectedTextOnly) { // For stroked painting, we have to change the text drawing mode. It's probably dangerous to leave that mutated as a side // effect, so only when we know we're stroking, do a save/restore. @@ -470,9 +495,9 @@ void InlineTextBox::paint(RenderObject::PaintInfo& paintInfo, int tx, int ty) updateGraphicsContext(context, textFillColor, textStrokeColor, textStrokeWidth, styleToUse->colorSpace()); if (!paintSelectedTextSeparately || ePos <= sPos) { // FIXME: Truncate right-to-left text correctly. - paintTextWithShadows(context, font, textRun, 0, m_truncation == cNoTruncation ? m_len : m_truncation, textOrigin, m_x + tx, m_y + ty, width(), height(), textShadow, textStrokeWidth > 0); + paintTextWithShadows(context, font, textRun, 0, length, length, textOrigin, m_x + tx, m_y + ty, width(), height(), textShadow, textStrokeWidth > 0); } else - paintTextWithShadows(context, font, textRun, ePos, sPos, textOrigin, m_x + tx, m_y + ty, width(), height(), textShadow, textStrokeWidth > 0); + paintTextWithShadows(context, font, textRun, ePos, sPos, length, textOrigin, m_x + tx, m_y + ty, width(), height(), textShadow, textStrokeWidth > 0); if (textStrokeWidth > 0) context->restore(); @@ -484,7 +509,7 @@ void InlineTextBox::paint(RenderObject::PaintInfo& paintInfo, int tx, int ty) context->save(); updateGraphicsContext(context, selectionFillColor, selectionStrokeColor, selectionStrokeWidth, styleToUse->colorSpace()); - paintTextWithShadows(context, font, textRun, sPos, ePos, textOrigin, m_x + tx, m_y + ty, width(), height(), selectionShadow, selectionStrokeWidth > 0); + paintTextWithShadows(context, font, textRun, sPos, ePos, length, textOrigin, m_x + tx, m_y + ty, width(), height(), selectionShadow, selectionStrokeWidth > 0); if (selectionStrokeWidth > 0) context->restore(); @@ -566,8 +591,11 @@ void InlineTextBox::paintSelection(GraphicsContext* context, int tx, int ty, Ren updateGraphicsContext(context, c, c, 0, style->colorSpace()); // Don't draw text at all! int y = selectionTop(); int h = selectionHeight(); + // If the text is truncated, let the thing being painted in the truncation + // draw its own highlight. + int length = m_truncation != cNoTruncation ? m_truncation : m_len; context->clip(IntRect(m_x + tx, y + ty, m_width, h)); - context->drawHighlightForText(font, TextRun(textRenderer()->text()->characters() + m_start, m_len, textRenderer()->allowTabs(), textPos(), m_toAdd, + context->drawHighlightForText(font, TextRun(textRenderer()->text()->characters() + m_start, length, textRenderer()->allowTabs(), textPos(), m_toAdd, direction() == RTL, m_dirOverride || style->visuallyOrdered()), IntPoint(m_x + tx, y + ty), h, c, style->colorSpace(), sPos, ePos); context->restore(); diff --git a/WebCore/rendering/InlineTextBox.h b/WebCore/rendering/InlineTextBox.h index 80af2e3..0a83ddd 100644 --- a/WebCore/rendering/InlineTextBox.h +++ b/WebCore/rendering/InlineTextBox.h @@ -62,6 +62,8 @@ public: void setFallbackFonts(const HashSet<const SimpleFontData*>&); void takeFallbackFonts(Vector<const SimpleFontData*>&); + unsigned short truncation() { return m_truncation; } + private: virtual int selectionTop(); virtual int selectionHeight(); diff --git a/WebCore/rendering/RenderText.cpp b/WebCore/rendering/RenderText.cpp index 3e48a707..8006ba3 100644 --- a/WebCore/rendering/RenderText.cpp +++ b/WebCore/rendering/RenderText.cpp @@ -26,6 +26,7 @@ #include "RenderText.h" #include "CharacterNames.h" +#include "EllipsisBox.h" #include "FloatQuad.h" #include "FrameView.h" #include "InlineTextBox.h" @@ -1171,9 +1172,25 @@ IntRect RenderText::selectionRectForRepaint(RenderBoxModelObject* repaintContain return IntRect(); IntRect rect; - for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) + for (InlineTextBox* box = firstTextBox(); box; box = box->nextTextBox()) { rect.unite(box->selectionRect(0, 0, startPos, endPos)); + // Check if there are ellipsis which fall within the selection. + unsigned short truncation = box->truncation(); + if (truncation != cNoTruncation) { + if (EllipsisBox* ellipsis = box->root()->ellipsisBox()) { + int ePos = min<int>(endPos - box->start(), box->len()); + int sPos = max<int>(startPos - box->start(), 0); + // The ellipsis should be considered to be selected if the end of + // the selection is past the beginning of the truncation and the + // beginning of the selection is before or at the beginning of the + // truncation. + if (ePos >= truncation && sPos <= truncation) + rect.unite(ellipsis->selectionRect(0, 0)); + } + } + } + if (clipToVisibleContent) computeRectForRepaint(repaintContainer, rect); else { -- 1.8.3.1