Title: [281230] trunk/Source/WebCore
Revision
281230
Author
[email protected]
Date
2021-08-19 02:15:03 -0700 (Thu, 19 Aug 2021)

Log Message

Port HTMLDetailsElement to use modern event handling code
https://bugs.webkit.org/show_bug.cgi?id=228863

Reviewed by Antti Koivisto.

No behaviour change, follows: https://html.spec.whatwg.org/#details-notification-task-steps

* html/HTMLDetailsElement.cpp:
(WebCore::HTMLDetailsElement::parseAttribute):
(WebCore::HTMLDetailsElement::toggleOpen):
(WebCore::detailToggleEventSender): Deleted.
(WebCore::HTMLDetailsElement::~HTMLDetailsElement): Deleted.
(WebCore::HTMLDetailsElement::dispatchPendingEvent): Deleted.
* html/HTMLDetailsElement.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (281229 => 281230)


--- trunk/Source/WebCore/ChangeLog	2021-08-19 09:02:02 UTC (rev 281229)
+++ trunk/Source/WebCore/ChangeLog	2021-08-19 09:15:03 UTC (rev 281230)
@@ -1,5 +1,22 @@
 2021-08-19  Tim Nguyen  <[email protected]>
 
+        Port HTMLDetailsElement to use modern event handling code
+        https://bugs.webkit.org/show_bug.cgi?id=228863
+
+        Reviewed by Antti Koivisto.
+
+        No behaviour change, follows: https://html.spec.whatwg.org/#details-notification-task-steps
+
+        * html/HTMLDetailsElement.cpp:
+        (WebCore::HTMLDetailsElement::parseAttribute):
+        (WebCore::HTMLDetailsElement::toggleOpen):
+        (WebCore::detailToggleEventSender): Deleted.
+        (WebCore::HTMLDetailsElement::~HTMLDetailsElement): Deleted.
+        (WebCore::HTMLDetailsElement::dispatchPendingEvent): Deleted.
+        * html/HTMLDetailsElement.h:
+
+2021-08-19  Tim Nguyen  <[email protected]>
+
         Implement ::backdrop pseudo element
         https://bugs.webkit.org/show_bug.cgi?id=227801
 

Modified: trunk/Source/WebCore/html/HTMLDetailsElement.cpp (281229 => 281230)


--- trunk/Source/WebCore/html/HTMLDetailsElement.cpp	2021-08-19 09:02:02 UTC (rev 281229)
+++ trunk/Source/WebCore/html/HTMLDetailsElement.cpp	2021-08-19 09:15:03 UTC (rev 281230)
@@ -24,8 +24,8 @@
 
 #include "AXObjectCache.h"
 #include "ElementIterator.h"
+#include "EventLoop.h"
 #include "EventNames.h"
-#include "EventSender.h"
 #include "HTMLSlotElement.h"
 #include "HTMLSummaryElement.h"
 #include "LocalizedStrings.h"
@@ -43,12 +43,6 @@
 
 using namespace HTMLNames;
 
-static DetailEventSender& detailToggleEventSender()
-{
-    static NeverDestroyed<DetailEventSender> sharedToggleEventSender(eventNames().toggleEvent);
-    return sharedToggleEventSender;
-}
-
 static const AtomString& summarySlotName()
 {
     static MainThreadNeverDestroyed<const AtomString> summarySlot("summarySlot");
@@ -98,11 +92,6 @@
     ASSERT(hasTagName(detailsTag));
 }
 
-HTMLDetailsElement::~HTMLDetailsElement()
-{
-    detailToggleEventSender().cancelEvent(*this);
-}
-
 RenderPtr<RenderElement> HTMLDetailsElement::createElementRenderer(RenderStyle&& style, const RenderTreePosition&)
 {
     return createRenderer<RenderBlockFlow>(*this, WTFMove(style));
@@ -139,12 +128,6 @@
     return slot == m_summarySlot;
 }
 
-void HTMLDetailsElement::dispatchPendingEvent(DetailEventSender* eventSender)
-{
-    ASSERT_UNUSED(eventSender, eventSender == &detailToggleEventSender());
-    dispatchEvent(Event::create(eventNames().toggleEvent, Event::CanBubble::No, Event::IsCancelable::No));
-}
-
 void HTMLDetailsElement::parseAttribute(const QualifiedName& name, const AtomString& value)
 {
     if (name == openAttr) {
@@ -158,9 +141,15 @@
             else
                 root->removeChild(*m_defaultSlot);
 
-            // https://html.spec.whatwg.org/#details-notification-task-steps.
-            detailToggleEventSender().cancelEvent(*this);
-            detailToggleEventSender().dispatchEventSoon(*this);
+            // https://html.spec.whatwg.org/#details-notification-task-steps
+            if (m_isToggleEventTaskQueued)
+                return;
+
+            document().eventLoop().queueTask(TaskSource::DOMManipulation, [protectedThis = GCReachableRef { *this }] {
+                protectedThis->dispatchEvent(Event::create(eventNames().toggleEvent, Event::CanBubble::No, Event::IsCancelable::No));
+                protectedThis->m_isToggleEventTaskQueued = false;
+            });
+            m_isToggleEventTaskQueued = true;
         }
     } else
         HTMLElement::parseAttribute(name, value);
@@ -169,7 +158,7 @@
 
 void HTMLDetailsElement::toggleOpen()
 {
-    setAttributeWithoutSynchronization(openAttr, m_isOpen ? nullAtom() : emptyAtom());
+    setBooleanAttribute(openAttr, !m_isOpen);
 
     // We need to post to the document because toggling this element will delete it.
     if (AXObjectCache* cache = document().existingAXObjectCache())

Modified: trunk/Source/WebCore/html/HTMLDetailsElement.h (281229 => 281230)


--- trunk/Source/WebCore/html/HTMLDetailsElement.h	2021-08-19 09:02:02 UTC (rev 281229)
+++ trunk/Source/WebCore/html/HTMLDetailsElement.h	2021-08-19 09:15:03 UTC (rev 281230)
@@ -27,14 +27,10 @@
 
 class HTMLSlotElement;
 
-template<typename T> class EventSender;
-using DetailEventSender = EventSender<HTMLDetailsElement>;
-
 class HTMLDetailsElement final : public HTMLElement {
     WTF_MAKE_ISO_ALLOCATED(HTMLDetailsElement);
 public:
     static Ref<HTMLDetailsElement> create(const QualifiedName& tagName, Document&);
-    ~HTMLDetailsElement();
 
     void toggleOpen();
 
@@ -41,8 +37,6 @@
     bool isOpen() const { return m_isOpen; }
     bool isActiveSummary(const HTMLSummaryElement&) const;
 
-    void dispatchPendingEvent(DetailEventSender*);
-    
 private:
     HTMLDetailsElement(const QualifiedName&, Document&);
 
@@ -57,6 +51,7 @@
     HTMLSlotElement* m_summarySlot { nullptr };
     HTMLSummaryElement* m_defaultSummary { nullptr };
     RefPtr<HTMLSlotElement> m_defaultSlot;
+    bool m_isToggleEventTaskQueued { false };
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to