| <!DOCTYPE html> | |
| <!-- | |
| | Test case to handle a particular bug where a DCHECK could result when a | |
| | pseudoelement's animations/transitions are not cleared properly while | |
| | moving from a parent's "display: none" to the main div's "display: none". | |
| | In the end, we expect the final result to be that no DCHECKs get set off, | |
| | and that the transition appears to have been fully completed. | |
| --> | |
| <html> | |
| <head> | |
| <style> | |
| #block { | |
| width: 100px; | |
| height: 100px; | |
| background-color: yellow; | |
| font-size: 30px; | |
| } | |
| #block::after { | |
| content: ""; | |
| display:block; | |
| transform: translateX(100px); | |
| width: 100px; | |
| height: 100px; | |
| background-color: #0f0; | |
| transition: background-color 1s linear; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div id="parent"> | |
| <div id="block"></div> | |
| </div> | |
| <script> | |
| if (window.testRunner) { | |
| window.testRunner.waitUntilDone(); | |
| } | |
| var parentDiv = document.getElementById('parent'); | |
| var blockDiv = document.getElementById('block'); | |
| window.addEventListener('load', function() { | |
| if (window.testRunner) { | |
| // Do a layout upon the load event so that we setup our source styles | |
| // that we will be transitioning from. | |
| window.testRunner.DoNonMeasuredLayout(); | |
| } | |
| // Modify the rule that targets the pseudo-element, to trigger the | |
| // transition. | |
| var sheet = document.styleSheets[0]; | |
| var rules = sheet.cssRules; | |
| rules[1].style.backgroundColor = '#00f'; | |
| if (window.testRunner) { | |
| // Do a layout to start the transition. | |
| window.testRunner.DoNonMeasuredLayout(); | |
| } | |
| // Set the parent div's display to none. This should have the effect | |
| // of hiding the parent div and cancelling all descendant animations | |
| // and transitions, like the one we started above. | |
| parentDiv.style.display = "none"; | |
| if (window.testRunner) { | |
| window.testRunner.DoNonMeasuredLayout(); | |
| } | |
| // Reveal the parent div but hide the main div at the same time. This | |
| // should result in the main div having its computed style calculated | |
| // again, even though we do nothing with it because it still has its | |
| // display set to none. This is mostly just a sanity check to make | |
| // sure no DCHECKs go off, as a bug had been found in this case before. | |
| parentDiv.style.display = "block"; | |
| blockDiv.style.display = "none"; | |
| if (window.testRunner) { | |
| // Run the transition a bit so that it is started but not completed. | |
| window.testRunner.AdvanceClockByMs(500); | |
| window.testRunner.DoNonMeasuredLayout(); | |
| blockDiv.style.display = "block"; | |
| // Measure that the transition should now appear to be fully completed. | |
| window.testRunner.notifyDone(); | |
| } | |
| }); | |
| </script> | |
| </body> | |
| </html> |