Index: third_party/WebKit/LayoutTests/external/wpt/html/webappapis/idle-callbacks/callback-suspended.html |
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/idle-callbacks/callback-suspended.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/idle-callbacks/callback-suspended.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6040de922fb328063fa75abf942d67a93943bb9b |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/idle-callbacks/callback-suspended.html |
@@ -0,0 +1,93 @@ |
+<!doctype html> |
+<meta charset=utf-8> |
+<title>Dispatching idle callbacks should be able to be suspended and then resumed</title> |
+<script src=/resources/testharness.js></script> |
+<script src=/resources/testharnessreport.js></script> |
+<div id="log"></div> |
+<script> |
+ function withEventListener(target, event, handler) { |
+ handler = handler || (e => e); |
+ return new Promise(resolve => { |
+ let wrapper = function(e) { |
+ let result = handler(e); |
+ if (!result) { |
+ return; |
+ } |
+ |
+ resolve(result); |
+ } |
+ target.addEventListener(event, wrapper, { once: true }); |
+ }); |
+ } |
+ |
+ function makePostBackUrl(name) { |
+ return new URL('resources/post_name_on_load.html?name=' + name, |
+ window.location).href; |
+ } |
+ |
+ function waitForMessage(message, handler) { |
+ return withEventListener(window, 'message', e => (e.data === message) && handler(e));; |
+ } |
+ |
+ function withWindow(name) { |
+ let win = window.open(makePostBackUrl(name)) |
+ return waitForMessage(name, _ => win); |
+ } |
+ |
+ function navigateWindow(win, name) { |
+ win.location = makePostBackUrl(name); |
+ return waitForMessage(name, _ => win); |
+ } |
+ |
+ function waitDuration(delay) { |
+ return new Promise(resolve => { |
+ setTimeout(resolve, delay); |
+ }) |
+ } |
+ |
+ function goBack(win) { |
+ var p = withEventListener(win, 'pagehide'); |
+ win.history.back(); |
+ return p; |
+ } |
+ |
+ promise_test(t => { |
+ let idleCalled = false; |
+ let running = true; |
+ return withWindow('foo') |
+ .then(win => { |
+ let callback = function(d) { |
+ idleCalled = true; |
+ if (running) { |
+ win.requestIdleCallback(callback); |
+ } |
+ }; |
+ |
+ win.requestIdleCallback(callback); |
+ |
+ return navigateWindow(win, 'bar') |
+ .then(_ => idleCalled = false) |
+ .then(_ => waitDuration(2000)) |
+ .then(_ => { |
+ assert_false(idleCalled, "idle callback shouldn't have been called yet"); |
+ return goBack(win); |
+ }) |
+ .then(_ => Promise.race([ |
+ // At this point it's a matter of having bfcache ... |
+ waitDuration(2000) |
+ .then(_ => { |
+ assert_true(idleCalled, "idle callback should've been called by now"); |
+ running = false; |
+ }), |
+ // ... or not. If not, we expect a load event. |
+ waitForMessage("foo") |
+ ])) |
+ .then(_ => win.close()) |
+ .catch(e => { |
+ win.close(); |
+ throw e; |
+ }) |
+ }); |
+ }); |
+ |
+</script> |