Commit f1a23606 authored by Philip Rogers's avatar Philip Rogers Committed by Commit Bot

Transforms with composited descendants do not require compositing

In the following example, we do not need to composite the first transform:
<div id="first" style="transform: translate(10px, 10px); width: 100px; height: 100px;">
  <div id="second" style="will-change: transform; width: 50px; height: 50px;"></div>
</div>

Pre-BlinkGenPropertyTrees, this was required to ensure a composited
cc::TransformNode existed, but this can now happen without a composited
cc::Layer.

This should reduce memory: On the top 10k pages, 2% of GPU tile memory is due to
layers with the kTransformWithCompositedDescendants compositing reason. This was
determined using a metrics collection patch on cluster telemetry:
https://docs.google.com/spreadsheets/d/1cCFRHDG9Uu0dbGETmHcjM-QI2nMZe8_lfA8Mgm7H23I/edit#gid=2004092469

Bug: 989251
Change-Id: I2b111eb2fe5cdbbfe073846f4e1271fb454bd887
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1696112Reviewed-by: default avatarChris Harrelson <chrishtr@chromium.org>
Commit-Queue: Philip Rogers <pdr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#692043}
parent df1c5ff7
...@@ -756,9 +756,6 @@ void CompositedLayerMapping::UpdateSquashingLayerGeometry( ...@@ -756,9 +756,6 @@ void CompositedLayerMapping::UpdateSquashingLayerGeometry(
// Store the local bounds of the Layer subtree before applying the offset. // Store the local bounds of the Layer subtree before applying the offset.
layers[i].composited_bounds = squashed_bounds; layers[i].composited_bounds = squashed_bounds;
DCHECK(&layers[i].paint_layer->TransformAncestorOrRoot() ==
common_transform_ancestor);
PhysicalOffset squashed_layer_offset_from_transformed_ancestor = PhysicalOffset squashed_layer_offset_from_transformed_ancestor =
layers[i].paint_layer->ComputeOffsetFromAncestor( layers[i].paint_layer->ComputeOffsetFromAncestor(
*common_transform_ancestor); *common_transform_ancestor);
......
...@@ -100,14 +100,31 @@ TEST_F(CompositedLayerMappingTest, ...@@ -100,14 +100,31 @@ TEST_F(CompositedLayerMappingTest,
TEST_F(CompositedLayerMappingTest, TEST_F(CompositedLayerMappingTest,
SubpixelAccumulationChangeIndirectCompositing) { SubpixelAccumulationChangeIndirectCompositing) {
SetBodyInnerHTML( SetBodyInnerHTML(R"HTML(
<style>
"<div id='target' style='background: lightblue; " #target {
" position: relative; top: -10px; left: 0.4px; width: 100px;" background: lightblue;
" height: 100px; transform: translateX(0)'>" position: relative;
" <div style='position; relative; width: 100px; height: 100px;" top: -10px;
" background: lightgray; will-change: transform'></div>" left: 0.4px;
"</div>"); width: 100px;
height: 100px;
transform: translateX(0);
opacity: 0.4;
}
#child {
position; relative;
width: 100px;
height: 100px;
background: lightgray;
will-change: transform;
opacity: 0.6;
}
</style>
<div id='target'>
<div id='child'></div>
</div>
)HTML");
Element* target = GetDocument().getElementById("target"); Element* target = GetDocument().getElementById("target");
target->SetInlineStyleProperty(CSSPropertyID::kLeft, "0.6px"); target->SetInlineStyleProperty(CSSPropertyID::kLeft, "0.6px");
...@@ -278,25 +295,28 @@ TEST_F(CompositedLayerMappingTest, LargeScaleInterestRect) { ...@@ -278,25 +295,28 @@ TEST_F(CompositedLayerMappingTest, LargeScaleInterestRect) {
width: 1920px; width: 1920px;
transform: scale(0.0859375); transform: scale(0.0859375);
transform-origin: 0 0 0; transform-origin: 0 0 0;
background:blue; background: blue;
will-change: transform;
} }
.wrapper { .wrapper {
height: 92px; height: 92px;
width: 165px; width: 165px;
overflow: hidden; overflow: hidden;
} }
.posabs { .posabs {
position: absolute; position: absolute;
width: 300px; width: 300px;
height: 300px; height: 300px;
top: 5000px; top: 5000px;
}
#target {
will-change: transform;
} }
</style> </style>
<div class='wrapper'> <div class='wrapper'>
<div id='target' class='container'> <div id='target' class='container'>
<div class='posabs'></div> <div class='posabs'></div>
<div id='target' style='will-change: transform' <div id='target class='posabs'></div>
class='posabs'></div>
</div> </div>
</div> </div>
)HTML"); )HTML");
......
...@@ -93,10 +93,6 @@ CompositingReasonFinder::PotentialCompositingReasonsFromStyle( ...@@ -93,10 +93,6 @@ CompositingReasonFinder::PotentialCompositingReasonsFromStyle(
if (style.HasBackdropFilter()) if (style.HasBackdropFilter())
reasons |= CompositingReason::kBackdropFilter; reasons |= CompositingReason::kBackdropFilter;
// See Layer::updateTransform for an explanation of why we check both.
if (layout_object.HasTransformRelatedProperty() && style.HasTransform())
reasons |= CompositingReason::kTransformWithCompositedDescendants;
if (style.HasOpacity()) if (style.HasOpacity())
reasons |= CompositingReason::kOpacityWithCompositedDescendants; reasons |= CompositingReason::kOpacityWithCompositedDescendants;
......
...@@ -64,10 +64,6 @@ constexpr CompositingReasonStringMap kCompositingReasonsStringMap[] = { ...@@ -64,10 +64,6 @@ constexpr CompositingReasonStringMap kCompositingReasonsStringMap[] = {
"Parent with composited negative z-index content"}, "Parent with composited negative z-index content"},
{CompositingReason::kSquashingDisallowed, "squashingDisallowed", {CompositingReason::kSquashingDisallowed, "squashingDisallowed",
"Layer was separately composited because it could not be squashed."}, "Layer was separately composited because it could not be squashed."},
{CompositingReason::kTransformWithCompositedDescendants,
"transformWithCompositedDescendants",
"Has a transform that needs to be known by compositor because of "
"composited descendants"},
{CompositingReason::kOpacityWithCompositedDescendants, {CompositingReason::kOpacityWithCompositedDescendants,
"opacityWithCompositedDescendants", "opacityWithCompositedDescendants",
"Has opacity that needs to be applied by compositor because of composited " "Has opacity that needs to be applied by compositor because of composited "
......
...@@ -139,9 +139,9 @@ class PLATFORM_EXPORT CompositingReason { ...@@ -139,9 +139,9 @@ class PLATFORM_EXPORT CompositingReason {
kScrollDependentPosition | kOverflowScrollingTouch, kScrollDependentPosition | kOverflowScrollingTouch,
kComboCompositedDescendants = kComboCompositedDescendants =
kTransformWithCompositedDescendants | kIsolateCompositedDescendants | kIsolateCompositedDescendants | kOpacityWithCompositedDescendants |
kOpacityWithCompositedDescendants | kMaskWithCompositedDescendants | kMaskWithCompositedDescendants | kFilterWithCompositedDescendants |
kFilterWithCompositedDescendants | kBlendingWithCompositedDescendants | kBlendingWithCompositedDescendants |
kReflectionWithCompositedDescendants | kClipsCompositingDescendants, kReflectionWithCompositedDescendants | kClipsCompositingDescendants,
kCombo3DDescendants = kCombo3DDescendants =
......
...@@ -351,3 +351,15 @@ crbug.com/864567 paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no ...@@ -351,3 +351,15 @@ crbug.com/864567 paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no
crbug.com/864567 paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no-layout-triggers-2.html [ Failure ] crbug.com/864567 paint/invalidation/svg/deep-nested-embedded-svg-size-changes-no-layout-triggers-2.html [ Failure ]
crbug.com/864567 paint/invalidation/svg/nested-embedded-svg-size-changes-no-layout-triggers-1.html [ Failure ] crbug.com/864567 paint/invalidation/svg/nested-embedded-svg-size-changes-no-layout-triggers-1.html [ Failure ]
crbug.com/864567 paint/invalidation/svg/nested-embedded-svg-size-changes-no-layout-triggers-2.html [ Failure ] crbug.com/864567 paint/invalidation/svg/nested-embedded-svg-size-changes-no-layout-triggers-2.html [ Failure ]
Bug(none) compositing/squashing/squash-same-transform-ancestor.html [ Failure ]
Bug(none) compositing/geometry/layer-due-to-layer-children-deep-switch.html [ Failure ]
Bug(none) compositing/geometry/layer-due-to-layer-children-switch.html [ Failure ]
Bug(none) compositing/layer-creation/overlap-transformed-layer-with-transform-body.html [ Failure ]
Bug(none) compositing/layer-creation/overlap-transformed-layer.html [ Failure ]
Bug(none) compositing/overflow/rotate-then-clip-effect-interleave.html [ Failure ]
Bug(none) compositing/overflow/rotate-then-clip-z-order-interleave.html [ Failure ]
Bug(none) compositing/overflow/rotate-then-clip.html [ Failure ]
Bug(none) paint/invalidation/offset-change-wrong-invalidation-with-float.html [ Failure ]
Bug(none) virtual/prefer_compositing_to_lcd_text/compositing/overflow/rotate-then-clip-effect-interleave.html [ Failure ]
Bug(none) virtual/prefer_compositing_to_lcd_text/compositing/overflow/rotate-then-clip-z-order-interleave.html [ Failure ]
Bug(none) virtual/prefer_compositing_to_lcd_text/compositing/overflow/rotate-then-clip.html [ Failure ]
...@@ -18,22 +18,10 @@ ...@@ -18,22 +18,10 @@
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{ {
"name": "LayoutBlockFlow DIV id='container'", "name": "LayoutNGBlockFlow (positioned) DIV id='composited'",
"bounds": [256, 256],
"contentsOpaque": true,
"transform": 2
},
{
"name": "LayoutBlockFlow (positioned) DIV id='composited'",
"contentsOpaque": true, "contentsOpaque": true,
"drawsContent": false, "drawsContent": false,
"transform": 3 "transform": 1
},
{
"name": "LayoutBlockFlow (positioned) DIV id='green'",
"bounds": [300, 300],
"contentsOpaque": true,
"backgroundColor": "#008000"
} }
], ],
"transforms": [ "transforms": [
...@@ -43,27 +31,7 @@ ...@@ -43,27 +31,7 @@
[1, 0, 0, 0], [1, 0, 0, 0],
[0, 1, 0, 0], [0, 1, 0, 0],
[0, 0, 1, 0], [0, 0, 1, 0],
[23, 8, 0, 1] [408, 8, 0, 1]
]
},
{
"id": 2,
"parent": 1,
"transform": [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[-10, 0, 0, 1]
]
},
{
"id": 3,
"parent": 2,
"transform": [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[385, 0, 0, 1]
] ]
} }
] ]
......
...@@ -18,28 +18,15 @@ ...@@ -18,28 +18,15 @@
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{ {
"name": "LayoutBlockFlow BODY", "name": "LayoutNGBlockFlow BODY",
"bounds": [784, 584], "bounds": [784, 584],
"transform": 1 "transform": 1
}, },
{ {
"name": "LayoutBlockFlow DIV id='container'", "name": "LayoutNGBlockFlow (positioned) DIV id='composited'",
"bounds": [256, 256],
"contentsOpaque": true,
"transform": 3
},
{
"name": "LayoutBlockFlow (positioned) DIV id='composited'",
"contentsOpaque": true, "contentsOpaque": true,
"drawsContent": false, "drawsContent": false,
"transform": 4 "transform": 2
},
{
"name": "LayoutBlockFlow (positioned) DIV id='green'",
"bounds": [300, 300],
"contentsOpaque": true,
"backgroundColor": "#008000",
"transform": 1
} }
], ],
"transforms": [ "transforms": [
...@@ -59,27 +46,7 @@ ...@@ -59,27 +46,7 @@
[1, 0, 0, 0], [1, 0, 0, 0],
[0, 1, 0, 0], [0, 1, 0, 0],
[0, 0, 1, 0], [0, 0, 1, 0],
[15, 0, 0, 1] [400, 0, 0, 1]
]
},
{
"id": 3,
"parent": 2,
"transform": [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[-10, 0, 0, 1]
]
},
{
"id": 4,
"parent": 3,
"transform": [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[385, 0, 0, 1]
] ]
} }
] ]
......
...@@ -18,62 +18,31 @@ ...@@ -18,62 +18,31 @@
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{ {
"name": "LayoutBlockFlow DIV", "name": "LayoutNGBlockFlow DIV",
"position": [108, 100],
"bounds": [240, 240], "bounds": [240, 240],
"drawsContent": false, "opacity": 0.899999976158142
"transform": 2
},
{
"name": "LayoutBlockFlow DIV",
"bounds": [240, 240],
"opacity": 0.899999976158142,
"transform": 2
}, },
{ {
"name": "LayoutBlockFlow DIV", "name": "LayoutNGBlockFlow DIV",
"position": [20, 20], "position": [128, 120],
"bounds": [400, 400], "bounds": [400, 400],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#0000FF", "backgroundColor": "#0000FF"
"transform": 2
}, },
{ {
"name": "LayoutBlockFlow (positioned) DIV", "name": "LayoutNGBlockFlow (positioned) DIV",
"position": [20, 0], "position": [128, 100],
"bounds": [400, 100], "bounds": [400, 100],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#00FFFF", "backgroundColor": "#00FFFF"
"transform": 2
}, },
{ {
"name": "LayoutBlockFlow (relative positioned) DIV", "name": "LayoutNGBlockFlow (relative positioned) DIV",
"position": [20, 20], "position": [128, 120],
"bounds": [100, 400], "bounds": [100, 400],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FF00FF", "backgroundColor": "#FF00FF"
"transform": 2
}
],
"transforms": [
{
"id": 1,
"transform": [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[108, 100, 0, 1]
]
},
{
"id": 2,
"parent": 1,
"transform": [
[0.707106781186548, 0.707106781186548, 0, 0],
[-0.707106781186548, 0.707106781186548, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
],
"origin": [120, 120]
} }
] ]
} }
......
...@@ -18,39 +18,11 @@ ...@@ -18,39 +18,11 @@
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{ {
"name": "LayoutBlockFlow DIV", "name": "LayoutNGBlockFlow DIV",
"bounds": [240, 240], "position": [128, 120],
"transform": 2
},
{
"name": "LayoutBlockFlow DIV",
"position": [20, 20],
"bounds": [400, 400], "bounds": [400, 400],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#0000FF", "backgroundColor": "#0000FF"
"transform": 2
}
],
"transforms": [
{
"id": 1,
"transform": [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[108, 100, 0, 1]
]
},
{
"id": 2,
"parent": 1,
"transform": [
[0.707106781186548, 0.707106781186548, 0, 0],
[-0.707106781186548, 0.707106781186548, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
],
"origin": [120, 120]
} }
] ]
} }
......
...@@ -18,52 +18,25 @@ ...@@ -18,52 +18,25 @@
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{ {
"name": "LayoutBlockFlow DIV", "name": "LayoutNGBlockFlow (relative positioned) DIV",
"bounds": [300, 100], "position": [108, 100],
"transform": 2
},
{
"name": "LayoutBlockFlow (relative positioned) DIV",
"bounds": [200, 100], "bounds": [200, 100],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#008000", "backgroundColor": "#008000"
"transform": 2
}, },
{ {
"name": "LayoutBlockFlow (positioned) DIV", "name": "LayoutNGBlockFlow (positioned) DIV",
"position": [108, 100],
"bounds": [200, 22], "bounds": [200, 22],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFF00", "backgroundColor": "#FFFF00"
"transform": 2
}, },
{ {
"name": "LayoutBlockFlow (relative positioned) DIV", "name": "LayoutNGBlockFlow (relative positioned) DIV",
"position": [108, 100],
"bounds": [50, 200], "bounds": [50, 200],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FF0000", "backgroundColor": "#FF0000"
"transform": 2
}
],
"transforms": [
{
"id": 1,
"transform": [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[108, 100, 0, 1]
]
},
{
"id": 2,
"parent": 1,
"transform": [
[0.707106781186548, 0.707106781186548, 0, 0],
[-0.707106781186548, 0.707106781186548, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
],
"origin": [150, 50]
} }
] ]
} }
......
...@@ -17,30 +17,21 @@ ...@@ -17,30 +17,21 @@
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{
"name": "LayoutBlockFlow DIV id='transform-parent'",
"bounds": [100, 100],
"contentsOpaque": true,
"backgroundColor": "#008000",
"transform": 2
},
{ {
"name": "Squashing Containment Layer", "name": "Squashing Containment Layer",
"drawsContent": false, "drawsContent": false
"transform": 2
}, },
{ {
"name": "LayoutBlockFlow (positioned) DIV id='squashing'", "name": "LayoutNGBlockFlow (positioned) DIV id='squashing'",
"bounds": [1, 1], "bounds": [1, 1],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#FFFFFF", "backgroundColor": "#FFFFFF",
"transform": 2 "transform": 1
}, },
{ {
"name": "Squashing Layer (first squashed layer: LayoutBlockFlow (positioned) DIV id='squashed')", "name": "Squashing Layer (first squashed layer: LayoutNGBlockFlow (positioned) DIV id='squashed')",
"position": [-100, 0], "position": [-92, 8],
"bounds": [200, 200], "bounds": [200, 200]
"transform": 2
} }
], ],
"transforms": [ "transforms": [
...@@ -51,18 +42,8 @@ ...@@ -51,18 +42,8 @@
[0, 1, 0, 0], [0, 1, 0, 0],
[0, 0, 1, 0], [0, 0, 1, 0],
[8, 8, 0, 1] [8, 8, 0, 1]
]
},
{
"id": 2,
"parent": 1,
"transform": [
[0.866025403784439, -0.5, 0, 0],
[0.5, 0.866025403784439, 0, 0],
[0, 0, 1, 0],
[100, 100, 0, 1]
], ],
"origin": [50, 50] "flattenInheritedTransform": false
} }
] ]
} }
......
...@@ -4,8 +4,8 @@ Compositing reasons for div#transform3d-individual: assumedOverlap,transform3D ...@@ -4,8 +4,8 @@ Compositing reasons for div#transform3d-individual: assumedOverlap,transform3D
Compositing reasons for div#backface-visibility: backfaceVisibilityHidden Compositing reasons for div#backface-visibility: backfaceVisibilityHidden
Compositing reasons for div#animation: activeTransformAnimation,assumedOverlap Compositing reasons for div#animation: activeTransformAnimation,assumedOverlap
Compositing reasons for div#animation-individual: activeTransformAnimation,assumedOverlap Compositing reasons for div#animation-individual: activeTransformAnimation,assumedOverlap
Compositing reasons for div#transformWithCompositedDescendants: assumedOverlap,transformWithCompositedDescendants Compositing reasons for div#transformWithCompositedDescendants: assumedOverlap,squashingDisallowed
Compositing reasons for div#transformWithCompositedDescendants-individual: assumedOverlap,transformWithCompositedDescendants Compositing reasons for div#transformWithCompositedDescendants-individual: assumedOverlap,squashingDisallowed
Compositing reasons for div#opacityWithCompositedDescendants: assumedOverlap,opacityWithCompositedDescendants Compositing reasons for div#opacityWithCompositedDescendants: assumedOverlap,opacityWithCompositedDescendants
Compositing reasons for div#reflectionWithCompositedDescendants: assumedOverlap,filterWithCompositedDescendants,reflectionWithCompositedDescendants Compositing reasons for div#reflectionWithCompositedDescendants: assumedOverlap,filterWithCompositedDescendants,reflectionWithCompositedDescendants
Compositing reasons for div#perspective: assumedOverlap,perspectiveWith3DDescendants Compositing reasons for div#perspective: assumedOverlap,perspectiveWith3DDescendants
......
...@@ -43,30 +43,11 @@ Second dump layer tree: ...@@ -43,30 +43,11 @@ Second dump layer tree:
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{ {
"name": "LayoutBlockFlow (relative positioned) DIV id='parent'", "name": "LayoutNGBlockFlow (relative positioned) DIV id='greatgrandchild'",
"position": [8, 8],
"bounds": [342, 292]
},
{
"name": "LayoutBlockFlow (relative positioned) DIV id='child'",
"position": [39, 47],
"bounds": [250, 220],
"contentsOpaque": true,
"backgroundColor": "#0000FF"
},
{
"name": "LayoutBlockFlow (relative positioned) DIV id='grandchild'",
"bounds": [200, 200],
"contentsOpaque": true,
"backgroundColor": "#FFFF00",
"transform": 2
},
{
"name": "LayoutBlockFlow (relative positioned) DIV id='greatgrandchild'",
"bounds": [250, 100], "bounds": [250, 100],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#008000", "backgroundColor": "#008000",
"transform": 4 "transform": 2
} }
], ],
"transforms": [ "transforms": [
...@@ -76,33 +57,12 @@ Second dump layer tree: ...@@ -76,33 +57,12 @@ Second dump layer tree:
[1, 0, 0, 0], [1, 0, 0, 0],
[0, 1, 0, 0], [0, 1, 0, 0],
[0, 0, 1, 0], [0, 0, 1, 0],
[49, 57, 0, 1] [149, 57, 0, 1]
] ]
}, },
{ {
"id": 2, "id": 2,
"parent": 1, "parent": 1,
"transform": [
[0.866025403784439, 0.5, 0, 0],
[-0.5, 0.866025403784439, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
],
"origin": [100, 100]
},
{
"id": 3,
"parent": 2,
"transform": [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[100, 0, 0, 1]
]
},
{
"id": 4,
"parent": 3,
"transform": [ "transform": [
[0.5, 0, -0.866025403784439, 0.0021650635094611], [0.5, 0, -0.866025403784439, 0.0021650635094611],
[0, 1, 0, 0], [0, 1, 0, 0],
......
...@@ -43,12 +43,7 @@ Second dump layer tree: ...@@ -43,12 +43,7 @@ Second dump layer tree:
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{ {
"name": "LayoutBlockFlow (relative positioned) DIV id='parent' class='parent'", "name": "LayoutNGBlockFlow (relative positioned) DIV id='child' class='child'",
"position": [8, 8],
"bounds": [242, 192]
},
{
"name": "LayoutBlockFlow (relative positioned) DIV id='child' class='child'",
"bounds": [250, 100], "bounds": [250, 100],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#008000", "backgroundColor": "#008000",
......
...@@ -20,25 +20,20 @@ ...@@ -20,25 +20,20 @@
{ {
"object": "LayoutNGBlockFlow (positioned) UL id='submenu'", "object": "LayoutNGBlockFlow (positioned) UL id='submenu'",
"rect": [48, 92, 40, 18], "rect": [48, 92, 40, 18],
"reason": "chunk disappeared" "reason": "disappeared"
},
{
"object": "NGPhysicalTextFragment '\u25E6 '",
"rect": [71, 92, 7, 18],
"reason": "disappeared"
} }
] ]
}, },
{
"name": "LayoutNGListItem (floating) LI id='watches'",
"position": [31, 42],
"bounds": [7, 18]
},
{ {
"name": "LayoutInline (relative positioned) SPAN id='placeholder'", "name": "LayoutInline (relative positioned) SPAN id='placeholder'",
"position": [48, 42], "position": [48, 42],
"drawsContent": false, "drawsContent": false,
"backfaceVisibility": "hidden" "backfaceVisibility": "hidden"
},
{
"name": "LayoutNGListItem (relative positioned) (floating) LI id='menu'",
"position": [31, 42],
"bounds": [7, 18]
} }
] ]
} }
......
...@@ -43,30 +43,11 @@ Second dump layer tree: ...@@ -43,30 +43,11 @@ Second dump layer tree:
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{ {
"name": "LayoutBlockFlow (relative positioned) DIV id='parent'", "name": "LayoutNGBlockFlow (relative positioned) DIV id='greatgrandchild'",
"position": [8, 8],
"bounds": [342, 292]
},
{
"name": "LayoutBlockFlow (relative positioned) DIV id='child'",
"position": [39, 49],
"bounds": [250, 220],
"contentsOpaque": true,
"backgroundColor": "#0000FF"
},
{
"name": "LayoutBlockFlow (relative positioned) DIV id='grandchild'",
"bounds": [200, 200],
"contentsOpaque": true,
"backgroundColor": "#FFFF00",
"transform": 2
},
{
"name": "LayoutBlockFlow (relative positioned) DIV id='greatgrandchild'",
"bounds": [250, 100], "bounds": [250, 100],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#008000", "backgroundColor": "#008000",
"transform": 4 "transform": 2
} }
], ],
"transforms": [ "transforms": [
...@@ -76,33 +57,12 @@ Second dump layer tree: ...@@ -76,33 +57,12 @@ Second dump layer tree:
[1, 0, 0, 0], [1, 0, 0, 0],
[0, 1, 0, 0], [0, 1, 0, 0],
[0, 0, 1, 0], [0, 0, 1, 0],
[49, 59, 0, 1] [149, 59, 0, 1]
] ]
}, },
{ {
"id": 2, "id": 2,
"parent": 1, "parent": 1,
"transform": [
[0.866025403784439, 0.5, 0, 0],
[-0.5, 0.866025403784439, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]
],
"origin": [100, 100]
},
{
"id": 3,
"parent": 2,
"transform": [
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[100, 0, 0, 1]
]
},
{
"id": 4,
"parent": 3,
"transform": [ "transform": [
[0.5, 0, -0.866025403784439, 0.0021650635094611], [0.5, 0, -0.866025403784439, 0.0021650635094611],
[0, 1, 0, 0], [0, 1, 0, 0],
......
...@@ -43,12 +43,7 @@ Second dump layer tree: ...@@ -43,12 +43,7 @@ Second dump layer tree:
"backgroundColor": "#FFFFFF" "backgroundColor": "#FFFFFF"
}, },
{ {
"name": "LayoutBlockFlow (relative positioned) DIV id='parent' class='parent'", "name": "LayoutNGBlockFlow (relative positioned) DIV id='child' class='child'",
"position": [8, 8],
"bounds": [242, 192]
},
{
"name": "LayoutBlockFlow (relative positioned) DIV id='child' class='child'",
"bounds": [250, 100], "bounds": [250, 100],
"contentsOpaque": true, "contentsOpaque": true,
"backgroundColor": "#008000", "backgroundColor": "#008000",
......
...@@ -20,25 +20,20 @@ ...@@ -20,25 +20,20 @@
{ {
"object": "LayoutNGBlockFlow (positioned) UL id='submenu'", "object": "LayoutNGBlockFlow (positioned) UL id='submenu'",
"rect": [48, 94, 40, 20], "rect": [48, 94, 40, 20],
"reason": "chunk disappeared" "reason": "disappeared"
},
{
"object": "NGPhysicalTextFragment '\u25E6 '",
"rect": [70, 94, 7, 19],
"reason": "disappeared"
} }
] ]
}, },
{
"name": "LayoutNGListItem (floating) LI id='watches'",
"position": [30, 44],
"bounds": [7, 20]
},
{ {
"name": "LayoutInline (relative positioned) SPAN id='placeholder'", "name": "LayoutInline (relative positioned) SPAN id='placeholder'",
"position": [48, 44], "position": [48, 44],
"drawsContent": false, "drawsContent": false,
"backfaceVisibility": "hidden" "backfaceVisibility": "hidden"
},
{
"name": "LayoutNGListItem (relative positioned) (floating) LI id='menu'",
"position": [30, 44],
"bounds": [7, 20]
} }
] ]
} }
......
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