Commit c10ffb10 authored by Yoichi Osato's avatar Yoichi Osato Committed by Commit Bot

[LayoutNG] Fix LocalSelectionRect rect flipping for vertical-rl.

This patch fixes LocalSelectionRect rect for vertical-rl.
It should be flipped physical.
This is similar to previous koji's work:
crrev.com/c/1457812

Test invalidation reason is also updated because if a LayoutText is selected,
visual rect is expanded and it is (miss)recognized as geometry(full) invalidation:
https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/paint/object_paint_invalidator.cc?l=266

In legacy, this occurs when the selection includes the link break
 (which is not covered by the original visual rect of LayoutText
 but covered by the selection visual rect).
For now this is a drawback of using LayoutText's visual rect
for fragments. We'll improve this in the future when combining
FragmentData and NGPaintFragment and use their real visual rects
instead of LayoutText's (because LayoutText's visual rect will no
longer need to include selection visual rect).

Selection update within a line will still use partial selection
invalidation for both NG and legacy.

Bug: 930034
Change-Id: I4fa3e41797655bd6b436b798f25e8b7012ac05d8
Reviewed-on: https://chromium-review.googlesource.com/c/1484398
Commit-Queue: Yoichi Osato <yoichio@chromium.org>
Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Reviewed-by: default avatarXianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#635892}
parent a4ce6f65
...@@ -2126,6 +2126,15 @@ LayoutRect LayoutText::LocalSelectionRect() const { ...@@ -2126,6 +2126,15 @@ LayoutRect LayoutText::LocalSelectionRect() const {
fragment_rect.offset += fragment->InlineOffsetToContainerBox(); fragment_rect.offset += fragment->InlineOffsetToContainerBox();
rect.Unite(fragment_rect.ToLayoutRect()); rect.Unite(fragment_rect.ToLayoutRect());
} }
if (!HasFlippedBlocksWritingMode())
return rect;
// Since legacy requires LocalSelectionRect return flipped block direction,
// we need to convert physical coordinates into physical coordinates in
// flipped block direction.
NGPaintFragment* container = NGPaintFragment::GetForInlineContainer(this);
DCHECK(container);
ToLayoutBox(container->GetLayoutObject())->FlipForWritingMode(rect);
return rect; return rect;
} }
......
...@@ -676,21 +676,21 @@ TEST_P(ParameterizedLayoutTextTest, LocalSelectionRectVertical) { ...@@ -676,21 +676,21 @@ TEST_P(ParameterizedLayoutTextTest, LocalSelectionRectVertical) {
LayoutRect(0, 0, 20, 40), LayoutRect(0, 0, 20, 40),
GetSelectionRectFor("<div style='writing-mode: vertical-lr; height: 2em'>" GetSelectionRectFor("<div style='writing-mode: vertical-lr; height: 2em'>"
"f^oo ba|r baz</div>")); "f^oo ba|r baz</div>"));
// TODO(yoichio): This is caused by mixing lrt between vertical and logical.
EXPECT_EQ( EXPECT_EQ(
LayoutNGEnabled() ? LayoutRect(10, 0, 20, 40) : LayoutRect(0, 0, 20, 40), LayoutRect(0, 0, 20, 40),
GetSelectionRectFor("<div style='writing-mode: vertical-rl; height: 2em'>" GetSelectionRectFor("<div style='writing-mode: vertical-rl; height: 2em'>"
"f^oo ba|r baz</div>")); "f^oo ba|r baz</div>"));
} }
TEST_P(ParameterizedLayoutTextTest, LocalSelectionRectVerticalRTL) { TEST_P(ParameterizedLayoutTextTest, LocalSelectionRectVerticalRTL) {
LoadAhem(); LoadAhem();
// TODO(yoichio): Investigate diff (maybe soft line break treatment).
EXPECT_EQ(LayoutNGEnabled() ? LayoutRect(0, -10, 20, 30) EXPECT_EQ(LayoutNGEnabled() ? LayoutRect(0, -10, 20, 30)
: LayoutRect(0, -10, 20, 40), : LayoutRect(0, -10, 20, 40),
GetSelectionRectFor( GetSelectionRectFor(
"<div style='writing-mode: vertical-lr; height: 2em' dir=rtl>" "<div style='writing-mode: vertical-lr; height: 2em' dir=rtl>"
"f^oo ba|r baz</div>")); "f^oo ba|r baz</div>"));
EXPECT_EQ(LayoutNGEnabled() ? LayoutRect(10, -10, 20, 30) EXPECT_EQ(LayoutNGEnabled() ? LayoutRect(0, -10, 20, 30)
: LayoutRect(0, -10, 20, 40), : LayoutRect(0, -10, 20, 40),
GetSelectionRectFor( GetSelectionRectFor(
"<div style='writing-mode: vertical-rl; height: 2em' dir=rtl>" "<div style='writing-mode: vertical-rl; height: 2em' dir=rtl>"
......
...@@ -485,8 +485,6 @@ crbug.com/591099 paint/invalidation/flexbox/scrollbars-changed.html [ Failure ] ...@@ -485,8 +485,6 @@ crbug.com/591099 paint/invalidation/flexbox/scrollbars-changed.html [ Failure ]
crbug.com/835484 paint/invalidation/outline/inline-focus.html [ Failure ] crbug.com/835484 paint/invalidation/outline/inline-focus.html [ Failure ]
crbug.com/591099 paint/invalidation/overflow/opacity-change-on-overflow-float.html [ Failure ] crbug.com/591099 paint/invalidation/overflow/opacity-change-on-overflow-float.html [ Failure ]
crbug.com/591099 paint/invalidation/scroll/fixed-under-composited-fixed-scrolled.html [ Failure ] crbug.com/591099 paint/invalidation/scroll/fixed-under-composited-fixed-scrolled.html [ Failure ]
crbug.com/930034 paint/invalidation/selection/japanese-rl-selection-clear.html [ Failure ]
crbug.com/930034 paint/invalidation/selection/selection-rl.html [ Failure ]
crbug.com/591099 paint/invalidation/svg/svg-background-partial-redraw.html [ Failure ] crbug.com/591099 paint/invalidation/svg/svg-background-partial-redraw.html [ Failure ]
crbug.com/591099 paint/invalidation/svg/text-selection-update.svg [ Failure Pass ] crbug.com/591099 paint/invalidation/svg/text-selection-update.svg [ Failure Pass ]
crbug.com/591099 paint/invalidation/svg/transform-focus-ring-repaint.html [ Failure ] crbug.com/591099 paint/invalidation/svg/transform-focus-ring-repaint.html [ Failure ]
......
...@@ -20,57 +20,57 @@ ...@@ -20,57 +20,57 @@
{ {
"object": "NGPhysicalTextFragment '\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B'", "object": "NGPhysicalTextFragment '\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22'", "object": "NGPhysicalTextFragment '\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u3059\u3002\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B'", "object": "NGPhysicalTextFragment '\u3059\u3002\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059'", "object": "NGPhysicalTextFragment '\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B'", "object": "NGPhysicalTextFragment '\u305B\u3063\u304B\u304F\u898B\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2'", "object": "NGPhysicalTextFragment '\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8'", "object": "NGPhysicalTextFragment '\u3064\u3051\u305F\u3059\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'", "object": "NGPhysicalTextFragment '\u306A\u3089\u30BF\u30A4\u30C8\u30EB\u3068\u30A2\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E'", "object": "NGPhysicalTextFragment '\u306E\u30B3\u30F3\u30C6\u30F3\u30C4\u304B\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E'", "object": "NGPhysicalTextFragment '\u3070\u3089\u3057\u3044\u8A18\u4E8B\u304C\u3069\u3053\u306B\u3042\u3063\u305F\u304B\u5FD8\u308C\u3066\u3057\u307E'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B'", "object": "NGPhysicalTextFragment '\u3089\u3082\u691C\u7D22\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\u305B\u3063\u304B\u304F\u898B'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
}, },
{ {
"object": "NGPhysicalTextFragment '\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4'", "object": "NGPhysicalTextFragment '\u308C\u3066\u3057\u307E\u3063\u305F\u7D4C\u9A13\u306F\u3042\u308A\u307E\u3059\u304B \u306A\u3089\u30BF\u30A4'",
...@@ -85,7 +85,7 @@ ...@@ -85,7 +85,7 @@
{ {
"object": "NGPhysicalTextFragment '\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8'", "object": "NGPhysicalTextFragment '\u30C9\u30EC\u30B9\u3060\u3051\u3067\u306A\u304F\u3001\u8A2A\u554F\u3057\u305F\u30A6\u30A7\u30D6\u30DA\u30FC\u30B8'",
"rect": [334, 123, 443, 404], "rect": [334, 123, 443, 404],
"reason": "selection" "reason": "geometry"
} }
] ]
} }
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
{ {
"object": "NGPhysicalTextFragment 'Testing both hit testing'", "object": "NGPhysicalTextFragment 'Testing both hit testing'",
"rect": [772, 8, 20, 143], "rect": [772, 8, 20, 143],
"reason": "selection" "reason": "geometry"
} }
] ]
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment