chromium/third_party/blink/web_tests/custom-elements/constructor-context-dies-retrieving-prototype.html

<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="../fast/dom/custom/testutils.js"></script>
<body>
<script>
'use strict';

// TODO(dominicc): Port fork() etc. to work with testharness, then
// remove these.
function debug() {}
function finishJSTest() {}

(() => {

if (fork()) {
  // The controlling parent frame.
  let t = async_test('constructor destroys the context retrieving prototype');
  let watcher = new EventWatcher(t, window, 'message');
  watcher.wait_for('message').then(t.step_func((event) => {
    assert_equals(event.data, 'PASS destroyed context');
    return watcher.wait_for('message');
  })).then(t.step_func((event) => {
    assert_equals(event.data, 'PASS child done');
    t.done();
  }));
} else {
  // The child frame.
  let should_destroy = false;
  let proxy;
  function BadConstructor() {
    should_destroy = true;
    return Reflect.construct(HTMLElement, [], proxy);
  }
  proxy = new Proxy(BadConstructor, {
    get(receiver, name) {
      if (should_destroy && name == 'prototype') {
        destroyContext();
        return 42;
      }
      return receiver[name];
    }
  });
  window.customElements.define('x-x', proxy);
  try {
    new proxy();
  } finally {
    done();
  }
}

})();
</script>