(async function(testRunner) {
  const {page, session, dp} = await testRunner.startBlank(
      `Tests that targets created with window.open share the same browser context.`);

  await dp.Target.setDiscoverTargets({discover: true});
  session.evaluate(`
    window.myWindow = window.open('../resources/inspector-protocol-page.html'); undefined;
  `);
  testRunner.log('Opened a second window');
  await dp.Target.onceTargetCreated();
  const pageTargets = (await dp.Target.getTargets()).result.targetInfos.filter(target => target.type === 'page');
  const browserContextId = pageTargets[0].browserContextId;
  if (!browserContextId) {
    testRunner.log('Found a page target without a browserContextId!');
    testRunner.log(pageTargets);
    testRunner.completeTest();
    return;
  }
  for (const pageTarget of pageTargets) {
    if (pageTarget.browserContextId !== browserContextId) {
      testRunner.log('Targets have different browserContextIds!');
      testRunner.log(pageTargets);
      testRunner.completeTest();
      return;
    }
  }
  testRunner.log('SUCCESS: All ' + pageTargets.length + ' pages belong to the same browser context.');
  testRunner.completeTest();
})
