18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2001 Dirk Mueller (mueller@kde.org)
55af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke * Copyright (C) 2004, 2005, 2006, 2010 Apple Inc. All rights reserved.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLLegendElement.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HTMLNames.h"
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/StdLibExtras.h>
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames;
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
355af96e2c7b73ebc627c6894727826a7576d31758Leon Clarkeinline HTMLLegendElement::HTMLLegendElement(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
365af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    : HTMLFormControlElement(tagName, document, form)
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    ASSERT(hasTagName(legendTag));
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
415af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkePassRefPtr<HTMLLegendElement> HTMLLegendElement::create(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    return adoptRef(new HTMLLegendElement(tagName, document, form));
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockbool HTMLLegendElement::supportsFocus() const
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
48231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return HTMLElement::supportsFocus();
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qianconst AtomicString& HTMLLegendElement::formControlType() const
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    DEFINE_STATIC_LOCAL(const AtomicString, legend, ("legend"));
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return legend;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
575af96e2c7b73ebc627c6894727826a7576d31758Leon ClarkeHTMLFormControlElement* HTMLLegendElement::associatedControl()
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check if there's a fieldset belonging to this legend.
60a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    ContainerNode* fieldset = parentNode();
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (fieldset && !fieldset->hasTagName(fieldsetTag))
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        fieldset = fieldset->parentNode();
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!fieldset)
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // Find first form element inside the fieldset that is not a legend element.
675af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // FIXME: Should we consider tabindex?
685af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    Node* node = fieldset;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((node = node->traverseNextNode(fieldset))) {
705af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        if (node->isElementNode()) {
715af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke            Element* element = static_cast<Element*>(node);
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            if (!element->hasLocalName(legendTag) && element->isFormControlElement())
735af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke                return static_cast<HTMLFormControlElement*>(element);
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLLegendElement::focus(bool)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (isFocusable())
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Element::focus();
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
855af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    // To match other browsers' behavior, never restore previous selection.
865af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (HTMLFormControlElement* control = associatedControl())
875af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        control->focus(false);
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid HTMLLegendElement::accessKeyAction(bool sendToAnyElement)
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
925af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke    if (HTMLFormControlElement* control = associatedControl())
935af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        control->accessKeyAction(sendToAnyElement);
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace
97