Index: Source/core/html/HTMLDetailsElement.cpp |
diff --git a/Source/core/html/HTMLDetailsElement.cpp b/Source/core/html/HTMLDetailsElement.cpp |
index e88582f38346562b1a90eb2a2c08632017d8e353..0ae3e6c26dbd737293bfefe4738996b64ff05fe2 100644 |
--- a/Source/core/html/HTMLDetailsElement.cpp |
+++ b/Source/core/html/HTMLDetailsElement.cpp |
@@ -47,11 +47,24 @@ PassRefPtr<HTMLDetailsElement> HTMLDetailsElement::create(Document& document) |
HTMLDetailsElement::HTMLDetailsElement(Document& document) |
: HTMLElement(detailsTag, document) |
+ , m_toggleEventTimer(this, &HTMLDetailsElement::toggleEventTimerFired) |
, m_isOpen(false) |
{ |
ScriptWrappable::init(this); |
} |
+void HTMLDetailsElement::toggleEventTimerFired(Timer<HTMLDetailsElement> *) |
+{ |
+ dispatchEvent(Event::create(EventTypeNames::toggle)); |
+} |
+ |
+void HTMLDetailsElement::dispatchToggleEventAsync() |
+{ |
+ if (m_toggleEventTimer.isActive()) |
+ m_toggleEventTimer.stop(); |
+ m_toggleEventTimer.startOneShot(0, FROM_HERE); |
+} |
+ |
RenderObject* HTMLDetailsElement::createRenderer(RenderStyle*) |
{ |
return new RenderBlockFlow(this); |
@@ -94,6 +107,10 @@ void HTMLDetailsElement::parseAttribute(const QualifiedName& name, const AtomicS |
m_isOpen = !value.isNull(); |
if (m_isOpen == oldValue) |
return; |
+ |
+ // Dispatch toggle event asynchronously. |
+ dispatchToggleEventAsync(); |
+ |
Element* content = ensureUserAgentShadowRoot().getElementById(ShadowElementNames::detailsContent()); |
ASSERT(content); |
if (m_isOpen) |