1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/** 2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is free software; you can redistribute it and/or 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modify it under the terms of the GNU Library General Public 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * License as published by the Free Software Foundation; either 7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * version 2 of the License, or (at your option) any later version. 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * This library is distributed in the hope that it will be useful, 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Library General Public License for more details. 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * You should have received a copy of the GNU Library General Public License 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * along with this library; see the file COPYING.LIB. If not, write to 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Boston, MA 02110-1301, USA. 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "config.h" 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(WML) 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLTimerElement.h" 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 26e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block#include "Attribute.h" 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "HTMLNames.h" 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLCardElement.h" 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLDocument.h" 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLNames.h" 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLPageState.h" 32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLTemplateElement.h" 33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "WMLVariables.h" 34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace WebCore { 36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectusing namespace WMLNames; 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectWMLTimerElement::WMLTimerElement(const QualifiedName& tagName, Document* doc) 40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project : WMLElement(tagName, doc) 41635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , m_timer(this, &WMLTimerElement::timerFired) 42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 455ddde30071f639962dd557c453f2ad01f8f0fd00Kristian MonsenPassRefPtr<WMLTimerElement> WMLTimerElement::create(const QualifiedName& tagName, Document* document) 465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen{ 475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen return adoptRef(new WMLTimerElement(tagName, document)); 485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen} 495ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen 50e78cbe89e6f337f2f1fe40315be88f742b547151Steve Blockvoid WMLTimerElement::parseMappedAttribute(Attribute* attr) 51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (attr->name() == HTMLNames::nameAttr) 53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_name = parseValueForbiddingVariableReferences(attr->value()); 54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else 55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WMLElement::parseMappedAttribute(attr); 56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLTimerElement::insertedIntoDocument() 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WMLElement::insertedIntoDocument(); 61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // If the value of timeout is not a positive integer, ignore it 630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (value().toInt() <= 0) 64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 66a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ContainerNode* parent = parentNode(); 67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!parent || !parent->isWMLElement()) 68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (parent->hasTagName(cardTag)) { 71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_card = static_cast<WMLCardElement*>(parent); 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_card->setIntrinsicEventTimer(this); 73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid WMLTimerElement::removedFromDocument() 770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 78a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch ContainerNode* parent = parentNode(); 790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (parent && parent->isWMLElement() && parent->hasTagName(cardTag)) { 800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_card->setIntrinsicEventTimer(0); 810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch m_card = 0; 820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch WMLElement::removedFromDocument(); 850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLTimerElement::timerFired(Timer<WMLTimerElement>*) 88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_card) 90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WMLPageState* pageState = wmlPageStateForDocument(document()); 93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!pageState) 94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch String value = this->value(); 970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // When the timer expires, set the name varialbe of timer to '0' 99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_name.isEmpty()) { 1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch value = "0"; 1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch pageState->storeVariable(m_name, value); 102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WMLIntrinsicEventType eventType = WMLIntrinsicEventOnTimer; 105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WMLIntrinsicEventHandler* eventHandler = m_card->eventHandler(); 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool hasIntrinsicEvent = false; 108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (eventHandler && eventHandler->hasIntrinsicEvent(eventType)) 109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project hasIntrinsicEvent = true; 110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project else if (m_card->templateElement()) { 111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project eventHandler = m_card->templateElement()->eventHandler(); 112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (eventHandler && eventHandler->hasIntrinsicEvent(eventType)) 113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project hasIntrinsicEvent = true; 114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (hasIntrinsicEvent) 117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project eventHandler->triggerIntrinsicEvent(eventType); 118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLTimerElement::start(int interval) 121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_card || m_timer.isActive()) 123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (interval <= 0 && !m_name.isEmpty()) { 126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (WMLPageState* pageState = wmlPageStateForDocument(document())) 127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project interval = pageState->getVariable(m_name).toInt(); 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (interval <= 0) 1310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch interval = value().toInt(); 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (interval > 0) 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_timer.startOneShot(interval / 10.0f); 135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLTimerElement::stop() 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (m_timer.isActive()) 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project m_timer.stop(); 141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid WMLTimerElement::storeIntervalToPageState() 144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!m_timer.isActive()) 146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return; 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int interval = static_cast<int>(m_timer.nextFireInterval()) * 10; 149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (WMLPageState* pageState = wmlPageStateForDocument(document())) 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project pageState->storeVariable(m_name, String::number(interval)); 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochString WMLTimerElement::value() const 1550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 1560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return parseValueSubstitutingVariableReferences(getAttribute(HTMLNames::valueAttr)); 1570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} 1580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 162