From 1a52fcd6ada28d136b188bded3477ad6ddb52f2e Mon Sep 17 00:00:00 2001 From: Jelle Raaijmakers Date: Wed, 20 Aug 2025 12:26:37 +0200 Subject: [PATCH] LibWeb: Draw selected text with its own color Other browsers such as Chrome and Firefox retain the text's color when the text is part of a selection, so let's mimic them. --- Libraries/LibWeb/Painting/PaintableBox.cpp | 12 ++++-------- .../expected/selection-text-color-ref.html | 7 +++++++ .../selection-start-in-end-node-ref.png | Bin 6814 -> 6984 bytes .../images/selection-text-color-ref.png | Bin 0 -> 6204 bytes .../input/selection-start-in-end-node-2.html | 2 +- .../input/selection-start-in-end-node-3.html | 2 +- .../input/selection-start-in-end-node.html | 2 +- .../input/selection-text-color.html | 13 +++++++++++++ 8 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 Tests/LibWeb/Screenshot/expected/selection-text-color-ref.html create mode 100644 Tests/LibWeb/Screenshot/images/selection-text-color-ref.png create mode 100644 Tests/LibWeb/Screenshot/input/selection-text-color.html diff --git a/Libraries/LibWeb/Painting/PaintableBox.cpp b/Libraries/LibWeb/Painting/PaintableBox.cpp index 60d66492fe6..7d0fd9939ef 100644 --- a/Libraries/LibWeb/Painting/PaintableBox.cpp +++ b/Libraries/LibWeb/Painting/PaintableBox.cpp @@ -934,6 +934,10 @@ void paint_text_fragment(DisplayListRecordingContext& context, TextPaintable con if (!glyph_run) return; + auto selection_rect = context.enclosing_device_rect(fragment.selection_rect()).to_type(); + if (!selection_rect.is_empty()) + painter.fill_rect(selection_rect, CSS::SystemColor::highlight(paintable.computed_values().color_scheme())); + auto scale = context.device_pixels_per_css_pixel(); auto baseline_start = Gfx::FloatPoint { fragment_absolute_rect.x().to_float(), @@ -941,14 +945,6 @@ void paint_text_fragment(DisplayListRecordingContext& context, TextPaintable con } * scale; painter.draw_glyph_run(baseline_start, *glyph_run, paintable.computed_values().webkit_text_fill_color(), fragment_enclosing_device_rect, scale, fragment.orientation()); - auto selection_rect = context.enclosing_device_rect(fragment.selection_rect()).to_type(); - if (!selection_rect.is_empty()) { - painter.fill_rect(selection_rect, CSS::SystemColor::highlight(paintable.computed_values().color_scheme())); - DisplayListRecorderStateSaver saver(painter); - painter.add_clip_rect(selection_rect); - painter.draw_glyph_run(baseline_start, *glyph_run, CSS::SystemColor::highlight_text(paintable.computed_values().color_scheme()), fragment_enclosing_device_rect, scale, fragment.orientation()); - } - paint_text_decoration(context, paintable, fragment); paint_cursor_if_needed(context, paintable, fragment); } diff --git a/Tests/LibWeb/Screenshot/expected/selection-text-color-ref.html b/Tests/LibWeb/Screenshot/expected/selection-text-color-ref.html new file mode 100644 index 00000000000..38686b74121 --- /dev/null +++ b/Tests/LibWeb/Screenshot/expected/selection-text-color-ref.html @@ -0,0 +1,7 @@ + + + diff --git a/Tests/LibWeb/Screenshot/images/selection-start-in-end-node-ref.png b/Tests/LibWeb/Screenshot/images/selection-start-in-end-node-ref.png index 7fc8f2747c682d75c7dd6220a369b2e149f3e0cb..2cc75b61167e9610938473aa1de73b5fb08ccce3 100644 GIT binary patch delta 4954 zcmbPddctgia=kRar;B4q#jUq@xp#yX-#bwF-q?8F^y!94URPZ7JOlM&MVy;W3=i!% zyJLw)8b{}>E`g;kFU4d>DiLd{@{Y*bw_uaDE+W7Ic z&vka^>#DxRrO(}(zxv<(z1ME7_Pxf;@L}q$Bi;-Q3L6+0Si~46t`e%BE?aTlTJPr3 zUknV=wF!H_->deXuJ`xJWdBW?g|%N_U7cV5@8@>0h{<8oV#8z%KE7psSEv2&Pg(c! zo3i;Paz79KOO8LiOs3%b?846tocVQ=8^7L6pMTVPYthqFe>&gq|6lj7divhw#m~+} zZppZ4|LzwbXvt&7^KweE*Gcfw-+HTU*bZ_m8^Y{lX}t4}AC`!z1_Dt#Tc zHcGbc$HT(Em;LSkX32Zax2rX~nKId1f3L}GqqH+KW^AhX_$c3MgWB3P*K6NAGku-& zss3$!$*-sP^AfJUFAcZpSu4FQqwe}8lhpZ+#!08-?z+`aZv1*JI{)b0u$4hizg~~` z4_3-c^6Hnf-BfA!>&4=@y;Z6Dv1^?4_x(uvcKNj4?loa+qh^Z~embdM|I%9YuGndv zA4g|QvYls^x@qh7(wSSnEi27=b!DY)^tL^p&slfhJ^H8q=jY2ppTsY%^3h3obfoiX zz3Myjy6h_}0>9rW_E(*smMWL^B0cl(=LTeGi8WMbfzrOr%*z|ti?`8AjYQJ8cS~F{E<%-kO z_1Aw`9{GT2gCXm+mCNVNI@bJSjZMOV21Vz#BN--DUtYYJ_k3RUJMDUn>oLW?Qf9ME zv&EV-e0KhRxBKz4KR-WnKhrV%_3wFO=;!J6&zHAve0lBaw*QsCW6#NLNPl0wXcym{ zEsGY|@7sP;%>G8!?K^fy_QZDWE|-)PUVNq}wnV%7QeX{mCrZs+fhO-z`& z!kJ;;?#9wXoa#sHAAMZ7=LXN`XJ@+&x8~p9mwDySlga*CHdoYgOLsi#(!N*mxL2rL z+}Zoi-OS~4#p>fquZ9{v{rCHQ|7%0D<&sG(b1jS0`sHk2U0p4{_-=Im-q4&te)~TK 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 delta 4762 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 z - + End Node Start Node NOT SELECTED