| importScripts("worker-testharness.js"); |
| importScripts("test-helpers.sub.js"); |
| importScripts("/common/get-host-info.sub.js") |
| importScripts("testharness-helpers.js") |
| |
| self.onfetch = function(e) { |
| if (e.request.url.indexOf("client-navigate-frame.html") >= 0) { |
| return; |
| } |
| e.respondWith(new Response(e.clientId)); |
| }; |
| |
| function pass(test, url) { |
| return { result: test, |
| url: url }; |
| } |
| |
| function fail(test, reason) { |
| return { result: "FAILED " + test + " " + reason } |
| } |
| |
| self.onmessage = function(e) { |
| var port = e.data.port; |
| var test = e.data.test; |
| var clientId = e.data.clientId; |
| var clientUrl = ""; |
| if (test === "test_client_navigate_success") { |
| promise_test(function(t) { |
| this.add_cleanup(() => port.postMessage(pass(test, clientUrl))); |
| return self.clients.get(clientId) |
| .then(client => client.navigate("client-navigated-frame.html")) |
| .then(client => { |
| clientUrl = client.url; |
| assert_true(client instanceof WindowClient); |
| }) |
| .catch(unreached_rejection(t)); |
| }, "Return value should be instance of WindowClient"); |
| } else if (test === "test_client_navigate_cross_origin") { |
| promise_test(function(t) { |
| this.add_cleanup(() => port.postMessage(pass(test, clientUrl))); |
| var path = new URL('client-navigated-frame.html', self.location.href).pathname; |
| var url = get_host_info()['HTTPS_REMOTE_ORIGIN'] + path; |
| return self.clients.get(clientId) |
| .then(client => client.navigate(url)) |
| .then(client => { |
| clientUrl = (client && client.url) || ""; |
| assert_equals(client, null, |
| 'cross-origin navigate resolves with null'); |
| }) |
| .catch(unreached_rejection(t)); |
| }, "Navigating to different origin should resolve with null"); |
| } else if (test === "test_client_navigate_about_blank") { |
| promise_test(function(t) { |
| this.add_cleanup(function() { port.postMessage(pass(test, "")); }); |
| return self.clients.get(clientId) |
| .then(client => promise_rejects(t, new TypeError(), client.navigate("about:blank"))) |
| .catch(unreached_rejection(t)); |
| }, "Navigating to about:blank should reject with TypeError"); |
| } else if (test === "test_client_navigate_mixed_content") { |
| promise_test(function(t) { |
| this.add_cleanup(function() { port.postMessage(pass(test, "")); }); |
| var path = new URL('client-navigated-frame.html', self.location.href).pathname; |
| // Insecure URL should fail since the frame is owned by a secure parent |
| // and navigating to http:// would create a mixed-content violation. |
| var url = get_host_info()['HTTP_REMOTE_ORIGIN'] + path; |
| return self.clients.get(clientId) |
| .then(client => promise_rejects(t, new TypeError(), client.navigate(url))) |
| .catch(unreached_rejection(t)); |
| }, "Navigating to mixed-content iframe should reject with TypeError"); |
| } else if (test === "test_client_navigate_redirect") { |
| var host_info = get_host_info(); |
| var url = new URL(host_info['HTTPS_REMOTE_ORIGIN']).toString() + |
| new URL("client-navigated-frame.html", location).pathname.substring(1); |
| promise_test(function(t) { |
| this.add_cleanup(() => port.postMessage(pass(test, clientUrl))); |
| return self.clients.get(clientId) |
| .then(client => client.navigate("redirect.py?Redirect=" + url)) |
| .then(client => { |
| clientUrl = (client && client.url) || "" |
| assert_true(client === null); |
| }) |
| .catch(unreached_rejection(t)); |
| }, "Redirecting to another origin should resolve with null"); |
| } |
| }; |