OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010, 2011 Nokia Corporation and/or its subsidiary(-ies) | 2 * Copyright (C) 2010, 2011 Nokia Corporation and/or its subsidiary(-ies) |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 29 matching lines...) Expand all Loading... |
40 | 40 |
41 PassRefPtr<HTMLDetailsElement> HTMLDetailsElement::create(Document& document) | 41 PassRefPtr<HTMLDetailsElement> HTMLDetailsElement::create(Document& document) |
42 { | 42 { |
43 RefPtr<HTMLDetailsElement> details = adoptRef(new HTMLDetailsElement(documen
t)); | 43 RefPtr<HTMLDetailsElement> details = adoptRef(new HTMLDetailsElement(documen
t)); |
44 details->ensureUserAgentShadowRoot(); | 44 details->ensureUserAgentShadowRoot(); |
45 return details.release(); | 45 return details.release(); |
46 } | 46 } |
47 | 47 |
48 HTMLDetailsElement::HTMLDetailsElement(Document& document) | 48 HTMLDetailsElement::HTMLDetailsElement(Document& document) |
49 : HTMLElement(detailsTag, document) | 49 : HTMLElement(detailsTag, document) |
| 50 , m_toggleEventTimer(this, &HTMLDetailsElement::toggleEventTimerFired) |
50 , m_isOpen(false) | 51 , m_isOpen(false) |
51 { | 52 { |
52 ScriptWrappable::init(this); | 53 ScriptWrappable::init(this); |
53 } | 54 } |
54 | 55 |
| 56 void HTMLDetailsElement::toggleEventTimerFired(Timer<HTMLDetailsElement> *) |
| 57 { |
| 58 dispatchEvent(Event::create(EventTypeNames::toggle)); |
| 59 } |
| 60 |
| 61 void HTMLDetailsElement::dispatchToggleEventAsync() |
| 62 { |
| 63 if (m_toggleEventTimer.isActive()) |
| 64 m_toggleEventTimer.stop(); |
| 65 m_toggleEventTimer.startOneShot(0, FROM_HERE); |
| 66 } |
| 67 |
55 RenderObject* HTMLDetailsElement::createRenderer(RenderStyle*) | 68 RenderObject* HTMLDetailsElement::createRenderer(RenderStyle*) |
56 { | 69 { |
57 return new RenderBlockFlow(this); | 70 return new RenderBlockFlow(this); |
58 } | 71 } |
59 | 72 |
60 void HTMLDetailsElement::didAddUserAgentShadowRoot(ShadowRoot& root) | 73 void HTMLDetailsElement::didAddUserAgentShadowRoot(ShadowRoot& root) |
61 { | 74 { |
62 DEFINE_STATIC_LOCAL(const AtomicString, summarySelector, ("summary:first-of-
type", AtomicString::ConstructFromLiteral)); | 75 DEFINE_STATIC_LOCAL(const AtomicString, summarySelector, ("summary:first-of-
type", AtomicString::ConstructFromLiteral)); |
63 | 76 |
64 RefPtr<HTMLSummaryElement> defaultSummary = HTMLSummaryElement::create(docum
ent()); | 77 RefPtr<HTMLSummaryElement> defaultSummary = HTMLSummaryElement::create(docum
ent()); |
(...skipping 22 matching lines...) Expand all Loading... |
87 return toElement(content->firstChild()); | 100 return toElement(content->firstChild()); |
88 } | 101 } |
89 | 102 |
90 void HTMLDetailsElement::parseAttribute(const QualifiedName& name, const AtomicS
tring& value) | 103 void HTMLDetailsElement::parseAttribute(const QualifiedName& name, const AtomicS
tring& value) |
91 { | 104 { |
92 if (name == openAttr) { | 105 if (name == openAttr) { |
93 bool oldValue = m_isOpen; | 106 bool oldValue = m_isOpen; |
94 m_isOpen = !value.isNull(); | 107 m_isOpen = !value.isNull(); |
95 if (m_isOpen == oldValue) | 108 if (m_isOpen == oldValue) |
96 return; | 109 return; |
| 110 |
| 111 // Dispatch toggle event asynchronously. |
| 112 dispatchToggleEventAsync(); |
| 113 |
97 Element* content = ensureUserAgentShadowRoot().getElementById(ShadowElem
entNames::detailsContent()); | 114 Element* content = ensureUserAgentShadowRoot().getElementById(ShadowElem
entNames::detailsContent()); |
98 ASSERT(content); | 115 ASSERT(content); |
99 if (m_isOpen) | 116 if (m_isOpen) |
100 content->removeInlineStyleProperty(CSSPropertyDisplay); | 117 content->removeInlineStyleProperty(CSSPropertyDisplay); |
101 else | 118 else |
102 content->setInlineStyleProperty(CSSPropertyDisplay, CSSValueNone); | 119 content->setInlineStyleProperty(CSSPropertyDisplay, CSSValueNone); |
103 Element* summary = ensureUserAgentShadowRoot().getElementById(ShadowElem
entNames::detailsSummary()); | 120 Element* summary = ensureUserAgentShadowRoot().getElementById(ShadowElem
entNames::detailsSummary()); |
104 ASSERT(summary); | 121 ASSERT(summary); |
105 // FIXME: DetailsMarkerControl's RenderDetailsMarker has no concept of b
eing updated | 122 // FIXME: DetailsMarkerControl's RenderDetailsMarker has no concept of b
eing updated |
106 // without recreating it causing a repaint. Instead we should change it
so we can tell | 123 // without recreating it causing a repaint. Instead we should change it
so we can tell |
107 // it to toggle the open/closed triangle state and avoid reattaching the
entire summary. | 124 // it to toggle the open/closed triangle state and avoid reattaching the
entire summary. |
108 summary->lazyReattachIfAttached(); | 125 summary->lazyReattachIfAttached(); |
109 return; | 126 return; |
110 } | 127 } |
111 HTMLElement::parseAttribute(name, value); | 128 HTMLElement::parseAttribute(name, value); |
112 } | 129 } |
113 | 130 |
114 void HTMLDetailsElement::toggleOpen() | 131 void HTMLDetailsElement::toggleOpen() |
115 { | 132 { |
116 setAttribute(openAttr, m_isOpen ? nullAtom : emptyAtom); | 133 setAttribute(openAttr, m_isOpen ? nullAtom : emptyAtom); |
117 } | 134 } |
118 | 135 |
119 bool HTMLDetailsElement::isInteractiveContent() const | 136 bool HTMLDetailsElement::isInteractiveContent() const |
120 { | 137 { |
121 return true; | 138 return true; |
122 } | 139 } |
123 | 140 |
124 } | 141 } |
OLD | NEW |