128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu/* 228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * Copyright (c) 2010 Google Inc. All rights reserved. 328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * 428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * Redistribution and use in source and binary forms, with or without 528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * modification, are permitted provided that the following conditions are 628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * met: 728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * 828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * * Redistributions of source code must retain the above copyright 928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * notice, this list of conditions and the following disclaimer. 1028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * * Redistributions in binary form must reproduce the above 1128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * copyright notice, this list of conditions and the following disclaimer 1228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * in the documentation and/or other materials provided with the 1328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * distribution. 1428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * * Neither the name of Google Inc. nor the names of its 1528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * contributors may be used to endorse or promote products derived from 1628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * this software without specific prior written permission. 1728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * 1828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu */ 3028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 3128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "config.h" 3228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "HTMLOutputElement.h" 3328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 3428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "HTMLFormElement.h" 3528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu#include "HTMLNames.h" 3628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 3728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhunamespace WebCore { 3828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 3928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuinline HTMLOutputElement::HTMLOutputElement(const QualifiedName& tagName, Document* document, HTMLFormElement* form) 4028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu : HTMLFormControlElement(tagName, document, form) 4128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu , m_isDefaultValueMode(true) 4228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu , m_isSetTextContentInProgress(false) 434576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang , m_defaultValue("") 4428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu , m_tokens(DOMSettableTokenList::create()) 4528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 4628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 4728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 4828040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuPassRefPtr<HTMLOutputElement> HTMLOutputElement::create(const QualifiedName& tagName, Document* document, HTMLFormElement* form) 4928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 5028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return adoptRef(new HTMLOutputElement(tagName, document, form)); 5128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 5228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 5328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuconst AtomicString& HTMLOutputElement::formControlType() const 5428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 5528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu DEFINE_STATIC_LOCAL(const AtomicString, output, ("output")); 5628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return output; 5728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 5828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 5928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid HTMLOutputElement::parseMappedAttribute(Attribute* attr) 6028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 6128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (attr->name() == HTMLNames::forAttr) 6228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu setFor(attr->value()); 6328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu else 6428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu HTMLFormControlElement::parseMappedAttribute(attr); 6528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 6628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 6728040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuDOMSettableTokenList* HTMLOutputElement::htmlFor() const 6828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 6928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return m_tokens.get(); 7028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 7128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 7228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid HTMLOutputElement::setFor(const String& value) 7328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 7428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_tokens->setValue(value); 7528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 7628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 772fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid HTMLOutputElement::childrenChanged(bool createdByParser, Node* beforeChange, Node* afterChange, int childCountDelta) 7828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 7928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (createdByParser || m_isSetTextContentInProgress) { 8028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_isSetTextContentInProgress = false; 8128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return; 8228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu } 8328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 8428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu if (m_isDefaultValueMode) 8528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_defaultValue = textContent(); 862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block HTMLFormControlElement::childrenChanged(createdByParser, beforeChange, afterChange, childCountDelta); 8728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 8828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 8928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid HTMLOutputElement::reset() 9028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 9128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // The reset algorithm for output elements is to set the element's 9228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // value mode flag to "default" and then to set the element's textContent 9328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // attribute to the default value. 9428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_isDefaultValueMode = true; 954576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (m_defaultValue == value()) 964576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 9728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu setTextContentInternal(m_defaultValue); 9828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 9928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 10028040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuString HTMLOutputElement::value() const 10128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 10228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return textContent(); 10328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 10428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 10528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid HTMLOutputElement::setValue(const String& value) 10628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 10728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu // The value mode flag set to "value" when the value attribute is set. 10828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_isDefaultValueMode = false; 1094576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (value == this->value()) 1104576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 11128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu setTextContentInternal(value); 11228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 11328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 11428040489d744e0c5d475a88663056c9040ed5320Teng-Hui ZhuString HTMLOutputElement::defaultValue() const 11528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 11628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu return m_defaultValue; 11728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 11828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 11928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid HTMLOutputElement::setDefaultValue(const String& value) 12028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 1214576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (m_defaultValue == value) 1224576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang return; 1234576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang m_defaultValue = value; 1244576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // The spec requires the value attribute set to the default value 1254576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang // when the element's value mode flag to "default". 1264576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang if (m_isDefaultValueMode) 1274576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang setTextContentInternal(value); 12828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 12928040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 13028040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhuvoid HTMLOutputElement::setTextContentInternal(const String& value) 13128040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu{ 13228040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ASSERT(!m_isSetTextContentInProgress); 13328040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu ExceptionCode ec; 13428040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu m_isSetTextContentInProgress = true; 13528040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu setTextContent(value, ec); 13628040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} 13728040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu 13828040489d744e0c5d475a88663056c9040ed5320Teng-Hui Zhu} // namespace 139