Skip to content

Commit c4ee30d

Browse files
lukewarlowJonWBedard
authored andcommitted
Implement ToggleEvent.source
https://bugs.webkit.org/show_bug.cgi?id=293686 Reviewed by Tim Nguyen and Anne van Kesteren. This implements the new source attribute on ToggleEvent, and wires it up from command invokers for dialogs, and all invokers for popover. This also tweaks the source property getter on CommandEvent. * LayoutTests/imported/w3c/web-platform-tests/html/dom/idlharness.https_exclude=(Document_Window_HTML._)-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-details-element/details-toggle-source-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-toggle-source-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/html/semantics/popovers/popover-toggle-source-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/html/semantics/the-button-element/command-and-commandfor/source-attribute-retargeting.tentative-expected.txt: * LayoutTests/platform/glib/imported/w3c/web-platform-tests/html/dom/idlharness.https_exclude=(Document_Window_HTML._)-expected.txt: * Source/WebCore/dom/CommandEvent.cpp: (WebCore::CommandEvent::source const): * Source/WebCore/dom/ToggleEvent.cpp: (WebCore::ToggleEvent::ToggleEvent): (WebCore::ToggleEvent::source const): * Source/WebCore/dom/ToggleEvent.h: * Source/WebCore/dom/ToggleEvent.idl: * Source/WebCore/dom/ToggleEventTask.cpp: (WebCore::ToggleEventTask::queue): * Source/WebCore/dom/ToggleEventTask.h: * Source/WebCore/html/HTMLDetailsElement.cpp: (WebCore::HTMLDetailsElement::queueDetailsToggleEventTask): * Source/WebCore/html/HTMLDialogElement.cpp: (WebCore::HTMLDialogElement::show): (WebCore::HTMLDialogElement::showModal): (WebCore::HTMLDialogElement::close): (WebCore::HTMLDialogElement::requestClose): (WebCore::HTMLDialogElement::handleCommandInternal): (WebCore::HTMLDialogElement::queueDialogToggleEventTask): * Source/WebCore/html/HTMLDialogElement.h: * Source/WebCore/html/HTMLElement.cpp: (WebCore::HTMLElement::queuePopoverToggleEventTask): (WebCore::HTMLElement::showPopoverInternal): (WebCore::HTMLElement::hidePopoverInternal): (WebCore::HTMLElement::togglePopover): (WebCore::HTMLElement::handleCommandInternal): * Source/WebCore/html/HTMLElement.h: * Source/WebCore/html/HTMLFormControlElement.cpp: (WebCore::HTMLFormControlElement::handlePopoverTargetAction): Canonical link: https://commits.webkit.org/306152@main
1 parent a318b9f commit c4ee30d

File tree

18 files changed

+122
-69
lines changed

18 files changed

+122
-69
lines changed

‎LayoutTests/imported/w3c/web-platform-tests/html/dom/idlharness.https_exclude=(Document_Window_HTML._)-expected.txt‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,12 +803,12 @@ PASS ToggleEvent interface: existence and properties of interface prototype obje
803803
PASS ToggleEvent interface: existence and properties of interface prototype object's @@unscopables property
804804
PASS ToggleEvent interface: attribute oldState
805805
PASS ToggleEvent interface: attribute newState
806-
FAIL ToggleEvent interface: attribute source assert_true: The prototype object must have a property "source" expected true got false
806+
PASS ToggleEvent interface: attribute source
807807
PASS ToggleEvent must be primary interface of new ToggleEvent("beforetoggle")
808808
PASS Stringification of new ToggleEvent("beforetoggle")
809809
PASS ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "oldState" with the proper type
810810
PASS ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "newState" with the proper type
811-
FAIL ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "source" with the proper type assert_inherits: property "source" not found in prototype chain
811+
PASS ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "source" with the proper type
812812
PASS CommandEvent interface: existence and properties of interface object
813813
PASS CommandEvent interface object length
814814
PASS CommandEvent interface object name
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
command source
22
summary
3-
details without summary
43

5-
FAIL ToggleEvent.source on <details> elements: details.open. assert_equals: Opening toggle.source. expected (object) null but got (undefined) undefined
6-
FAIL ToggleEvent.source on <details> elements: click summary. assert_equals: toggle newstate should be open. expected "open" but got "closed"
7-
FAIL ToggleEvent.source on <details> elements: click details. assert_equals: Opening toggle.source. expected (object) null but got (undefined) undefined
4+
PASS ToggleEvent.source on <details> elements: details.open.
5+
PASS ToggleEvent.source on <details> elements: click summary.
6+
PASS ToggleEvent.source on <details> elements: click details.
87
FAIL ToggleEvent.source on <details> elements: command invokers. assert_true: An opening toggle event should have been fired. expected true got false
98

Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
show modal light dismiss dialog close request close
22

3-
FAIL ToggleEvent.source on <dialog> elements: dialog.showModal(). assert_equals: Opening beforetoggle.source. expected (object) null but got (undefined) undefined
4-
FAIL ToggleEvent.source on <dialog> elements: command button. assert_true: An opening beforetoggle event should have been fired. expected true got false
5-
FAIL ToggleEvent.source on <dialog> elements: open with showModal, close with button. assert_true: An opening beforetoggle event should have been fired. expected true got false
6-
FAIL ToggleEvent.soruce on <dialog> elements: open with button, close with dialog.close(). assert_true: An opening beforetoggle event should have been fired. expected true got false
7-
FAIL ToggleEvent.source on <dialog> elements: open with showModal, close with request-close button. assert_true: An opening beforetoggle event should have been fired. expected true got false
8-
FAIL ToggleEvent.source on <dialog> elements: open with button, close with light dismiss. promise_test: Unhandled rejection with value: object "Error: element click intercepted error"
3+
PASS ToggleEvent.source on <dialog> elements: dialog.showModal().
4+
PASS ToggleEvent.source on <dialog> elements: command button.
5+
PASS ToggleEvent.source on <dialog> elements: open with showModal, close with button.
6+
PASS ToggleEvent.soruce on <dialog> elements: open with button, close with dialog.close().
7+
PASS ToggleEvent.source on <dialog> elements: open with showModal, close with request-close button.
8+
FAIL ToggleEvent.source on <dialog> elements: open with button, close with light dismiss. assert_true: A closing beforetoggle event should have been fired. expected true got false
99

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
popovertarget source command source
22

3-
FAIL ToggleEvent.source on popover elements: showPopover() without source. assert_equals: Opening beforetoggle.source. expected (object) null but got (undefined) undefined
4-
FAIL ToggleEvent.source on popover elements: showPopover() with source. assert_true: An opening beforetoggle event should have been fired. expected true got false
5-
FAIL ToggleEvent.source on popover elements: Calling click() on a popovertarget button. assert_equals: beforetoggle newState should be open. expected "open" but got "closed"
6-
FAIL ToggleEvent.source on popover elements: Calling click() on a command button. assert_equals: Opening beforetoggle.source. expected (object) Element node <button id="commandsource" commandfor="popover" command="... but got (undefined) undefined
7-
FAIL ToggleEvent.source on popover elements: showPopover() then popovertarget button. assert_true: An opening beforetoggle event should have been fired. expected true got false
8-
FAIL ToggleEvent.source on popover elements: showPopover(invoker) then popovertarget button. assert_true: An opening beforetoggle event should have been fired. expected true got false
9-
FAIL ToggleEvent.source on popover elements: popovertarget button then hidePopover(). assert_equals: beforetoggle newState should be open. expected "open" but got "closed"
3+
PASS ToggleEvent.source on popover elements: showPopover() without source.
4+
PASS ToggleEvent.source on popover elements: showPopover() with source.
5+
PASS ToggleEvent.source on popover elements: Calling click() on a popovertarget button.
6+
PASS ToggleEvent.source on popover elements: Calling click() on a command button.
7+
PASS ToggleEvent.source on popover elements: showPopover() then popovertarget button.
8+
PASS ToggleEvent.source on popover elements: showPopover(invoker) then popovertarget button.
9+
PASS ToggleEvent.source on popover elements: popovertarget button then hidePopover().
1010

Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
popover 3show popover 3
22

3-
FAIL CommandEvent.source and ToggleEvent.source should be retargeted during and after event dispatch. assert_equals: beforetoggle.source during capture. expected (object) Element node <div id="host">
4-
5-
</div> but got (undefined) undefined
3+
PASS CommandEvent.source and ToggleEvent.source should be retargeted during and after event dispatch.
64
PASS CommandEvent.source should be retargeted when manually dispatched with composed set to true.
7-
FAIL CommandEvent.source and ToggleEvent.source should not be set to null after dispatch without ShadowDOM. assert_equals: beforetoggle.source should be the invoker button after dispatch. expected (object) Element node <button id="button3" commandfor="popover3" command="show-... but got (undefined) undefined
5+
PASS CommandEvent.source and ToggleEvent.source should not be set to null after dispatch without ShadowDOM.
86

‎LayoutTests/platform/glib/imported/w3c/web-platform-tests/html/dom/idlharness.https_exclude=(Document_Window_HTML._)-expected.txt‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -803,12 +803,12 @@ PASS ToggleEvent interface: existence and properties of interface prototype obje
803803
PASS ToggleEvent interface: existence and properties of interface prototype object's @@unscopables property
804804
PASS ToggleEvent interface: attribute oldState
805805
PASS ToggleEvent interface: attribute newState
806-
FAIL ToggleEvent interface: attribute source assert_true: The prototype object must have a property "source" expected true got false
806+
PASS ToggleEvent interface: attribute source
807807
PASS ToggleEvent must be primary interface of new ToggleEvent("beforetoggle")
808808
PASS Stringification of new ToggleEvent("beforetoggle")
809809
PASS ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "oldState" with the proper type
810810
PASS ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "newState" with the proper type
811-
FAIL ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "source" with the proper type assert_inherits: property "source" not found in prototype chain
811+
PASS ToggleEvent interface: new ToggleEvent("beforetoggle") must inherit property "source" with the proper type
812812
PASS CommandEvent interface: existence and properties of interface object
813813
PASS CommandEvent interface object length
814814
PASS CommandEvent interface object name

‎Source/WebCore/dom/CommandEvent.cpp‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,12 @@ RefPtr<Element> CommandEvent::source() const
6666
if (RefPtr target = dynamicDowncast<Node>(currentTarget())) {
6767
Ref treeScope = target->treeScope();
6868
Ref node = treeScope->retargetToScope(*m_source);
69-
return &downcast<Element>(node).get();
69+
return downcast<Element>(node);
7070
}
7171

7272
Ref treeScope = m_source->treeScope().documentScope();
7373
Ref node = treeScope->retargetToScope(*m_source);
74-
return &downcast<Element>(node).get();
74+
return downcast<Element>(node);
7575
}
7676

7777
} // namespace WebCore

‎Source/WebCore/dom/ToggleEvent.cpp‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@
2626
#include "config.h"
2727
#include "ToggleEvent.h"
2828

29+
#include "Document.h"
30+
#include "Element.h"
31+
#include "TreeScope.h"
32+
2933
#include <wtf/TZoneMallocInlines.h>
3034

3135
namespace WebCore {
@@ -41,13 +45,15 @@ ToggleEvent::ToggleEvent(const AtomString& type, const ToggleEvent::Init& initia
4145
: Event(EventInterfaceType::ToggleEvent, type, Event::CanBubble::No, cancelable, Event::IsComposed::No)
4246
, m_oldState(initializer.oldState)
4347
, m_newState(initializer.newState)
48+
, m_source(initializer.source)
4449
{
4550
}
4651

4752
ToggleEvent::ToggleEvent(const AtomString& type, const ToggleEvent::Init& initializer)
4853
: Event(EventInterfaceType::ToggleEvent, type, initializer, IsTrusted::No)
4954
, m_oldState(initializer.oldState)
5055
, m_newState(initializer.newState)
56+
, m_source(initializer.source)
5157
{
5258
}
5359

@@ -66,4 +72,20 @@ Ref<ToggleEvent> ToggleEvent::createForBindings()
6672
return adoptRef(*new ToggleEvent);
6773
}
6874

75+
RefPtr<Element> ToggleEvent::source() const
76+
{
77+
if (!m_source)
78+
return nullptr;
79+
80+
if (RefPtr target = dynamicDowncast<Node>(currentTarget())) {
81+
Ref treeScope = target->treeScope();
82+
Ref node = treeScope->retargetToScope(*m_source);
83+
return downcast<Element>(node);
84+
}
85+
86+
Ref treeScope = m_source->treeScope().documentScope();
87+
Ref node = treeScope->retargetToScope(*m_source);
88+
return downcast<Element>(node);
89+
}
90+
6991
} // namespace WebCore

‎Source/WebCore/dom/ToggleEvent.h‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@
3030

3131
namespace WebCore {
3232

33+
class Element;
34+
3335
class ToggleEvent final : public Event {
3436
WTF_MAKE_TZONE_ALLOCATED(ToggleEvent);
3537
public:
3638
struct Init : EventInit {
3739
String oldState;
3840
String newState;
41+
RefPtr<Element> source;
3942
};
4043

4144
static Ref<ToggleEvent> create(const AtomString& type, const Init&, Event::IsCancelable);
@@ -44,6 +47,7 @@ class ToggleEvent final : public Event {
4447

4548
String oldState() const { return m_oldState; }
4649
String newState() const { return m_newState; }
50+
RefPtr<Element> source() const;
4751

4852
private:
4953
ToggleEvent();
@@ -52,6 +56,7 @@ class ToggleEvent final : public Event {
5256

5357
String m_oldState;
5458
String m_newState;
59+
const RefPtr<Element> m_source;
5560
};
5661

5762
} // namespace WebCore

‎Source/WebCore/dom/ToggleEvent.idl‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ interface ToggleEvent : Event {
2828
constructor([AtomString] DOMString type, optional ToggleEventInit eventInitDict = {});
2929
readonly attribute DOMString oldState;
3030
readonly attribute DOMString newState;
31+
readonly attribute Element? source;
3132
};
3233

3334
[
3435
LegacyNativeDictionaryRequiredInterfaceNullability,
3536
] dictionary ToggleEventInit : EventInit {
3637
DOMString oldState = "";
3738
DOMString newState = "";
39+
Element? source = null;
3840
};

0 commit comments

Comments
 (0)