15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 1999 Antti Koivisto (koivisto@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *           (C) 2000 Dirk Mueller (mueller@kde.org)
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2011 Apple Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef HTMLSelectElement_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define HTMLSelectElement_h
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "core/html/HTMLContentElement.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormControlElementWithState.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLOptionsCollection.h"
3206f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)#include "core/html/forms/TypeAhead.h"
33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "wtf/Vector.h"
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass AutoscrollController;
38df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLOptionElement;
40197021e6b966cfb06891637935ef33fff06433d1Ben Murdochclass MouseEvent;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass HTMLSelectElement FINAL : public HTMLFormControlElementWithState, public TypeAheadDataSource {
437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    DEFINE_WRAPPERTYPEINFO();
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
45323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    static PassRefPtrWillBeRawPtr<HTMLSelectElement> create(Document&);
46323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    static PassRefPtrWillBeRawPtr<HTMLSelectElement> create(Document&, HTMLFormElement*);
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int selectedIndex() const;
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSelectedIndex(int);
5043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    int suggestedIndex() const;
5143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    void setSuggestedIndex(int);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void optionSelectedByUser(int index, bool dispatchChangeEvent, bool allowMultipleSelection = false);
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For ValidityState
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String validationMessage() const OVERRIDE;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool valueMissing() const OVERRIDE;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    virtual void resetImpl() OVERRIDE;
60591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned length() const;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int size() const { return m_size; }
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool multiple() const { return m_multiple; }
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool usesMenuList() const;
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
68df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void add(HTMLElement*, HTMLElement* beforeElement, ExceptionState&);
6907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void addBeforeOptionAtIndex(HTMLElement*, int beforeIndex, ExceptionState&);
70c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)
71c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    using Node::remove;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void remove(int index);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String value() const;
7507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void setValue(const String&, bool sendEvents = false);
7643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    String suggestedValue() const;
7743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    void setSuggestedValue(const String&);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
79d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    PassRefPtrWillBeRawPtr<HTMLOptionsCollection> options();
80d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    PassRefPtrWillBeRawPtr<HTMLCollection> selectedOptions();
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void optionElementChildrenChanged();
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setRecalcListItems();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void invalidateSelectedItems();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateListItemSelectedStates();
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    const WillBeHeapVector<RawPtrWillBeMember<HTMLElement> >& listItems() const;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void accessKeyAction(bool sendMouseEvents) OVERRIDE;
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void accessKeySetSelectedIndex(int);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setMultiple(bool);
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSize(int);
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setOption(unsigned index, HTMLOptionElement*, ExceptionState&);
98df95704c49daea886ddad70775bda23618d6274dBen Murdoch    void setLength(unsigned, ExceptionState&);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* namedItem(const AtomicString& name);
1019e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    HTMLOptionElement* item(unsigned index);
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void scrollToSelection();
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void scrollTo(int listIndex);
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
106e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    void listBoxSelectItem(int listIndex, bool allowMultiplySelections, bool shift, bool fireOnChangeNow = true);
107e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool canSelectAll() const;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void selectAll();
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int listToOptionIndex(int listIndex) const;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void listBoxOnChange();
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int optionToListIndex(int optionIndex) const;
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int activeSelectionStartListIndex() const;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int activeSelectionEndListIndex() const;
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setActiveSelectionAnchorIndex(int);
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setActiveSelectionEndIndex(int);
11702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For use in the implementation of HTMLOptionElement.
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void optionSelectionStateChanged(HTMLOptionElement*, bool optionIsSelected);
120197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void optionRemoved(const HTMLOptionElement&);
121f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    bool anonymousIndexedSetter(unsigned, PassRefPtrWillBeRawPtr<HTMLOptionElement>, ExceptionState&);
122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1236f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    void updateListOnRenderer();
124f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)
125197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    HTMLOptionElement* spatialNavigationFocusedOption();
126197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void handleMouseRelease();
127197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
128f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
129f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
13109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    HTMLSelectElement(Document&, HTMLFormElement*);
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
13409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual const AtomicString& formControlType() const OVERRIDE;
13502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
136591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    virtual bool shouldShowFocusRingOnMouseFocus() const OVERRIDE;
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void dispatchFocusEvent(Element* oldFocusedElement, FocusType) OVERRIDE;
13902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    virtual void dispatchBlurEvent(Element* newFocusedElemnet) OVERRIDE;
14002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool canStartSelection() const OVERRIDE { return false; }
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
14309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isEnumeratable() const OVERRIDE { return true; }
144bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    virtual bool isInteractiveContent() const OVERRIDE;
14509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool supportsAutofocus() const OVERRIDE;
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool supportLabels() const OVERRIDE { return true; }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual FormControlState saveFormControlState() const OVERRIDE;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void restoreFormControlState(const FormControlState&) OVERRIDE;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isPresentationAttribute(const QualifiedName&) const OVERRIDE;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual RenderObject* createRenderer(RenderStyle*) OVERRIDE;
15509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool appendFormData(FormDataList&, bool) OVERRIDE;
156197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    virtual void didAddUserAgentShadowRoot(ShadowRoot&) OVERRIDE;
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void defaultEventHandler(Event*) OVERRIDE;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void dispatchInputAndChangeEventForMenuList(bool requiresUserGesture = true);
16102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void recalcListItems(bool updateSelectedStates = true) const;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void typeAheadFind(KeyboardEvent*);
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void saveLastSelection();
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isOptionalFormControl() const OVERRIDE { return !isRequiredFormControl(); }
17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual bool isRequiredFormControl() const OVERRIDE;
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasPlaceholderLabelOption() const;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum SelectOptionFlag {
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        DeselectOtherOptions = 1 << 0,
176d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        DispatchInputAndChangeEvent = 1 << 1,
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        UserDriven = 1 << 2,
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef unsigned SelectOptionFlags;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void selectOption(int optionIndex, SelectOptionFlags = 0);
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void deselectItemsWithoutValidation(HTMLElement* elementToExclude = 0);
182926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void parseMultipleAttribute(const AtomicString&);
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int lastSelectedListIndex() const;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateSelectedState(int listIndex, bool multi, bool shift);
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void menuListDefaultEventHandler(Event*);
186197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    void handlePopupOpenKeyboardEvent(Event*);
187197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool shouldOpenPopupForKeyDownEvent(KeyboardEvent*);
188197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    bool shouldOpenPopupForKeyPressEvent(KeyboardEvent*);
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void listBoxDefaultEventHandler(Event*);
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setOptionsChangedOnRenderer();
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    size_t searchOptionsForValue(const String&, size_t listIndexStart, size_t listIndexEnd) const;
192f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch    void updateListBoxSelection(bool deselectOtherOptions, bool scroll = true);
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum SkipDirection {
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SkipBackwards = -1,
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        SkipForwards = 1
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int nextValidIndex(int listIndex, SkipDirection, int skip) const;
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int nextSelectableListIndex(int startIndex) const;
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int previousSelectableListIndex(int startIndex) const;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int firstSelectableListIndex() const;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int lastSelectableListIndex() const;
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int nextSelectableListIndexPageAway(int startIndex, SkipDirection) const;
204197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    int listIndexForEventTargetOption(const Event&);
205197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    int listIndexForOption(const HTMLOptionElement&);
206197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    AutoscrollController* autoscrollController() const;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
208197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    virtual void childrenChanged(const ChildrenChange&) OVERRIDE;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool areAuthorShadowsAllowed() const OVERRIDE { return false; }
21053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void finishParsingChildren() OVERRIDE;
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
212926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // TypeAheadDataSource functions.
213926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual int indexOfSelectedOption() const OVERRIDE;
214926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual int optionCount() const OVERRIDE;
215926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual String optionAtIndex(int index) const OVERRIDE;
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // m_listItems contains HTMLOptionElement, HTMLOptGroupElement, and HTMLHRElement objects.
218f523d2789ac2f83c4eca0ee4d5161bfdb5f2d052Torne (Richard Coles)    mutable WillBeHeapVector<RawPtrWillBeMember<HTMLElement> > m_listItems;
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<bool> m_lastOnChangeSelection;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<bool> m_cachedStateForActiveSelection;
221926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    TypeAhead m_typeAhead;
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_size;
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_lastOnChangeIndex;
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_activeSelectionAnchorIndex;
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_activeSelectionEndIndex;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_isProcessingUserDrivenChange;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_multiple;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_activeSelectionState;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutable bool m_shouldRecalcListItems;
23043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    int m_suggestedIndex;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif // HTMLSelectElement_h
236