chromium/headless/test/data/protocol/emulation/virtual-time-dispose-while-running.js

// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(async function(testRunner) {
  const {page, session, dp} = await testRunner.startBlank(
      'Tests that disposing Emulation agent before virtual time expires ' +
      'doesn\'t cause a crash');

  // Create another session, so that we can have it detached while maintaining
  // control of the renderer through the original session.
  const bp = testRunner.browserP();
  const targets = (await bp.Target.getTargets()).result.targetInfos;
  const pageTarget = targets.find(
      target => target.url.endsWith('inspector-protocol-page.html'));
  const sessionId = (await bp.Target.attachToTarget({
      targetId: pageTarget.targetId, flatten: true})).result.sessionId;
  const session2 = new TestRunner.Session(testRunner, sessionId);
  const dp2 = session2.protocol;

  const FetchHelper = await testRunner.loadScriptAbsolute(
      '../fetch/resources/fetch-test.js');
  const helper = new FetchHelper(testRunner, dp);
  await helper.enable();

  helper.onceRequest('https://test.com/index.html').fulfill(
      FetchHelper.makeContentResponse(`<html></html>`));

  // Enable virtual time through the second session.
  await dp2.Emulation.setVirtualTimePolicy({policy: 'pause'});
  await dp.Page.navigate({url: 'https://test.com/index.html'});
  dp2.Emulation.setVirtualTimePolicy({
    policy: 'pauseIfNetworkFetchesPending', budget: 5000});

  // Pause page with VT paused using request interception, then detach
  // session, then let the time expire.
  const fetchResponse =
      session.evaluateAsync(`fetch('/fetch').then(r => r.text())`);
  const request = await helper.onceRequest('https://test.com/fetch').matched();
  dp.Inspector.onceTargetCrashed(() => {
    testRunner.log('FAIL: target crashed!');
    testRunner.completeTest();
  });
  await bp.Target.detachFromTarget({sessionId});
  await dp.Fetch.fulfillRequest(
      Object.assign(FetchHelper.makeContentResponse(`test fetch`),
      {requestId: request.requestId}));
  testRunner.log(`fetch request: ${await fetchResponse}`);
  // Make a round-trip to the page to make sure it's alive.
  testRunner.log(await session.evaluate('"PASSED"'));
  testRunner.completeTest();
})