• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20 
21 #include "config.h"
22 
23 #if ENABLE(WML)
24 #include "WMLTimerElement.h"
25 
26 #include "HTMLNames.h"
27 #include "MappedAttribute.h"
28 #include "WMLCardElement.h"
29 #include "WMLDocument.h"
30 #include "WMLNames.h"
31 #include "WMLPageState.h"
32 #include "WMLTemplateElement.h"
33 #include "WMLVariables.h"
34 
35 namespace WebCore {
36 
37 using namespace WMLNames;
38 
WMLTimerElement(const QualifiedName & tagName,Document * doc)39 WMLTimerElement::WMLTimerElement(const QualifiedName& tagName, Document* doc)
40     : WMLElement(tagName, doc)
41     , m_timer(this, &WMLTimerElement::timerFired)
42 {
43 }
44 
parseMappedAttribute(MappedAttribute * attr)45 void WMLTimerElement::parseMappedAttribute(MappedAttribute* attr)
46 {
47     if (attr->name() == HTMLNames::nameAttr)
48         m_name = parseValueForbiddingVariableReferences(attr->value());
49     else
50         WMLElement::parseMappedAttribute(attr);
51 }
52 
insertedIntoDocument()53 void WMLTimerElement::insertedIntoDocument()
54 {
55     WMLElement::insertedIntoDocument();
56 
57     // If the value of timeout is not a positive integer, ignore it
58     if (value().toInt() <= 0)
59         return;
60 
61     Node* parent = parentNode();
62     if (!parent || !parent->isWMLElement())
63         return;
64 
65     if (parent->hasTagName(cardTag)) {
66         m_card = static_cast<WMLCardElement*>(parent);
67         m_card->setIntrinsicEventTimer(this);
68     }
69 }
70 
removedFromDocument()71 void WMLTimerElement::removedFromDocument()
72 {
73     Node* parent = parentNode();
74     if (parent && parent->isWMLElement() && parent->hasTagName(cardTag)) {
75         m_card->setIntrinsicEventTimer(0);
76         m_card = 0;
77     }
78 
79     WMLElement::removedFromDocument();
80 }
81 
timerFired(Timer<WMLTimerElement> *)82 void WMLTimerElement::timerFired(Timer<WMLTimerElement>*)
83 {
84     if (!m_card)
85         return;
86 
87     WMLPageState* pageState = wmlPageStateForDocument(document());
88     if (!pageState)
89         return;
90 
91     String value = this->value();
92 
93     // When the timer expires, set the name varialbe of timer to '0'
94     if (!m_name.isEmpty()) {
95         value = "0";
96         pageState->storeVariable(m_name, value);
97     }
98 
99     WMLIntrinsicEventType eventType = WMLIntrinsicEventOnTimer;
100     WMLIntrinsicEventHandler* eventHandler = m_card->eventHandler();
101 
102     bool hasIntrinsicEvent = false;
103     if (eventHandler && eventHandler->hasIntrinsicEvent(eventType))
104         hasIntrinsicEvent = true;
105     else if (m_card->templateElement()) {
106         eventHandler = m_card->templateElement()->eventHandler();
107         if (eventHandler && eventHandler->hasIntrinsicEvent(eventType))
108             hasIntrinsicEvent = true;
109     }
110 
111     if (hasIntrinsicEvent)
112         eventHandler->triggerIntrinsicEvent(eventType);
113 }
114 
start(int interval)115 void WMLTimerElement::start(int interval)
116 {
117     if (!m_card || m_timer.isActive())
118         return;
119 
120     if (interval <= 0 && !m_name.isEmpty()) {
121         if (WMLPageState* pageState = wmlPageStateForDocument(document()))
122             interval = pageState->getVariable(m_name).toInt();
123     }
124 
125     if (interval <= 0)
126         interval = value().toInt();
127 
128     if (interval > 0)
129         m_timer.startOneShot(interval / 10.0f);
130 }
131 
stop()132 void WMLTimerElement::stop()
133 {
134     if (m_timer.isActive())
135         m_timer.stop();
136 }
137 
storeIntervalToPageState()138 void WMLTimerElement::storeIntervalToPageState()
139 {
140     if (!m_timer.isActive())
141         return;
142 
143     int interval = static_cast<int>(m_timer.nextFireInterval()) * 10;
144 
145     if (WMLPageState* pageState = wmlPageStateForDocument(document()))
146         pageState->storeVariable(m_name, String::number(interval));
147 }
148 
value() const149 String WMLTimerElement::value() const
150 {
151     return parseValueSubstitutingVariableReferences(getAttribute(HTMLNames::valueAttr));
152 }
153 
154 }
155 
156 #endif
157