Bug 1198381 - Add tests for requestIdleCallback, r?smaug draft
authorAndreas Farre <farre@mozilla.com>
Tue, 30 Aug 2016 16:02:08 +0200
changeset 425386 ebd763f55d2dbb8358e91ac0ad4d3d319b531e38
parent 425385 eaba38613f40c4bf84d453a689ec948c5ac4274e
child 533912 9ee14787996b19e4700e548641d2857e3da5f9b7
push id32416
push userbmo:afarre@mozilla.com
push dateFri, 14 Oct 2016 17:24:07 +0000
reviewerssmaug
bugs1198381
milestone52.0a1
Bug 1198381 - Add tests for requestIdleCallback, r?smaug MozReview-Commit-ID: HRdU1SJEg9K
testing/web-platform/meta/MANIFEST.json
testing/web-platform/meta/html/webappapis/idle-callbacks/__dir__.ini
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-exception.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-iframe.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-invoked.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-multiple-calls.html
testing/web-platform/tests/html/webappapis/idle-callbacks/callback-timeout.html
testing/web-platform/tests/html/webappapis/idle-callbacks/cancel-invoked.html
testing/web-platform/tests/html/webappapis/idle-callbacks/idlharness.html
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -37539,16 +37539,58 @@
           }
         ],
         "secure-contexts/shared-worker-secure-first.https.html": [
           {
             "path": "secure-contexts/shared-worker-secure-first.https.html",
             "url": "/secure-contexts/shared-worker-secure-first.https.html"
           }
         ],
+        "html/webappapis/idle-callbacks/callback-exception.html": [
+          {
+            "path": "html/webappapis/idle-callbacks/callback-exception.html",
+            "url": "/html/webappapis/idle-callbacks/callback-exception.html"
+          }
+        ],
+        "html/webappapis/idle-callbacks/callback-iframe.html": [
+          {
+            "path": "html/webappapis/idle-callbacks/callback-iframe.html",
+            "url": "/html/webappapis/idle-callbacks/callback-iframe.html"
+          }
+        ],
+        "html/webappapis/idle-callbacks/callback-invoked.html": [
+          {
+            "path": "html/webappapis/idle-callbacks/callback-invoked.html",
+            "url": "/html/webappapis/idle-callbacks/callback-invoked.html"
+          }
+        ],
+        "html/webappapis/idle-callbacks/callback-multiple-calls.html": [
+          {
+            "path": "html/webappapis/idle-callbacks/callback-multiple-calls.html",
+            "url": "/html/webappapis/idle-callbacks/callback-multiple-calls.html"
+          }
+        ],
+        "html/webappapis/idle-callbacks/callback-timeout.html": [
+          {
+            "path": "html/webappapis/idle-callbacks/callback-timeout.html",
+            "url": "/html/webappapis/idle-callbacks/callback-timeout.html"
+          }
+        ],
+        "html/webappapis/idle-callbacks/cancel-invoked.html": [
+          {
+            "path": "html/webappapis/idle-callbacks/cancel-invoked.html",
+            "url": "/html/webappapis/idle-callbacks/cancel-invoked.html"
+          }
+        ],
+        "html/webappapis/idle-callbacks/idlharness.html": [
+          {
+            "path": "html/webappapis/idle-callbacks/idlharness.html",
+            "url": "/html/webappapis/idle-callbacks/idlharness.html"
+          }
+        ],
         "selectors/child-indexed-pseudo-class.html": [
           {
             "path": "selectors/child-indexed-pseudo-class.html",
             "url": "/selectors/child-indexed-pseudo-class.html"
           }
         ],
         "svg/linking/scripted/href-animate-element.html": [
           {
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/html/webappapis/idle-callbacks/__dir__.ini
@@ -0,0 +1,1 @@
+prefs: [dom.requestIdleCallback.enabled:true]
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-exception.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>requestIdleCallback callback exception reported to error handler</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+  var custom_exception = 'requestIdleCallbackException';
+  setup({allow_uncaught_exception : true});
+  async_test(function (t) {
+    assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+    addEventListener("error",function(e) {
+      t.step(function() {
+        assert_equals(e.error.message, custom_exception);
+        t.done();
+      })
+    });
+    window.requestIdleCallback(function () {
+      throw new Error(custom_exception);
+    });
+  }, "requestIdleCallback callback exceptions are reported to error handler");
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-iframe.html
@@ -0,0 +1,17 @@
+<!doctype html>
+<meta charset=utf-8>
+<title></title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<iframe style="display:none" id="frame"></iframe>
+<script>
+  async_test(function (t) {
+    let frame = document.getElementById("frame");
+    frame.contentWindow.test = function() {
+      this.window.requestIdleCallback(t.step_func_done());
+    }
+
+    frame.contentWindow.test();
+  });
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-invoked.html
@@ -0,0 +1,12 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>requestIdleCallback callback must be called eventually</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+  async_test(function (t) {
+    assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+    window.requestIdleCallback(t.step_func_done());
+  }, "requestIdleCallback callback is invoked at least once before the timeout");
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-multiple-calls.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>multiple calls to requestIdleCallback</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+  async_test(function (t) {
+    assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+    var counter = 0;
+    function f(c) {
+      assert_equals(counter, c);
+      if (counter === 99) {
+        t.done();
+      }
+
+      ++counter;
+    }
+    for (var i = 0; i < 100; ++i) {
+      let j = i;
+      window.requestIdleCallback(t.step_func(function () { f(j) }));
+    }
+  }, "requestIdleCallback callbacks should be invoked in order (called iteratively)");
+
+  async_test(function (t) {
+    assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+    var counter = 0;
+
+    function f(c) {
+      assert_equals(counter, c);
+      if (counter === 99) {
+        t.done();
+      }
+
+      ++counter;
+      window.requestIdleCallback(t.step_func(function () { f(c + 1) }));
+    }
+
+    window.requestIdleCallback(t.step_func(function () { f(0) }));
+  }, "requestIdleCallback callbacks should be invoked in order (called recursively)");
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/callback-timeout.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>requestIdleCallback timeout callback must be called with didTimeout equal to true</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+  async_test(function (t) {
+    assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+    var counter = 0;
+
+    function g(deadline) {
+      assert_true(deadline.didTimeout)
+      t.done();
+    }
+
+    function f(deadline) {
+      assert_false(deadline.didTimeout);
+      window.requestIdleCallback(t.step_func(g), {timeout:300});
+
+      var d = Date.now() + 500;
+      while (Date.now() < d) {
+
+      }
+    }
+    window.requestIdleCallback(t.step_func(f));
+  }, "requestIdleCallback callback should time out");
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/cancel-invoked.html
@@ -0,0 +1,26 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>cancelling idle requests</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<div id="log"></div>
+<script>
+  test(function (t) {
+    window.cancelIdleCallback(42);
+    assert_true(true);
+  }, "cancelIdleCallback does nothing if there is no callback with the given handle");
+
+  async_test(function (t) {
+    assert_false(document.hidden, "document.hidden must exist and be false to run this test properly");
+    var neverCalled = true;
+    var handle = window.requestIdleCallback(function () {
+      neverCalled = false;
+    });
+    window.cancelIdleCallback(handle);
+
+    t.step_timeout(function() {
+      assert_true(neverCalled);
+      t.done();
+    }, 2000);
+  }, "A cancelled callback is never invoked");
+</script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/html/webappapis/idle-callbacks/idlharness.html
@@ -0,0 +1,34 @@
+<!doctype html>
+<meta charset=utf-8>
+<title>idlharness test</title>
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+<script src="/resources/WebIDLParser.js"></script>
+<script src="/resources/idlharness.js"></script>
+
+<pre id='untested_idl' style='display:none'>
+[PrimaryGlobal]
+interface Window {
+};
+</pre>
+
+<pre id='idl'>
+partial interface Window {
+  unsigned long requestIdleCallback(IdleRequestCallback callback,
+                                    optional IdleRequestOptions options);
+  void          cancelIdleCallback(unsigned long handle);
+};
+
+dictionary IdleRequestOptions {
+  unsigned long timeout;
+};
+
+callback IdleRequestCallback = void (IdleDeadline deadline);
+</pre>
+<script>
+  var idl_array = new IdlArray();
+  idl_array.add_untested_idls(document.getElementById("untested_idl").textContent);
+  idl_array.add_idls(document.getElementById("idl").textContent);
+  idl_array.add_objects({Window: ["window"]});
+  idl_array.test();
+</script>