Bug 1321878 P2 Add a wpt test to verify Performance timing API accounts for service worker time. r=asuth
authorBen Kelly <ben@wanderview.com>
Wed, 14 Dec 2016 19:42:08 -0800
changeset 450143 e1b7a57826e0e9523616df493907f7613f9d8dc1
parent 450142 efe8228d192bea2704c94c92f88da4d9e0f68ae0
child 450144 63b447888a6469b9f6ae8f76ac5f0d7c6ea239da
child 450281 c94ca0caa6f2f07505fb9ed3889ce0de6ed6fd23
push id38763
push userbmo:jyavenard@mozilla.com
push dateFri, 16 Dec 2016 02:12:02 +0000
reviewersasuth
bugs1321878
milestone53.0a1
Bug 1321878 P2 Add a wpt test to verify Performance timing API accounts for service worker time. r=asuth
testing/web-platform/tests/service-workers/service-worker/performance-timeline.https.html
testing/web-platform/tests/service-workers/service-worker/resources/empty-but-slow-worker.js
--- a/testing/web-platform/tests/service-workers/service-worker/performance-timeline.https.html
+++ b/testing/web-platform/tests/service-workers/service-worker/performance-timeline.https.html
@@ -3,9 +3,50 @@
 <script src="/resources/testharnessreport.js"></script>
 <script src="resources/test-helpers.sub.js"></script>
 <script>
 
 service_worker_test(
     'resources/performance-timeline-worker.js',
     'Test Performance Timeline API in Service Worker');
 
+// The purpose of this test is to verify that service worker overhead
+// is included in the Performance API's timing information.
+promise_test(t => {
+  let script = 'resources/empty-but-slow-worker.js';
+  let scope = 'resources/dummy.txt?slow-sw-timing';
+  let url = new URL(scope, window.location).href;
+  let slowURL = url + '&slow';
+  let frame;
+  return service_worker_unregister_and_register(t, script, scope)
+    .then(reg => wait_for_state(t, reg.installing, 'activated'))
+    .then(_ => with_iframe(scope))
+    .then(f => {
+      frame = f;
+      return Promise.all([
+        // This will get effectively an empty service worker FetchEvent
+        // handler.  It should have no additional delay.  Note that the
+        // text() call is necessary to complete the response and have the
+        // timings show up in the performance entries.
+        frame.contentWindow.fetch(url).then(r => r && r.text()),
+        // This will cause the service worker to spin for two seconds
+        // in its FetchEvent handler.
+        frame.contentWindow.fetch(slowURL).then(r => r && r.text())
+      ]);
+    })
+    .then(_ => {
+      function elapsed(u) {
+        let entry = frame.contentWindow.performance.getEntriesByName(u);
+        return entry[0] ? entry[0].duration : undefined;
+      }
+      let urlTime = elapsed(url);
+      let slowURLTime = elapsed(slowURL);
+      // Verify the request slowed by the service worker is indeed measured
+      // to be slower.  Note, we compare to smaller delay instead of the exact
+      // delay amount to avoid making the test racy under automation.
+      assert_true(slowURLTime >= urlTime + 1500,
+                  'Slow service worker request should measure increased delay.');
+      frame.remove();
+      return service_worker_unregister_and_done(t, scope);
+    })
+}, 'empty service worker fetch event included in performance timings');
+
 </script>
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/tests/service-workers/service-worker/resources/empty-but-slow-worker.js
@@ -0,0 +1,8 @@
+addEventListener('fetch', evt => {
+  if (evt.request.url.endsWith('slow')) {
+    // Performance.now() might be a bit better here, but Date.now() has
+    // better compat in workers right now.
+    let start = Date.now();
+    while(Date.now() - start < 2000);
+  }
+});