| <!DOCTYPE html> |
| <!-- |
| This test passes if it does not crash. |
| |
| This test creates a scenario where we have a non-ancestor clip parent. |inner-hidden| |
| forces a stacking context because of its opacity:0.5 style. |inner-hidden| itself is |
| clipped by a sibling in the composited layer tree (|outer-hidden|) and therefore creates |
| an "ancestor clipping layer". The result is that |content| appears below this ancestor |
| clipping layer in the composited layer tree, but its clip parent, |outer-hidden|, is |
| a sibling of this ancestor clipping layer. The real solution to this issue is to |
| composite in terms of what we paint, but in the interim, we must ensure that we do |
| not crash in this case. |
| |
| This might be clearer if we look at a fragment of the composited layer tree we generate |
| in this case. |
| |
| 23 LayoutView #document |
| 24 LayoutBlockFlow (relative positioned) reasons(Is a scrollable overflow element) |
| 28 Scrolling Layer reasons(Secondary layer, used to position the scolling contents while scrolling) |
| 29 Scrolling Contents Layer reasons(Secondary layer, to house contents that can be scrolled) |
| 30 Scrolling Block Selection Layer reasons(Secondary layer, to house block selection gaps for composited scrolling with no scrolling contents) |
| 34 Overflow Controls Host Layer reasons(Secondary layer, the overflow controls host layer) |
| 31 Horizontal Scrollbar Layer reasons(Secondary layer, the horizontal scrollbar layer) |
| 32 Vertical Scrollbar Layer reasons(Secondary layer, the vertical scrollbar layer) |
| 33 Scroll Corner Layer reasons(Secondary layer, the scroll corner layer) |
| 25 ==>LayoutBlockFlow (positioned) reasons(Scroll parent is not an ancestor, |
| Might overlap other composited content, |
| Cannot be squashed because this layer has a different clipping container than the squashing layer) |
| 36 Ancestor Clipping Layer reasons(Secondary layer, applies a clip due to a sibling in the compositing tree) |
| 26 LayoutBlockFlow DIV id='inner-hidden' reasons(Scroll parent is not an ancestor, |
| Might overlap other composited content, |
| Parent with composited negative z-index content, |
| Has opacity that needs to be applied by compositor because of composited descendants, |
| Has a clip that needs to be known by compositor because of composited descendants) |
| 37 Child Containment Layer reasons(Secondary layer, to clip descendants of the owning layer) |
| 27 LayoutBlockFlow (positioned) DIV id='content' reasons(Has clipping ancestor) |
| clip-parent:25 |
| 35 LayoutBlockFlow DIV id='inner-hidden' (foreground) Layer reasons( |
| Secondary layer, |
| to contain any normal flow and positive z-index contents on top of a negative z-index layer) |
| |
| The problem is that layer 27 is not a descendant of layer 25. |
| --> |
| <div id="scroller" style="overflow:scroll; position:relative; height:200px;"> |
| <div id="outer-hidden" style="position:absolute; overflow:hidden; width:300px; height:300px;"> |
| <div id="inner-hidden" style="opacity:0.5; width:100px; height: 100px; overflow:hidden"> |
| <div id="content" style="z-index:-1; position:absolute">hello</div> |
| </div> |
| </div> |
| </div> |