Commit 2417e170 authored by Hiroshige Hayashizaki's avatar Hiroshige Hayashizaki Committed by aborovova@mozilla.com
Browse files

Bug 1967289 [wpt PR 52641] - [SW+Prefetch] Add tests for Navigation Preload,

Automatic update from web-platform-tests
[SW+Prefetch] Add tests for Navigation Preload

Chromium's current behavior (when the feature is enabled under
`virtual/prefetch-sw`): `preloadResponse` is never resolved nor
rejected, which will be fixed by
https://chromium-review.googlesource.com/c/chromium/src/+/6557209.

Bug: 396460807, 413168042
Change-Id: I9b20dec9cf17ee009e9f7ce9763581f40e3815b5
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6349750


Reviewed-by: default avatarHiroki Nakagawa <nhiroki@chromium.org>
Reviewed-by: default avatarShunya Shishido <sisidovski@chromium.org>
Commit-Queue: Hiroshige Hayashizaki <hiroshige@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1462612}

--

wpt-commits: e306c3183705368d31c4775449c9c8ba36e72c7d
wpt-pr: 52641

Differential Revision: https://phabricator.services.mozilla.com/D250930
parent d6d802b0
Loading
Loading
Loading
Loading
+31 −2
Original line number Diff line number Diff line
const swOption = new URL(location.href).searchParams.get('sw');

if (swOption === 'fetch-handler-navigation-preload') {
  self.addEventListener('activate', event => {
    if (self.registration.navigationPreload) {
      event.waitUntil(self.registration.navigationPreload.enable());
    }
  });
}

const interceptedRequests = [];

self.addEventListener('message', event => {
@@ -21,14 +29,15 @@ if (swOption !== 'no-fetch-handler') {
    event.request.headers.forEach((value, key) => {
      headers[key] = value;
    });
    interceptedRequests.push({
    const interceptedRequest = {
      request: {
        url: event.request.url,
        headers: headers,
      },
      clientId: event.clientId,
      resultingClientId: event.resultingClientId
    });
    };
    interceptedRequests.push(interceptedRequest);

    if (swOption === 'fetch-handler') {
      event.respondWith(fetch(event.request));
@@ -49,6 +58,26 @@ if (swOption !== 'no-fetch-handler') {
    } else if (swOption === 'fetch-handler-modify-referrer') {
      event.respondWith(fetch(event.request,
          {referrer: new URL('/intercepted', location.href).href}));
    } else if (swOption === 'fetch-handler-navigation-preload') {
      event.respondWith((async () => {
        try {
          if (event.preloadResponse === 'undefined') {
            interceptedRequest.preloadResponse = 'undefined';
            return fetch(event.request);
          }
          const response = await event.preloadResponse;
          if (response) {
            interceptedRequest.preloadResponse = 'resolved';
            return response;
          } else {
            interceptedRequest.preloadResponse = 'resolved to undefined';
            return fetch(event.request);
          }
        } catch(e) {
          interceptedRequest.preloadResponse = 'rejected';
          throw e;
        }
      })());
    } else {
      // Do nothing to fallback to the network.
    }
+2 −0
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ window.requestHeaders = {
  "referer": "{{header_or_default(Referer, NONEXISTENT)}}",
  "sec-fetch-dest": "{{header_or_default(Sec-Fetch-Dest, NONEXISTENT)}}",
  "sec-fetch-mode": "{{header_or_default(Sec-Fetch-Mode, NONEXISTENT)}}",
  "service-worker-navigation-preload":
      "{{header_or_default(Service-Worker-Navigation-Preload, NONEXISTENT)}}",
  // Convert to the raw string to avoid backslashes from being processed as
  // escape sequences.
  // TODO(crbug.com/404573971): Remove `header_or_default` to reflect
+7 −0
Original line number Diff line number Diff line
@@ -260,6 +260,13 @@ function assert_intercept_non_prefetch(interceptedRequest, expectedUrl) {
  }
}

function assert_served_by_navigation_preload(requestHeaders) {
  assert_equals(
    requestHeaders['service-worker-navigation-preload'],
    'true',
    'Service-Worker-Navigation-Preload');
}

// Use nvs_header query parameter to ask the wpt server
// to populate No-Vary-Search response header.
function addNoVarySearchHeaderUsingQueryParam(url, value){
+20 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@
<meta name="variant" content="?origin=same-site&sw=fetch-handler-to-fallback">
<meta name="variant" content="?origin=same-site&sw=fetch-handler-modify-url">
<meta name="variant" content="?origin=same-site&sw=fetch-handler-modify-referrer">
<meta name="variant" content="?origin=same-site&sw=fetch-handler-navigation-preload">
<meta name="variant" content="?origin=same-site&sw=no-fetch-handler">
<meta name="variant" content="?origin=same-site&sw=no-controller">

@@ -119,6 +120,25 @@ promise_test(async t => {
      assert_equals(interceptedRequests.length, 1);
      assert_intercept_prefetch(interceptedRequests[0], nextUrl);
    }
  } else if (originOption === 'same-site' &&
      swOption === 'fetch-handler-navigation-preload') {
    // Check the behavior of `FetchEvent.preloadResponse` for prefetching
    // requests.
    // Here we allow >1 intercepted requests to check `preloadResponse`
    // behavior even if e.g. prefetched response isn't served and there is
    // second intercepted request (=non-prefetch navigation request).
    assert_greater_than_equal(interceptedRequests.length, 1);
    // The first intercepted request is a prefetch request.
    assert_intercept_prefetch(interceptedRequests[0], nextUrl);
    assert_equals(interceptedRequests[0].preloadResponse, 'resolved',
        'preloadResponse should be resolved');

    assert_served_by_navigation_preload(headers);
    assert_prefetched(headers, "Prefetched result should be served.");
    assert_equals(requestCount.prefetch, 1,
        'a prefetch request should be sent to the server.');
    assert_equals(requestCount.nonPrefetch, 0,
        'non-prefetch requests should not be sent to the server.');
  } else if (originOption === 'same-site' &&
             (swOption === 'fetch-handler-modify-url' ||
              swOption === 'fetch-handler-modify-referrer')) {