// META: script=/common/get-host-info.sub.js
// META: script=./resources/common.js
// META: timeout=long
'use strict';

assert_true(self.crossOriginIsolated);

promise_test(async testCase => {
  const {iframes, windows} = await build([
    {
      id: 'cross-site-1',
      children: [
        {
          id: 'same-origin-2',
        },
        {
          id: 'same-origin-11',
          window_open: true,
        },
      ],
    },
    {
      id: 'same-origin-3',
      children: [
        {
          id: 'same-origin-4',
        },
        {
          id: 'same-origin-12',
          window_open: true,
        },
      ],
    },
    {
      id: 'cross-origin-5',
      children: [
        {
          id: 'same-origin-6',
        },
        {
          id: 'same-origin-13',
          window_open: true,
        },
      ],
    },
    {
      id: 'same-origin-7',
      window_open: true,
      children: [
        {
          id: 'same-origin-8',
        }
      ],
    },
    {
      id: 'cross-origin-9',
      window_open: true,
      children: [
        {
          id: 'same-origin-10',
        }
      ],
    },
  ]);
  const expected = [
    {
      url: window.location.href,
      scope: 'Window',
      container: null,
    },
    {
      url: 'cross-origin-url',
      scope: 'cross-origin-aggregated',
      container: {
        id: 'cross-site-1',
        src: iframes['cross-site-1'].src,
      },
    },
    {
      url: windows['same-origin-2'].location.href,
      scope: 'Window',
      container: {
        id: 'cross-site-1',
        src: iframes['cross-site-1'].src,
      },
    },
    {
      url: windows['same-origin-3'].location.href,
      scope: 'Window',
      container: {
        id: 'same-origin-3',
        src: iframes['same-origin-3'].src,
      },
    },
    {
      url: windows['same-origin-4'].location.href,
      scope: 'Window',
      container: {
        id: 'same-origin-4',
        src: iframes['same-origin-4'].src,
      },
    },
    {
      url: 'cross-origin-url',
      scope: 'cross-origin-aggregated',
      container: {
        id: 'cross-origin-5',
        src: iframes['cross-origin-5'].src,
      },
    },
    {
      url: windows['same-origin-6'].location.href,
      scope: 'Window',
      container: {
        id: 'cross-origin-5',
        src: iframes['cross-origin-5'].src,
      },
    },
    {
      url: windows['same-origin-8'].location.href,
      scope: 'Window',
      container: {
        id: 'same-origin-8',
        src: iframes['same-origin-8'].src,
      },
    },
    {
      url: windows['same-origin-7'].location.href,
      scope: 'Window',
      container: null,
    },
    {
      url: windows['same-origin-11'].location.href,
      scope: 'Window',
      container: null,
    },
    {
      url: windows['same-origin-12'].location.href,
      scope: 'Window',
      container: null,
    },
    {
      url: windows['same-origin-13'].location.href,
      scope: 'Window',
      container: null,
    },
  ];
  const keep = sameOriginContexts(frames).concat(sameOriginContexts(windows));
  // Detach iframes:
  // 1) By setting src attribute:
  iframes['cross-site-1'].src =
      iframes['cross-site-1'].src.replace('iframe.sub', 'iframe.secret.sub');
  // 2) By setting location attribute:
  let url = iframes['same-origin-3'].contentWindow.location.href;
  url = url.replace('iframe.sub', 'iframe.secret.sub');
  iframes['same-origin-3'].contentWindow.location.href = url;
  // 3) By removing from the DOM tree:
  iframes['cross-origin-5'].parentNode.removeChild(iframes['cross-origin-5']);

  // Detach windows:
  // 1) By setting document.location attribute:
  url = windows['same-origin-7'].location.href;
  url = url.replace('window.sub', 'window.secret.sub');
  windows['same-origin-7'].location.href = url;
  // 2) By closing the window:
  windows['same-origin-10'].parent.close();

  await waitForMessage('cross-site-1');
  await waitForMessage('same-origin-3');
  await waitForMessage('same-origin-7');

  expected.push({
    url: 'cross-origin-url',
    scope: 'cross-origin-aggregated',
    container: {
      id: 'cross-site-1',
      src: iframes['cross-site-1'].src,
    },
  });

  expected.push({
    url: windows['same-origin-3'].location.href,
    scope: 'Window',
    container: {
      id: 'same-origin-3',
      src: iframes['same-origin-3'].src,
    },
  });
  expected.push({
    url: windows['same-origin-7'].location.href,
    scope: 'Window',
    container: null,
  });
  const result = await performance.measureUserAgentSpecificMemory();
  checkMeasureMemory(result, expected);
}, 'performance.measureUserAgentSpecificMemory URLs within a cross-site iframe.');
