| <!DOCTYPE html> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/common/dispatcher/dispatcher.js"></script> |
| <script src="/common/utils.js"></script> |
| <script src="../resources/utils.js"></script> |
| <script src="resources/utils.sub.js"></script> |
| |
| <meta name="variant" content="?default"> |
| <meta name="variant" content="?bypass_cache=true"> |
| <meta name="variant" content="?prefetch=true"> |
| <meta name="variant" content="?prefetch=true&bypass_cache=true"> |
| |
| <script> |
| setup(() => assertSpeculationRulesIsSupported()); |
| |
| const searchParams = new URLSearchParams(location.search); |
| const prefetchEnabled = searchParams.has('prefetch'); |
| const bypassCache = searchParams.has('bypass_cache'); |
| |
| // Header size: https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-transfersize |
| const headerSize = 300; |
| |
| promise_test(async t => { |
| const agent = await spawnWindow(t); |
| // Some meaningless query param to avoid cached response. |
| const prefetchUrl = |
| bypassCache ? agent.getExecutorURL({ a: "b" }) : agent.getExecutorURL(); |
| |
| if (prefetchEnabled) |
| await agent.forceSinglePrefetch(prefetchUrl); |
| |
| await agent.navigate(prefetchUrl); |
| |
| if (prefetchEnabled) |
| assert_prefetched(await agent.getRequestHeaders(), |
| `Prefetch ${prefetchUrl.href} should work.`); |
| else |
| assert_not_prefetched(await agent.getRequestHeaders(), |
| `${prefetchUrl.href} should not be prefetched.`); |
| |
| await agent.execute_script( |
| () => window.entries = performance.getEntriesByType('navigation')); |
| |
| // TODO(crbug/1317756): Currently the initial prefetch request bypasses the |
| // HTTP cache. Expand test coverage for cache and cache+revalidation cases. |
| // |
| // We do not assert the exact size of `resources/executor.sub.html` since it |
| // would be a headache to update this test everytime executor.sub.html |
| // changes. |
| assert_equals(await agent.execute_script(() => window.entries.length), 1, |
| 'Wrong number of entries'); |
| const entry = |
| await agent.execute_script(() => window.entries[0]); |
| const bodySize = entry.encodedBodySize; |
| assert_greater_than(bodySize, 0); |
| assert_equals(entry.transferSize, headerSize + bodySize); |
| assert_equals(entry.decodedBodySize, bodySize); |
| }, `PerformanceNavigationTiming.transferSize/encodedBodySize/decodedBodySize test, same origin prefetch.`); |
| </script> |