blob: de5d61f47e35a3e24581ef00c12e6f9fb711d703 [file] [log] [blame]
// Copyright 2020 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.
(async function() {
TestRunner.addResult('Tests V8 code cache for resources revalidated with 304.\n');
// The main purpose of the test is to demonstrate that after producing the
// code cache on the 2nd load, it gets cleared on disk by subsequent loads of
// the subresource, even if the response instructs to reuse the old resource.
await TestRunner.loadModule('performance_test_runner');
await TestRunner.showPanel('timeline');
// Clear browser cache to avoid any existing entries for the fetched scripts
// in the cache.
SDK.multitargetNetworkManager.clearBrowserCache();
// The script is executed as a parser-inserted script, to keep the
// ScriptResource in blink::MemoryCache and reduce flake. ScriptResource for
// a dynamically-inserted <script> can be garbage-collected and thus removed
// from MemoryCache after its execution.
const resource = 'resources/revalidated-script.html'
TestRunner.addResult('--- Begin trace events related to code cache. ------');
await PerformanceTestRunner.startTimeline();
async function stopAndPrintTimeline() {
await PerformanceTestRunner.stopTimeline();
await PerformanceTestRunner.printTimelineRecordsWithDetails(
TimelineModel.TimelineModel.RecordType.CompileScript);
}
async function expectationComment(msg) {
await stopAndPrintTimeline();
TestRunner.addResult(msg);
await PerformanceTestRunner.startTimeline();
}
// Load the resource a few times. With the current V8 heuristics
// we produce cache on second fetch and consume it in the
// third fetch. Note that addIframe() waits for
// iframe's load event, which waits for the <script> to load.
await expectationComment('1st load. Produce timestamp. -->');
await TestRunner.addIframe(resource);
await expectationComment('2nd load. Produce code cache. -->');
await TestRunner.addIframe(resource);
await expectationComment('3rd load. Consume code cache. -->');
await TestRunner.addIframe(resource);
await expectationComment('Clear the resource from the MemoryCache. -->');
// Blink evicts previous Resource when a new request to the same URL but with
// different resource type is started. We fetch() the URL, and thus
// evict the previous ScriptResource of the URL.
await TestRunner.evaluateInPageAsync(
`fetch('/devtools/resources/v8-cache-revalidated-script.cgi')`);
await expectationComment('Load the resource with revalidation. ' +
'The code cache got dropped because its timestamp did not ' +
'match the one of the request. -->');
// The timestamp is written in the next step because there was no cached code.
await TestRunner.addIframe(resource);
await stopAndPrintTimeline();
TestRunner.addResult('----- End trace events related to code cache. ------');
TestRunner.completeTest();
})();