Commit f5ddd1ba authored by Aleks Totic's avatar Aleks Totic Committed by Commit Bot

[LayoutNG] Implement children outlines for focus rings.

NG did not traverse children, which are needed for Focus rings.

Bug: 835484
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_layout_ng
Change-Id: I33a326b18da85b65f76b5035634d9b8151431313
Reviewed-on: https://chromium-review.googlesource.com/1022979
Commit-Queue: Aleks Totic <atotic@chromium.org>
Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Cr-Commit-Position: refs/heads/master@{#552904}
parent 3cc46b70
...@@ -1043,7 +1043,6 @@ crbug.com/591099 fast/css/import_with_baseurl.html [ Failure Pass ] ...@@ -1043,7 +1043,6 @@ crbug.com/591099 fast/css/import_with_baseurl.html [ Failure Pass ]
crbug.com/591099 fast/css/large-numbers.html [ Timeout ] crbug.com/591099 fast/css/large-numbers.html [ Timeout ]
crbug.com/591099 fast/css/margin-top-bottom-dynamic.html [ Failure ] crbug.com/591099 fast/css/margin-top-bottom-dynamic.html [ Failure ]
crbug.com/591099 fast/css/negative-text-indent-in-inline-block.html [ Failure ] crbug.com/591099 fast/css/negative-text-indent-in-inline-block.html [ Failure ]
crbug.com/591099 fast/css/outline-auto-empty-rects.html [ Failure ]
crbug.com/591099 fast/css/outline-narrowLine.html [ Failure ] crbug.com/591099 fast/css/outline-narrowLine.html [ Failure ]
crbug.com/714962 fast/css/outline-small-visual-overflow.html [ Failure ] crbug.com/714962 fast/css/outline-small-visual-overflow.html [ Failure ]
crbug.com/591099 fast/css/overflow-rtl-border-after.html [ Failure ] crbug.com/591099 fast/css/overflow-rtl-border-after.html [ Failure ]
......
...@@ -778,6 +778,7 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/float-with-margin- ...@@ -778,6 +778,7 @@ crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/float-with-margin-
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/float-with-margin-moved-by-child-line-and-unbreakable.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/float-with-margin-moved-by-child-line-and-unbreakable.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/float-with-margin-moved-by-child-line.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/float-with-margin-moved-by-child-line.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/float-with-margin-moved-unbreakable.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/float-with-margin-moved-unbreakable.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/focus-outline.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/forced-break-after-block-with-spanner.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/forced-break-after-block-with-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/forced-break-after-empty-block-after-spanner.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/forced-break-after-empty-block-after-spanner.html [ Failure ]
crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/forced-break-after-last-block-before-spanner.html [ Failure ] crbug.com/591099 virtual/layout_ng_experimental/fast/multicol/forced-break-after-last-block-before-spanner.html [ Failure ]
......
...@@ -88,6 +88,18 @@ void LayoutNGMixin<Base>::AddOverflowFromChildren() { ...@@ -88,6 +88,18 @@ void LayoutNGMixin<Base>::AddOverflowFromChildren() {
Base::AddOverflowFromChildren(); Base::AddOverflowFromChildren();
} }
template <typename Base>
void LayoutNGMixin<Base>::AddOutlineRects(
Vector<LayoutRect>& rects,
const LayoutPoint& additional_offset,
LayoutObject::IncludeBlockVisualOverflowOrNot include_block_overflows)
const {
Base::AddOutlineRects(rects, additional_offset, include_block_overflows);
if (CurrentFragment()) {
CurrentFragment()->AddSelfOutlineRects(&rects, additional_offset);
}
}
// Retrieve NGBaseline from the current fragment. // Retrieve NGBaseline from the current fragment.
template <typename Base> template <typename Base>
const NGBaseline* LayoutNGMixin<Base>::FragmentBaseline( const NGBaseline* LayoutNGMixin<Base>::FragmentBaseline(
......
...@@ -77,6 +77,11 @@ class CORE_TEMPLATE_CLASS_EXPORT LayoutNGMixin : public Base { ...@@ -77,6 +77,11 @@ class CORE_TEMPLATE_CLASS_EXPORT LayoutNGMixin : public Base {
void AddOverflowFromChildren() override; void AddOverflowFromChildren() override;
void AddOutlineRects(
Vector<LayoutRect>&,
const LayoutPoint& additional_offset,
LayoutObject::IncludeBlockVisualOverflowOrNot) const override;
const NGPhysicalBoxFragment* CurrentFragment() const override; const NGPhysicalBoxFragment* CurrentFragment() const override;
const NGBaseline* FragmentBaseline(NGBaselineAlgorithmType) const; const NGBaseline* FragmentBaseline(NGBaselineAlgorithmType) const;
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#include "third_party/blink/renderer/core/layout/layout_block.h" #include "third_party/blink/renderer/core/layout/layout_block.h"
#include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/layout/layout_box.h"
#include "third_party/blink/renderer/core/layout/layout_object.h" #include "third_party/blink/renderer/core/layout/layout_object.h"
#include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_fragment_traversal.h"
#include "third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment.h"
#include "third_party/blink/renderer/core/layout/ng/ng_outline_utils.h" #include "third_party/blink/renderer/core/layout/ng/ng_outline_utils.h"
namespace blink { namespace blink {
...@@ -119,19 +121,51 @@ void NGPhysicalBoxFragment::AddSelfOutlineRects( ...@@ -119,19 +121,51 @@ void NGPhysicalBoxFragment::AddSelfOutlineRects(
Vector<LayoutRect>* outline_rects, Vector<LayoutRect>* outline_rects,
const LayoutPoint& additional_offset) const { const LayoutPoint& additional_offset) const {
DCHECK(outline_rects); DCHECK(outline_rects);
// TODO(kojii): Implement. This is quite incomplete yet.
// bool include_block_visual_overflow =
// layout_object->OutlineRectsShouldIncludeBlockVisualOverflow();
//
LayoutRect outline_rect(additional_offset, Size().ToLayoutSize()); LayoutRect outline_rect(additional_offset, Size().ToLayoutSize());
// LayoutRect outline_rect = VisualRect();
// outline_rect.MoveBy(additional_offset);
// outline_rect.Inflate(-Style().OutlineOffset());
// outline_rect.Inflate(-Style().OutlineWidth());
outline_rects->push_back(outline_rect); outline_rects->push_back(outline_rect);
DCHECK(GetLayoutObject());
if (!GetLayoutObject()->IsBox())
return;
if (!Style().OutlineStyleIsAuto() || GetLayoutObject()->HasOverflowClip() ||
ToLayoutBox(GetLayoutObject())->HasControlClip())
return;
// Focus outline includes chidlren
for (const auto& child : Children()) {
// List markers have no outline
if (child->IsListMarker())
continue;
if (child->IsLineBox()) {
// Traverse children of the linebox
Vector<NGPhysicalFragmentWithOffset> line_children =
NGInlineFragmentTraversal::DescendantsOf(
ToNGPhysicalLineBoxFragment(*child));
for (const auto& line_child : line_children) {
Vector<LayoutRect> line_child_rects;
line_child_rects.push_back(
line_child.RectInContainerBox().ToLayoutRect());
DCHECK(line_child.fragment->GetLayoutObject());
line_child.fragment->GetLayoutObject()->LocalToAncestorRects(
line_child_rects, ToLayoutBoxModelObject(GetLayoutObject()),
child->Offset().ToLayoutPoint(), additional_offset);
if (!line_child_rects.IsEmpty())
outline_rects->push_back(line_child_rects[0]);
}
} else {
DCHECK(child->GetLayoutObject());
LayoutObject* child_layout = child->GetLayoutObject();
Vector<LayoutRect> child_rects;
child_rects.push_back(child->VisualRectWithContents().ToLayoutRect());
child_layout->LocalToAncestorRects(
child_rects, ToLayoutBoxModelObject(GetLayoutObject()), LayoutPoint(),
additional_offset);
if (!child_rects.IsEmpty())
outline_rects->push_back(child_rects[0]);
}
}
} }
NGPhysicalOffsetRect NGPhysicalBoxFragment::VisualRectWithContents() const { NGPhysicalOffsetRect NGPhysicalBoxFragment::VisualRectWithContents() const {
......
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