15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2001 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2006 Alexey Proskuryakov (ap@nypop.com)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2010 Apple Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Motorola Mobility, Inc.  All rights reserved.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLOptionElement.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h"
315d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeRenderStyle.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeTraversal.h"
35e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "core/dom/ScriptLoader.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Text.h"
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/dom/shadow/ShadowRoot.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLDataListElement.h"
39197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/html/HTMLOptGroupElement.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLSelectElement.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderTheme.h"
43591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/Vector.h"
44591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringBuilder.h"
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)HTMLOptionElement::HTMLOptionElement(Document& document)
5151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    : HTMLElement(optionTag, document)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_disabled(false)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isSelected(false)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    setHasCustomStyleCallbacks();
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)HTMLOptionElement::~HTMLOptionElement()
59c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){
60c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)}
61c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)
62323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLOptionElement> HTMLOptionElement::create(Document& document)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
64197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RefPtrWillBeRawPtr<HTMLOptionElement> option = adoptRefWillBeNoop(new HTMLOptionElement(document));
65197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    option->ensureUserAgentShadowRoot();
66197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return option.release();
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
69323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)PassRefPtrWillBeRawPtr<HTMLOptionElement> HTMLOptionElement::createForJSConstructor(Document& document, const String& data, const AtomicString& value,
7051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    bool defaultSelected, bool selected, ExceptionState& exceptionState)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    RefPtrWillBeRawPtr<HTMLOptionElement> element = adoptRefWillBeNoop(new HTMLOptionElement(document));
73197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    element->ensureUserAgentShadowRoot();
74d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    element->appendChild(Text::create(document, data.isNull() ? "" : data), exceptionState);
7551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
76d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return nullptr;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value.isNull())
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element->setValue(value);
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (defaultSelected)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        element->setAttribute(selectedAttr, emptyAtom);
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    element->setSelected(selected);
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return element.release();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
87521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void HTMLOptionElement::attach(const AttachContext& context)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    AttachContext optionContext(context);
90d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (context.resolvedStyle) {
91d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        ASSERT(!m_style || m_style == context.resolvedStyle);
92d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_style = context.resolvedStyle;
93d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    } else {
94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        updateNonRenderStyle();
95d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        optionContext.resolvedStyle = m_style.get();
96d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
97d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    HTMLElement::attach(optionContext);
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
100521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)void HTMLOptionElement::detach(const AttachContext& context)
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_style.clear();
103521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)    HTMLElement::detach(context);
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLOptionElement::text() const
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1088abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    Document& document = this->document();
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String text;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // WinIE does not use the label attribute, so as a quirk, we ignore it.
1128abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!document.inQuirksMode())
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        text = fastGetAttribute(labelAttr);
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // FIXME: The following treats an element with the label attribute set to
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the empty string the same as an element with no label attribute at all.
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Is that correct? If it is, then should the label function work the same way?
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (text.isEmpty())
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        text = collectOptionInnerText();
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1211e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return text.stripWhiteSpace(isHTMLSpace<UChar>).simplifyWhiteSpace(isHTMLSpace<UChar>);
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void HTMLOptionElement::setText(const String &text, ExceptionState& exceptionState)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
126f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    RefPtrWillBeRawPtr<Node> protectFromMutationEvents(this);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Changing the text causes a recalc of a select's items, which will reset the selected
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // index to the first item if the select is single selection with a menu list. We attempt to
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // preserve the selected item.
131323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RefPtrWillBeRawPtr<HTMLSelectElement> select = ownerSelectElement();
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool selectIsMenuList = select && select->usesMenuList();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int oldSelectedIndex = selectIsMenuList ? select->selectedIndex() : -1;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Handle the common special case where there's exactly 1 child node, and it's a text node.
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Node* child = firstChild();
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (child && child->isTextNode() && !child->nextSibling())
138521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)        toText(child)->setData(text);
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else {
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        removeChildren();
14151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        appendChild(Text::create(document(), text), exceptionState);
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
14302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (selectIsMenuList && select->selectedIndex() != oldSelectedIndex)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        select->setSelectedIndex(oldSelectedIndex);
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLOptionElement::accessKeyAction(bool)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
15009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (HTMLSelectElement* select = ownerSelectElement())
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        select->accessKeySetSelectedIndex(index());
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int HTMLOptionElement::index() const
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // It would be faster to cache the index, but harder to get it right in all cases.
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    HTMLSelectElement* selectElement = ownerSelectElement();
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!selectElement)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int optionIndex = 0;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
164f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& items = selectElement->listItems();
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t length = items.size();
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (size_t i = 0; i < length; ++i) {
167d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        if (!isHTMLOptionElement(*items[i]))
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            continue;
169f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)        if (items[i].get() == this)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return optionIndex;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ++optionIndex;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void HTMLOptionElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (name == valueAttr) {
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (HTMLDataListElement* dataList = ownerDataListElement())
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            dataList->optionElementChildrenChanged();
18293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    } else if (name == disabledAttr) {
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool oldDisabled = m_disabled;
184926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_disabled = !value.isNull();
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (oldDisabled != m_disabled) {
1867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pseudoStateChanged(CSSSelector::PseudoDisabled);
1877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            pseudoStateChanged(CSSSelector::PseudoEnabled);
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            if (renderer() && renderer()->style()->hasAppearance())
189d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)                RenderTheme::theme().stateChanged(renderer(), EnabledControlState);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
191926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    } else if (name == selectedAttr) {
1927757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        if (bool willBeSelected = !value.isNull())
1937757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch            setSelected(willBeSelected);
194197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    } else if (name == labelAttr) {
195197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        updateLabel();
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        HTMLElement::parseAttribute(name, value);
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLOptionElement::value() const
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const AtomicString& value = fastGetAttribute(valueAttr);
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!value.isNull())
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return value;
20506f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return collectOptionInnerText().stripWhiteSpace(isHTMLSpace<UChar>).simplifyWhiteSpace(isHTMLSpace<UChar>);
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
208a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void HTMLOptionElement::setValue(const AtomicString& value)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setAttribute(valueAttr, value);
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool HTMLOptionElement::selected() const
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
21553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (HTMLSelectElement* select = ownerSelectElement()) {
21653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // If a stylesheet contains option:checked selectors, this function is
21753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // called during parsing. updateListItemSelectedStates() is O(N) where N
21853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // is the number of option elements, so the <select> parsing would be
21909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // O(N^2) without the isFinishedParsingChildren check. Also,
22053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // updateListItemSelectedStates() determines default selection, and we'd
22153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // like to avoid to determine default selection with incomplete option
22253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        // list.
22309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (!select->isFinishedParsingChildren())
22453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return m_isSelected;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        select->updateListItemSelectedStates();
22653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    }
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_isSelected;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLOptionElement::setSelected(bool selected)
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_isSelected == selected)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setSelectedState(selected);
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HTMLSelectElement* select = ownerSelectElement())
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        select->optionSelectionStateChanged(this, selected);
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLOptionElement::setSelectedState(bool selected)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_isSelected == selected)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isSelected = selected;
2477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    pseudoStateChanged(CSSSelector::PseudoChecked);
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HTMLSelectElement* select = ownerSelectElement())
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        select->invalidateSelectedItems();
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
253197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HTMLOptionElement::childrenChanged(const ChildrenChange& change)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HTMLDataListElement* dataList = ownerDataListElement())
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dataList->optionElementChildrenChanged();
25793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    else if (HTMLSelectElement* select = ownerSelectElement())
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        select->optionElementChildrenChanged();
259197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    updateLabel();
260197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HTMLElement::childrenChanged(change);
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLDataListElement* HTMLOptionElement::ownerDataListElement() const
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
26507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return Traversal<HTMLDataListElement>::firstAncestor(*this);
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLSelectElement* HTMLOptionElement::ownerSelectElement() const
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
27007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return Traversal<HTMLSelectElement>::firstAncestor(*this);
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLOptionElement::label() const
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const AtomicString& label = fastGetAttribute(labelAttr);
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!label.isNull())
27702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return label;
27806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)    return collectOptionInnerText().stripWhiteSpace(isHTMLSpace<UChar>).simplifyWhiteSpace(isHTMLSpace<UChar>);
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
281a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void HTMLOptionElement::setLabel(const AtomicString& label)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setAttribute(labelAttr, label);
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HTMLOptionElement::updateNonRenderStyle()
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2885267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    m_style = originalStyleForRenderer();
289197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (HTMLSelectElement* select = ownerSelectElement())
290197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        select->updateListOnRenderer();
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)RenderStyle* HTMLOptionElement::nonRendererStyle() const
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_style.get();
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<RenderStyle> HTMLOptionElement::customStyleForRenderer()
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
300d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    updateNonRenderStyle();
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_style;
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
304d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void HTMLOptionElement::didRecalcStyle(StyleRecalcChange change)
30509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
306d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (change == NoChange)
307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return;
30809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
309d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    // FIXME: We ask our owner select to repaint regardless of which property changed.
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HTMLSelectElement* select = ownerSelectElement()) {
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (RenderObject* renderer = select->renderer())
3129e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)            renderer->setShouldDoFullPaintInvalidation(true);
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLOptionElement::textIndentedToRespectGroupLabel() const
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ContainerNode* parent = parentNode();
319d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (parent && isHTMLOptGroupElement(*parent))
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "    " + text();
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return text();
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool HTMLOptionElement::isDisabledFormControl() const
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ownElementDisabled())
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
328591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (Element* parent = parentElement())
329d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return isHTMLOptGroupElement(*parent) && parent->isDisabledFormControl();
330591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return false;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Node::InsertionNotificationRequest HTMLOptionElement::insertedInto(ContainerNode* insertionPoint)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HTMLSelectElement* select = ownerSelectElement()) {
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        select->setRecalcListItems();
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Do not call selected() since calling updateListItemSelectedStates()
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // at this time won't do the right thing. (Why, exactly?)
3397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        if (m_isSelected) {
3407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // FIXME: Might be better to call this unconditionally, always
3417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // passing m_isSelected, rather than only calling it if we are
3427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            // selected.
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            select->optionSelectionStateChanged(this, true);
3447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            select->scrollToSelection();
3457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        }
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return HTMLElement::insertedInto(insertionPoint);
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
351197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HTMLOptionElement::removedFrom(ContainerNode* insertionPoint)
352197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
353c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    if (HTMLSelectElement* select = Traversal<HTMLSelectElement>::firstAncestorOrSelf(*insertionPoint)) {
354c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        select->setRecalcListItems();
355197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        select->optionRemoved(*this);
356c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    }
357197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HTMLElement::removedFrom(insertionPoint);
358197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
359197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HTMLOptionElement::collectOptionInnerText() const
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    StringBuilder text;
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Node* node = firstChild(); node; ) {
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (node->isTextNode())
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            text.append(node->nodeValue());
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Text nodes inside script elements are not part of the option text.
367e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch        if (node->isElementNode() && toScriptLoaderIfPossible(toElement(node)))
36851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            node = NodeTraversal::nextSkippingChildren(*node, this);
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
37051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            node = NodeTraversal::next(*node, this);
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return text.toString();
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)HTMLFormElement* HTMLOptionElement::form() const
37609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (HTMLSelectElement* selectElement = ownerSelectElement())
37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return selectElement->formOwner();
37909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
38009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return 0;
38109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
38209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
383197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HTMLOptionElement::didAddUserAgentShadowRoot(ShadowRoot& root)
3846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
385197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    updateLabel();
386197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
387197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
388197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HTMLOptionElement::updateLabel()
389197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
390197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (ShadowRoot* root = userAgentShadowRoot())
391197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        root->setTextContent(textIndentedToRespectGroupLabel());
392197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
393197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
394197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool HTMLOptionElement::spatialNavigationFocused() const
395197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
396197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HTMLSelectElement* select = ownerSelectElement();
397197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!select || !select->focused())
398197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return false;
399197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return select->spatialNavigationFocusedOption() == this;
4006f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
4016f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
402e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)bool HTMLOptionElement::isDisplayNone() const
403e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles){
404e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // If m_style is not set, then the node is still unattached.
405e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    // We have to wait till it gets attached to read the display property.
406e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!m_style)
407e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return false;
408e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
409e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (m_style->display() != NONE) {
410e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        Element* parent = parentElement();
411e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        ASSERT(parent);
412e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        if (isHTMLOptGroupElement(*parent)) {
413e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            RenderStyle* parentStyle = parent->renderStyle() ? parent->renderStyle() : parent->computedStyle();
414e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            return !parentStyle || parentStyle->display() == NONE;
415e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        }
416e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    }
417e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return m_style->display() == NONE;
418e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)}
419e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
420c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
421