| Index: third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/getregistrations.https.html
 | 
| diff --git a/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/getregistrations.https.html b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/getregistrations.https.html
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..b65a97869561ab87fe161b671bc855af93d23f2f
 | 
| --- /dev/null
 | 
| +++ b/third_party/WebKit/LayoutTests/imported/wpt/service-workers/service-worker/getregistrations.https.html
 | 
| @@ -0,0 +1,191 @@
 | 
| +<!DOCTYPE html>
 | 
| +<title>Service Worker: getRegistrations()</title>
 | 
| +<script src="/resources/testharness.js"></script>
 | 
| +<script src="/resources/testharnessreport.js"></script>
 | 
| +<script src="resources/test-helpers.sub.js"></script>
 | 
| +<script src="resources/get-host-info.sub.js"></script>
 | 
| +<script src="../fetch/resources/fetch-test-helpers.sub.js"></script>
 | 
| +<script>
 | 
| +// Purge the existing registrations for the origin.
 | 
| +// getRegistrations() is used in order to avoid adding additional complexity
 | 
| +// e.g. adding an internal function.
 | 
| +promise_test(function(t) {
 | 
| +    return navigator.serviceWorker.getRegistrations()
 | 
| +      .then(function(registrations) {
 | 
| +          return registrations.reduce(function(sequence, registration) {
 | 
| +              return sequence.then(function() {
 | 
| +                  return registration.unregister();
 | 
| +                });
 | 
| +            }, Promise.resolve());
 | 
| +        });
 | 
| +  }, 'Purge the existing registrations.');
 | 
| +
 | 
| +promise_test(function(t) {
 | 
| +    return navigator.serviceWorker.getRegistrations()
 | 
| +      .then(function(value) {
 | 
| +          assert_array_equals(
 | 
| +            value,
 | 
| +            [],
 | 
| +            'getRegistrations should resolve with an empty array.');
 | 
| +        });
 | 
| +  }, 'getRegistrations');
 | 
| +
 | 
| +promise_test(function(t) {
 | 
| +    var scope = 'resources/scope/getregistrations/normal';
 | 
| +    var script = 'resources/empty-worker.js';
 | 
| +    var registrations = [];
 | 
| +    return service_worker_unregister_and_register(t, script, scope)
 | 
| +      .then(function(r) {
 | 
| +          registrations.push(r);
 | 
| +          return navigator.serviceWorker.getRegistrations();
 | 
| +        })
 | 
| +      .then(function(value) {
 | 
| +          assert_array_equals(
 | 
| +            value,
 | 
| +            registrations,
 | 
| +            'getRegistrations should resolve with array of registrations.');
 | 
| +          return service_worker_unregister(t, scope);
 | 
| +        });
 | 
| +  }, 'Register then getRegistrations');
 | 
| +
 | 
| +promise_test(function(t) {
 | 
| +    var scope1 = 'resources/scope/getregistrations/scope1';
 | 
| +    var scope2 = 'resources/scope/getregistrations/scope2';
 | 
| +    var script = 'resources/empty-worker.js';
 | 
| +    var registrations = [];
 | 
| +    return service_worker_unregister_and_register(t, script, scope1)
 | 
| +      .then(function(r) {
 | 
| +          registrations.push(r);
 | 
| +          return service_worker_unregister_and_register(t, script, scope2);
 | 
| +        })
 | 
| +      .then(function(r) {
 | 
| +          registrations.push(r);
 | 
| +          return navigator.serviceWorker.getRegistrations();
 | 
| +        })
 | 
| +      .then(function(value) {
 | 
| +          assert_array_equals(
 | 
| +            value,
 | 
| +            registrations,
 | 
| +            'getRegistrations should resolve with array of registrations.');
 | 
| +          return service_worker_unregister(t, scope1);
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          return service_worker_unregister(t, scope2);
 | 
| +        });
 | 
| +  }, 'Register multiple times then getRegistrations');
 | 
| +
 | 
| +promise_test(function(t) {
 | 
| +    var scope = 'resources/scope/getregistrations/register-unregister';
 | 
| +    var script = 'resources/empty-worker.js';
 | 
| +    return service_worker_unregister_and_register(t, script, scope)
 | 
| +      .then(function(registration) {
 | 
| +          return registration.unregister();
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          return navigator.serviceWorker.getRegistrations();
 | 
| +        })
 | 
| +      .then(function(value) {
 | 
| +          assert_array_equals(
 | 
| +            value,
 | 
| +            [],
 | 
| +            'getRegistrations should resolve with an empty array.');
 | 
| +        });
 | 
| +  }, 'Register then Unregister then getRegistrations');
 | 
| +
 | 
| +promise_test(function(t) {
 | 
| +    var scope = 'resources/scope/getregistrations/register-unregister-controlled';
 | 
| +    var script = 'resources/empty-worker.js';
 | 
| +    var registrations;
 | 
| +    var frame;
 | 
| +    return service_worker_unregister_and_register(t, script, scope)
 | 
| +      .then(function(r) {
 | 
| +          registration = r;
 | 
| +          return wait_for_state(t, registration.installing, 'activated');
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          return with_iframe(scope);
 | 
| +        })
 | 
| +      .then(function(f) {
 | 
| +          frame = f;
 | 
| +          return registration.unregister();
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          return navigator.serviceWorker.getRegistrations();
 | 
| +        })
 | 
| +      .then(function(value) {
 | 
| +          assert_array_equals(
 | 
| +            value,
 | 
| +            [],
 | 
| +            'getRegistrations should resolve with an empty array.');
 | 
| +          assert_equals(registration.installing, null);
 | 
| +          assert_equals(registration.waiting, null);
 | 
| +          assert_equals(registration.active.state, 'activated');
 | 
| +          frame.remove();
 | 
| +        });
 | 
| +  }, 'Register then Unregister with controlled frame then getRegistrations');
 | 
| +
 | 
| +promise_test(function(t) {
 | 
| +    var host_info = get_host_info();
 | 
| +    // Rewrite the url to point to remote origin.
 | 
| +    var frame_same_origin_url = new URL("resources/frame-for-getregistrations.html", window.location);
 | 
| +    var frame_url = host_info['HTTPS_REMOTE_ORIGIN'] + frame_same_origin_url.pathname;
 | 
| +    var scope = 'resources/scope-for-getregistrations';
 | 
| +    var script = 'resources/empty-worker.js';
 | 
| +    var frame;
 | 
| +    var registrations = [];
 | 
| +
 | 
| +    // Loads an iframe and waits for 'ready' message from it to resolve promise.
 | 
| +    // Caller is responsible for removing frame.
 | 
| +    function with_iframe_ready(url) {
 | 
| +        return new Promise(function(resolve) {
 | 
| +            var frame = document.createElement('iframe');
 | 
| +            frame.src = url;
 | 
| +            window.addEventListener('message', function onMessage(e) {
 | 
| +              window.removeEventListener('message', onMessage);
 | 
| +              if (e.data == 'ready') {
 | 
| +                resolve(frame);
 | 
| +              }
 | 
| +            });
 | 
| +            document.body.appendChild(frame);
 | 
| +        });
 | 
| +    }
 | 
| +
 | 
| +    // We need this special frame loading function because the frame is going
 | 
| +    // to register it's own service worker and there is the possibility that that
 | 
| +    // register() finishes after the register() for the same domain later in the
 | 
| +    // test. So we have to wait until the cross origin register() is done, and not
 | 
| +    // just until the frame loads.
 | 
| +    return with_iframe_ready(frame_url)
 | 
| +      .then(function(f) {
 | 
| +          frame = f;
 | 
| +          return service_worker_unregister_and_register(t, script, scope);
 | 
| +        })
 | 
| +      .then(function(r) {
 | 
| +          registrations.push(r);
 | 
| +          return navigator.serviceWorker.getRegistrations();
 | 
| +        })
 | 
| +      .then(function(value) {
 | 
| +          assert_array_equals(
 | 
| +            value,
 | 
| +            registrations,
 | 
| +            'getRegistrations should only return same origin registrations.');
 | 
| +
 | 
| +          var channel = new MessageChannel();
 | 
| +          var resolve;
 | 
| +          var p = new Promise(function(r) { resolve = r; });
 | 
| +
 | 
| +          channel.port1.onmessage = function(e) {
 | 
| +            if (e.data == 'unregistered')
 | 
| +              resolve();
 | 
| +          };
 | 
| +          frame.contentWindow.postMessage('unregister', '*', [channel.port2]);
 | 
| +          return p;
 | 
| +        })
 | 
| +      .then(function() {
 | 
| +          frame.remove();
 | 
| +          return service_worker_unregister(t, scope);
 | 
| +        });
 | 
| +  }, 'getRegistrations promise resolves only with same origin registrations.');
 | 
| +
 | 
| +done();
 | 
| +</script>
 | 
| 
 |