| Index: third_party/WebKit/LayoutTests/intersection-observer/resources/intersection-observer-test-utils.js
|
| diff --git a/third_party/WebKit/LayoutTests/intersection-observer/resources/intersection-observer-test-utils.js b/third_party/WebKit/LayoutTests/intersection-observer/resources/intersection-observer-test-utils.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f9eca2e58e15250a8c79020d6d85d562c22190b4
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/intersection-observer/resources/intersection-observer-test-utils.js
|
| @@ -0,0 +1,112 @@
|
| +// Here's how waitForNotification works:
|
| +//
|
| +// - myTestFunction0()
|
| +// - waitForNotification(myTestFunction1)
|
| +// - requestAnimationFrame()
|
| +// - Modify DOM in a way that should trigger an IntersectionObserver callback.
|
| +// - BeginFrame
|
| +// - requestAnimationFrame handler runs
|
| +// - First setTimeout()
|
| +// - Style, layout, paint
|
| +// - IntersectionObserver generates new notifications
|
| +// - Posts a task to deliver notifications
|
| +// - First setTimeout handler runs
|
| +// - Second setTimeout()
|
| +// - Task to deliver IntersectionObserver notifications runs
|
| +// - IntersectionObserver callbacks run
|
| +// - Second setTimeout handler runs
|
| +// - myTestFunction1()
|
| +// - [optional] waitForNotification(myTestFunction2)
|
| +// - requestAnimationFrame()
|
| +// - Verify newly-arrived IntersectionObserver notifications
|
| +// - [optional] Modify DOM to trigger new notifications
|
| +function waitForNotification(f) {
|
| + requestAnimationFrame(function() {
|
| + setTimeout(function() { setTimeout(f); });
|
| + });
|
| +}
|
| +
|
| +// The timing of when runTestCycle is called is important. It should be
|
| +// called:
|
| +//
|
| +// - Before or during the window load event, or
|
| +// - Inside of a prior runTestCycle callback, *before* any assert_* methods
|
| +// are called.
|
| +//
|
| +// Following these rules will ensure that the test suite will not abort before
|
| +// all test steps have run.
|
| +function runTestCycle(f, description) {
|
| + async_test(function(t) {
|
| + waitForNotification(t.step_func_done(f));
|
| + }, description);
|
| +}
|
| +
|
| +// Root bounds for a root with an overflow clip as defined by:
|
| +// http://wicg.github.io/IntersectionObserver/#intersectionobserver-root-intersection-rectangle
|
| +function contentBounds(root) {
|
| + var left = root.offsetLeft + root.clientLeft;
|
| + var right = left + root.clientWidth;
|
| + var top = root.offsetTop + root.clientTop;
|
| + var bottom = top + root.clientHeight;
|
| + return [left, right, top, bottom];
|
| +}
|
| +
|
| +// Root bounds for a root without an overflow clip as defined by:
|
| +// http://wicg.github.io/IntersectionObserver/#intersectionobserver-root-intersection-rectangle
|
| +function borderBoxBounds(root) {
|
| + var left = root.offsetLeft;
|
| + var right = left + root.offsetWidth;
|
| + var top = root.offsetTop;
|
| + var bottom = top + root.offsetHeight;
|
| + return [left, right, top, bottom];
|
| +}
|
| +
|
| +function rectArea(rect) {
|
| + return (rect.left - rect.right) * (rect.bottom - rect.top);
|
| +}
|
| +
|
| +function checkRect(actual, expected, description) {
|
| + if (!expected.length)
|
| + return;
|
| + assert_equals(actual.left, expected[0], description + '.left');
|
| + assert_equals(actual.right, expected[1], description + '.right');
|
| + assert_equals(actual.top, expected[2], description + '.top');
|
| + assert_equals(actual.bottom, expected[3], description + '.bottom');
|
| +}
|
| +
|
| +function checkLastEntry(entries, i, expected) {
|
| + assert_equals(entries.length, i + 1, 'entries.length');
|
| + if (expected) {
|
| + checkRect(
|
| + entries[i].boundingClientRect, expected.slice(0, 4),
|
| + 'entries[' + i + '].boundingClientRect');
|
| + checkRect(
|
| + entries[i].intersectionRect, expected.slice(4, 8),
|
| + 'entries[' + i + '].intersectionRect');
|
| + checkRect(
|
| + entries[i].rootBounds, expected.slice(8, 12),
|
| + 'entries[' + i + '].rootBounds');
|
| + }
|
| +}
|
| +
|
| +function checkJsonEntry(actual, expected) {
|
| + checkRect(
|
| + actual.boundingClientRect, expected.boundingClientRect,
|
| + 'entry.boundingClientRect');
|
| + checkRect(
|
| + actual.intersectionRect, expected.intersectionRect,
|
| + 'entry.intersectionRect');
|
| + if (actual.rootBounds == 'null')
|
| + assert_equals(expected.rootBounds, 'null', 'rootBounds is null');
|
| + else
|
| + checkRect(actual.rootBounds, expected.rootBounds, 'entry.rootBounds');
|
| + assert_equals(actual.target, expected.target);
|
| +}
|
| +
|
| +function checkJsonEntries(actual, expected, description) {
|
| + test(function() {
|
| + assert_equals(actual.length, expected.length);
|
| + for (var i = 0; i < actual.length; i++)
|
| + checkJsonEntry(actual[i], expected[i]);
|
| + }, description);
|
| +}
|
|
|