(async function(testRunner) {
  var {page, session, dp} = await testRunner.startBlank(`Tests oopif discovery.`);

  await dp.Page.enable();
  dp.Page.navigate({url: testRunner.url('../resources/site_per_process_main.html')});
  await dp.Page.onceLoadEventFired();

  testRunner.log('Enabling auto-discovery...');
  const attachedPromise = dp.Target.onceAttachedToTarget();
  await dp.Target.setAutoAttach({autoAttach: true, waitForDebuggerOnStart: false});

  const attachedEvent = (await attachedPromise).params;
  testRunner.log('Got auto-attached.');
  const frameId = attachedEvent.targetInfo.targetId;

  testRunner.log('Navigating to in-process iframe...');
  const navigatePromise = dp.Page.navigate({frameId, url: testRunner.url('../resources/iframe.html')});
  const detachedPromise = dp.Target.onceDetachedFromTarget();
  await Promise.all([navigatePromise, detachedPromise]);

  const detachedEvent = (await detachedPromise).params;
  testRunner.log('Session id should match: ' + (attachedEvent.sessionId === detachedEvent.sessionId));
  testRunner.log('Target id should match: ' + (attachedEvent.targetInfo.targetId === detachedEvent.targetId));

  testRunner.log('Navigating back to out-of-process iframe...');

  const attachedPromise2 = dp.Target.onceAttachedToTarget();
  dp.Page.navigate({frameId, url: 'http://devtools.oopif.test:8000/inspector-protocol/resources/iframe.html'});

  const attachedEvent2 = (await attachedPromise2).params;
  testRunner.log('Target ids should match: ' + (attachedEvent.targetInfo.targetId === attachedEvent2.targetInfo.targetId));

  const detachedPromise2 = dp.Target.onceDetachedFromTarget();
  await dp.Target.setAutoAttach({autoAttach: false, waitForDebuggerOnStart: false});
  const detachedEvent2 = (await detachedPromise2).params;
  testRunner.log('Session id should match: ' + (attachedEvent2.sessionId === detachedEvent2.sessionId));
  testRunner.log('Target id should match: ' + (attachedEvent2.targetInfo.targetId === detachedEvent2.targetId));

  testRunner.completeTest();
})
