| <!DOCTYPE html> | 
 | <style> | 
 |   body { | 
 |     margin: 0; | 
 |     padding: 0; | 
 |   } | 
 |  | 
 |   #nonFastRegion { | 
 |     height: 222px; | 
 |     width: 222px; | 
 |     border: none; | 
 |     overflow: scroll; | 
 |     -webkit-transform: translateX(0); | 
 |   } | 
 |  | 
 |   #nonFastRegion > div { | 
 |     height: 1000px; | 
 |     width: 1000px; | 
 |     background: linear-gradient(to bottom, red, white); | 
 |   } | 
 |  | 
 |   .spacer { | 
 |     height: 2000px; | 
 |   } | 
 | </style> | 
 |  | 
 | <div id='nonFastRegion'><div>This should be covered by a green overlay.</div></div> | 
 |  | 
 | <p>A single square should be visible covered by a green overlay.</p> | 
 | <div id="console"></div> | 
 | <div class="spacer"></div> | 
 |  | 
 | <script src="../resources/js-test.js"></script> | 
 | <script src="../resources/run-after-layout-and-paint.js"></script> | 
 | <script src="resources/non-fast-scrollable-region-testing.js"></script> | 
 | <script> | 
 |   jsTestIsAsync = true; | 
 |   // print result lazily to avoid layouts during the test | 
 |   setPrintTestResultsLazily(); | 
 |   description('This test ensures that transforming a non-fast scrollable area ' + | 
 |     'correctly updates list of non-fast scrollable rects ' + | 
 |     '(See http://crbug.com/417345).'); | 
 |  | 
 |   onload = function() { | 
 |     runAfterLayoutAndPaint(runTests); | 
 |   }; | 
 |  | 
 |   function runTests() { | 
 |     nonFastScrollableRects = internals.nonFastScrollableRects(document); | 
 |     shouldBe('nonFastScrollableRects.length', '1'); | 
 |     shouldBeEqualToString('rectToString(nonFastScrollableRects[0])', '[0, 0, 222, 222]'); | 
 |  | 
 |     document.body.style.padding = "10px"; | 
 |     debug("Trigger style update"); | 
 |     shouldBe("internals.updateStyleAndReturnAffectedElementCount()", "1"); | 
 |     debug("Verifying layout hasn't been triggered"); | 
 |     shouldBe("internals.needsLayoutCount()", "3"); | 
 |  | 
 |     // Updating transforms hits an optimized layout path which is root cause of | 
 |     // http://crbug.com/417345 | 
 |     debug("Update non-fast element's transform"); | 
 |     document.getElementById('nonFastRegion').style.webkitTransform = 'translateX(100px)'; | 
 |  | 
 |     debug("Trigger style update"); | 
 |     shouldBe("internals.updateStyleAndReturnAffectedElementCount()", "1"); | 
 |     debug("Verifying layout still hasn't been triggered"); | 
 |     shouldBe("internals.needsLayoutCount()", "3"); | 
 |     debug("Verifying non-fast regions have been updated"); | 
 |     // Note: querying non-fast regions forces layout, so the expectation | 
 |     // reflects the change to body element padding. | 
 |     nonFastScrollableRects = internals.nonFastScrollableRects(document); | 
 |     shouldBe('nonFastScrollableRects.length', '1'); | 
 |     shouldBeEqualToString('rectToString(nonFastScrollableRects[0])', '[110, 10, 222, 222]'); | 
 |  | 
 |     setTimeout(function() { | 
 |       // Add green overlays to help visualize the test | 
 |       drawNonFastScrollableRegionOverlays(); | 
 |       finishJSTest(); | 
 |     }, 0); | 
 |   } | 
 | </script> |