Re: [WICG/webcomponents] Reference Target: How to handle events fired on the reference target by related elements? (Issue #1098)

alice left a comment (WICG/webcomponents#1098)

#### Testing the new new logic for slotted content in deeper shadow DOM

Maybe I should just write some code for this instead, but just one more.

```html
<template shadowrootmode="open">
  <!-- shadow0 -->
  <x-form id="xForm">
    <template shadowrootmode="open" shadowrootreferencetarget="thing">
      <!-- shadow1 -->
      <inner-thing id="thing">
        <template shadowrootmode="open" shadowrootreferencetarget="form">
          <!-- shadow2 -->
          <slot>
            <!-- form gets slotted in here -->
          </slot>
        </template>
        <form id="form"></form>
      </inner-thing>
    </template>
  </x-form>
  <label>Name: <input id="input" form="xForm"></label>
</template>
```

Steps 1-6 are the same as above.

7. When [a node's get the parent](https://dom.spec.whatwg.org/#ref-for-get-the-parent%E2%91%A4) is invoked on `form`, it returns `slot`.
8.  When [a node's get the parent](https://dom.spec.whatwg.org/#ref-for-get-the-parent%E2%91%A4) is invoked on `slot`, it returns `shadow2`.
9. 🆕 When [a shadow root's get the parent](https://dom.spec.whatwg.org/#ref-for-get-the-parent%E2%91%A6) is invoked on `shadow2`, we go to the (_new_) new logic:
   > 1. let target be event’s path’s first struct’s invocation target;
   > 2. if event’s composed flag is set, return shadow root’s host;
   > 3. if shadow root is not the root of target, and event does not have a source or shadow root is not the root of event's source, return shadow root's host;
   > 4. if event has a source, and event's source's root is a shadow-including ancestor of shadow root, return the result of retargeting target against event's triggering element;
   > 5. otherwise, return null.
   
   1. _target_ is `form`; 
   2. the composed flag is _not_ set
   3. `shadow2` is _not_ the root of `form` (`true`); event has an `source`, `input`, and `shadow2` is _not_ the root of `input` (`true`), so `true && true` and we return `thing`.
10. When a node's get the parent](https://dom.spec.whatwg.org/#ref-for-get-the-parent%E2%91%A4) is invoked on `thing`, it returns `shadow1` as normal.
11. 🆕 When [a shadow root's get the parent](https://dom.spec.whatwg.org/#ref-for-get-the-parent%E2%91%A6) is invoked on `shadow1`, we go to the (_new_) new logic:
    > 1. let target be event’s path’s first struct’s invocation target;
    > 2. if event’s composed flag is set, return shadow root’s host;
    > 3. if shadow root is not the root of target, and event does not have a source or shadow root is not the root of event's source, return shadow root's host;
    > 4. if event has a source, and event's source's root is a shadow-including ancestor of shadow root, return the result of retargeting target against event's triggering element;
    > 5. otherwise, return null.
   
    1. _target_ is `form`; 
    2. the composed flag is _not_ set
    3. `shadow1` _is_ the root of `form` (`false`); event has an `source`, `input`, and `shadow1` is _not_ the root of `input` (`true`), so `false && true` and we don't return shadow root's host but go to step (4)
    4. `input`'s root (`shadow0`) _is_ a shadow-including exclusive ancestor of `shadow1`; so, we return the result of retargeting `form` against `input` yielding `xForm`.
10. (same as step 9 above.)
11. (same as step 10 above.)
12. 🆕 Back in event dispatch where the path would previously have just been [`form`, `slot`, `shadow2`, `thing`, `shadow1`], it now goes [`form`, `slot`, `shadow2`, `thing`, `shadow1`, `xForm`, `shadow0`].


-- 
Reply to this email directly or view it on GitHub:
https://github.com/WICG/webcomponents/issues/1098#issuecomment-2808147407
You are receiving this because you are subscribed to this thread.

Message ID: <WICG/webcomponents/issues/1098/2808147407@github.com>

Received on Wednesday, 16 April 2025 03:41:52 UTC