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