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..6b67b9acbe3f7b4af8cefcc753a858a5d0b01280 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/intersection-observer/resources/intersection-observer-test-utils.js |
@@ -0,0 +1,132 @@ |
+// Here's how waitForNotification works: |
foolip
2017/01/11 11:42:33
Great documentation! :)
|
+// |
+// - 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() |
+// - waitForNotification(myTestFunction2) |
foolip
2017/01/11 11:42:33
I guess that this part is optional, and that the o
szager1
2017/01/23 23:18:04
Done.
|
+// - requestAnimationFrame() |
+// - Verify newly-arrived IntersectionObserver notifications |
+// - Modify DOM to trigger new notifications |
+function waitForNotification(f, description) { |
+ requestAnimationFrame(function() { |
+ setTimeout(function() { |
+ setTimeout(f); |
+ }); |
+ }); |
+} |
+ |
+function runTestCycle(f, description) { |
+ async_test(function(t) { |
foolip
2017/01/11 11:42:33
Can you document that the timing of when runTestCy
szager1
2017/01/23 23:18:04
Done.
|
+ waitForNotification(t.step_func(function() { |
foolip
2017/01/11 11:42:33
Simplification nit: waitForNotification(t.step_fun
szager1
2017/01/23 23:18:04
Done.
|
+ f(); |
+ t.done(); |
+ })); |
+ }, 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 > 0) |
foolip
2017/01/11 11:42:33
Just skimming the call sites I don't quite see whe
szager1
2017/01/23 23:18:04
Yes, there are cases where it's called with expect
|
+ assert_equals(actual.left, expected[0], description + ".left == " + expected[0]); |
foolip
2017/01/11 11:42:33
testharness.js style nit: the assertion descriptio
szager1
2017/01/23 23:18:04
Done.
|
+ if (expected.length > 1) |
+ assert_equals(actual.right, expected[1], description + ".right == " + expected[1]); |
+ if (expected.length > 2) |
+ assert_equals(actual.top, expected[2], description + ".top == " + expected[2]); |
+ if (expected.length > 3) |
+ assert_equals(actual.bottom, expected[3], description + ".bottom == " + expected[3]); |
+} |
+ |
+function checkEntry(entries, i, expected) { |
+ assert_equals(entries.length, i+1, String(i+1) + " notification(s)."); |
foolip
2017/01/11 11:42:33
Nit: Here the description "number of notifications
foolip
2017/01/11 13:42:53
Actually, why can checkEntry only be used to check
szager1
2017/01/23 23:18:04
That's a good idea, changed to checkLastEntry.
|
+ 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 coordinatesToClientRectJson(top, right, bottom, left) { |
foolip
2017/01/11 11:42:33
This appears to be unused now.
szager1
2017/01/23 23:18:04
It's used in resources/cross-origin-subframe.html
|
+ return { |
+ top: top, |
+ right: right, |
+ bottom: bottom, |
+ left: left |
+ }; |
+} |
+ |
+function clientRectToJson(rect) { |
+ if (!rect) |
+ return "null"; |
+ return { |
+ top: rect.top, |
+ right: rect.right, |
+ bottom: rect.bottom, |
+ left: rect.left |
+ }; |
+} |
+ |
+function entryToJson(entry) { |
+ return { |
+ boundingClientRect: clientRectToJson(entry.boundingClientRect), |
+ intersectionRect: clientRectToJson(entry.intersectionRect), |
+ rootBounds: clientRectToJson(entry.rootBounds), |
+ target: entry.target.id |
+ }; |
+} |
+ |
+function checkJsonEntry(actual, expected) { |
+ checkRect(actual.boundingClientRect, expected.boundingClientRect, "entry.boundingClientRect"); |
+ checkRect(actual.intersectionRect, expected.intersectionRect, "entry.intersectionRect"); |
+ if (actual.rootBounds == "null") |
foolip
2017/01/11 11:42:33
I've argued against requiring === everywhere on bl
szager1
2017/01/23 23:18:04
This value is encoded by clientRectToJson, which u
|
+ 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() { |
foolip
2017/01/11 11:42:33
Shouldn't this already be inside a test? Will comm
szager1
2017/01/23 23:18:04
I addressed this in the test, but: this is a case
|
+ assert_equals(actual.length, expected.length); |
+ for (var i = 0; i < actual.length; i++) |
+ checkJsonEntry(actual[i], expected[i]); |
+ }, description); |
+} |