Commit 69b81d79 authored by Hiroki Nakagawa's avatar Hiroki Nakagawa Committed by Chromium LUCI CQ

Prerender: Test that clients in prerendering state are exposed via Clients#matchAll()

By adding a new browser test, this CL clarifies the current behavior
that clients in the prerendering state are exposed via
Clients#matchAll() on service workers. This behavior can be changed
based on future discussions.

Change-Id: I6be9d2e3db91a5b411a5debbe4098a83597f4f86
Bug: 1166470
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2626861Reviewed-by: default avatarMatt Falkenhagen <falken@chromium.org>
Reviewed-by: default avatarKinuko Yasuda <kinuko@chromium.org>
Commit-Queue: Hiroki Nakagawa <nhiroki@chromium.org>
Cr-Commit-Position: refs/heads/master@{#844487}
parent e1e04cce
...@@ -470,5 +470,33 @@ IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, FeatureRestriction_WindowOpen) { ...@@ -470,5 +470,33 @@ IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest, FeatureRestriction_WindowOpen) {
EXPECT_EQ(registry.FindHostByUrlForTesting(kPrerenderingUrl), prerender_host); EXPECT_EQ(registry.FindHostByUrlForTesting(kPrerenderingUrl), prerender_host);
} }
// Tests that Clients#matchAll() on ServiceWorkerGlobalScope exposes clients in
// the prerendering state.
// TODO(https://crbug.com/1166470): This can be a tentative behavior. We may
// stop exposing the clients.
IN_PROC_BROWSER_TEST_P(PrerenderBrowserTest,
FeatureRestriction_ClientsMatchAll) {
// Navigate to an initial page.
const GURL kInitialUrl = GetUrl("/prerender/clients_matchall.html");
ASSERT_TRUE(NavigateToURL(shell(), kInitialUrl));
// Start a prerender.
const GURL kPrerenderingUrl = GetUrl("/empty.html");
AddPrerender(kPrerenderingUrl);
PrerenderHostRegistry& registry = GetPrerenderHostRegistry();
PrerenderHost* prerender_host =
registry.FindHostByUrlForTesting(kPrerenderingUrl);
ASSERT_TRUE(prerender_host);
// Make sure the prerendering page is exposed via Clients#matchAll().
EvalJsResult results =
EvalJs(shell()->web_contents(), "get_exposed_client_urls()");
std::vector<std::string> client_urls;
for (auto& result : results.ExtractList())
client_urls.push_back(result.GetString());
EXPECT_TRUE(base::Contains(client_urls, kInitialUrl));
EXPECT_TRUE(base::Contains(client_urls, kPrerenderingUrl));
}
} // namespace } // namespace
} // namespace content } // namespace content
<!DOCTYPE html>
<html>
<head></head>
<body></body>
<script>
// Adds <link rel=prerender> for the URL.
function add_prerender(url) {
const link = document.createElement('link');
link.rel = 'prerender';
link.href = url;
document.head.appendChild(link);
}
async function unregister_service_worker(scope) {
const registration = await navigator.serviceWorker.getRegistration(scope);
if (!registration)
return;
return registration.unregister();
}
// Returns client urls exposed by Clients#matchAll().
async function get_exposed_client_urls() {
// Start a service worker.
const worker_url = 'clients_matchall_service_worker.js';
const scope = 'controlled/';
await unregister_service_worker(scope);
const registration =
await navigator.serviceWorker.register(worker_url, { scope: scope });
// Ask the service worker to run Clients#matchAll().
const message = await new Promise(resolve => {
registration.installing.postMessage('matchall');
navigator.serviceWorker.onmessage = resolve;
});
// `data` contains client URLs.
return message.data;
}
</script>
</html>
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
onmessage = e => {
// Collect all client URLs in this origin.
const options = { includeUncontrolled: true, type: 'all' };
const promise = self.clients.matchAll(options)
.then(clients => {
const client_urls = [];
clients.forEach(client => client_urls.push(client.url));
e.source.postMessage(client_urls);
});
e.waitUntil(promise);
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment