<!DOCTYPE html>
<html>
<head>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>

  <script src="resources/profile-utils.js"></script>

  <script id="external-script" src="resources/external-script.js"></script>
</head>
<body>
  <script>
    promise_test(async t => {
      const trace = await ProfileUtils.profileFunction(function trampoline(sample) {
        externalScriptFunction(sample);
      });

      const scriptUrl = document.querySelector('#external-script').src;
      assert_true(ProfileUtils.containsResource(trace, scriptUrl),
                  'external resource is included');

      const expectedTrampolineFrame = {
        name: 'trampoline',
        resourceId: trace.resources.indexOf(
          location.href,
        ),
      };
      const expectedExternalFrame = {
        name: 'externalScriptFunction',
        resourceId: trace.resources.indexOf(scriptUrl),
        line: EXTERNAL_SCRIPT_FUNCTION_LINE,
        column: EXTERNAL_SCRIPT_FUNCTION_COLUMN,
      };

      assert_true(ProfileUtils.containsFrame(trace, expectedTrampolineFrame),
                  'trampoline function included');

      assert_true(ProfileUtils.containsFrame(trace, expectedExternalFrame),
                  'external script function included');

      assert_true(ProfileUtils.containsSubstack(trace, [
                    externalScriptFunction,
                    expectedTrampolineFrame,
                  ]),
                  'stack exists with external script function');

    }, 'external script function details');
  </script>
</body>
</html>
