summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc236
1 files changed, 190 insertions, 46 deletions
diff --git a/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc
index 01bd3002faa..16a0c57498f 100644
--- a/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc
+++ b/chromium/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -6,7 +6,6 @@
#include <memory>
-#include "base/macros.h"
#include "third_party/blink/renderer/core/css/css_color.h"
#include "third_party/blink/renderer/core/css/css_computed_style_declaration.h"
#include "third_party/blink/renderer/core/css/css_grid_auto_repeat_value.h"
@@ -15,6 +14,7 @@
#include "third_party/blink/renderer/core/css/css_property_name.h"
#include "third_party/blink/renderer/core/css/css_property_names.h"
#include "third_party/blink/renderer/core/css/css_value.h"
+#include "third_party/blink/renderer/core/css/resolver/style_resolver.h"
#include "third_party/blink/renderer/core/display_lock/display_lock_utilities.h"
#include "third_party/blink/renderer/core/dom/dom_node_ids.h"
#include "third_party/blink/renderer/core/dom/pseudo_element.h"
@@ -56,6 +56,8 @@ class PathBuilder {
public:
PathBuilder() : path_(protocol::ListValue::create()) {}
+ PathBuilder(const PathBuilder&) = delete;
+ PathBuilder& operator=(const PathBuilder&) = delete;
virtual ~PathBuilder() = default;
std::unique_ptr<protocol::ListValue> Release() { return std::move(path_); }
@@ -81,7 +83,6 @@ class PathBuilder {
size_t length);
std::unique_ptr<protocol::ListValue> path_;
- DISALLOW_COPY_AND_ASSIGN(PathBuilder);
};
void PathBuilder::AppendPathCommandAndPoints(const char* command,
@@ -289,7 +290,7 @@ void AppendStyleInfo(Node* node,
properties.push_back(CSSPropertyID::kMargin);
properties.push_back(CSSPropertyID::kBackgroundColor);
- for (size_t i = 0; i < properties.size(); ++i) {
+ for (wtf_size_t i = 0; i < properties.size(); ++i) {
const CSSValue* value = style->GetPropertyCSSValue(properties[i]);
if (!value)
continue;
@@ -522,6 +523,20 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridHighlightConfigInfo(
return grid_config_info;
}
+std::unique_ptr<protocol::DictionaryValue>
+BuildContainerQueryContainerHighlightConfigInfo(
+ const InspectorContainerQueryContainerHighlightConfig& container_config) {
+ std::unique_ptr<protocol::DictionaryValue> container_config_info =
+ protocol::DictionaryValue::create();
+
+ AppendLineStyleConfig(container_config.container_border,
+ container_config_info, "containerBorder");
+ AppendLineStyleConfig(container_config.descendant_border,
+ container_config_info, "descendantBorder");
+
+ return container_config_info;
+}
+
// Swaps |left| and |top| of an offset.
PhysicalOffset Transpose(PhysicalOffset& offset) {
return PhysicalOffset(offset.top, offset.left);
@@ -549,7 +564,7 @@ LayoutUnit TranslateRTLCoordinate(const LayoutObject* layout_object,
}
LayoutUnit GetPositionForTrackAt(const LayoutObject* layout_object,
- size_t index,
+ wtf_size_t index,
GridTrackSizingDirection direction,
const Vector<LayoutUnit>& positions) {
if (direction == kForRows)
@@ -570,7 +585,7 @@ LayoutUnit GetPositionForFirstTrack(const LayoutObject* layout_object,
LayoutUnit GetPositionForLastTrack(const LayoutObject* layout_object,
GridTrackSizingDirection direction,
const Vector<LayoutUnit>& positions) {
- size_t index = positions.size() - 1;
+ wtf_size_t index = positions.size() - 1;
return GetPositionForTrackAt(layout_object, index, direction, positions);
}
@@ -644,20 +659,22 @@ std::unique_ptr<protocol::ListValue> BuildGridTrackSizes(
GridTrackSizingDirection direction,
float scale,
LayoutUnit gap,
+ LayoutUnit rtl_offset,
const Vector<LayoutUnit>& positions,
const Vector<LayoutUnit>& alt_axis_positions,
const Vector<String>* authored_values) {
LayoutObject* layout_object = node->GetLayoutObject();
- bool is_rtl = direction == kForColumns &&
- !layout_object->StyleRef().IsLeftToRightDirection();
+ bool is_rtl = !layout_object->StyleRef().IsLeftToRightDirection();
std::unique_ptr<protocol::ListValue> sizes = protocol::ListValue::create();
- size_t track_count = positions.size();
+ wtf_size_t track_count = positions.size();
LayoutUnit alt_axis_pos = GetPositionForFirstTrack(
layout_object, direction == kForRows ? kForColumns : kForRows,
alt_axis_positions);
+ if (is_rtl && direction == kForRows)
+ alt_axis_pos += rtl_offset;
- for (size_t i = 1; i < track_count; i++) {
+ for (wtf_size_t i = 1; i < track_count; i++) {
LayoutUnit current_position =
GetPositionForTrackAt(layout_object, i, direction, positions);
LayoutUnit prev_position =
@@ -665,11 +682,11 @@ std::unique_ptr<protocol::ListValue> BuildGridTrackSizes(
LayoutUnit gap_offset = i < track_count - 1 ? gap : LayoutUnit();
LayoutUnit width = current_position - prev_position - gap_offset;
- if (is_rtl)
+ if (is_rtl && direction == kForColumns)
width = prev_position - current_position - gap_offset;
LayoutUnit main_axis_pos = prev_position + width / 2;
- if (is_rtl)
- main_axis_pos = prev_position - width / 2;
+ if (is_rtl && direction == kForColumns)
+ main_axis_pos = rtl_offset + prev_position - width / 2;
auto adjusted_size = AdjustForAbsoluteZoom::AdjustFloat(
width * scale, layout_object->StyleRef());
PhysicalOffset track_size_pos(main_axis_pos, alt_axis_pos);
@@ -692,30 +709,33 @@ std::unique_ptr<protocol::ListValue> BuildGridPositiveLineNumberPositions(
const LayoutUnit& grid_gap,
GridTrackSizingDirection direction,
float scale,
+ LayoutUnit rtl_offset,
const Vector<LayoutUnit>& positions,
const Vector<LayoutUnit>& alt_axis_positions) {
LayoutObject* layout_object = node->GetLayoutObject();
auto* grid_interface = ToInterface<LayoutNGGridInterface>(layout_object);
- bool is_rtl = direction == kForColumns &&
- !layout_object->StyleRef().IsLeftToRightDirection();
+ bool is_rtl = !layout_object->StyleRef().IsLeftToRightDirection();
std::unique_ptr<protocol::ListValue> number_positions =
protocol::ListValue::create();
- size_t track_count = positions.size();
+ wtf_size_t track_count = positions.size();
LayoutUnit alt_axis_pos = GetPositionForFirstTrack(
layout_object, direction == kForRows ? kForColumns : kForRows,
alt_axis_positions);
+ if (is_rtl && direction == kForRows)
+ alt_axis_pos += rtl_offset;
+
// Find index of the first explicit Grid Line.
- size_t first_explicit_index =
+ wtf_size_t first_explicit_index =
grid_interface->ExplicitGridStartForDirection(direction);
// Go line by line, calculating the offset to fall in the middle of gaps
// if needed.
- for (size_t i = first_explicit_index; i < track_count; ++i) {
+ for (wtf_size_t i = first_explicit_index; i < track_count; ++i) {
LayoutUnit gapOffset = grid_gap / 2;
- if (is_rtl)
+ if (is_rtl && direction == kForColumns)
gapOffset *= -1;
// No need for a gap offset if there is no gap, or the first line is
// explicit, or this is the last line.
@@ -724,6 +744,8 @@ std::unique_ptr<protocol::ListValue> BuildGridPositiveLineNumberPositions(
}
LayoutUnit offset =
GetPositionForTrackAt(layout_object, i, direction, positions);
+ if (is_rtl && direction == kForColumns)
+ offset += rtl_offset;
PhysicalOffset number_position(offset - gapOffset, alt_axis_pos);
if (direction == kForRows)
number_position = Transpose(number_position);
@@ -739,20 +761,22 @@ std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions(
const LayoutUnit& grid_gap,
GridTrackSizingDirection direction,
float scale,
+ LayoutUnit rtl_offset,
const Vector<LayoutUnit>& positions,
const Vector<LayoutUnit>& alt_axis_positions) {
LayoutObject* layout_object = node->GetLayoutObject();
auto* grid_interface = ToInterface<LayoutNGGridInterface>(layout_object);
- bool is_rtl = direction == kForColumns &&
- !layout_object->StyleRef().IsLeftToRightDirection();
+ bool is_rtl = !layout_object->StyleRef().IsLeftToRightDirection();
std::unique_ptr<protocol::ListValue> number_positions =
protocol::ListValue::create();
- size_t track_count = positions.size();
+ wtf_size_t track_count = positions.size();
LayoutUnit alt_axis_pos = GetPositionForLastTrack(
layout_object, direction == kForRows ? kForColumns : kForRows,
alt_axis_positions);
+ if (is_rtl && direction == kForRows)
+ alt_axis_pos += rtl_offset;
// This is the number of tracks from the start of the grid, to the end of the
// explicit grid (including any leading implicit tracks).
@@ -762,6 +786,8 @@ std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions(
{
LayoutUnit first_offset =
GetPositionForFirstTrack(layout_object, direction, positions);
+ if (is_rtl && direction == kForColumns)
+ first_offset += rtl_offset;
// Always start negative numbers at the first line.
std::unique_ptr<protocol::DictionaryValue> pos =
@@ -775,9 +801,9 @@ std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions(
// Then go line by line, calculating the offset to fall in the middle of gaps
// if needed.
- for (size_t i = 1; i <= explicit_grid_end_track_count; i++) {
+ for (wtf_size_t i = 1; i <= explicit_grid_end_track_count; i++) {
LayoutUnit gapOffset = grid_gap / 2;
- if (is_rtl)
+ if (is_rtl && direction == kForColumns)
gapOffset *= -1;
if (grid_gap == 0 ||
(i == explicit_grid_end_track_count && i == track_count - 1)) {
@@ -785,6 +811,8 @@ std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions(
}
LayoutUnit offset =
GetPositionForTrackAt(layout_object, i, direction, positions);
+ if (is_rtl && direction == kForColumns)
+ offset += rtl_offset;
PhysicalOffset number_position(offset - gapOffset, alt_axis_pos);
if (direction == kForRows)
number_position = Transpose(number_position);
@@ -886,7 +914,7 @@ std::unique_ptr<protocol::ListValue> BuildGridLineNames(
for (const auto& item : named_lines_map) {
const String& name = item.key;
- for (const size_t index : item.value) {
+ for (const wtf_size_t index : item.value) {
LayoutUnit track =
GetPositionForTrackAt(layout_object, index, direction, positions);
@@ -1210,6 +1238,13 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo(
auto column_gap = grid_interface->GridGap(kForColumns) +
grid_interface->GridItemOffset(kForColumns);
+ // In legacy grid the last column in rtl will go to the extent of the grid,
+ // all the way to the left. In NG, this is not the case, and will stop sooner
+ // if the tracks don't take up the full size of the grid.
+ LayoutUnit rtl_offset;
+ if (layout_object->IsLayoutNGGrid())
+ rtl_offset = To<LayoutBox>(layout_object)->LogicalWidth() - columns.back();
+
if (grid_highlight_config.show_track_sizes) {
Element* element = DynamicTo<Element>(node);
DCHECK(element);
@@ -1217,28 +1252,34 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo(
HeapHashMap<CSSPropertyName, Member<const CSSValue>> cascaded_values =
style_resolver.CascadedValuesForElement(element, kPseudoIdNone);
Vector<String> column_authored_values = GetAuthoredGridTrackSizes(
- cascaded_values.at(
+ cascaded_values.DeprecatedAtOrEmptyValue(
CSSPropertyName(CSSPropertyID::kGridTemplateColumns)),
grid_interface->AutoRepeatCountForDirection(kForColumns));
Vector<String> row_authored_values = GetAuthoredGridTrackSizes(
- cascaded_values.at(CSSPropertyName(CSSPropertyID::kGridTemplateRows)),
+ cascaded_values.DeprecatedAtOrEmptyValue(
+ CSSPropertyName(CSSPropertyID::kGridTemplateRows)),
grid_interface->AutoRepeatCountForDirection(kForRows));
grid_info->setValue(
"columnTrackSizes",
- BuildGridTrackSizes(node, kForColumns, scale, column_gap, columns, rows,
- &column_authored_values));
+ BuildGridTrackSizes(node, kForColumns, scale, column_gap, rtl_offset,
+ columns, rows, &column_authored_values));
grid_info->setValue(
"rowTrackSizes",
- BuildGridTrackSizes(node, kForRows, scale, row_gap, rows, columns,
- &row_authored_values));
+ BuildGridTrackSizes(node, kForRows, scale, row_gap, rtl_offset, rows,
+ columns, &row_authored_values));
}
+ bool is_ltr = layout_object->StyleRef().IsLeftToRightDirection();
+
PathBuilder row_builder;
PathBuilder row_gap_builder;
LayoutUnit row_left = columns.front();
+ if (!is_ltr) {
+ row_left += rtl_offset;
+ }
LayoutUnit row_width = columns.back() - columns.front();
- for (size_t i = 1; i < rows.size(); ++i) {
+ for (wtf_size_t i = 1; i < rows.size(); ++i) {
// Rows
PhysicalOffset position(row_left, rows.at(i - 1));
PhysicalSize size(row_width, rows.at(i) - rows.at(i - 1));
@@ -1266,15 +1307,15 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo(
PathBuilder column_gap_builder;
LayoutUnit column_top = rows.front();
LayoutUnit column_height = rows.back() - rows.front();
- bool is_ltr = layout_object->StyleRef().IsLeftToRightDirection();
- for (size_t i = 1; i < columns.size(); ++i) {
+ for (wtf_size_t i = 1; i < columns.size(); ++i) {
PhysicalSize size(columns.at(i) - columns.at(i - 1), column_height);
if (i != columns.size() - 1)
size.width -= column_gap;
LayoutUnit line_left =
GetPositionForTrackAt(layout_object, i - 1, kForColumns, columns);
- if (!is_ltr)
- line_left -= size.width;
+ if (!is_ltr) {
+ line_left += rtl_offset - size.width;
+ }
PhysicalOffset position(line_left, column_top);
PhysicalRect column(position, size);
FloatQuad column_quad = layout_object->LocalRectToAbsoluteQuad(column);
@@ -1288,6 +1329,8 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo(
GetPositionForTrackAt(layout_object, i, kForColumns, columns);
if (is_ltr)
gap_left -= column_gap;
+ else
+ gap_left += rtl_offset;
PhysicalOffset gap_position(gap_left, column_top);
PhysicalSize gap_size(column_gap, column_height);
PhysicalRect gap(gap_position, gap_size);
@@ -1301,24 +1344,26 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo(
// Positive Row and column Line positions
if (grid_highlight_config.show_positive_line_numbers) {
- grid_info->setValue("positiveRowLineNumberPositions",
- BuildGridPositiveLineNumberPositions(
- node, row_gap, kForRows, scale, rows, columns));
+ grid_info->setValue(
+ "positiveRowLineNumberPositions",
+ BuildGridPositiveLineNumberPositions(node, row_gap, kForRows, scale,
+ rtl_offset, rows, columns));
grid_info->setValue(
"positiveColumnLineNumberPositions",
BuildGridPositiveLineNumberPositions(node, column_gap, kForColumns,
- scale, columns, rows));
+ scale, rtl_offset, columns, rows));
}
// Negative Row and column Line positions
if (grid_highlight_config.show_negative_line_numbers) {
- grid_info->setValue("negativeRowLineNumberPositions",
- BuildGridNegativeLineNumberPositions(
- node, row_gap, kForRows, scale, rows, columns));
+ grid_info->setValue(
+ "negativeRowLineNumberPositions",
+ BuildGridNegativeLineNumberPositions(node, row_gap, kForRows, scale,
+ rtl_offset, rows, columns));
grid_info->setValue(
"negativeColumnLineNumberPositions",
BuildGridNegativeLineNumberPositions(node, column_gap, kForColumns,
- scale, columns, rows));
+ scale, rtl_offset, columns, rows));
}
// Area names
@@ -1637,8 +1682,8 @@ InspectorHighlight::InspectorHighlight(
show_extension_lines_(highlight_config.show_extension_lines),
show_accessibility_info_(highlight_config.show_accessibility_info),
color_format_(highlight_config.color_format) {
- DCHECK(node->GetDocument().Lifecycle().GetState() >=
- DocumentLifecycle::kLayoutClean);
+ DCHECK_GE(node->GetDocument().Lifecycle().GetState(),
+ DocumentLifecycle::kLayoutClean);
AppendPathsForShapeOutside(node, highlight_config);
AppendNodeHighlight(node, highlight_config);
auto* text_node = DynamicTo<Text>(node);
@@ -1688,7 +1733,7 @@ void InspectorHighlight::AppendDistanceInfo(Node* node) {
CSSComputedStyleDeclaration* style =
MakeGarbageCollected<CSSComputedStyleDeclaration>(node, true);
- for (size_t i = 0; i < style->length(); ++i) {
+ for (unsigned i = 0; i < style->length(); ++i) {
AtomicString name(style->item(i));
const CSSValue* value = style->GetPropertyCSSValue(
CssPropertyID(node->GetExecutionContext(), name));
@@ -1859,6 +1904,13 @@ void InspectorHighlight::AppendNodeHighlight(
node, *(highlight_config.flex_item_highlight_config), scale_));
}
}
+
+ if (highlight_config.container_query_container_highlight_config) {
+ container_query_container_info_ = protocol::ListValue::create();
+ container_query_container_info_->pushValue(BuildContainerQueryContainerInfo(
+ node, *(highlight_config.container_query_container_highlight_config),
+ scale_));
+ }
}
std::unique_ptr<protocol::DictionaryValue> InspectorHighlight::AsProtocolValue()
@@ -1908,6 +1960,11 @@ std::unique_ptr<protocol::DictionaryValue> InspectorHighlight::AsProtocolValue()
object->setValue("flexInfo", flex_container_info_->clone());
if (flex_item_info_ && flex_item_info_->size() > 0)
object->setValue("flexItemInfo", flex_item_info_->clone());
+ if (container_query_container_info_ &&
+ container_query_container_info_->size() > 0) {
+ object->setValue("containerQueryInfo",
+ container_query_container_info_->clone());
+ }
return object;
}
@@ -2180,6 +2237,93 @@ std::unique_ptr<protocol::DictionaryValue> InspectorScrollSnapHighlight(
return scroll_snap_info;
}
+Vector<FloatQuad> GetContainerQueryingDescendantQuads(Element* container) {
+ Vector<FloatQuad> descendant_quads;
+ for (Element* descendant :
+ InspectorDOMAgent::GetContainerQueryingDescendants(container)) {
+ LayoutBox* layout_box = descendant->GetLayoutBox();
+ if (!layout_box)
+ continue;
+ auto content_box = layout_box->PhysicalContentBoxRect();
+ FloatQuad content_quad = layout_box->LocalRectToAbsoluteQuad(content_box);
+ descendant_quads.push_back(content_quad);
+ }
+
+ return descendant_quads;
+}
+
+std::unique_ptr<protocol::DictionaryValue> BuildContainerQueryContainerInfo(
+ Node* node,
+ const InspectorContainerQueryContainerHighlightConfig&
+ container_query_container_highlight_config,
+ float scale) {
+ if (!node)
+ return nullptr;
+
+ LayoutBox* layout_box = node->GetLayoutBox();
+ if (!layout_box)
+ return nullptr;
+
+ LocalFrameView* containing_view = node->GetDocument().View();
+ if (!containing_view)
+ return nullptr;
+
+ std::unique_ptr<protocol::DictionaryValue> container_query_container_info =
+ protocol::DictionaryValue::create();
+
+ PathBuilder container_builder;
+ auto content_box = layout_box->PhysicalContentBoxRect();
+ FloatQuad content_quad = layout_box->LocalRectToAbsoluteQuad(content_box);
+ FrameQuadToViewport(containing_view, content_quad);
+ container_builder.AppendPath(QuadToPath(content_quad), scale);
+ container_query_container_info->setValue("containerBorder",
+ container_builder.Release());
+
+ auto* element = DynamicTo<Element>(node);
+ bool include_descendants =
+ container_query_container_highlight_config.descendant_border &&
+ !container_query_container_highlight_config.descendant_border
+ ->IsTransparent();
+ if (element && include_descendants) {
+ std::unique_ptr<protocol::ListValue> descendants_info =
+ protocol::ListValue::create();
+ for (auto& descendant_quad : GetContainerQueryingDescendantQuads(element)) {
+ std::unique_ptr<protocol::DictionaryValue> descendant_info =
+ protocol::DictionaryValue::create();
+ descendant_info->setValue(
+ "descendantBorder",
+ BuildPathFromQuad(containing_view, descendant_quad));
+ descendants_info->pushValue(std::move(descendant_info));
+ }
+ container_query_container_info->setArray("queryingDescendants",
+ std::move(descendants_info));
+ }
+
+ container_query_container_info->setValue(
+ "containerQueryContainerHighlightConfig",
+ BuildContainerQueryContainerHighlightConfigInfo(
+ container_query_container_highlight_config));
+
+ return container_query_container_info;
+}
+
+std::unique_ptr<protocol::DictionaryValue> InspectorContainerQueryHighlight(
+ Node* node,
+ const InspectorContainerQueryContainerHighlightConfig& config) {
+ LocalFrameView* frame_view = node->GetDocument().View();
+ if (!frame_view)
+ return nullptr;
+
+ std::unique_ptr<protocol::DictionaryValue> container_query_container_info =
+ BuildContainerQueryContainerInfo(node, config,
+ DeviceScaleFromFrameView(frame_view));
+
+ if (!container_query_container_info)
+ return nullptr;
+
+ return container_query_container_info;
+}
+
// static
InspectorHighlightConfig InspectorHighlight::DefaultConfig() {
InspectorHighlightConfig config;