Commit 3a9145f3 authored by Alex Rudenko's avatar Alex Rudenko Committed by Commit Bot

Fix grid label positioning within iframes

This CL adds calls to FramePointToViewport when generating
absolute label positions to ensure that labels are
properly positioned within iframes.

Screenshot: https://i.imgur.com/DDMvChr.png
Fixed: 1116324
Change-Id: I7ae1e720eb99e3e0b0394b838a7d0b7e660901dd
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2359033
Commit-Queue: Alex Rudenko <alexrudenko@chromium.org>
Reviewed-by: default avatarPeter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799283}
parent b37e1d9b
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/page.h"
#include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h"
#include "third_party/blink/renderer/core/style/grid_positions_resolver.h" #include "third_party/blink/renderer/core/style/grid_positions_resolver.h"
#include "third_party/blink/renderer/platform/geometry/float_point.h"
#include "third_party/blink/renderer/platform/geometry/layout_unit.h" #include "third_party/blink/renderer/platform/geometry/layout_unit.h"
#include "third_party/blink/renderer/platform/graphics/path.h" #include "third_party/blink/renderer/platform/graphics/path.h"
#include "third_party/blink/renderer/platform/web_test_support.h" #include "third_party/blink/renderer/platform/web_test_support.h"
...@@ -419,10 +420,15 @@ PhysicalOffset Transpose(PhysicalOffset& offset) { ...@@ -419,10 +420,15 @@ PhysicalOffset Transpose(PhysicalOffset& offset) {
return PhysicalOffset(offset.top, offset.left); return PhysicalOffset(offset.top, offset.left);
} }
PhysicalOffset LocalToAbsolutePoint(LayoutGrid* layout_grid, PhysicalOffset LocalToAbsolutePoint(Node* node,
PhysicalOffset local, PhysicalOffset local,
float scale) { float scale) {
PhysicalOffset abs_number_pos = layout_grid->LocalToAbsolutePoint(local); LayoutObject* layout_object = node->GetLayoutObject();
LayoutGrid* layout_grid = ToLayoutGrid(layout_object);
FloatPoint local_in_frame = FramePointToViewport(
node->GetDocument().View(), FloatPoint(local.left, local.top));
PhysicalOffset abs_number_pos = layout_grid->LocalToAbsolutePoint(
PhysicalOffset::FromFloatPointRound(local_in_frame));
abs_number_pos.Scale(scale); abs_number_pos.Scale(scale);
return abs_number_pos; return abs_number_pos;
} }
...@@ -437,11 +443,13 @@ std::unique_ptr<protocol::DictionaryValue> BuildPosition( ...@@ -437,11 +443,13 @@ std::unique_ptr<protocol::DictionaryValue> BuildPosition(
} }
std::unique_ptr<protocol::ListValue> BuildGridTrackSizes( std::unique_ptr<protocol::ListValue> BuildGridTrackSizes(
LayoutGrid* layout_grid, Node* node,
GridTrackSizingDirection direction, GridTrackSizingDirection direction,
float scale, float scale,
LayoutUnit gap, LayoutUnit gap,
const Vector<String>* authored_values) { const Vector<String>* authored_values) {
LayoutObject* layout_object = node->GetLayoutObject();
LayoutGrid* layout_grid = ToLayoutGrid(layout_object);
std::unique_ptr<protocol::ListValue> sizes = protocol::ListValue::create(); std::unique_ptr<protocol::ListValue> sizes = protocol::ListValue::create();
const Vector<LayoutUnit>& positions = direction == kForRows const Vector<LayoutUnit>& positions = direction == kForRows
? layout_grid->RowPositions() ? layout_grid->RowPositions()
...@@ -462,7 +470,7 @@ std::unique_ptr<protocol::ListValue> BuildGridTrackSizes( ...@@ -462,7 +470,7 @@ std::unique_ptr<protocol::ListValue> BuildGridTrackSizes(
if (direction == kForRows) if (direction == kForRows)
track_size_pos = Transpose(track_size_pos); track_size_pos = Transpose(track_size_pos);
std::unique_ptr<protocol::DictionaryValue> size_info = std::unique_ptr<protocol::DictionaryValue> size_info =
BuildPosition(LocalToAbsolutePoint(layout_grid, track_size_pos, scale)); BuildPosition(LocalToAbsolutePoint(node, track_size_pos, scale));
size_info->setDouble("computedSize", adjusted_size); size_info->setDouble("computedSize", adjusted_size);
if (i - 1 < authored_values->size()) { if (i - 1 < authored_values->size()) {
size_info->setString("authoredSize", authored_values->at(i - 1)); size_info->setString("authoredSize", authored_values->at(i - 1));
...@@ -474,11 +482,14 @@ std::unique_ptr<protocol::ListValue> BuildGridTrackSizes( ...@@ -474,11 +482,14 @@ std::unique_ptr<protocol::ListValue> BuildGridTrackSizes(
} }
std::unique_ptr<protocol::ListValue> BuildGridPositiveLineNumberPositions( std::unique_ptr<protocol::ListValue> BuildGridPositiveLineNumberPositions(
LayoutGrid* layout_grid, Node* node,
const Vector<LayoutUnit>& track_positions, const Vector<LayoutUnit>& track_positions,
const LayoutUnit& grid_gap, const LayoutUnit& grid_gap,
GridTrackSizingDirection direction, GridTrackSizingDirection direction,
float scale) { float scale) {
LayoutObject* layout_object = node->GetLayoutObject();
LayoutGrid* layout_grid = ToLayoutGrid(layout_object);
std::unique_ptr<protocol::ListValue> number_positions = std::unique_ptr<protocol::ListValue> number_positions =
protocol::ListValue::create(); protocol::ListValue::create();
...@@ -504,19 +515,22 @@ std::unique_ptr<protocol::ListValue> BuildGridPositiveLineNumberPositions( ...@@ -504,19 +515,22 @@ std::unique_ptr<protocol::ListValue> BuildGridPositiveLineNumberPositions(
alt_axis_pos); alt_axis_pos);
if (direction == kForRows) if (direction == kForRows)
number_position = Transpose(number_position); number_position = Transpose(number_position);
number_positions->pushValue(BuildPosition( number_positions->pushValue(
LocalToAbsolutePoint(layout_grid, number_position, scale))); BuildPosition(LocalToAbsolutePoint(node, number_position, scale)));
} }
return number_positions; return number_positions;
} }
std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions( std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions(
LayoutGrid* layout_grid, Node* node,
const Vector<LayoutUnit>& trackPositions, const Vector<LayoutUnit>& trackPositions,
const LayoutUnit& grid_gap, const LayoutUnit& grid_gap,
GridTrackSizingDirection direction, GridTrackSizingDirection direction,
float scale) { float scale) {
LayoutObject* layout_object = node->GetLayoutObject();
LayoutGrid* layout_grid = ToLayoutGrid(layout_object);
std::unique_ptr<protocol::ListValue> number_positions = std::unique_ptr<protocol::ListValue> number_positions =
protocol::ListValue::create(); protocol::ListValue::create();
...@@ -539,7 +553,7 @@ std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions( ...@@ -539,7 +553,7 @@ std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions(
if (direction == kForRows) if (direction == kForRows)
number_position = Transpose(number_position); number_position = Transpose(number_position);
number_positions->pushValue( number_positions->pushValue(
BuildPosition(LocalToAbsolutePoint(layout_grid, number_position, scale))); BuildPosition(LocalToAbsolutePoint(node, number_position, scale)));
// Then go line by line, calculating the offset to fall in the middle of gaps // Then go line by line, calculating the offset to fall in the middle of gaps
// if needed. // if needed.
...@@ -553,16 +567,19 @@ std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions( ...@@ -553,16 +567,19 @@ std::unique_ptr<protocol::ListValue> BuildGridNegativeLineNumberPositions(
alt_axis_pos); alt_axis_pos);
if (direction == kForRows) if (direction == kForRows)
number_position = Transpose(number_position); number_position = Transpose(number_position);
number_positions->pushValue(BuildPosition( number_positions->pushValue(
LocalToAbsolutePoint(layout_grid, number_position, scale))); BuildPosition(LocalToAbsolutePoint(node, number_position, scale)));
} }
return number_positions; return number_positions;
} }
std::unique_ptr<protocol::DictionaryValue> BuildAreaNamePaths( std::unique_ptr<protocol::DictionaryValue> BuildAreaNamePaths(Node* node,
LayoutGrid* layout_grid, float scale) {
float scale) { LayoutObject* layout_object = node->GetLayoutObject();
LayoutGrid* layout_grid = ToLayoutGrid(layout_object);
LocalFrameView* containing_view = node->GetDocument().View();
std::unique_ptr<protocol::DictionaryValue> area_paths = std::unique_ptr<protocol::DictionaryValue> area_paths =
protocol::DictionaryValue::create(); protocol::DictionaryValue::create();
...@@ -594,7 +611,7 @@ std::unique_ptr<protocol::DictionaryValue> BuildAreaNamePaths( ...@@ -594,7 +611,7 @@ std::unique_ptr<protocol::DictionaryValue> BuildAreaNamePaths(
end_row - start_row - row_gap_offset); end_row - start_row - row_gap_offset);
PhysicalRect area_rect(position, size); PhysicalRect area_rect(position, size);
FloatQuad area_quad = layout_grid->LocalRectToAbsoluteQuad(area_rect); FloatQuad area_quad = layout_grid->LocalRectToAbsoluteQuad(area_rect);
FrameQuadToViewport(containing_view, area_quad);
PathBuilder area_builder; PathBuilder area_builder;
area_builder.AppendPath(QuadToPath(area_quad), scale); area_builder.AppendPath(QuadToPath(area_quad), scale);
...@@ -605,9 +622,12 @@ std::unique_ptr<protocol::DictionaryValue> BuildAreaNamePaths( ...@@ -605,9 +622,12 @@ std::unique_ptr<protocol::DictionaryValue> BuildAreaNamePaths(
} }
std::unique_ptr<protocol::ListValue> BuildGridLineNames( std::unique_ptr<protocol::ListValue> BuildGridLineNames(
LayoutGrid* layout_grid, Node* node,
GridTrackSizingDirection direction, GridTrackSizingDirection direction,
float scale) { float scale) {
LayoutObject* layout_object = node->GetLayoutObject();
LayoutGrid* layout_grid = ToLayoutGrid(layout_object);
std::unique_ptr<protocol::ListValue> lines = protocol::ListValue::create(); std::unique_ptr<protocol::ListValue> lines = protocol::ListValue::create();
const Vector<LayoutUnit>& tracks = direction == kForColumns const Vector<LayoutUnit>& tracks = direction == kForColumns
...@@ -637,8 +657,8 @@ std::unique_ptr<protocol::ListValue> BuildGridLineNames( ...@@ -637,8 +657,8 @@ std::unique_ptr<protocol::ListValue> BuildGridLineNames(
if (direction == kForRows) if (direction == kForRows)
line_name_pos = Transpose(line_name_pos); line_name_pos = Transpose(line_name_pos);
std::unique_ptr<protocol::DictionaryValue> line = BuildPosition( std::unique_ptr<protocol::DictionaryValue> line =
LocalToAbsolutePoint(layout_grid, line_name_pos, scale)); BuildPosition(LocalToAbsolutePoint(node, line_name_pos, scale));
line->setString("name", name); line->setString("name", name);
...@@ -764,11 +784,11 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo( ...@@ -764,11 +784,11 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo(
grid_info->setValue( grid_info->setValue(
"columnTrackSizes", "columnTrackSizes",
BuildGridTrackSizes(layout_grid, kForColumns, scale, column_gap, BuildGridTrackSizes(node, kForColumns, scale, column_gap,
&column_authored_values)); &column_authored_values));
grid_info->setValue("rowTrackSizes", grid_info->setValue("rowTrackSizes",
BuildGridTrackSizes(layout_grid, kForRows, scale, BuildGridTrackSizes(node, kForRows, scale, row_gap,
row_gap, &row_authored_values)); &row_authored_values));
} }
PathBuilder row_builder; PathBuilder row_builder;
...@@ -838,35 +858,33 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo( ...@@ -838,35 +858,33 @@ std::unique_ptr<protocol::DictionaryValue> BuildGridInfo(
if (grid_highlight_config.show_positive_line_numbers) { if (grid_highlight_config.show_positive_line_numbers) {
grid_info->setValue("positiveRowLineNumberPositions", grid_info->setValue("positiveRowLineNumberPositions",
BuildGridPositiveLineNumberPositions( BuildGridPositiveLineNumberPositions(
layout_grid, rows, row_gap, kForRows, scale)); node, rows, row_gap, kForRows, scale));
grid_info->setValue( grid_info->setValue("positiveColumnLineNumberPositions",
"positiveColumnLineNumberPositions", BuildGridPositiveLineNumberPositions(
BuildGridPositiveLineNumberPositions(layout_grid, columns, column_gap, node, columns, column_gap, kForColumns, scale));
kForColumns, scale));
} }
// Negative Row and column Line positions // Negative Row and column Line positions
if (grid_highlight_config.show_negative_line_numbers) { if (grid_highlight_config.show_negative_line_numbers) {
grid_info->setValue("negativeRowLineNumberPositions", grid_info->setValue("negativeRowLineNumberPositions",
BuildGridNegativeLineNumberPositions( BuildGridNegativeLineNumberPositions(
layout_grid, rows, row_gap, kForRows, scale)); node, rows, row_gap, kForRows, scale));
grid_info->setValue( grid_info->setValue("negativeColumnLineNumberPositions",
"negativeColumnLineNumberPositions", BuildGridNegativeLineNumberPositions(
BuildGridNegativeLineNumberPositions(layout_grid, columns, column_gap, node, columns, column_gap, kForColumns, scale));
kForColumns, scale));
} }
// Area names // Area names
if (grid_highlight_config.show_area_names) { if (grid_highlight_config.show_area_names) {
grid_info->setValue("areaNames", BuildAreaNamePaths(layout_grid, scale)); grid_info->setValue("areaNames", BuildAreaNamePaths(node, scale));
} }
// line names // line names
if (grid_highlight_config.show_line_names) { if (grid_highlight_config.show_line_names) {
grid_info->setValue("rowLineNameOffsets", grid_info->setValue("rowLineNameOffsets",
BuildGridLineNames(layout_grid, kForRows, scale)); BuildGridLineNames(node, kForRows, scale));
grid_info->setValue("columnLineNameOffsets", grid_info->setValue("columnLineNameOffsets",
BuildGridLineNames(layout_grid, kForColumns, scale)); BuildGridLineNames(node, kForColumns, scale));
} }
// Grid border // Grid border
......
This test verifies that persistent grid in iframe are positioned correctly.
{
"gridHighlights": [
{
"rotationAngle": 0,
"columnTrackSizes": [
{
"x": 158,
"y": 98,
"computedSize": 120,
"authoredSize": "120px"
},
{
"x": 288,
"y": 98,
"computedSize": 120,
"authoredSize": "120px"
},
{
"x": 418,
"y": 98,
"computedSize": 120,
"authoredSize": "120px"
}
],
"rowTrackSizes": [
{
"x": 98,
"y": 220.5,
"computedSize": 245,
"authoredSize": "1fr"
},
{
"x": 98,
"y": 475.5,
"computedSize": 245,
"authoredSize": "1fr"
}
],
"rows": [
"M",
98,
98,
"L",
478,
98,
"M",
478,
343,
"L",
98,
343,
"M",
98,
353,
"L",
478,
353,
"M",
478,
598,
"L",
98,
598
],
"rowGaps": [
"M",
98,
343,
"L",
478,
343,
"L",
478,
353,
"L",
98,
353,
"Z"
],
"columns": [
"M",
98,
98,
"L",
98,
598,
"M",
218,
598,
"L",
218,
98,
"M",
228,
98,
"L",
228,
598,
"M",
348,
598,
"L",
348,
98,
"M",
358,
98,
"L",
358,
598,
"M",
478,
598,
"L",
478,
98
],
"columnGaps": [
"M",
218,
98,
"L",
228,
98,
"L",
228,
598,
"L",
218,
598,
"Z",
"M",
348,
98,
"L",
358,
98,
"L",
358,
598,
"L",
348,
598,
"Z"
],
"positiveRowLineNumberPositions": [
{
"x": 98,
"y": 98
},
{
"x": 98,
"y": 348
},
{
"x": 98,
"y": 598
}
],
"positiveColumnLineNumberPositions": [
{
"x": 98,
"y": 98
},
{
"x": 223,
"y": 98
},
{
"x": 353,
"y": 98
},
{
"x": 478,
"y": 98
}
],
"negativeRowLineNumberPositions": [
{
"x": 478,
"y": 98
},
{
"x": 478,
"y": 348
},
{
"x": 478,
"y": 598
}
],
"negativeColumnLineNumberPositions": [
{
"x": 98,
"y": 598
},
{
"x": 223,
"y": 598
},
{
"x": 353,
"y": 598
},
{
"x": 478,
"y": 598
}
],
"areaNames": {
"header": [
"M",
228,
98,
"L",
478,
98,
"L",
478,
343,
"L",
228,
343,
"Z"
],
"sidebar": [
"M",
98,
353,
"L",
218,
353,
"L",
218,
598,
"L",
98,
598,
"Z"
],
"content": [
"M",
228,
353,
"L",
478,
353,
"L",
478,
598,
"L",
228,
598,
"Z"
]
},
"rowLineNameOffsets": [
{
"x": 98,
"y": 598,
"name": "sidebar-end"
},
{
"x": 98,
"y": 348,
"name": "sidebar-start"
},
{
"x": 98,
"y": 348,
"name": "content-start"
},
{
"x": 98,
"y": 348,
"name": "header-end"
},
{
"x": 98,
"y": 598,
"name": "content-end"
},
{
"x": 98,
"y": 98,
"name": "header-start"
}
],
"columnLineNameOffsets": [],
"gridBorder": [
"M",
98,
98,
"L",
478,
98,
"L",
478,
598,
"L",
98,
598,
"Z"
],
"gridHighlightConfig": {
"gridBorderDash": false,
"rowLineDash": true,
"columnLineDash": true,
"showGridExtensionLines": true,
"showPositiveLineNumbers": true,
"showNegativeLineNumbers": true,
"showAreaNames": true,
"showLineNames": true,
"gridBorderColor": "rgba(255, 0, 0, 0)",
"rowLineColor": "rgba(128, 0, 0, 0)",
"columnLineColor": "rgba(128, 0, 0, 0)",
"rowGapColor": "rgba(0, 255, 0, 0)",
"columnGapColor": "rgba(0, 0, 255, 0)",
"rowHatchColor": "rgba(255, 255, 255, 0)",
"columnHatchColor": "rgba(128, 128, 128, 0)",
"areaBorderColor": "rgba(255, 0, 0, 0)"
},
"isPrimaryGrid": true
}
]
}
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
TestRunner.addResult(`This test verifies that persistent grid in iframe are positioned correctly.\n`);
await TestRunner.loadModule('elements_test_runner');
await TestRunner.showPanel('elements');
await TestRunner.loadHTML(`
<!DOCTYPE html>
<iframe style="margin: 5em; width: 600px; height: 600px;" srcdoc="<style>div{width:500px;height:500px;display: grid;grid-gap: 10px;grid-template-columns: 120px 120px 120px;grid-template-areas:'....... header header' 'sidebar content content'; background-color: #fff; color: #444;grid-template-rows:1fr 1fr;</style><div id='grid'>"></iframe>
`);
await new Promise(resolve => {
ElementsTestRunner.dumpInspectorGridHighlightsJSON(['grid'], resolve);
});
TestRunner.completeTest();
})();
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