| // Run a callback after a frame update. |
| // |
| // Note that this file has two copies: |
| // resources/run-after-layout-and-paint.js |
| // and |
| // http/tests/resources/run-after-layout-and-paint.js. |
| // They should be kept always the same. |
| // |
| // The function runAfterLayoutAndPaint() has two modes: |
| // - traditional mode, for existing tests, and tests needing customized |
| // notifyDone timing: |
| // if (window.testRunner) |
| // testRunner.waitUntilDone(); |
| // runAfterLayoutAndPaint(function() { |
| // ... // some code which modifies style/layout |
| // if (window.testRunner) |
| // testRunner.notifyDone(); |
| // // Or notifyDone any time later if needed. |
| // }); |
| // |
| // - autoNotifyDone mode, for new tests which just need to change style/layout |
| // and finish: |
| // runAfterLayoutAndPaint(function() { |
| // ... // some code which modifies style/layout |
| // }, true); |
| // |
| // Note that because we always update a frame before finishing a test, |
| // we don't need |
| // runAfterLayoutAndPaint(function() { testRunner.notifyDone(); }) |
| // to ensure the test finish after a frame update. |
| // |
| if (window.internals) |
| internals.runtimeFlags.paintUnderInvalidationCheckingEnabled = true; |
| |
| function runAfterLayoutAndPaint(callback, autoNotifyDone) { |
| if (!window.testRunner) { |
| // For manual test. Delay 500ms to allow us to see the visual change |
| // caused by the callback. |
| setTimeout(callback, 500); |
| return; |
| } |
| |
| if (autoNotifyDone) |
| testRunner.waitUntilDone(); |
| |
| // We do requestAnimationFrame and setTimeout to ensure a frame has started |
| // and layout and paint have run. The requestAnimationFrame fires after the |
| // frame has started but before layout and paint. The setTimeout fires |
| // at the beginning of the next frame, meaning that the previous frame has |
| // completed layout and paint. |
| // See http://crrev.com/c/1395193/10/third_party/blink/web_tests/http/tests/resources/run-after-layout-and-paint.js |
| // for more discussions. |
| requestAnimationFrame(function() { |
| setTimeout(function() { |
| callback(); |
| if (autoNotifyDone) |
| testRunner.notifyDone(); |
| }, 1); |
| }); |
| } |
| |
| function test_after_layout_and_paint(func, name, properties) { |
| var test = async_test(name, properties); |
| runAfterLayoutAndPaint(test.step_func(() => { |
| func.call(test, test); |
| test.done(); |
| }, false)); |
| } |
| |
| function async_test_after_layout_and_paint(func, name, properties) { |
| var test = async_test(name, properties); |
| runAfterLayoutAndPaint(test.step_func(() => { |
| func.call(test, test); |
| }, false)); |
| } |