diff options
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.cc | 236 |
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; |