@@ -21795,6 +21795,7 @@ interface <dfn interface>HTMLDivElement</dfn> : <span>HTMLElement</span> {
21795
21795
<dd><code data-x="attr-hyperlink-hreflang">hreflang</code></dd>
21796
21796
<dd><code data-x="attr-hyperlink-type">type</code></dd>
21797
21797
<dd><code data-x="attr-hyperlink-referrerpolicy">referrerpolicy</code></dd>
21798
+ <dd><code data-x="attr-interesttarget">interesttarget</code></dd>
21798
21799
<dt><span
21799
21800
data-x="concept-element-accessibility-considerations">Accessibility considerations</span>:</dt>
21800
21801
<dd>If the element has an <code data-x="attr-hyperlink-href">href</code> attribute: <a
@@ -21823,7 +21824,8 @@ interface <dfn interface>HTMLAnchorElement</dfn> : <span>HTMLElement</span> {
21823
21824
21824
21825
// <a href="#HTMLAnchorElement-partial">also has obsolete members</a>
21825
21826
};
21826
- <span>HTMLAnchorElement</span> includes <span>HTMLHyperlinkElementUtils</span>;</code></pre>
21827
+ <span>HTMLAnchorElement</span> includes <span>HTMLHyperlinkElementUtils</span>;
21828
+ <span>HTMLAnchorElement</span> includes <span>InterestInvokerElement</span>;</code></pre>
21827
21829
</dd>
21828
21830
<dd w-dev>Uses <code>HTMLAnchorElement</code>.</dd>
21829
21831
</dl>
@@ -42070,6 +42072,7 @@ interface <dfn interface>HTMLMapElement</dfn> : <span>HTMLElement</span> {
42070
42072
<dd><code data-x="attr-hyperlink-ping">ping</code></dd>
42071
42073
<dd><code data-x="attr-hyperlink-rel">rel</code></dd>
42072
42074
<dd><code data-x="attr-hyperlink-referrerpolicy">referrerpolicy</code></dd>
42075
+ <dd><code data-x="attr-interesttarget">interesttarget</code></dd>
42073
42076
<dt><span
42074
42077
data-x="concept-element-accessibility-considerations">Accessibility considerations</span>:</dt>
42075
42078
<dd>If the element has an <code data-x="attr-hyperlink-href">href</code> attribute: <a
@@ -42096,7 +42099,8 @@ interface <dfn interface>HTMLAreaElement</dfn> : <span>HTMLElement</span> {
42096
42099
42097
42100
// <a href="#HTMLAreaElement-partial">also has obsolete members</a>
42098
42101
};
42099
- <span>HTMLAreaElement</span> includes <span>HTMLHyperlinkElementUtils</span>;</code></pre>
42102
+ <span>HTMLAreaElement</span> includes <span>HTMLHyperlinkElementUtils</span>;
42103
+ <span>HTMLAreaElement</span> includes <span>InterestInvokerElement</span>;</code></pre>
42100
42104
</dd>
42101
42105
<dd w-dev>Uses <code>HTMLAreaElement</code>.</dd>
42102
42106
</dl>
@@ -53518,6 +53522,7 @@ You cannot submit this form when the field is incorrect.</samp></pre>
53518
53522
<dd><code data-x="attr-fe-name">name</code></dd>
53519
53523
<dd><code data-x="attr-popovertarget">popovertarget</code></dd>
53520
53524
<dd><code data-x="attr-popovertargetaction">popovertargetaction</code></dd>
53525
+ <dd><code data-x="attr-interesttarget">interesttarget</code></dd>
53521
53526
<dd><code data-x="attr-button-type">type</code></dd>
53522
53527
<dd><code data-x="attr-button-value">value</code></dd>
53523
53528
<dt><span
@@ -53552,7 +53557,8 @@ interface <dfn interface>HTMLButtonElement</dfn> : <span>HTMLElement</span> {
53552
53557
53553
53558
readonly attribute <span>NodeList</span> <span data-x="dom-lfe-labels">labels</span>;
53554
53559
};
53555
- <span>HTMLButtonElement</span> includes <span>PopoverInvokerElement</span>;</code></pre>
53560
+ <span>HTMLButtonElement</span> includes <span>PopoverInvokerElement</span>;
53561
+ <span>HTMLButtonElement</span> includes <span>InterestInvokerElement</span>;</code></pre>
53556
53562
</dd>
53557
53563
<dd w-dev>Uses <code>HTMLButtonElement</code>.</dd>
53558
53564
</dl>
@@ -75852,6 +75858,13 @@ contradict people?
75852
75858
data-x="concept-selector-active">being activated</i>.)</p>
75853
75859
</dd>
75854
75860
75861
+ <dt><dfn selector noexport><code data-x="selector-has-interest">:has-interest</code></dfn></dt>
75862
+ <dd>
75863
+ <p>The <code data-x="selector-has-interest">:has-interest</code> <span>pseudo-class</span> is
75864
+ defined to match any <span data-x="html elements">HTML element</span> whose <span>has
75865
+ interest</span> is true.</p>
75866
+ </dd>
75867
+
75855
75868
<dt><dfn selector noexport><code data-x="selector-hover">:hover</code></dfn></dt>
75856
75869
<dd>
75857
75870
<p>The <code data-x="selector-hover">:hover</code> <span>pseudo-class</span> is defined to
@@ -88115,6 +88128,159 @@ dictionary <dfn dictionary>DragEventInit</dfn> : <span>MouseEventInit</span> {
88115
88128
</ol>
88116
88129
88117
88130
88131
+ <h3 split-filename="interesttarget">Interest invokers</h3>
88132
+
88133
+ <h4>The <code data-x="attr-interesttarget">interesttarget</code> attribute</h4>
88134
+
88135
+ <p>The <dfn element-attr for="html-global"><code data-x="attr-interesttarget">interesttarget</code></dfn> attribute on <code>a</code>, <code>area</code>, and <code>button</code> elements TODO.</p>
88136
+
88137
+ <p>If specified, the <code data-x="attr-interesttarget">interesttarget</code> attribute value
88138
+ must be the <span data-x="concept-ID">ID</span> of an element in the same <span>tree</span> as the
88139
+ element with the <code data-x="attr-interesttarget">interesttarget</code> attribute.</p>
88140
+
88141
+ <span data-x="concept-element-dom">DOM interface</span>:
88142
+ <pre><code class="idl">interface mixin <dfn interface>InterestInvokerElement</dfn> {
88143
+ [<span>CEReactions</span>] attribute Element? <span data-x="dom-interestTargetElement">interestTargetElement</span>;
88144
+ };</code></pre>
88145
+
88146
+ <p>The <dfn attribute for="HTMLElement"><code
88147
+ data-x="dom-interestTargetElement">interestTargetElement</code></dfn> IDL attribute must
88148
+ <span>reflect</span> the <code data-x="attr-interesttarget">interesttarget</code> attribute.</p>
88149
+
88150
+ <div class="example">
88151
+ <p>The following demonstrates how one might show a tooltip for a button using the
88152
+ <code data-x="attr-interesttarget">interesttarget</code> attribute to associate the button with
88153
+ a <code>div</code> <code data-x="attr-popover">popover</code> representing the tooltip.</p>
88154
+
88155
+ <pre><code class="html"><button interesttarget=tooltip>
88156
+ Click me
88157
+ </button>
88158
+
88159
+ <div popover=hint id=tooltip>
88160
+ I will appear
88161
+ </div></code></pre>
88162
+ </div>
88163
+
88164
+ <p>Every <span data-x="HTML elements">HTML element</span> has a <dfn>has interest</dfn>, which is a
88165
+ boolean, initially set to false.</p>
88166
+ <!-- TODO: or have an Element slot on Document for this since there can only be one at a time? -->
88167
+
88168
+ <h4>The <code>InterestEvent</code> interface</h4>
88169
+
88170
+ <pre><code class="idl">[Exposed=Window]
88171
+ interface <dfn interface>InterestEvent</dfn> : <span>Event</span> {
88172
+ constructor(DOMString type, optional <span>InterestEventInit</span> eventInitDict = {});
88173
+ readonly attribute Element? source; // TODO: nullable, or require in ctor?
88174
+ };
88175
+
88176
+ dictionary <dfn dictionary>InterestEventInit</dfn> : <span>EventInit</span> {
88177
+ Element? source = null;
88178
+ };</code></pre>
88179
+
88180
+ <dl class="domintro">
88181
+ <dt><code data-x=""><var>event</var>.<span subdfn
88182
+ data-x="dom-InterestEvent-source">source</span></code></dt>
88183
+
88184
+ <dd>
88185
+ <p>Set to an interesting element TODO.</p>
88186
+ </dd>
88187
+ </dl>
88188
+
88189
+ <p>The <dfn attribute for="InterestEvent"><code
88190
+ data-x="dom-InterestEvent-source">source</code></dfn> attribute must return the value it was
88191
+ initialized to.</p>
88192
+
88193
+ <h4 id="interest-target-processing-model">Processing model</h4>
88194
+
88195
+ <p>To <dfn export data-x="capture-interest">capture interest</dfn>, given an <span
88196
+ data-x="HTML elements">HTML element</span> <var>invoker</var>:</p>
88197
+
88198
+ <ol>
88199
+ <li><p>Assert: <var>invoker</var> is an <code>a</code>, <code>area</code>, or <code>button</code>
88200
+ element.</p></li>
88201
+
88202
+ <li><p>Assert: <var>invoker</var> has the <code data-x="attr-interesttarget">interesttarget</code>
88203
+ attribute specified.</p></li>
88204
+
88205
+ <li><p>Let <var>target</var> be the result of running <var>node</var>'s <span data-x="get
88206
+ the attr-associated element">get the <code data-x="">interesttarget</code>-associated
88207
+ element</span>.</p></li>
88208
+
88209
+ <li><p>If <var>target</var> is null, then return.</p></li>
88210
+
88211
+ <li><p>Let <var>continue</var> be the result of <span data-x="concept-event-fire">firing an
88212
+ event</span> named <code data-x="event-interest">interest</code> at <var>target</var>, using
88213
+ <code>InterestEvent</code>, with the <code data-x="dom-Event-cancelable">cancelable</code> and
88214
+ <code data-x="dom-Event-composed">composed</code> attributes initialized to true, and the
88215
+ <code data-x="dom-InterestEvent-source">source</code> attribute initialized to
88216
+ <var>invoker</var>.</p></li>
88217
+ <!-- TODO: the explainer calls for composed without bubbling, does that make sense? -->
88218
+
88219
+ <li><p>If <var>continue</var> is false, then return.</p></li>
88220
+
88221
+ <li><p>Set <var>invoker</var>'s <span>has interest</span> to true.</p></li>
88222
+
88223
+ <!-- TODO: test that :has-interest doesn't match when the interest event is fired, but does
88224
+ match when the popover toggle event fired. -->
88225
+
88226
+ <li><p>If <var>target</var>'s <code data-x="attr-popover">popover</code> attribute is not in the
88227
+ <span data-x="attr-popover-none-state">no popover state</span>, then run <span>show popover</span>
88228
+ given <var>target</var>, false, and <var>invoker</var>.</p></li>
88229
+ <!-- TODO: should invoker be passed? It's used for popovertarget, might not do the right thing
88230
+ if passed in here... -->
88231
+
88232
+ <!-- TODO: nothing to do if not a popover? how can devs show/hide it? needs another pseudo-class? -->
88233
+ </ol>
88234
+
88235
+ <p>To <dfn export data-x="lose-interest">lose interest</dfn>, given an <span
88236
+ data-x="HTML elements">HTML element</span> <var>invoker</var>:</p>
88237
+
88238
+ <ol>
88239
+ <li><p>Assert: <var>invoker</var> is an <code>a</code>, <code>area</code>, or <code>button</code>
88240
+ element.</p></li>
88241
+
88242
+ <li><p>Note: <var>invoker</var> may no longer have the <code
88243
+ data-x="attr-interesttarget">interesttarget</code> attribute specified.</p></li>
88244
+
88245
+ <li><p>Let <var>target</var> be the result of running <var>node</var>'s <span data-x="get
88246
+ the attr-associated element">get the <code data-x="">interesttarget</code>-associated
88247
+ element</span>.</p></li>
88248
+
88249
+ <li><p>If <var>target</var> is null, then return.</p></li>
88250
+
88251
+ <!-- TODO: what state is possibly left dangling if the target wasn't found? -->
88252
+
88253
+ <li><p>Let <var>continue</var> be the result of <span data-x="concept-event-fire">firing an
88254
+ event</span> named <code data-x="event-interest">loseinterest</code> at <var>target</var>, using
88255
+ <code>InterestEvent</code>, with the <code data-x="dom-Event-cancelable">cancelable</code> and
88256
+ <code data-x="dom-Event-composed">composed</code> attributes initialized to true, and the
88257
+ <code data-x="dom-InterestEvent-source">source</code> attribute initialized to
88258
+ <var>invoker</var>.</p></li>
88259
+ <!-- TODO: the explainer calls for composed without bubbling, does that make sense? -->
88260
+
88261
+ <li><p>If <var>continue</var> is false, then return.</p></li>
88262
+ <!-- TODO: what's the point of being able to cancel this event? -->
88263
+
88264
+ <li><p>If <var>target</var>'s <code data-x="attr-popover">popover</code> attribute is not in the
88265
+ <span data-x="attr-popover-none-state">no popover state</span>, then <span
88266
+ data-x="hide popover algorithm">hide popover</span> given <var>invoker</var>, false, true, and
88267
+ false.</p></li>
88268
+
88269
+ <li><p>Set <var>invoker</var>'s <span>has interest</span> to false.</p></li>
88270
+ <!-- TODO: is this the right time to change the state? too late? -->
88271
+ </ol>
88272
+
88273
+ <p>TODO / questions:</p>
88274
+
88275
+ <ul>
88276
+ <li><p>Actually invoke the capture/lose algorithms.</p></li>
88277
+ <li><p>Which algorithm reads the computed style for interest-target-delay?</p></li>
88278
+ <li><p>Handle removal of the interesttarget attribute, or the element that has it.</p></li>
88279
+ <li><p>Handle changes of the interesttarget attribute while an element has interest.</p></li>
88280
+ <li><p>Handle changes to the ID attribute referenced by an interesttarget attribute.</p></li>
88281
+ </ul>
88282
+
88283
+
88118
88284
<h2 split-filename="browsers" id="browsers">Loading web pages</h2>
88119
88285
88120
88286
<div w-nodev>
@@ -144434,6 +144600,13 @@ interface <dfn interface>External</dfn> {
144434
144600
<code data-x="attr-script-integrity">script</code>
144435
144601
<td> Integrity metadata used in <cite>Subresource Integrity</cite> checks <ref>SRI</ref>
144436
144602
<td> <a href="#attribute-text">Text</a>
144603
+ <tr>
144604
+ <th> <code data-x="">interesttarget</code>
144605
+ <td> <code data-x="attr-interesttarget">a</code>;
144606
+ <code data-x="attr-interesttarget">area</code>;
144607
+ <code data-x="attr-interesttarget">button</code>
144608
+ <td> Targets an interesting TODO
144609
+ <td> <span data-x="concept-id">ID</span>* <!-- TODO: is the asterisk needed, is it really complicated? -->
144437
144610
<tr>
144438
144611
<th> <code data-x="">is</code>
144439
144612
<td> <span data-x="attr-is">HTML elements</span>
@@ -146236,6 +146409,12 @@ INSERT INTERFACES HERE
146236
146409
<td> Elements
146237
146410
<td> Fired when the user changes the <code data-x="attr-contenteditable">contenteditable</code> element's content, or the form control's value. See also the <code data-x="event-change">change</code> event for form controls.
146238
146411
146412
+ <tr> <!-- interest -->
146413
+ <td> <dfn event for="HTMLElement"><code data-x="event-interest">interest</code></dfn>
146414
+ <td> <code>InterestEvent</code>
146415
+ <td> Elements
146416
+ <td> Fired on interesting elements because of code <code data-x="attr-interesttarget">interesttarget</code> TODO.
146417
+
146239
146418
<tr> <!-- invalid -->
146240
146419
<td> <dfn event for="HTMLElement"><code data-x="event-invalid">invalid</code></dfn>
146241
146420
<td> <code>Event</code>
@@ -146254,6 +146433,12 @@ INSERT INTERFACES HERE
146254
146433
<td> <code>Window</code>, elements
146255
146434
<td> Fired at the <code>Window</code> when the document has finished loading; fired at an element containing a resource (e.g. <code>img</code>, <code>embed</code>) when its resource has finished loading
146256
146435
146436
+ <tr> <!-- loseinterest -->
146437
+ <td> <dfn event for="HTMLElement"><code data-x="event-loseinterest">loseinterest</code></dfn>
146438
+ <td> <code>InterestEvent</code>
146439
+ <td> Elements
146440
+ <td> Fired on boring elements because of code <code data-x="attr-interesttarget">interesttarget</code> TODO.
146441
+
146257
146442
<tr> <!-- message -->
146258
146443
<td> <dfn event for="Window,EventSource,MessagePort,BroadcastChannel,DedicatedWorkerGlobalScope,Worker,ServiceWorkerContainer"><code data-x="event-message">message</code></dfn>
146259
146444
<td> <code>MessageEvent</code>
0 commit comments