Bug 1198381 - Add tests for requestIdleCallback, r=smaug
authorAndreas Farre <farre@mozilla.com>
Tue, 30 Aug 2016 16:02:08 +0200
changeset 320175 e239269e09007016aca9d9fed1007b67e3352ae6
parent 320174 9b8cb1537fbe88497bb785bf0890d2ea81c02c12
child 320176 e8475fb54d7d81733d82738b541407fbb6dfaf3a
push id20751
push userphilringnalda@gmail.com
push dateSun, 30 Oct 2016 18:06:35 +0000
treeherderfx-team@e3279760cd97 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssmaug
bugs1198381
milestone52.0a1
Bug 1198381 - Add tests for requestIdleCallback, r=smaug MozReview-Commit-ID: HRdU1SJEg9K
dom/tests/mochitest/general/test_interfaces.html
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/dom/tests/mochitest/general/test_interfaces.html
+++ b/dom/tests/mochitest/general/test_interfaces.html
@@ -560,16 +560,18 @@ var interfaceNamesInGlobalScope =
     "HTMLTrackElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLUListElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLUnknownElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "HTMLVideoElement",
 // IMPORTANT: Do not change this list without review from a DOM peer!
+    "IdleDeadline",
+// IMPORTANT: Do not change this list without review from a DOM peer!
     "IDBCursor",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "IDBCursorWithValue",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "IDBDatabase",
 // IMPORTANT: Do not change this list without review from a DOM peer!
     "IDBFactory",
 // IMPORTANT: Do not change this list without review from a DOM peer!
--- a/testing/web-platform/meta/MANIFEST.json
+++ b/testing/web-platform/meta/MANIFEST.json
@@ -38610,16 +38610,58 @@
           }
         ],
         "html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html": [
           {
             "path": "html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.html",
             "url": "/html/semantics/links/links-created-by-a-and-area-elements/htmlanchorelement_noopener.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"
+          }
+        ],
         "secure-contexts/basic-dedicated-worker.html": [
           {
             "path": "secure-contexts/basic-dedicated-worker.html",
             "url": "/secure-contexts/basic-dedicated-worker.html"
           }
         ],
         "secure-contexts/basic-dedicated-worker.https.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() {
+      frame.contentWindow.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>