@@ -21795,6 +21795,7 @@ interface <dfn interface>HTMLDivElement</dfn> : <span>HTMLElement</span> {
2179521795 <dd><code data-x="attr-hyperlink-hreflang">hreflang</code></dd>
2179621796 <dd><code data-x="attr-hyperlink-type">type</code></dd>
2179721797 <dd><code data-x="attr-hyperlink-referrerpolicy">referrerpolicy</code></dd>
21798+ <dd><code data-x="attr-interesttarget">interesttarget</code></dd>
2179821799 <dt><span
2179921800 data-x="concept-element-accessibility-considerations">Accessibility considerations</span>:</dt>
2180021801 <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> {
2182321824
2182421825 // <a href="#HTMLAnchorElement-partial">also has obsolete members</a>
2182521826};
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>
2182721829 </dd>
2182821830 <dd w-dev>Uses <code>HTMLAnchorElement</code>.</dd>
2182921831 </dl>
@@ -42070,6 +42072,7 @@ interface <dfn interface>HTMLMapElement</dfn> : <span>HTMLElement</span> {
4207042072 <dd><code data-x="attr-hyperlink-ping">ping</code></dd>
4207142073 <dd><code data-x="attr-hyperlink-rel">rel</code></dd>
4207242074 <dd><code data-x="attr-hyperlink-referrerpolicy">referrerpolicy</code></dd>
42075+ <dd><code data-x="attr-interesttarget">interesttarget</code></dd>
4207342076 <dt><span
4207442077 data-x="concept-element-accessibility-considerations">Accessibility considerations</span>:</dt>
4207542078 <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> {
4209642099
4209742100 // <a href="#HTMLAreaElement-partial">also has obsolete members</a>
4209842101};
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>
4210042104 </dd>
4210142105 <dd w-dev>Uses <code>HTMLAreaElement</code>.</dd>
4210242106 </dl>
@@ -53518,6 +53522,7 @@ You cannot submit this form when the field is incorrect.</samp></pre>
5351853522 <dd><code data-x="attr-fe-name">name</code></dd>
5351953523 <dd><code data-x="attr-popovertarget">popovertarget</code></dd>
5352053524 <dd><code data-x="attr-popovertargetaction">popovertargetaction</code></dd>
53525+ <dd><code data-x="attr-interesttarget">interesttarget</code></dd>
5352153526 <dd><code data-x="attr-button-type">type</code></dd>
5352253527 <dd><code data-x="attr-button-value">value</code></dd>
5352353528 <dt><span
@@ -53552,7 +53557,8 @@ interface <dfn interface>HTMLButtonElement</dfn> : <span>HTMLElement</span> {
5355253557
5355353558 readonly attribute <span>NodeList</span> <span data-x="dom-lfe-labels">labels</span>;
5355453559};
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>
5355653562 </dd>
5355753563 <dd w-dev>Uses <code>HTMLButtonElement</code>.</dd>
5355853564 </dl>
@@ -75852,6 +75858,13 @@ contradict people?
7585275858 data-x="concept-selector-active">being activated</i>.)</p>
7585375859 </dd>
7585475860
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+
7585575868 <dt><dfn selector noexport><code data-x="selector-hover">:hover</code></dfn></dt>
7585675869 <dd>
7585775870 <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> {
8811588128 </ol>
8811688129
8811788130
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+
8811888284 <h2 split-filename="browsers" id="browsers">Loading web pages</h2>
8811988285
8812088286 <div w-nodev>
@@ -144434,6 +144600,13 @@ interface <dfn interface>External</dfn> {
144434144600 <code data-x="attr-script-integrity">script</code>
144435144601 <td> Integrity metadata used in <cite>Subresource Integrity</cite> checks <ref>SRI</ref>
144436144602 <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? -->
144437144610 <tr>
144438144611 <th> <code data-x="">is</code>
144439144612 <td> <span data-x="attr-is">HTML elements</span>
@@ -146236,6 +146409,12 @@ INSERT INTERFACES HERE
146236146409 <td> Elements
146237146410 <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.
146238146411
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+
146239146418 <tr> <!-- invalid -->
146240146419 <td> <dfn event for="HTMLElement"><code data-x="event-invalid">invalid</code></dfn>
146241146420 <td> <code>Event</code>
@@ -146254,6 +146433,12 @@ INSERT INTERFACES HERE
146254146433 <td> <code>Window</code>, elements
146255146434 <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
146256146435
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+
146257146442 <tr> <!-- message -->
146258146443 <td> <dfn event for="Window,EventSource,MessagePort,BroadcastChannel,DedicatedWorkerGlobalScope,Worker,ServiceWorkerContainer"><code data-x="event-message">message</code></dfn>
146259146444 <td> <code>MessageEvent</code>
0 commit comments