(async function(testRunner) {
  const {page, session, dp} = await testRunner.startBlank(
      `Verifies that navigating from a in-process iframe to in-process iframe sets the right sessionId.\n`);

  await dp.Page.enable();
  await dp.Page.setLifecycleEventsEnabled({ enabled: true });
  let numberOfLoads = 0;
  dp.Page.onLifecycleEvent(onLifecycleEvent);

  await dp.Network.clearBrowserCache();
  await dp.Network.setCacheDisabled({cacheDisabled: true});
  await dp.Network.enable();

  const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session);

  await session.navigate('resources/page-in.html');

  async function onLifecycleEvent(event) {
    if (event.params.name != "load") return;
    numberOfLoads++;
    if (numberOfLoads != 2) return;
    const events = [];
    // The two in-process iframes from page-in.html have loaded.
    dp.Network.onRequestWillBeSent(() => events.push("onRequestWillBeSent"));
    dp.Network.onRequestWillBeSentExtraInfo(() => events.push("onRequestWillBeSentExtraInfo"));
    dp.Network.onResponseReceivedExtraInfo(() => events.push("onResponseReceivedExtraInfo"));
    dp.Network.onResponseReceived(() => events.push("onResponseReceived"));

    const [request, requestExtraInfo, responseExtraInfo, response] =
      await helper.jsNavigateIFrameWithExtraInfo('page-iframe', '/devtools/oopif/resources/inner-iframe.html');

    testRunner.log(`Events received: [${events.sort().join(", ")}]`);
    const requests = [request, requestExtraInfo, responseExtraInfo, response];
    const requestIds = requests.map(x => x.params.requestId);
    const sessionIds = requests.map(x => x.sessionId);

    testRunner.log(`Number of request ids: ${requestIds.length}, unique ids ${new Set(requestIds).size}`);
    testRunner.log(`Number of session ids: ${sessionIds.length}, unique ids ${new Set(sessionIds).size}`);

    testRunner.completeTest();
  }
})
