HTMLLegendElement.cpp revision 5af96e2c7b73ebc627c6894727826a7576d31758
1932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang/*
2932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang *           (C) 2001 Dirk Mueller (mueller@kde.org)
5932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * Copyright (C) 2004, 2005, 2006, 2010 Apple Inc. All rights reserved.
6932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
7932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang *
8932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * This library is free software; you can redistribute it and/or
9932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * modify it under the terms of the GNU Library General Public
10932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * License as published by the Free Software Foundation; either
11932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * version 2 of the License, or (at your option) any later version.
12932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang *
13932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * This library is distributed in the hope that it will be useful,
14932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * but WITHOUT ANY WARRANTY; without even the implied warranty of
15932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang * Library General Public License for more details.
17105a9d2c57759532f70baa8b47b594f86a2a15a2Carl Shapiro *
18105a9d2c57759532f70baa8b47b594f86a2a15a2Carl Shapiro * You should have received a copy of the GNU Library General Public License
1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao * along with this library; see the file COPYING.LIB.  If not, write to
20210a1ef6791db6d19856256346a318e8ba8b5ad9Shih-wei Liao * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao * Boston, MA 02110-1301, USA.
22eac346ddd3c7cf7b4992b973e7160cb351fe1777Logan *
2394bf1c1882a5f5dbc57faa4898b10312d704857bShih-wei Liao */
24bc5ed67ad0b0c96c3b72aefdc188fde97a7aa722Shih-wei Liao
25bc5ed67ad0b0c96c3b72aefdc188fde97a7aa722Shih-wei Liao#include "config.h"
26cd61af3513b64e6eb0cbfbb4e0182f898bae91edShih-wei Liao#include "HTMLLegendElement.h"
272c06c3ef2b23e48dcdf527c823e1debf7bc52596Ying Wang
28cd61af3513b64e6eb0cbfbb4e0182f898bae91edShih-wei Liao#include "HTMLNames.h"
29cf3e5219a81a19773bc36368876deb378ad513bfLogan#include <wtf/StdLibExtras.h>
30cf3e5219a81a19773bc36368876deb378ad513bfLogan
31f7f0ac5d3e12b2e84bd18aa32add4a11bf296dbbLogannamespace WebCore {
32a27a83f2b01b1710238d077dc9dfd7655f4513cdLogan
33cf3e5219a81a19773bc36368876deb378ad513bfLoganusing namespace HTMLNames;
34cf3e5219a81a19773bc36368876deb378ad513bfLogan
35cf3e5219a81a19773bc36368876deb378ad513bfLoganinline HTMLLegendElement::HTMLLegendElement(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
36cf3e5219a81a19773bc36368876deb378ad513bfLogan    : HTMLFormControlElement(tagName, document, form)
37ef9e4f7b23f110093bce85b92d8522d496676098Logan{
38cf3e5219a81a19773bc36368876deb378ad513bfLogan    ASSERT(hasTagName(legendTag));
39cf3e5219a81a19773bc36368876deb378ad513bfLogan}
402a6dc82a465631f82fc589c6bc68c15ed264f7ebLogan
41f7f0ac5d3e12b2e84bd18aa32add4a11bf296dbbLoganPassRefPtr<HTMLLegendElement> HTMLLegendElement::create(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
4275cc8a5c58b3260e530eae9f2edd502b71d25373Logan{
43cf3e5219a81a19773bc36368876deb378ad513bfLogan    return new HTMLLegendElement(tagName, document, form);
44cf3e5219a81a19773bc36368876deb378ad513bfLogan}
4552fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao
4652fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liaobool HTMLLegendElement::supportsFocus() const
4752fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao{
4852fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao    return HTMLElement::supportsFocus();
4952fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao}
5052fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao
5152fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liaoconst AtomicString& HTMLLegendElement::formControlType() const
5252fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao{
5352fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao    DEFINE_STATIC_LOCAL(const AtomicString, legend, ("legend"));
5452fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao    return legend;
5552fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao}
5652fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei Liao
5752fb1e93af048acde6405038fe8bfabfd8c45a0fShih-wei LiaoString HTMLLegendElement::accessKey() const
5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{
5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao    return getAttribute(accesskeyAttr);
6077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}
6177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao
6277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaovoid HTMLLegendElement::setAccessKey(const String &value)
63932648d528f333d43defdf16b3f8e84afa865cc8Zonr Chang{
6461cb230180231bbcff0166ebc90ca8e16aba05dcLogan    setAttribute(accesskeyAttr, value);
65cf3e5219a81a19773bc36368876deb378ad513bfLogan}
6661cb230180231bbcff0166ebc90ca8e16aba05dcLogan
6761cb230180231bbcff0166ebc90ca8e16aba05dcLoganString HTMLLegendElement::align() const
6861cb230180231bbcff0166ebc90ca8e16aba05dcLogan{
6961cb230180231bbcff0166ebc90ca8e16aba05dcLogan    return getAttribute(alignAttr);
7061cb230180231bbcff0166ebc90ca8e16aba05dcLogan}
7161cb230180231bbcff0166ebc90ca8e16aba05dcLogan
7261cb230180231bbcff0166ebc90ca8e16aba05dcLoganvoid HTMLLegendElement::setAlign(const String &value)
7361cb230180231bbcff0166ebc90ca8e16aba05dcLogan{
7461cb230180231bbcff0166ebc90ca8e16aba05dcLogan    setAttribute(alignAttr, value);
7561cb230180231bbcff0166ebc90ca8e16aba05dcLogan}
7661cb230180231bbcff0166ebc90ca8e16aba05dcLogan
7761cb230180231bbcff0166ebc90ca8e16aba05dcLoganHTMLFormControlElement* HTMLLegendElement::associatedControl()
7861cb230180231bbcff0166ebc90ca8e16aba05dcLogan{
7961cb230180231bbcff0166ebc90ca8e16aba05dcLogan    // Check if there's a fieldset belonging to this legend.
8061cb230180231bbcff0166ebc90ca8e16aba05dcLogan    Node* fieldset = parentNode();
8161cb230180231bbcff0166ebc90ca8e16aba05dcLogan    while (fieldset && !fieldset->hasTagName(fieldsetTag))
8261cb230180231bbcff0166ebc90ca8e16aba05dcLogan        fieldset = fieldset->parentNode();
8361cb230180231bbcff0166ebc90ca8e16aba05dcLogan    if (!fieldset)
8461cb230180231bbcff0166ebc90ca8e16aba05dcLogan        return 0;
8561cb230180231bbcff0166ebc90ca8e16aba05dcLogan
8661cb230180231bbcff0166ebc90ca8e16aba05dcLogan    // Find first form element inside the fieldset that is not a legend element.
8761cb230180231bbcff0166ebc90ca8e16aba05dcLogan    // FIXME: Should we consider tabindex?
8861cb230180231bbcff0166ebc90ca8e16aba05dcLogan    Node* node = fieldset;
8961cb230180231bbcff0166ebc90ca8e16aba05dcLogan    while ((node = node->traverseNextNode(fieldset))) {
9061cb230180231bbcff0166ebc90ca8e16aba05dcLogan        if (node->isElementNode()) {
9161cb230180231bbcff0166ebc90ca8e16aba05dcLogan            Element* element = static_cast<Element*>(node);
9261cb230180231bbcff0166ebc90ca8e16aba05dcLogan            if (!element->hasLocalName(legendTag) && element->isFormControlElement())
9361cb230180231bbcff0166ebc90ca8e16aba05dcLogan                return static_cast<HTMLFormControlElement*>(element);
9461cb230180231bbcff0166ebc90ca8e16aba05dcLogan        }
9561cb230180231bbcff0166ebc90ca8e16aba05dcLogan    }
9661cb230180231bbcff0166ebc90ca8e16aba05dcLogan
9761cb230180231bbcff0166ebc90ca8e16aba05dcLogan    return 0;
9861cb230180231bbcff0166ebc90ca8e16aba05dcLogan}
9961cb230180231bbcff0166ebc90ca8e16aba05dcLogan
10061cb230180231bbcff0166ebc90ca8e16aba05dcLoganvoid HTMLLegendElement::focus(bool)
10161cb230180231bbcff0166ebc90ca8e16aba05dcLogan{
10261cb230180231bbcff0166ebc90ca8e16aba05dcLogan    if (isFocusable())
10361cb230180231bbcff0166ebc90ca8e16aba05dcLogan        Element::focus();
10461cb230180231bbcff0166ebc90ca8e16aba05dcLogan
10561cb230180231bbcff0166ebc90ca8e16aba05dcLogan    // To match other browsers' behavior, never restore previous selection.
10661cb230180231bbcff0166ebc90ca8e16aba05dcLogan    if (HTMLFormControlElement* control = associatedControl())
10761cb230180231bbcff0166ebc90ca8e16aba05dcLogan        control->focus(false);
10861cb230180231bbcff0166ebc90ca8e16aba05dcLogan}
10961cb230180231bbcff0166ebc90ca8e16aba05dcLogan
11061cb230180231bbcff0166ebc90ca8e16aba05dcLoganvoid HTMLLegendElement::accessKeyAction(bool sendToAnyElement)
11161cb230180231bbcff0166ebc90ca8e16aba05dcLogan{
11261cb230180231bbcff0166ebc90ca8e16aba05dcLogan    if (HTMLFormControlElement* control = associatedControl())
11361cb230180231bbcff0166ebc90ca8e16aba05dcLogan        control->accessKeyAction(sendToAnyElement);
11461cb230180231bbcff0166ebc90ca8e16aba05dcLogan}
11561cb230180231bbcff0166ebc90ca8e16aba05dcLogan
11661cb230180231bbcff0166ebc90ca8e16aba05dcLogan} // namespace
11761cb230180231bbcff0166ebc90ca8e16aba05dcLogan