<!DOCTYPE html>
<title>Shadow DOM: Event composed</title>
<meta name="author" title="Hayato Ito" href="mailto:hayato@google.com">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/shadow-dom.js"></script>
<div id=host>
  <template id=shadowRoot data-mode=open>
    <div id=target></div>
  </template>
</div>
<script>
test(() => {
  const e = new Event('test');
  assert_equals(e.composed, false);
}, 'A new events composed value should be set to false by default.');

test(() => {
  const e = new Event('test', { composed: true });
  assert_equals(e.composed, true);
}, 'Users should be able to set a composed value.');

function assertScoped(event) {
  let nodes = createTestTree(host);
  let log = dispatchEventWithLog(nodes, nodes.target, event);
  let expectedPath = ['target', 'shadowRoot'];
  assert_event_path_equals(log,
                           [['target', 'target', null, expectedPath],
                            ['shadowRoot', 'target', null, expectedPath]]);
}

function assertComposed(event) {
  let nodes = createTestTree(host);
  let log = dispatchEventWithLog(nodes, nodes.target, event);
  let expectedPath = ['target', 'shadowRoot', 'host'];
  assert_event_path_equals(log,
                           [['target', 'target', null, expectedPath],
                            ['shadowRoot', 'target', null, expectedPath],
                            ['host', 'host', null, expectedPath]]);
}

test(() => {
  assertScoped(new Event('test', { bubbles: true }));
}, 'An event should be scoped by default');

test(() => {
  assertComposed(new Event('test', { bubbles: true, composed: true }));
}, 'An event should not be scoped if composed is specified');

test(() => {
  assertScoped(new MouseEvent('click', { bubbles: true }));
}, 'A synthetic MouseEvent should be scoped by default');

test(() => {
  assertComposed(new MouseEvent('click', { bubbles: true, composed: true }));
}, 'A synthetic MouseEvent with composed=true should not be scoped');

test(() => {
  assertScoped(new FocusEvent('focus', { bubbles: true }));
}, 'A synthetic FocusEvent should be scoped by default');

test(() => {
  assertComposed(new FocusEvent('focus', { bubbles: true, composed: true }));
}, 'A synthetic FocusEvent with composed=true should not be scoped');

function assertUAComposed(eventType, callback) {
  let nodes = createTestTree(host);
  let log = dispatchUAEventWithLog(nodes, nodes.target, eventType, callback);
  let expectedPath = ['target', 'shadowRoot', 'host'];
  assert_event_path_equals(log,
                           [['target', 'target', null, expectedPath],
                            ['shadowRoot', 'target', null, expectedPath],
                            ['host', 'host', null, expectedPath]]);
}

test(() => {
  assertUAComposed('click', (target) => { target.click(); });
}, 'A UA click event should not be scoped');

// TODO(hayato): Test other UIEvents.
</script>
