| Test that layers can be nicely added or removed from a squashed layer, without unnecessary repaints on any layer. Click anywhere to test interactively; keep clicking to proceed through the test. |
| |
| CASE 1, original layer tree with overlap1 and overlap2: |
| { |
| "layers": [ |
| { |
| "name": "Scrolling Contents Layer", |
| "bounds": [800, 600], |
| "contentsOpaque": true, |
| "backgroundColor": "#FFFFFF" |
| }, |
| { |
| "name": "LayoutNGBlockFlow (positioned) DIV class='composited'", |
| "bounds": [400, 400], |
| "contentsOpaque": true, |
| "backgroundColor": "#808080", |
| "transform": 1 |
| }, |
| { |
| "name": "Squashing Layer (first squashed layer: LayoutNGBlockFlow (positioned) DIV id='A' class='overlap1')", |
| "position": [80, 80], |
| "bounds": [180, 180], |
| "transform": 1 |
| } |
| ], |
| "transforms": [ |
| { |
| "id": 1, |
| "transform": [ |
| [1, 0, 0, 0], |
| [0, 1, 0, 0], |
| [0, 0, 1, 0], |
| [60, 60, 0, 1] |
| ] |
| } |
| ] |
| } |
| |
| CASE 2, overlap3 gets added: |
| { |
| "layers": [ |
| { |
| "name": "Scrolling Contents Layer", |
| "bounds": [800, 600], |
| "contentsOpaque": true, |
| "backgroundColor": "#FFFFFF" |
| }, |
| { |
| "name": "LayoutNGBlockFlow (positioned) DIV class='composited'", |
| "bounds": [400, 400], |
| "contentsOpaque": true, |
| "backgroundColor": "#808080", |
| "transform": 1 |
| }, |
| { |
| "name": "Squashing Layer (first squashed layer: LayoutNGBlockFlow (positioned) DIV id='A' class='overlap1')", |
| "position": [80, 80], |
| "bounds": [260, 260], |
| "paintInvalidations": [ |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='C' class='overlap3'", |
| "rect": [160, 160, 100, 100], |
| "reason": "chunk appeared" |
| } |
| ], |
| "transform": 1 |
| } |
| ], |
| "transforms": [ |
| { |
| "id": 1, |
| "transform": [ |
| [1, 0, 0, 0], |
| [0, 1, 0, 0], |
| [0, 0, 1, 0], |
| [60, 60, 0, 1] |
| ] |
| } |
| ] |
| } |
| |
| CASE 3, overlap2 gets removed. Since this does not resize the layer, there should only be a repaint of overlap2: |
| { |
| "layers": [ |
| { |
| "name": "Scrolling Contents Layer", |
| "bounds": [800, 600], |
| "contentsOpaque": true, |
| "backgroundColor": "#FFFFFF" |
| }, |
| { |
| "name": "LayoutNGBlockFlow (positioned) DIV class='composited'", |
| "bounds": [400, 400], |
| "contentsOpaque": true, |
| "backgroundColor": "#808080", |
| "transform": 1 |
| }, |
| { |
| "name": "Squashing Layer (first squashed layer: LayoutNGBlockFlow (positioned) DIV id='A' class='overlap1')", |
| "position": [80, 80], |
| "bounds": [260, 260], |
| "paintInvalidations": [ |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='B' class='overlap2'", |
| "rect": [80, 80, 100, 100], |
| "reason": "chunk disappeared" |
| } |
| ], |
| "transform": 1 |
| } |
| ], |
| "transforms": [ |
| { |
| "id": 1, |
| "transform": [ |
| [1, 0, 0, 0], |
| [0, 1, 0, 0], |
| [0, 0, 1, 0], |
| [60, 60, 0, 1] |
| ] |
| } |
| ] |
| } |
| |
| CASE 4, overlap1 gets removed: |
| { |
| "layers": [ |
| { |
| "name": "Scrolling Contents Layer", |
| "bounds": [800, 600], |
| "contentsOpaque": true, |
| "backgroundColor": "#FFFFFF" |
| }, |
| { |
| "name": "LayoutNGBlockFlow (positioned) DIV class='composited'", |
| "bounds": [400, 400], |
| "contentsOpaque": true, |
| "backgroundColor": "#808080", |
| "transform": 1 |
| }, |
| { |
| "name": "Squashing Layer (first squashed layer: LayoutNGBlockFlow (positioned) DIV id='C' class='overlap3')", |
| "position": [240, 240], |
| "bounds": [100, 100], |
| "paintInvalidations": [ |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='A' class='overlap1'", |
| "rect": [0, 0, 100, 100], |
| "reason": "chunk disappeared" |
| }, |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='C' class='overlap3'", |
| "rect": [0, 0, 100, 100], |
| "reason": "paint property change" |
| } |
| ], |
| "transform": 1 |
| } |
| ], |
| "transforms": [ |
| { |
| "id": 1, |
| "transform": [ |
| [1, 0, 0, 0], |
| [0, 1, 0, 0], |
| [0, 0, 1, 0], |
| [60, 60, 0, 1] |
| ] |
| } |
| ] |
| } |
| |
| CASE 5, overlap2 gets added back: |
| { |
| "layers": [ |
| { |
| "name": "Scrolling Contents Layer", |
| "bounds": [800, 600], |
| "contentsOpaque": true, |
| "backgroundColor": "#FFFFFF" |
| }, |
| { |
| "name": "LayoutNGBlockFlow (positioned) DIV class='composited'", |
| "bounds": [400, 400], |
| "contentsOpaque": true, |
| "backgroundColor": "#808080", |
| "transform": 1 |
| }, |
| { |
| "name": "Squashing Layer (first squashed layer: LayoutNGBlockFlow (positioned) DIV id='B' class='overlap2')", |
| "position": [160, 160], |
| "bounds": [180, 180], |
| "paintInvalidations": [ |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='C' class='overlap3'", |
| "rect": [80, 80, 100, 100], |
| "reason": "paint property change" |
| }, |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='B' class='overlap2'", |
| "rect": [0, 0, 100, 100], |
| "reason": "chunk appeared" |
| }, |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='C' class='overlap3'", |
| "rect": [0, 0, 100, 100], |
| "reason": "paint property change" |
| } |
| ], |
| "transform": 1 |
| } |
| ], |
| "transforms": [ |
| { |
| "id": 1, |
| "transform": [ |
| [1, 0, 0, 0], |
| [0, 1, 0, 0], |
| [0, 0, 1, 0], |
| [60, 60, 0, 1] |
| ] |
| } |
| ] |
| } |
| |
| CASE 6, overlap1 gets added back, and overlap3 gets removed: |
| { |
| "layers": [ |
| { |
| "name": "Scrolling Contents Layer", |
| "bounds": [800, 600], |
| "contentsOpaque": true, |
| "backgroundColor": "#FFFFFF" |
| }, |
| { |
| "name": "LayoutNGBlockFlow (positioned) DIV class='composited'", |
| "bounds": [400, 400], |
| "contentsOpaque": true, |
| "backgroundColor": "#808080", |
| "transform": 1 |
| }, |
| { |
| "name": "Squashing Layer (first squashed layer: LayoutNGBlockFlow (positioned) DIV id='A' class='overlap1')", |
| "position": [80, 80], |
| "bounds": [180, 180], |
| "paintInvalidations": [ |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='B' class='overlap2'", |
| "rect": [80, 80, 100, 100], |
| "reason": "paint property change" |
| }, |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='C' class='overlap3'", |
| "rect": [80, 80, 100, 100], |
| "reason": "chunk disappeared" |
| }, |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='A' class='overlap1'", |
| "rect": [0, 0, 100, 100], |
| "reason": "chunk appeared" |
| }, |
| { |
| "object": "LayoutNGBlockFlow (positioned) DIV id='B' class='overlap2'", |
| "rect": [0, 0, 100, 100], |
| "reason": "paint property change" |
| } |
| ], |
| "transform": 1 |
| } |
| ], |
| "transforms": [ |
| { |
| "id": 1, |
| "transform": [ |
| [1, 0, 0, 0], |
| [0, 1, 0, 0], |
| [0, 0, 1, 0], |
| [60, 60, 0, 1] |
| ] |
| } |
| ] |
| } |
| |