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