<!doctype HTML>

<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<style>
  div {
    contain: style layout;
  }
</style>
<div id="outermost">
  Outermost
  <div id="outer">
    Outer
    <div id="inner">
      Inner
      <div id="innermost">
        Innermost
      </div>
    </div>
  </div>
</div>
<a id="innermostLink" href ="#innermost">Click</a>
<script>
'use strict';
function prepareTest() {
  return Promise.all([
    outer.displayLock.acquire({ timeout: Infinity, activatable: true }),
    inner.displayLock.acquire({ timeout: Infinity, activatable: true })
  ]);
}

promise_test(() => {
  return new Promise((resolve, reject) => {
    prepareTest().then(() => {
      assert_false(outermost.displayLock.locked);
      assert_true(outer.displayLock.locked);
      assert_true(inner.displayLock.locked);
      assert_false(innermost.displayLock.locked);

      let innerPromise = new Promise((resolve, reject) => {
        inner.onbeforeactivate = (e) => {
          assert_equals(e.activatedElement, innermost);
          resolve();
        }
      });

      let outerPromise = new Promise((resolve, reject) => {
        outer.onbeforeactivate = (e) => {
          assert_equals(e.activatedElement, innermost);
          // Resolve if this is directly targeted to #outer,
          // instead of bubbling here.
          if (e.target == outer)
            resolve();
        }
      });

      let outermostPromise = new Promise((resolve, reject) => {
        outermost.onbeforeactivate = (e) => {
          assert_equals(e.activatedElement, innermost);
          assert_not_equals(e.target, outermost);
          // Resolve if this is targeted to #outer, which is
          // dispatched after the event targeted to #inner.
          if (e.target == outer)
            resolve();
        }
      });

      innermost.onbeforeactivate = reject;
      // Navigating to element in locked subtree should fire beforeactivate
      // on locked ancestors, but not itself.
      innermostLink.click();
      Promise.all([innerPromise, outerPromise, outermostPromise]).then(resolve);
    });
  });
}, "Activation through anchor link fires beforeactivate on locked ancestor");
</script>
