Get started cleaning up interesttarget implementation [1/N]

This is the first in a series of patches to clean up and update the
`interesttarget` implementation to match recent OpenUI discussions.

This CL:
 - Gets rid of `interestaction`. See the large comment posted here:
   https://github.com/openui/open-ui/issues/1064#issuecomment-2581511411
 - Adds a connection to `InterestLost` when elements are de-focused.
 - Adds support (tentatively) for dialogs being shown modally.
 - Remove keyboard/focus support for `interesttarget`. This will
   get re-added later in its new form, via a hotkey rather than
   focus.

Bug: 326681249
Change-Id: I26f07a00c4fb1d2b1da92b64d91f330c02a11468
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6166890
Auto-Submit: Mason Freed <masonf@chromium.org>
Reviewed-by: David Baron <dbaron@chromium.org>
Commit-Queue: Mason Freed <masonf@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1408202}
diff --git a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
index 8ac3e4f..2dd6f7fc 100644
--- a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
@@ -3412,7 +3412,6 @@
     getter hostname
     getter href
     getter hreflang
-    getter interestAction
     getter interestTargetElement
     getter name
     getter origin
@@ -3442,7 +3441,6 @@
     setter hostname
     setter href
     setter hreflang
-    setter interestAction
     setter interestTargetElement
     setter name
     setter password
@@ -3470,7 +3468,6 @@
     getter host
     getter hostname
     getter href
-    getter interestAction
     getter interestTargetElement
     getter noHref
     getter origin
@@ -3496,7 +3493,6 @@
     setter host
     setter hostname
     setter href
-    setter interestAction
     setter interestTargetElement
     setter noHref
     setter password
@@ -3602,7 +3598,6 @@
     getter formMethod
     getter formNoValidate
     getter formTarget
-    getter interestAction
     getter interestTargetElement
     getter labels
     getter name
@@ -3625,7 +3620,6 @@
     setter formMethod
     setter formNoValidate
     setter formTarget
-    setter interestAction
     setter interestTargetElement
     setter name
     setter popoverTargetAction
@@ -4281,7 +4275,6 @@
     getter height
     getter incremental
     getter indeterminate
-    getter interestAction
     getter interestTargetElement
     getter labels
     getter list
@@ -4342,7 +4335,6 @@
     setter height
     setter incremental
     setter indeterminate
-    setter interestAction
     setter interestTargetElement
     setter max
     setter maxLength
@@ -5450,8 +5442,7 @@
     method getTargetRanges
 interface InterestEvent : Event
     attribute @@toStringTag
-    getter action
-    getter invoker
+    getter source
     method constructor
 interface IntersectionObserver
     attribute @@toStringTag
@@ -7673,11 +7664,9 @@
 interface SVGAElement : SVGGraphicsElement
     attribute @@toStringTag
     getter href
-    getter interestAction
     getter interestTargetElement
     getter target
     method constructor
-    setter interestAction
     setter interestTargetElement
 interface SVGAngle
     attribute @@toStringTag
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc
index b64fcd3..eb91d32 100644
--- a/third_party/blink/renderer/core/dom/element.cc
+++ b/third_party/blink/renderer/core/dom/element.cc
@@ -1273,45 +1273,63 @@
 
 void Element::InterestGained() {
   CHECK(RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled());
+  CHECK(IsInTreeScope());
+  CHECK(GetDocument().IsActive());
 
-  if (!IsInTreeScope()) {
-    return;
-  }
-
-  Element* interest_target_element = this->interestTargetElement();
-  AtomicString interest_action = this->interestAction();
-  if (interest_target_element && !interest_action.IsNull()) {
-    // TODO(crbug.com/326681249): This should only fire if action is valid.
-    Event* interest_event = InterestEvent::Create(event_type_names::kInterest,
-                                                  interest_action, this);
+  if (Element* interest_target_element = this->interestTargetElement()) {
+    Event* interest_event =
+        InterestEvent::Create(event_type_names::kInterest, this);
     interest_target_element->DispatchEvent(*interest_event);
     if (!interest_event->defaultPrevented()) {
       if (auto* popover = DynamicTo<HTMLElement>(interest_target_element);
           popover && popover->PopoverType() != PopoverValueType::kNone) {
-        if (!(interest_action.empty() ||
-              EqualIgnoringASCIICase(interest_action,
-                                     keywords::kTogglePopover))) {
-          return;
-        }
-
         // TODO(crbug.com/326681249): This might need to queue a task with a
         // delay based on CSS properties.
-        auto& document = GetDocument();
-        bool can_show = popover->IsPopoverReady(
-            PopoverTriggerAction::kShow,
-            /*exception_state=*/nullptr,
-            /*include_event_handler_text=*/true, &document);
-        bool can_hide = popover->IsPopoverReady(
-            PopoverTriggerAction::kHide,
-            /*exception_state=*/nullptr,
-            /*include_event_handler_text=*/true, &document);
-        if (can_hide) {
+        if (popover->IsPopoverReady(PopoverTriggerAction::kShow,
+                                    /*exception_state=*/nullptr,
+                                    /*include_event_handler_text=*/true,
+                                    &GetDocument())) {
+          popover->InvokePopover(*this);
+        }
+      } else if (auto* dialog =
+                     DynamicTo<HTMLDialogElement>(interest_target_element)) {
+        if (!dialog->IsOpen()) {
+          dialog->showModal(ASSERT_NO_EXCEPTION);
+        }
+      }
+    }
+  }
+}
+
+void Element::InterestLost() {
+  CHECK(RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled());
+  CHECK(IsInTreeScope());
+
+  // TODO(masonf): It would be a good idea to add a DHECK method that makes sure
+  // we never get InterestLost without first getting an InterestGained.
+
+  if (Element* interest_target_element = this->interestTargetElement()) {
+    Event* lose_interest_event =
+        InterestEvent::Create(event_type_names::kLoseinterest, this);
+    interest_target_element->DispatchEvent(*lose_interest_event);
+    if (!lose_interest_event->defaultPrevented()) {
+      if (auto* popover = DynamicTo<HTMLElement>(interest_target_element);
+          popover && popover->PopoverType() != PopoverValueType::kNone) {
+        // TODO(crbug.com/326681249): This might need to queue a task with a
+        // delay based on CSS properties.
+        if (popover->IsPopoverReady(PopoverTriggerAction::kHide,
+                                    /*exception_state=*/nullptr,
+                                    /*include_event_handler_text=*/true,
+                                    &GetDocument())) {
           popover->HidePopoverInternal(
               HidePopoverFocusBehavior::kFocusPreviousElement,
               HidePopoverTransitionBehavior::kFireEventsAndWaitForTransitions,
               /*exception_state=*/nullptr);
-        } else if (can_show) {
-          popover->InvokePopover(*this);
+        }
+      } else if (auto* dialog =
+                     DynamicTo<HTMLDialogElement>(interest_target_element)) {
+        if (dialog->IsOpen()) {
+          dialog->close();
         }
       }
     }
@@ -6625,11 +6643,6 @@
 
   FocusStateChanged();
 
-  if (received &&
-      RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled()) {
-    InterestGained();
-  }
-
   if (GetLayoutObject() || received) {
     return;
   }
@@ -10205,8 +10218,13 @@
 
   InvalidateIfHasEffectiveAppearance();
 
-  if (hovered && RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled()) {
-    InterestGained();
+  if (RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled() &&
+      IsInTreeScope() && GetDocument().IsActive()) {
+    if (hovered) {
+      InterestGained();
+    } else {
+      InterestLost();
+    }
   }
 }
 
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h
index 356ebee..026f1c33 100644
--- a/third_party/blink/renderer/core/dom/element.h
+++ b/third_party/blink/renderer/core/dom/element.h
@@ -1071,10 +1071,10 @@
     return false;
   }
 
+  // Implementation of the `interesttarget` feature.
   void InterestGained();
-
+  void InterestLost();
   virtual Element* interestTargetElement() { return nullptr; }
-  virtual AtomicString interestAction() const { return g_null_atom; }
 
   // The implementations of |innerText()| and |GetInnerTextWithoutUpdate()| are
   // found in "element_inner_text.cc".
diff --git a/third_party/blink/renderer/core/dom/interest_invoker_element.idl b/third_party/blink/renderer/core/dom/interest_invoker_element.idl
index 95f7549..e47885c 100644
--- a/third_party/blink/renderer/core/dom/interest_invoker_element.idl
+++ b/third_party/blink/renderer/core/dom/interest_invoker_element.idl
@@ -5,5 +5,4 @@
 [RuntimeEnabled=HTMLInterestTargetAttribute]
 interface mixin InterestInvokerElement {
   [CEReactions,Reflect=interesttarget] attribute Element? interestTargetElement;
-  [CEReactions,Reflect=interestaction] attribute DOMString interestAction;
 };
diff --git a/third_party/blink/renderer/core/events/interest_event.cc b/third_party/blink/renderer/core/events/interest_event.cc
index b943932..8eec3c0 100644
--- a/third_party/blink/renderer/core/events/interest_event.cc
+++ b/third_party/blink/renderer/core/events/interest_event.cc
@@ -16,39 +16,33 @@
                              const InterestEventInit* initializer)
     : Event(type, initializer) {
   DCHECK(RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled());
-  if (initializer->hasInvoker()) {
-    invoker_ = initializer->invoker();
-  }
-  if (initializer->hasAction()) {
-    action_ = initializer->action();
+  if (initializer->hasSource()) {
+    source_ = initializer->source();
   }
 }
 
-InterestEvent::InterestEvent(const AtomicString& type,
-                             const String& action,
-                             Element* invoker)
+InterestEvent::InterestEvent(const AtomicString& type, Element* source)
     : Event(type, Bubbles::kNo, Cancelable::kYes, ComposedMode::kComposed),
-      invoker_(invoker),
-      action_(action) {
+      source_(source) {
   DCHECK(RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled());
 }
 
-Element* InterestEvent::invoker() const {
-  Element* invoker = invoker_.Get();
-  if (!invoker) {
+Element* InterestEvent::source() const {
+  Element* source = source_.Get();
+  if (!source) {
     return nullptr;
   }
 
   if (auto* current = currentTarget()) {
     CHECK(current->ToNode());
-    return &current->ToNode()->GetTreeScope().Retarget(*invoker);
+    return &current->ToNode()->GetTreeScope().Retarget(*source);
   }
   DCHECK_EQ(eventPhase(), Event::PhaseType::kNone);
-  return invoker;
+  return source;
 }
 
 void InterestEvent::Trace(Visitor* visitor) const {
-  visitor->Trace(invoker_);
+  visitor->Trace(source_);
   Event::Trace(visitor);
 }
 
diff --git a/third_party/blink/renderer/core/events/interest_event.h b/third_party/blink/renderer/core/events/interest_event.h
index fed5bd7..6db27e7 100644
--- a/third_party/blink/renderer/core/events/interest_event.h
+++ b/third_party/blink/renderer/core/events/interest_event.h
@@ -23,16 +23,12 @@
     return MakeGarbageCollected<InterestEvent>(type, initializer);
   }
 
-  static InterestEvent* Create(const AtomicString& type,
-                               const String& action,
-                               Element* invoker) {
-    return MakeGarbageCollected<InterestEvent>(type, action, invoker);
+  static InterestEvent* Create(const AtomicString& type, Element* source) {
+    return MakeGarbageCollected<InterestEvent>(type, source);
   }
 
   InterestEvent(const AtomicString& type, const InterestEventInit* initializer);
-  InterestEvent(const AtomicString& type,
-                const String& action,
-                Element* invoker);
+  InterestEvent(const AtomicString& type, Element* source);
 
   const AtomicString& InterfaceName() const override {
     return event_interface_names::kInterestEvent;
@@ -40,14 +36,11 @@
 
   void Trace(Visitor*) const override;
 
-  const String& action() const { return action_; }
-
-  Element* invoker() const;
-  void SetInvoker(Element* invoker) { invoker_ = invoker; }
+  Element* source() const;
+  void SetSource(Element* source) { source_ = source; }
 
  private:
-  Member<Element> invoker_;
-  String action_;
+  Member<Element> source_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/events/interest_event.idl b/third_party/blink/renderer/core/events/interest_event.idl
index 4b71a42..2717627 100644
--- a/third_party/blink/renderer/core/events/interest_event.idl
+++ b/third_party/blink/renderer/core/events/interest_event.idl
@@ -7,11 +7,9 @@
     Exposed=Window
 ] interface InterestEvent : Event {
     constructor(DOMString type, optional InterestEventInit eventInitDict = {});
-    readonly attribute Element? invoker;
-    readonly attribute DOMString action;
+    readonly attribute Element? source;
 };
 
 dictionary InterestEventInit : EventInit {
-    Element? invoker = null;
-    DOMString action = "";
+    Element? source = null;
 };
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
index 22ee4d2..a755f48 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -417,17 +417,6 @@
   setAttribute(html_names::kPopovertargetactionAttr, value);
 }
 
-AtomicString HTMLFormControlElement::interestAction() const {
-  CHECK(RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled());
-  const AtomicString& attribute_value =
-      FastGetAttribute(html_names::kInterestactionAttr);
-  if (attribute_value && !attribute_value.IsNull() &&
-      !attribute_value.empty()) {
-    return attribute_value;
-  }
-  return g_empty_atom;
-}
-
 void HTMLFormControlElement::DefaultEventHandler(Event& event) {
   // Buttons that aren't form participants might be Invoker buttons or Popover
   // buttons.
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.h b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
index 2352765..e26d943f 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
@@ -117,8 +117,6 @@
 
   Element* interestTargetElement() override;
 
-  AtomicString interestAction() const override;
-
   void DefaultEventHandler(Event&) override;
 
   void SetHovered(bool hovered) override;
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc
index 2a34e87..e1440edf 100644
--- a/third_party/blink/renderer/core/html/html_anchor_element.cc
+++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -629,17 +629,6 @@
       html_names::kInteresttargetAttr);
 }
 
-AtomicString HTMLAnchorElementBase::interestAction() const {
-  CHECK(RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled());
-  const AtomicString& attribute_value =
-      FastGetAttribute(html_names::kInterestactionAttr);
-  if (attribute_value && !attribute_value.IsNull() &&
-      !attribute_value.empty()) {
-    return attribute_value;
-  }
-  return g_empty_atom;
-}
-
 void HTMLAnchorElementBase::HandleClick(MouseEvent& event) {
   event.SetDefaultHandled();
 
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.h b/third_party/blink/renderer/core/html/html_anchor_element.h
index ae3a23b..f9dcb765 100644
--- a/third_party/blink/renderer/core/html/html_anchor_element.h
+++ b/third_party/blink/renderer/core/html/html_anchor_element.h
@@ -114,8 +114,6 @@
 
   Element* interestTargetElement() override;
 
-  AtomicString interestAction() const override;
-
   void Trace(Visitor*) const override;
 
  protected:
diff --git a/third_party/blink/renderer/core/html/html_area_element.cc b/third_party/blink/renderer/core/html/html_area_element.cc
index 699ddc0..0602e0e 100644
--- a/third_party/blink/renderer/core/html/html_area_element.cc
+++ b/third_party/blink/renderer/core/html/html_area_element.cc
@@ -239,17 +239,6 @@
       html_names::kInteresttargetAttr);
 }
 
-AtomicString HTMLAreaElement::interestAction() const {
-  CHECK(RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled());
-  const AtomicString& attribute_value =
-      FastGetAttribute(html_names::kInterestactionAttr);
-  if (attribute_value && !attribute_value.IsNull() &&
-      !attribute_value.empty()) {
-    return attribute_value;
-  }
-  return g_empty_atom;
-}
-
 void HTMLAreaElement::UpdateSelectionOnFocus(
     SelectionBehaviorOnFocus selection_behavior,
     const FocusOptions* options) {
diff --git a/third_party/blink/renderer/core/html/html_area_element.h b/third_party/blink/renderer/core/html/html_area_element.h
index c99edcb8..7622ae2 100644
--- a/third_party/blink/renderer/core/html/html_area_element.h
+++ b/third_party/blink/renderer/core/html/html_area_element.h
@@ -72,7 +72,6 @@
   void SetFocused(bool, mojom::blink::FocusType) override;
 
   Element* interestTargetElement() override;
-  AtomicString interestAction() const override;
 
   enum Shape { kDefault, kPoly, kRect, kCircle };
   void InvalidateCachedPath();
diff --git a/third_party/blink/renderer/core/html/html_attribute_names.json5 b/third_party/blink/renderer/core/html/html_attribute_names.json5
index 868d155..ccb30fd 100644
--- a/third_party/blink/renderer/core/html/html_attribute_names.json5
+++ b/third_party/blink/renderer/core/html/html_attribute_names.json5
@@ -118,7 +118,6 @@
     "inert",
     "inputmode",
     "integrity",
-    "interestaction",
     "interesttarget",
     "is",
     "ismap",
diff --git a/third_party/blink/renderer/core/svg/svg_a_element.cc b/third_party/blink/renderer/core/svg/svg_a_element.cc
index 09f7ae3..9bac8ecb8 100644
--- a/third_party/blink/renderer/core/svg/svg_a_element.cc
+++ b/third_party/blink/renderer/core/svg/svg_a_element.cc
@@ -179,17 +179,6 @@
       svg_names::kInteresttargetAttr);
 }
 
-AtomicString SVGAElement::interestAction() const {
-  CHECK(RuntimeEnabledFeatures::HTMLInterestTargetAttributeEnabled());
-  const AtomicString& attribute_value =
-      FastGetAttribute(svg_names::kInterestactionAttr);
-  if (attribute_value && !attribute_value.IsNull() &&
-      !attribute_value.empty()) {
-    return attribute_value;
-  }
-  return g_empty_atom;
-}
-
 bool SVGAElement::HasActivationBehavior() const {
   return true;
 }
diff --git a/third_party/blink/renderer/core/svg/svg_a_element.h b/third_party/blink/renderer/core/svg/svg_a_element.h
index 0515d909a..59cb21f 100644
--- a/third_party/blink/renderer/core/svg/svg_a_element.h
+++ b/third_party/blink/renderer/core/svg/svg_a_element.h
@@ -38,7 +38,6 @@
   explicit SVGAElement(Document&);
 
   Element* interestTargetElement() override;
-  AtomicString interestAction() const override;
 
   void Trace(Visitor*) const override;
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 60ea43a..fde4eb7 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1556,6 +1556,9 @@
 crbug.com/335223786 virtual/html-anchor-attribute-disabled/external/wpt/html/semantics/popovers/popover-anchor-nested-display.tentative.html [ Failure ]
 crbug.com/335223786 virtual/html-anchor-attribute-disabled/external/wpt/html/semantics/popovers/popover-anchor-scroll-display.tentative.html [ Failure ]
 
+# Interesttarget related tests
+crbug.com/326681249 external/wpt/html/semantics/the-button-element/interest-target/interesttarget-svg-a-event-dispatch.tentative.html [ Failure ]
+
 crbug.com/1107923 inspector-protocol/debugger/wasm-streaming-url.js [ Failure Pass Timeout ]
 
 crbug.com/350730710 inspector-protocol/css/css-get-position-try.js [ Failure Skip ]
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestelement-interface.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestelement-interface.tentative.html
index 8b1e375..bc68dc5 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestelement-interface.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestelement-interface.tentative.html
@@ -84,82 +84,4 @@
       "interestTargetElement attribute value must be an instance of Element",
     );
   }, "interestTargetElement throws error on assignment of non Element");
-
-  test(function () {
-    assert_false(buttonInvoker.hasAttribute("interestaction"));
-    assert_equals(buttonInvoker.interestAction, "");
-    assert_false(aInvoker.hasAttribute("interestaction"));
-    assert_equals(aInvoker.interestAction, "");
-    assert_false(inputInvoker.hasAttribute("interestaction"));
-    assert_equals(inputInvoker.interestAction, "");
-  }, "interestAction reflects '' when attribute not present");
-
-  test(function () {
-    buttonInvoker.setAttribute("interestaction", "");
-    assert_equals(buttonInvoker.getAttribute("interestaction"), "");
-    assert_equals(buttonInvoker.interestAction, "");
-    aInvoker.setAttribute("interestaction", "");
-    assert_equals(aInvoker.getAttribute("interestaction"), "");
-    assert_equals(aInvoker.interestAction, "");
-    inputInvoker.setAttribute("interestaction", "");
-    assert_equals(inputInvoker.getAttribute("interestaction"), "");
-    assert_equals(inputInvoker.interestAction, "");
-  }, "interestAction reflects '' when attribute empty, setAttribute version");
-
-  test(function () {
-      buttonInvoker.interestAction = "";
-      assert_equals(buttonInvoker.getAttribute("interestaction"), "");
-      assert_equals(buttonInvoker.interestAction, "");
-      aInvoker.interestAction = "";
-      assert_equals(aInvoker.getAttribute("interestaction"), "");
-      assert_equals(aInvoker.interestAction, "");
-      inputInvoker.interestAction = "";
-      assert_equals(inputInvoker.getAttribute("interestaction"), "");
-      assert_equals(inputInvoker.interestAction, "");
-  }, "interestAction reflects '' when attribute empty, IDL setter version");
-
-  test(function () {
-      buttonInvoker.interestAction = "fooBarBaz";
-      assert_equals(buttonInvoker.getAttribute("interestaction"), "fooBarBaz");
-      assert_equals(buttonInvoker.interestAction, "fooBarBaz");
-      aInvoker.interestAction = "fooBarBaz";
-      assert_equals(aInvoker.getAttribute("interestaction"), "fooBarBaz");
-      assert_equals(aInvoker.interestAction, "fooBarBaz");
-      inputInvoker.interestAction = "fooBarBaz";
-      assert_equals(inputInvoker.getAttribute("interestaction"), "fooBarBaz");
-      assert_equals(inputInvoker.interestAction, "fooBarBaz");
-  }, "interestAction reflects same casing");
-
-  test(function () {
-      buttonInvoker.interestAction = [];
-      assert_equals(buttonInvoker.getAttribute("interestaction"), "");
-      assert_equals(buttonInvoker.interestAction, "");
-      aInvoker.interestAction = [];
-      assert_equals(aInvoker.getAttribute("interestaction"), "");
-      assert_equals(aInvoker.interestAction, "");
-      inputInvoker.interestAction = [];
-      assert_equals(inputInvoker.getAttribute("interestaction"), "");
-      assert_equals(inputInvoker.interestAction, "");
-  }, "interestAction reflects '' when attribute set to []");
-
-  test(function () {
-      buttonInvoker.interestAction = [1, 2, 3];
-      assert_equals(buttonInvoker.getAttribute("interestaction"), "1,2,3");
-      assert_equals(buttonInvoker.interestAction, "1,2,3");
-      aInvoker.interestAction = [1, 2, 3];
-      assert_equals(aInvoker.getAttribute("interestaction"), "1,2,3");
-      assert_equals(aInvoker.interestAction, "1,2,3");
-      inputInvoker.interestAction = [1, 2, 3];
-      assert_equals(inputInvoker.getAttribute("interestaction"), "1,2,3");
-      assert_equals(inputInvoker.interestAction, "1,2,3");
-  }, "interestAction reflects tostring value");
-
-  test(function () {
-      buttonInvoker.interestAction = {};
-      assert_equals(buttonInvoker.interestAction, "[object Object]");
-      aInvoker.interestAction = {};
-      assert_equals(aInvoker.interestAction, "[object Object]");
-      inputInvoker.interestAction = {};
-      assert_equals(inputInvoker.interestAction, "[object Object]");
-  }, "interestAction reflects tostring value 2");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestevent-dispatch-shadow.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestevent-dispatch-shadow.tentative.html
index d96907e..9911357e 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestevent-dispatch-shadow.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestevent-dispatch-shadow.tentative.html
@@ -1,8 +1,11 @@
-<!doctype html>
+<!DOCTYPE html>
 <meta charset="utf-8" />
 <meta name="author" title="Keith Cirkel" href="mailto:keithamus@github.com" />
 <meta name="author" title="Luke Warlow" href="mailto:lwarlow@igalia.com" />
-<link rel="help" href="https://open-ui.org/components/interest-invokers.explainer/" />
+<link
+  rel="help"
+  href="https://open-ui.org/components/interest-invokers.explainer/"
+/>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/resources/testdriver.js"></script>
@@ -20,63 +23,35 @@
     const slot = shadow.appendChild(document.createElement("slot"));
     let childEvent = null;
     let childEventTarget = null;
-    let childEventInvoker = null;
+    let childEventSource = null;
     let hostEvent = null;
     let hostEventTarget = null;
-    let hostEventInvoker = null;
-    slot.addEventListener(
-      "interest",
-      (e) => {
+    let hostEventSource = null;
+    slot.addEventListener("interest", (e) => {
         childEvent = e;
         childEventTarget = e.target;
-        childEventInvoker = e.invoker;
-      },
-      { once: true },
-    );
-    host.addEventListener(
-      "interest",
-      (e) => {
+        childEventSource = e.source;
+      }, { once: true });
+    host.addEventListener("interest", (e) => {
         hostEvent = e;
         hostEventTarget = e.target;
-        hostEventInvoker = e.invoker;
-      },
-      { once: true },
-    );
+        hostEventSource = e.source;
+      }, { once: true });
     const event = new InterestEvent("interest", {
       bubbles: true,
-      invoker: slot,
+      source: slot,
       composed: true,
     });
     slot.dispatchEvent(event);
     assert_true(childEvent instanceof InterestEvent, "slot saw interest event");
-    assert_equals(
-      childEventTarget,
-      slot,
-      "target is child inside shadow boundary",
-    );
-    assert_equals(
-      childEventInvoker,
-      slot,
-      "invoker is child inside shadow boundary",
-    );
-    assert_equals(
-      hostEvent,
-      childEvent,
-      "event dispatch propagates across shadow boundary",
-    );
-    assert_equals(
-      hostEventTarget,
-      host,
-      "target is retargeted to shadowroot host",
-    );
-    assert_equals(
-      hostEventInvoker,
-      host,
-      "invoker is retargeted to shadowroot host",
-    );
-  }, "InterestEvent propagates across shadow boundaries retargeting invoker");
+    assert_equals(childEventTarget, slot, "target is child inside shadow boundary");
+    assert_equals(childEventSource, slot, "source is child inside shadow boundary");
+    assert_equals(hostEvent, childEvent, "event dispatch propagates across shadow boundary");
+    assert_equals(hostEventTarget, host, "target is retargeted to shadowroot host");
+    assert_equals(hostEventSource, host, "source is retargeted to shadowroot host");
+  }, "InterestEvent propagates across shadow boundaries retargeting invoker source");
 
-  test(function (t) {
+  promise_test(async (t) => {
     const host = document.createElement("div");
     document.body.append(host);
     t.add_cleanup(() => host.remove());
@@ -86,19 +61,16 @@
     button.interestTargetElement = interestee;
     let event = null;
     let eventTarget = null;
-    let eventInvoker = null;
-    interestee.addEventListener(
-      "interest",
-      (e) => {
+    let eventSource = null;
+    interestee.addEventListener("interest", (e) => {
         event = e;
         eventTarget = e.target;
-        eventInvoker = e.invoker;
-      },
-      { once: true },
-    );
-    button.focus();
+        eventSource = e.source;
+      },{ once: true });
+    await hoverOver(button);
+    assert_true(!!event,"InterestEvent gets fired");
     assert_true(event instanceof InterestEvent);
     assert_equals(eventTarget, interestee, "target is interestee");
-    assert_equals(eventInvoker, host, "interestee is host");
+    assert_equals(eventSource, host, "interestee is host");
   }, "cross shadow InterestEvent retargets interestee to host element");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestevent-interface.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestevent-interface.tentative.html
index ed7d82f..9ed95a6 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestevent-interface.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interestevent-interface.tentative.html
@@ -16,152 +16,80 @@
 <script>
   test(function () {
     const event = new InterestEvent("test");
-    assert_equals(event.action, "");
-    assert_readonly(event, "action", "readonly attribute value");
-  }, "action is a readonly defaulting to ''");
+    assert_equals(event.source, null);
+    assert_readonly(event, "source", "readonly attribute value");
+  }, "source is readonly defaulting to null");
 
   test(function () {
-    const event = new InterestEvent("test");
-    assert_equals(event.invoker, null);
-    assert_readonly(event, "invoker", "readonly attribute value");
-  }, "invoker is readonly defaulting to null");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: "sAmPle" });
-    assert_equals(event.action, "sAmPle");
-  }, "action reflects initialized attribute");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: undefined });
-    assert_equals(event.action, "");
-  }, "action set to undefined");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: null });
-    assert_equals(event.action, "null");
-  }, "action set to null");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: false });
-    assert_equals(event.action, "false");
-  }, "action set to false");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: "" });
-    assert_equals(event.action, "");
-  }, "action explicitly set to empty string");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: true });
-    assert_equals(event.action, "true");
-  }, "action set to true");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: 0.5 });
-    assert_equals(event.action, "0.5");
-  }, "action set to a number");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: [] });
-    assert_equals(event.action, "");
-  }, "action set to []");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: [1, 2, 3] });
-    assert_equals(event.action, "1,2,3");
-  }, "action set to [1, 2, 3]");
-
-  test(function () {
-    const event = new InterestEvent("test", { action: { sample: 0.5 } });
-    assert_equals(event.action, "[object Object]");
-  }, "action set to an object");
-
-  test(function () {
-    const event = new InterestEvent("test", {
-      action: {
-        toString() {
-          return "sample";
-        },
-      },
-    });
-    assert_equals(event.action, "sample");
-  }, "action set to an object with a toString function");
-
-  test(function () {
-    const eventInit = { action: "sample", invoker: document.body };
+    const eventInit = { source: document.body };
     const event = new InterestEvent("test", eventInit);
-    assert_equals(event.action, "sample");
-    assert_equals(event.invoker, document.body);
-  }, "InterestEventInit properties set value");
+    assert_equals(event.source, document.body);
+  }, "InterestEventInit properties set value (manual event)");
 
   test(function () {
     const eventInit = {
-      action: "open",
-      invoker: document.getElementById("div"),
+      source: document.getElementById("div"),
     };
     const event = new InterestEvent("beforetoggle", eventInit);
-    assert_equals(event.action, "open");
-    assert_equals(event.invoker, document.getElementById("div"));
-  }, "InterestEventInit properties set value 2");
+    assert_equals(event.source, document.getElementById("div"));
+  }, "InterestEventInit properties set value (beforetoggle event)");
 
   test(function () {
     const eventInit = {
-      action: "closed",
-      invoker: document.getElementById("button"),
+      source: document.getElementById("button"),
     };
     const event = new InterestEvent("toggle", eventInit);
-    assert_equals(event.action, "closed");
-    assert_equals(event.invoker, document.getElementById("button"));
-  }, "InterestEventInit properties set value 3");
+    assert_equals(event.source, document.getElementById("button"));
+  }, "InterestEventInit properties set value (toggle event)");
 
   test(function () {
-    const event = new InterestEvent("test", { invoker: undefined });
-    assert_equals(event.invoker, null);
-  }, "invoker set to undefined");
+    const event = new InterestEvent("test", { source: undefined });
+    assert_equals(event.source, null);
+  }, "source set to undefined");
 
   test(function () {
-    const event = new InterestEvent("test", { invoker: null });
-    assert_equals(event.invoker, null);
-  }, "invoker set to null");
+    const event = new InterestEvent("test", { source: null });
+    assert_equals(event.source, null);
+  }, "source set to null");
 
   test(function () {
     assert_throws_js(
       TypeError,
       function () {
-        new InterestEvent("test", { invoker: false });
+        new InterestEvent("test", { source: false });
       },
-      "invoker is not an object",
+      "source is not an object",
     );
-  }, "invoker set to false");
+  }, "source set to false");
 
   test(function () {
     assert_throws_js(
       TypeError,
       function () {
-        const event = new InterestEvent("test", { invoker: true });
+        const event = new InterestEvent("test", { source: true });
       },
-      "invoker is not an object",
+      "source is not an object",
     );
-  }, "invoker set to true");
+  }, "source set to true");
 
   test(function () {
     assert_throws_js(
       TypeError,
       function () {
-        const event = new InterestEvent("test", { invoker: {} });
+        const event = new InterestEvent("test", { source: {} });
       },
-      "invoker is not an object",
+      "source is not an object",
     );
-  }, "invoker set to {}");
+  }, "source set to {}");
 
   test(function () {
     assert_throws_js(
       TypeError,
       function () {
-        const eventInit = { action: "closed", invoker: new XMLHttpRequest() };
+        const eventInit = { source: new XMLHttpRequest() };
         const event = new InterestEvent("toggle", eventInit);
       },
-      "invoker is not an Element",
+      "source is not an Element",
     );
-  }, "invoker set to non-Element EventTarget");
+  }, "source set to non-Element EventTarget");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-anchor-event-dispatch.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-anchor-event-dispatch.tentative.html
index b5a481a..88a54c2 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-anchor-event-dispatch.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-anchor-event-dispatch.tentative.html
@@ -19,29 +19,14 @@
     t.add_cleanup(() => otherbutton.focus());
     let event = null;
     interestee.addEventListener("interest", (e) => (event = e), { once: true });
-    interestanchor.focus();
-    assert_true(event instanceof InterestEvent, "event is InterestEvent");
-    assert_equals(event.type, "interest", "type");
-    assert_equals(event.bubbles, false, "bubbles");
-    assert_equals(event.composed, true, "composed");
-    assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "", "action");
-    assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestanchor, "invoker");
-  }, "InterestEvent dispatches on anchor focus");
-
-  promise_test(async function (t) {
-    t.add_cleanup(() => otherbutton.focus());
-    let event = null;
-    interestee.addEventListener("interest", (e) => (event = e), { once: true });
     await hoverOver(interestanchor);
+    assert_true(!!event, "InterestEvent is fired");
     assert_true(event instanceof InterestEvent, "event is InterestEvent");
     assert_equals(event.type, "interest", "type");
     assert_equals(event.bubbles, false, "bubbles");
     assert_equals(event.composed, true, "composed");
     assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "", "action");
     assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestanchor, "invoker");
+    assert_equals(event.source, interestanchor, "source");
   }, "InterestEvent dispatches on anchor hover");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-area-event-dispatch.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-area-event-dispatch.tentative.html
index 358acbb..5573235 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-area-event-dispatch.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-area-event-dispatch.tentative.html
@@ -22,29 +22,14 @@
     t.add_cleanup(() => otherbutton.focus());
     let event = null;
     interestee.addEventListener("interest", (e) => (event = e), { once: true });
-    interestarea.focus();
-    assert_true(event instanceof InterestEvent, "event is InterestEvent");
-    assert_equals(event.type, "interest", "type");
-    assert_equals(event.bubbles, false, "bubbles");
-    assert_equals(event.composed, true, "composed");
-    assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "", "action");
-    assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestarea, "invoker");
-  }, "InterestEvent dispatches on area focus");
-
-  promise_test(async function (t) {
-    t.add_cleanup(() => otherbutton.focus());
-    let event = null;
-    interestee.addEventListener("interest", (e) => (event = e), { once: true });
     await hoverOver(interestarea);
+    assert_true(!!event, "InterestEvent is fired");
     assert_true(event instanceof InterestEvent, "event is InterestEvent");
     assert_equals(event.type, "interest", "type");
     assert_equals(event.bubbles, false, "bubbles");
     assert_equals(event.composed, true, "composed");
     assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "", "action");
     assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestarea, "invoker");
+    assert_equals(event.source, interestarea, "source");
   }, "InterestEvent dispatches on area hover");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-button-event-dispatch.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-button-event-dispatch.tentative.html
index 69126dbe..a9d68bb03 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-button-event-dispatch.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-button-event-dispatch.tentative.html
@@ -16,71 +16,23 @@
 
 <script>
   promise_test(async function (t) {
-    t.add_cleanup(() => otherbutton.focus());
-    let event = null;
-    interestee.addEventListener("interest", (e) => (event = e), { once: true });
-    interestbutton.focus();
-    assert_true(event instanceof InterestEvent, "event is InterestEvent");
-    assert_equals(event.type, "interest", "type");
-    assert_equals(event.bubbles, false, "bubbles");
-    assert_equals(event.composed, true, "composed");
-    assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "", "action");
-    assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestbutton, "invoker");
-  }, "InterestEvent dispatches on button focus");
-
-  promise_test(async function (t) {
-    t.add_cleanup(() => otherbutton.focus());
     let event = null;
     interestee.addEventListener("interest", (e) => (event = e), { once: true });
     await hoverOver(interestbutton);
+    assert_true(!!event, "InterestEvent is fired");
     assert_true(event instanceof InterestEvent, "event is InterestEvent");
     assert_equals(event.type, "interest", "type");
     assert_equals(event.bubbles, false, "bubbles");
     assert_equals(event.composed, true, "composed");
     assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "", "action");
     assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestbutton, "invoker");
+    assert_equals(event.source, interestbutton, "source");
   }, "InterestEvent dispatches on button hover");
 
   promise_test(async function (t) {
-    t.add_cleanup(() => otherbutton.focus());
-    let event = null;
-    interestee.addEventListener("interest", (e) => (event = e), { once: true });
-    interestbutton.interestAction = "fooBar";
-    interestbutton.focus();
-    assert_true(event instanceof InterestEvent, "event is InterestEvent");
-    assert_equals(event.type, "interest", "type");
-    assert_equals(event.bubbles, false, "bubbles");
-    assert_equals(event.composed, true, "composed");
-    assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "fooBar", "action");
-    assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestbutton, "invoker");
-  }, "event action is set to interestAction");
-
-  promise_test(async function (t) {
-    t.add_cleanup(() => otherbutton.focus());
-    let event = null;
-    interestee.addEventListener("interest", (e) => (event = e), { once: true });
-    interestbutton.setAttribute("interestaction", "BaRbAz");
-    interestbutton.focus();
-    assert_true(event instanceof InterestEvent, "event is InterestEvent");
-    assert_equals(event.type, "interest", "type");
-    assert_equals(event.bubbles, false, "bubbles");
-    assert_equals(event.composed, true, "composed");
-    assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "BaRbAz", "action");
-    assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestbutton, "invoker");
-  }, "event action is set to interestaction attribute");
-
-  promise_test(async function (t) {
-    t.add_cleanup(() => {
+    t.add_cleanup(async () => {
       interestbutton.removeAttribute('disabled');
-      otherbutton.focus();
+      await hoverOver(otherbutton);
     });
     let called = false;
     interestee.addEventListener(
@@ -91,34 +43,27 @@
       { once: true },
     );
     interestbutton.setAttribute("disabled", "");
-    interestbutton.focus();
+    await hoverOver(interestbutton);
     assert_false(called, "event was not called");
   }, "event does not dispatch if invoker is disabled");
 
   promise_test(async function (t) {
     svgInterestee = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
-    t.add_cleanup(() => {
+    t.add_cleanup(async () => {
       interestbutton.interestTargetElement = interestee;
       svgInterestee.remove();
-      otherbutton.focus();
+      await hoverOver(otherbutton);
     });
     document.body.append(svgInterestee);
     let called = false;
     assert_false(svgInterestee instanceof HTMLElement);
     assert_true(svgInterestee instanceof Element);
     let event = null;
-    svgInterestee.addEventListener(
-      "interest",
-      (e) => {
-        event = e;
-        called = true;
-      },
-      { once: true },
-    );
+    svgInterestee.addEventListener("interest", (e) => (event = e), { once: true });
     interestbutton.interestTargetElement = svgInterestee;
-    interestbutton.focus();
-    assert_true(called, "event was called");
-    assert_equals(event.invoker, interestbutton, "event.invoker is set to right element");
+    await hoverOver(interestbutton);
+    assert_true(!!event, "InterestEvent is fired");
+    assert_equals(event.source, interestbutton, "event.source is set to right element");
     assert_equals(event.target, svgInterestee, "event.target is set to right element");
   }, "event dispatches if interestee is non-HTML Element");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-on-popover-behavior.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-on-popover-behavior.tentative.html
index fd0a77b9..cbb5e40 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-on-popover-behavior.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-on-popover-behavior.tentative.html
@@ -17,44 +17,17 @@
 <button id="otherbutton">Other button</button>
 
 <script>
-  function reset() {
+  async function reset() {
       hoverOver(otherbutton);
-      otherbutton.focus();
+      await hoverOver(otherbutton);
       interestee.hidePopover();
-      interestbutton.removeAttribute("interestaction");
   }
-
-  // auto
-
   promise_test(async function (t) {
     t.add_cleanup(reset);
     assert_false(interestee.matches(":popover-open"));
     await hoverOver(interestbutton);
     assert_true(interestee.matches(":popover-open"));
-  }, "hover interest invoking (as auto) closed popover opens");
-
-  promise_test(async function (t) {
-    t.add_cleanup(reset);
-    interestee.showPopover();
-    assert_true(interestee.matches(":popover-open"));
-    await hoverOver(interestbutton);
-    assert_false(interestee.matches(":popover-open"));
-  }, "hover interest invoking (as auto) open popover closes");
-
-  promise_test(async function (t) {
-    t.add_cleanup(reset);
-    assert_false(interestee.matches(":popover-open"));
-    interestbutton.focus();
-    assert_true(interestee.matches(":popover-open"));
-  }, "focus interest invoking (as auto) closed popover opens");
-
-  promise_test(async function (t) {
-    t.add_cleanup(reset);
-    interestee.showPopover();
-    assert_true(interestee.matches(":popover-open"));
-    interestbutton.focus();
-    assert_false(interestee.matches(":popover-open"));
-  }, "focus interest invoking (as auto) open popover closes");
+  }, "hover interest invoking closed popover opens");
 
   promise_test(async function (t) {
     t.add_cleanup(reset);
@@ -64,50 +37,5 @@
     });
     await hoverOver(interestbutton);
     assert_false(interestee.matches(":popover-open"));
-  }, "interest invoking (as auto) closed popover with preventDefault does not open");
-
-  // togglepopover
-
-  promise_test(async function (t) {
-    t.add_cleanup(reset);
-    assert_false(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "toggle-popover");
-    await hoverOver(interestbutton);
-    assert_true(interestee.matches(":popover-open"));
-  }, "hover interest invoking (as togglepopover) closed popover opens");
-
-  promise_test(async function (t) {
-    t.add_cleanup(reset);
-    interestee.showPopover();
-    assert_true(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "toggle-popover");
-    await hoverOver(interestbutton);
-    assert_false(interestee.matches(":popover-open"));
-  }, "hover interest invoking (as togglepopover) open popover closes");
-
-  promise_test(async function (t) {
-    t.add_cleanup(reset);
-    assert_false(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "toggle-popover");
-    interestbutton.focus();
-    assert_true(interestee.matches(":popover-open"));
-  }, "focus interest invoking (as togglepopover) closed popover opens");
-
-  promise_test(async function (t) {
-    t.add_cleanup(reset);
-    interestee.showPopover();
-    assert_true(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "toggle-popover");
-    interestbutton.focus();
-    assert_false(interestee.matches(":popover-open"));
-  }, "focus interest invoking (as togglepopover) open popover closes");
-
-  promise_test(async function (t) {
-    t.add_cleanup(reset);
-    assert_false(interestee.matches(":popover-open"));
-    interestbutton.setAttribute("interestaction", "tOgGlE-pOpOvEr");
-    interestbutton.focus();
-    assert_true(interestee.matches(":popover-open"));
-  }, "interest invoking (as togglepopover - case insensitive) closed popover opens");
-
+  }, "interest invoking closed popover with preventDefault does not open");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-svg-a-event-dispatch.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-svg-a-event-dispatch.tentative.html
index 7fb4b1c19..8208c8d 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-svg-a-event-dispatch.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-svg-a-event-dispatch.tentative.html
@@ -20,32 +20,19 @@
 
 <script>
   promise_test(async function (t) {
-    t.add_cleanup(() => otherbutton.focus());
-    let event = null;
-    interestee.addEventListener("interest", (e) => (event = e), { once: true });
-    interestsvga.focus();
-    assert_true(event instanceof InterestEvent, "event is InterestEvent");
-    assert_equals(event.type, "interest", "type");
-    assert_equals(event.bubbles, false, "bubbles");
-    assert_equals(event.composed, true, "composed");
-    assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "", "action");
-    assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestsvga, "invoker");
-  }, "InterestEvent dispatches on svg a focus");
-
-  promise_test(async function (t) {
-    t.add_cleanup(() => otherbutton.focus());
+    t.add_cleanup(async () => {
+      await hoverOver(otherbutton);
+    });
     let event = null;
     interestee.addEventListener("interest", (e) => (event = e), { once: true });
     await hoverOver(interestsvga);
+    assert_true(!!event, "InterestEvent is fired");
     assert_true(event instanceof InterestEvent, "event is InterestEvent");
     assert_equals(event.type, "interest", "type");
     assert_equals(event.bubbles, false, "bubbles");
     assert_equals(event.composed, true, "composed");
     assert_equals(event.isTrusted, true, "isTrusted");
-    assert_equals(event.action, "", "action");
     assert_equals(event.target, interestee, "target");
-    assert_equals(event.invoker, interestsvga, "invoker");
+    assert_equals(event.source, interestsvga, "source");
   }, "InterestEvent dispatches on svg a hover");
 </script>
diff --git a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
index 7bd5528..f58ad5e4 100644
--- a/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/element-instance-property-listing-expected.txt
@@ -364,7 +364,6 @@
     property href
     property hrefTranslate
     property hreflang
-    property interestAction
     property interestTargetElement
     property name
     property origin
@@ -395,7 +394,6 @@
     property host
     property hostname
     property href
-    property interestAction
     property interestTargetElement
     property noHref
     property origin
@@ -517,7 +515,6 @@
     property formMethod
     property formNoValidate
     property formTarget
-    property interestAction
     property interestTargetElement
     property labels
     property name
@@ -775,7 +772,6 @@
     property height
     property incremental
     property indeterminate
-    property interestAction
     property interestTargetElement
     property labels
     property list
@@ -1611,7 +1607,6 @@
     property getCTM
     property getScreenCTM
     property href
-    property interestAction
     property interestTargetElement
     property nearestViewportElement
     property requiredExtensions
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index 97cf6af..f36ecf2b 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -3564,7 +3564,6 @@
     getter href
     getter hrefTranslate
     getter hreflang
-    getter interestAction
     getter interestTargetElement
     getter name
     getter origin
@@ -3595,7 +3594,6 @@
     setter href
     setter hrefTranslate
     setter hreflang
-    setter interestAction
     setter interestTargetElement
     setter name
     setter password
@@ -3623,7 +3621,6 @@
     getter host
     getter hostname
     getter href
-    getter interestAction
     getter interestTargetElement
     getter noHref
     getter origin
@@ -3649,7 +3646,6 @@
     setter host
     setter hostname
     setter href
-    setter interestAction
     setter interestTargetElement
     setter noHref
     setter password
@@ -3753,7 +3749,6 @@
     getter formMethod
     getter formNoValidate
     getter formTarget
-    getter interestAction
     getter interestTargetElement
     getter labels
     getter name
@@ -3776,7 +3771,6 @@
     setter formMethod
     setter formNoValidate
     setter formTarget
-    setter interestAction
     setter interestTargetElement
     setter name
     setter popoverTargetAction
@@ -4453,7 +4447,6 @@
     getter height
     getter incremental
     getter indeterminate
-    getter interestAction
     getter interestTargetElement
     getter labels
     getter list
@@ -4514,7 +4507,6 @@
     setter height
     setter incremental
     setter indeterminate
-    setter interestAction
     setter interestTargetElement
     setter max
     setter maxLength
@@ -5665,8 +5657,7 @@
     method getTargetRanges
 interface InterestEvent : Event
     attribute @@toStringTag
-    getter action
-    getter invoker
+    getter source
     method constructor
 interface IntersectionObserver
     attribute @@toStringTag
@@ -8175,11 +8166,9 @@
 interface SVGAElement : SVGGraphicsElement
     attribute @@toStringTag
     getter href
-    getter interestAction
     getter interestTargetElement
     getter target
     method constructor
-    setter interestAction
     setter interestTargetElement
 interface SVGAngle
     attribute @@toStringTag