Skip to content

Commit 554f1cf

Browse files
committed
Shadow: Do not dispatch a trusted event when target and reletedTarget are identical
For example, when a mouse pointer moves from an element in a shadow tree to its shadow host, a "mouseover" event should not be dispatched on the shadow host. The current spec allows a non-empty event path in this case. Fixes #337.
1 parent bf1c902 commit 554f1cf

File tree

2 files changed

+52
-38
lines changed

2 files changed

+52
-38
lines changed

dom.bs

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,32 +1201,41 @@ for discussion).
12011201
<a>relatedTarget</a> against <var>target</var> if <var>event</var>'s <a>relatedTarget</a> is
12021202
non-null, and null otherwise.
12031203

1204-
<li><p>Append (<var>target</var>, <var>targetOverride</var>, <var>relatedTarget</var>) to <var>event</var>'s
1205-
<a for=Event>path</a>.
1206-
1207-
<li><p>Let <var>parent</var> be the result of invoking <var>target</var>'s <a>get the parent</a>
1208-
with <var>event</var>.
1209-
12101204
<li>
1211-
<p>While <var>parent</var> is non-null:</p>
1205+
<p>If either <var>target</var> and <var>event</var>'s <a>relatedTarget</a> are in the same
1206+
<a>tree</a>, or <var>target</var> and <var>relatedTarget</var> are not identical, run these
1207+
substeps:
12121208

12131209
<ol>
1214-
<li><p>Let <var>relatedTarget</var> be the result of <a>retargeting</a> <var>event</var>'s
1215-
<a>relatedTarget</a> against <var>parent</var> if <var>event</var>'s <a>relatedTarget</a> is
1216-
non-null, and null otherwise.
1210+
<li><p>Append (<var>target</var>, <var>targetOverride</var>, <var>relatedTarget</var>) to
1211+
<var>event</var>'s <a for=Event>path</a>.
1212+
1213+
<li><p>Let <var>parent</var> be the result of invoking <var>target</var>'s <a>get the parent</a>
1214+
with <var>event</var>.
1215+
1216+
<li>
1217+
<p>While <var>parent</var> is non-null:</p>
1218+
1219+
<ol>
1220+
<li><p>Let <var>relatedTarget</var> be the result of <a>retargeting</a> <var>event</var>'s
1221+
<a>relatedTarget</a> against <var>parent</var> if <var>event</var>'s <a>relatedTarget</a> is
1222+
non-null, and null otherwise.
12171223

1218-
<li><p>If <var>target</var>'s <a for=tree>root</a> is a
1219-
<a>shadow-including inclusive ancestor</a> of <var>parent</var>, then append
1220-
(<var>parent</var>, null, <var>relatedTarget</var>) to <var>event</var>'s <a for=Event>path</a>.
1224+
<li><p>If <var>target</var>'s <a for=tree>root</a> is a
1225+
<a>shadow-including inclusive ancestor</a> of <var>parent</var>, then append
1226+
(<var>parent</var>, null, <var>relatedTarget</var>) to <var>event</var>'s
1227+
<a for=Event>path</a>.
12211228

1222-
<li><p>Otherwise, if <var>parent</var> and <var>relatedTarget</var> are identical, then set
1223-
<var>parent</var> to null.
1229+
<li><p>Otherwise, if <var>parent</var> and <var>relatedTarget</var> are identical, then set
1230+
<var>parent</var> to null.
12241231

1225-
<li><p>Otherwise, set <var>target</var> to <var>parent</var> and append (<var>parent</var>,
1226-
<var>target</var>, <var>relatedTarget</var>) to <var>event</var>'s <a for=Event>path</a>.
1232+
<li><p>Otherwise, set <var>target</var> to <var>parent</var> and append (<var>parent</var>,
1233+
<var>target</var>, <var>relatedTarget</var>) to <var>event</var>'s <a for=Event>path</a>.
12271234

1228-
<li><p>If <var>parent</var> is non-null, then set <var>parent</var> to the result of invoking
1229-
<var>parent</var>'s <a>get the parent</a> with <var>event</var>.
1235+
<li><p>If <var>parent</var> is non-null, then set <var>parent</var> to the result of invoking
1236+
<var>parent</var>'s <a>get the parent</a> with <var>event</var>.
1237+
</ol>
1238+
</li>
12301239
</ol>
12311240

12321241
<li><p>Set <var>event</var>'s {{Event/eventPhase}} attribute to {{Event/CAPTURING_PHASE}}.

dom.html

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
<p data-fill-with="logo"><a class="logo" href="https://whatwg.org/"> <img alt="WHATWG" height="100" src="https://resources.whatwg.org/logo-dom.svg"> </a> </p>
7272
<hgroup>
7373
<h1 class="p-name no-ref allcaps" id="title">DOM</h1>
74-
<h2 class="no-num no-toc no-ref heading settled" id="subtitle"><span class="content">Living Standard — Last Updated <time class="dt-updated" datetime="2016-09-15">15 September 2016</time></span></h2>
74+
<h2 class="no-num no-toc no-ref heading settled" id="subtitle"><span class="content">Living Standard — Last Updated <time class="dt-updated" datetime="2016-10-03">3 October 2016</time></span></h2>
7575
</hgroup>
7676
<div data-fill-with="spec-metadata">
7777
<dl>
@@ -882,24 +882,29 @@ <h3 class="heading settled" data-level="3.8" id="dispatching-events"><span class
882882
<li>Let <var>relatedTarget</var> be the result of <a data-link-type="dfn" href="#retarget">retargeting</a> <var>event</var>’s <a data-link-type="dfn" href="#event-relatedtarget">relatedTarget</a> against <var>target</var> if <var>event</var>’s <a data-link-type="dfn" href="#event-relatedtarget">relatedTarget</a> is
883883
non-null, and null otherwise.
884884
<li>
885-
<p>Append (<var>target</var>, <var>targetOverride</var>, <var>relatedTarget</var>) to <var>event</var>’s <a data-link-type="dfn" href="#event-path">path</a>. </p>
886-
<li>
887-
<p>Let <var>parent</var> be the result of invoking <var>target</var>’s <a data-link-type="dfn" href="#get-the-parent">get the parent</a> with <var>event</var>. </p>
888-
<li>
889-
<p>While <var>parent</var> is non-null:</p>
885+
<p>If either <var>target</var> and <var>event</var>’s <a data-link-type="dfn" href="#event-relatedtarget">relatedTarget</a> are in the same <a data-link-type="dfn" href="#concept-tree">tree</a>, or <var>target</var> and <var>relatedTarget</var> are not identical, run these
886+
substeps: </p>
890887
<ol>
891888
<li>
892-
<p>Let <var>relatedTarget</var> be the result of <a data-link-type="dfn" href="#retarget">retargeting</a> <var>event</var>’s <a data-link-type="dfn" href="#event-relatedtarget">relatedTarget</a> against <var>parent</var> if <var>event</var>’s <a data-link-type="dfn" href="#event-relatedtarget">relatedTarget</a> is
893-
non-null, and null otherwise. </p>
889+
<p>Append (<var>target</var>, <var>targetOverride</var>, <var>relatedTarget</var>) to <var>event</var>’s <a data-link-type="dfn" href="#event-path">path</a>. </p>
894890
<li>
895-
<p>If <var>target</var>’s <a data-link-type="dfn" href="#concept-tree-root">root</a> is a <a data-link-type="dfn" href="#concept-shadow-including-inclusive-ancestor">shadow-including inclusive ancestor</a> of <var>parent</var>, then append
896-
(<var>parent</var>, null, <var>relatedTarget</var>) to <var>event</var>’s <a data-link-type="dfn" href="#event-path">path</a>. </p>
891+
<p>Let <var>parent</var> be the result of invoking <var>target</var>’s <a data-link-type="dfn" href="#get-the-parent">get the parent</a> with <var>event</var>. </p>
897892
<li>
898-
<p>Otherwise, if <var>parent</var> and <var>relatedTarget</var> are identical, then set <var>parent</var> to null. </p>
899-
<li>
900-
<p>Otherwise, set <var>target</var> to <var>parent</var> and append (<var>parent</var>, <var>target</var>, <var>relatedTarget</var>) to <var>event</var>’s <a data-link-type="dfn" href="#event-path">path</a>. </p>
901-
<li>
902-
<p>If <var>parent</var> is non-null, then set <var>parent</var> to the result of invoking <var>parent</var>’s <a data-link-type="dfn" href="#get-the-parent">get the parent</a> with <var>event</var>. </p>
893+
<p>While <var>parent</var> is non-null:</p>
894+
<ol>
895+
<li>
896+
<p>Let <var>relatedTarget</var> be the result of <a data-link-type="dfn" href="#retarget">retargeting</a> <var>event</var>’s <a data-link-type="dfn" href="#event-relatedtarget">relatedTarget</a> against <var>parent</var> if <var>event</var>’s <a data-link-type="dfn" href="#event-relatedtarget">relatedTarget</a> is
897+
non-null, and null otherwise. </p>
898+
<li>
899+
<p>If <var>target</var>’s <a data-link-type="dfn" href="#concept-tree-root">root</a> is a <a data-link-type="dfn" href="#concept-shadow-including-inclusive-ancestor">shadow-including inclusive ancestor</a> of <var>parent</var>, then append
900+
(<var>parent</var>, null, <var>relatedTarget</var>) to <var>event</var>’s <a data-link-type="dfn" href="#event-path">path</a>. </p>
901+
<li>
902+
<p>Otherwise, if <var>parent</var> and <var>relatedTarget</var> are identical, then set <var>parent</var> to null. </p>
903+
<li>
904+
<p>Otherwise, set <var>target</var> to <var>parent</var> and append (<var>parent</var>, <var>target</var>, <var>relatedTarget</var>) to <var>event</var>’s <a data-link-type="dfn" href="#event-path">path</a>. </p>
905+
<li>
906+
<p>If <var>parent</var> is non-null, then set <var>parent</var> to the result of invoking <var>parent</var>’s <a data-link-type="dfn" href="#get-the-parent">get the parent</a> with <var>event</var>. </p>
907+
</ol>
903908
</ol>
904909
<li>
905910
<p>Set <var>event</var>’s <code class="idl"><a data-link-type="idl" href="#dom-event-eventphase">eventPhase</a></code> attribute to <code class="idl"><a data-link-type="idl" href="#dom-event-capturing_phase">CAPTURING_PHASE</a></code>. </p>
@@ -1139,7 +1144,7 @@ <h4 class="heading settled" data-level="4.2.1" id="document-trees"><span class="
11391144
<p>The <dfn data-dfn-type="dfn" data-export="" id="document-element">document element<a class="self-link" href="#document-element"></a></dfn> of a <a data-link-type="dfn" href="#concept-document">document</a> is the <a data-link-type="dfn" href="#concept-element">element</a> whose <a data-link-type="dfn" href="#concept-tree-parent">parent</a> is that <a data-link-type="dfn" href="#concept-document">document</a>, if it exists, and null otherwise. </p>
11401145
<p class="note no-backref" role="note">Per the <a data-link-type="dfn" href="#concept-node-tree">node tree</a> constraints, there can be only one such <a data-link-type="dfn" href="#concept-element">element</a>. </p>
11411146
<p>An <a data-link-type="dfn" href="#concept-element">element</a> is <dfn data-dfn-type="dfn" data-export="" id="in-a-document-tree">in a document tree<a class="self-link" href="#in-a-document-tree"></a></dfn> if its <a data-link-type="dfn" href="#concept-tree-root">root</a> is a <a data-link-type="dfn" href="#concept-document">document</a>. </p>
1142-
<p>An <a data-link-type="dfn" href="#concept-element">element</a> is <dfn data-dfn-type="dfn" data-export="" id="in-a-document">in a document<a class="self-link" href="#in-a-document"></a></dfn> if it is <a data-link-type="dfn" href="#in-a-document-tree">in a document tree</a>. <span class="note" role="note">The term <a data-link-type="dfn" href="#in-a-document">in a document</a> is no longer supposed to be used. It indicates that
1147+
<p>An <a data-link-type="dfn" href="#concept-element">element</a> is <dfn data-dfn-type="dfn" data-export="" id="in-a-document">in a document<a class="self-link" href="#in-a-document"></a></dfn> if it is <a data-link-type="dfn" href="#in-a-document-tree">in a document tree</a>. <span class="note">The term <a data-link-type="dfn" href="#in-a-document">in a document</a> is no longer supposed to be used. It indicates that
11431148
the standard using it has not been updated to account for <a data-link-type="dfn" href="#concept-shadow-tree">shadow trees</a>.</span> </p>
11441149
<h4 class="heading settled" data-level="4.2.2" id="shadow-trees"><span class="secno">4.2.2. </span><span class="content">Shadow tree</span><a class="self-link" href="#shadow-trees"></a></h4>
11451150
<p>A <dfn data-dfn-type="dfn" data-export="" id="concept-shadow-tree">shadow tree<a class="self-link" href="#concept-shadow-tree"></a></dfn> is a <a data-link-type="dfn" href="#concept-node-tree">node tree</a> whose <a data-link-type="dfn" href="#concept-tree-root">root</a> is a <a data-link-type="dfn" href="#concept-shadow-root">shadow root</a>. </p>
@@ -4765,7 +4770,7 @@ <h3 class="heading settled" data-level="5.2" id="interface-range"><span class="s
47654770
<li><a data-link-type="dfn" href="#concept-range-select">Select</a> <var>newParent</var> within <a data-link-type="dfn" href="#context-object">context object</a>.
47664771
</ol>
47674772
<p>The <dfn class="idl-code" data-dfn-for="Range" data-dfn-type="method" data-export="" id="dom-range-clonerange"><code>cloneRange()</code><a class="self-link" href="#dom-range-clonerange"></a></dfn> method, when invoked, must return a new <a data-link-type="dfn" href="#concept-range">range</a> with the same <a data-link-type="dfn" href="#concept-range-start">start</a> and <a data-link-type="dfn" href="#concept-range-end">end</a> as <a data-link-type="dfn" href="#context-object">context object</a>. </p>
4768-
<p>The <dfn class="idl-code" data-dfn-for="Range" data-dfn-type="method" data-export="" id="dom-range-detach"><code>detach()</code><a class="self-link" href="#dom-range-detach"></a></dfn> method, when invoked, must do nothing. <span class="note" role="note">Its functionality (disabling a <code class="idl"><a data-link-type="idl" href="#range">Range</a></code> object) was removed, but the method itself
4773+
<p>The <dfn class="idl-code" data-dfn-for="Range" data-dfn-type="method" data-export="" id="dom-range-detach"><code>detach()</code><a class="self-link" href="#dom-range-detach"></a></dfn> method, when invoked, must do nothing. <span class="note">Its functionality (disabling a <code class="idl"><a data-link-type="idl" href="#range">Range</a></code> object) was removed, but the method itself
47694774
is preserved for compatibility.</span> </p>
47704775
<hr>
47714776
<dl class="domintro">
@@ -4912,7 +4917,7 @@ <h3 class="heading settled" data-level="6.1" id="interface-nodeiterator"><span c
49124917
<p>The <dfn class="idl-code" data-dfn-for="NodeIterator" data-dfn-type="method" data-export="" id="dom-nodeiterator-nextnode"><code>nextNode()</code><a class="self-link" href="#dom-nodeiterator-nextnode"></a></dfn> method, when invoked, must <a data-link-type="dfn" href="#concept-nodeiterator-traverse">traverse</a> in direction next. </p>
49134918
<p>The <dfn class="idl-code" data-dfn-for="NodeIterator" data-dfn-type="method" data-export="" id="dom-nodeiterator-previousnode"><code>previousNode()</code><a class="self-link" href="#dom-nodeiterator-previousnode"></a></dfn> method, when invoked, must <a data-link-type="dfn" href="#concept-nodeiterator-traverse">traverse</a> in direction previous. </p>
49144919
<p>The <dfn class="idl-code" data-dfn-for="NodeIterator" data-dfn-type="method" data-export="" id="dom-nodeiterator-detach"><code>detach()</code><a class="self-link" href="#dom-nodeiterator-detach"></a></dfn> method, when invoked, must do
4915-
nothing. <span class="note" role="note">Its functionality (disabling a <code class="idl"><a data-link-type="idl" href="#nodeiterator">NodeIterator</a></code> object) was removed, but
4920+
nothing. <span class="note">Its functionality (disabling a <code class="idl"><a data-link-type="idl" href="#nodeiterator">NodeIterator</a></code> object) was removed, but
49164921
the method itself is preserved for compatibility.</span> </p>
49174922
<h3 class="heading settled" data-level="6.2" id="interface-treewalker"><span class="secno">6.2. </span><span class="content">Interface <code class="idl"><a data-link-type="idl" href="#treewalker">TreeWalker</a></code></span><a class="self-link" href="#interface-treewalker"></a></h3>
49184923
<pre class="idl highlight def">[<a class="nv idl-code" data-link-type="extended-attribute" href="https://heycam.github.io/webidl/#Exposed">Exposed</a>=<span class="n">Window</span>]
@@ -6633,7 +6638,7 @@ <h3 class="no-num no-ref heading settled" id="normative"><span class="content">N
66336638
<dt id="biblio-webgl">[WEBGL]
66346639
<dd>Chris Marrin (Apple Inc.). <a href="https://www.khronos.org/registry/webgl/specs/1.0/">WebGL Specification, Version 1.0</a>. 10 February 2011. URL: <a href="https://www.khronos.org/registry/webgl/specs/1.0/">https://www.khronos.org/registry/webgl/specs/1.0/</a>
66356640
<dt id="biblio-webidl">[WEBIDL]
6636-
<dd>Cameron McCormack; Boris Zbarsky. <a href="https://heycam.github.io/webidl/">WebIDL Level 1</a>. 8 March 2016. CR. URL: <a href="https://heycam.github.io/webidl/">https://heycam.github.io/webidl/</a>
6641+
<dd>Cameron McCormack; Boris Zbarsky. <a href="https://heycam.github.io/webidl/">WebIDL Level 1</a>. 15 September 2016. PR. URL: <a href="https://heycam.github.io/webidl/">https://heycam.github.io/webidl/</a>
66376642
<dt id="biblio-xhr">[XHR]
66386643
<dd>Anne van Kesteren. <a href="https://xhr.spec.whatwg.org/">XMLHttpRequest Standard</a>. Living Standard. URL: <a href="https://xhr.spec.whatwg.org/">https://xhr.spec.whatwg.org/</a>
66396644
<dt id="biblio-xml">[XML]

0 commit comments

Comments
 (0)