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) 2000 Dirk Mueller (mueller@kde.org)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009, 2010, 2011 Google Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef HTMLTextFormControlElement_h
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define HTMLTextFormControlElement_h
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLFormControlElementWithState.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32df95704c49daea886ddad70775bda23618d6274dBen Murdochclass ExceptionState;
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class Position;
345d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)class Range;
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderTextControl;
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class VisiblePosition;
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum TextFieldSelectionDirection { SelectionHasNoDirection, SelectionHasForwardDirection, SelectionHasBackwardDirection };
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)enum TextFieldEventBehavior { DispatchNoEvent, DispatchChangeEvent, DispatchInputAndChangeEvent };
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class HTMLTextFormControlElement : public HTMLFormControlElementWithState {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Common flag for HTMLInputElement::tooLong() and HTMLTextAreaElement::tooLong().
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    enum NeedsToCheckDirtyFlag {CheckDirtyFlag, IgnoreDirtyFlag};
45c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    // Option of setSelectionRange.
46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    enum SelectionOption {
47c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        ChangeSelection,
48f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch        ChangeSelectionAndFocus,
49f542a0e9557608d421c9d165487573efa35a5f91Ben Murdoch        ChangeSelectionIfFocused,
50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        NotChangeSelection
51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    };
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual ~HTMLTextFormControlElement();
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void forwardEvent(Event*);
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The derived class should return true if placeholder processing is needed.
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool supportsPlaceholder() const = 0;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String strippedPlaceholder() const;
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool placeholderShouldBeVisible() const;
649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    HTMLElement* placeholderElement() const;
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updatePlaceholderVisibility(bool);
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    VisiblePosition visiblePositionForIndex(int) const;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int indexForVisiblePosition(const VisiblePosition&) const;
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int selectionStart() const;
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int selectionEnd() const;
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const AtomicString& selectionDirection() const;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSelectionStart(int);
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSelectionEnd(int);
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSelectionDirection(const String&);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void select();
76df95704c49daea886ddad70775bda23618d6274dBen Murdoch    virtual void setRangeText(const String& replacement, ExceptionState&);
77df95704c49daea886ddad70775bda23618d6274dBen Murdoch    virtual void setRangeText(const String& replacement, unsigned start, unsigned end, const String& selectionMode, ExceptionState&);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setSelectionRange(int start, int end, const String& direction);
79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)    void setSelectionRange(int start, int end, TextFieldSelectionDirection = SelectionHasNoDirection, SelectionOption = ChangeSelection);
80a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<Range> selection() const;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void dispatchFormControlChangeEvent() OVERRIDE FINAL;
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual String value() const = 0;
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8676c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    HTMLElement* innerEditorElement() const;
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void selectionChanged(bool userTriggered);
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool lastChangeWasUserEdit() const;
9076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    virtual void setInnerEditorValue(const String&);
9176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)    String innerEditorValue() const;
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String directionForFormData() const;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setTextAsOfLastFormControlChangeEvent(const String& text) { m_textAsOfLastFormControlChangeEvent = text; }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // These functions don't cause synchronous layout and SpellChecker uses
98197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // them to improve performance.
99197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // Passed |Position| must point inside of a text form control.
100197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    static Position startOfWord(const Position&);
101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    static Position endOfWord(const Position&);
102197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    static Position startOfSentence(const Position&);
103197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    static Position endOfSentence(const Position&);
104197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
1068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    HTMLTextFormControlElement(const QualifiedName&, Document&, HTMLFormElement*);
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isPlaceholderEmpty() const;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void updatePlaceholderText() = 0;
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void cacheSelection(int start, int end, TextFieldSelectionDirection direction)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1146f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch        ASSERT(start >= 0);
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_cachedSelectionStart = start;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_cachedSelectionEnd = end;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_cachedSelectionDirection = direction;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void restoreCachedSelection();
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void defaultEventHandler(Event*) OVERRIDE;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void subtreeHasChanged() = 0;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setLastChangeWasNotUserEdit() { m_lastChangeWasUserEdit = false; }
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String valueWithHardLineBreaks() const;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
129323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    virtual bool shouldDispatchFormControlChangeEvent(String&, String&);
130323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int computeSelectionStart() const;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int computeSelectionEnd() const;
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextFieldSelectionDirection computeSelectionDirection() const;
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
13609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void dispatchFocusEvent(Element* oldFocusedElement, FocusType) OVERRIDE FINAL;
13709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void dispatchBlurEvent(Element* newFocusedElement) OVERRIDE FINAL;
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns true if user-editable value is empty. Used to check placeholder visibility.
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isEmptyValue() const = 0;
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Returns true if suggested value is empty. Used to check placeholder visibility.
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isEmptySuggestedValue() const { return true; }
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Called in dispatchFocusEvent(), after placeholder process, before calling parent's dispatchFocusEvent().
14409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    virtual void handleFocusEvent(Element* /* oldFocusedNode */, FocusType) { }
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Called in dispatchBlurEvent(), after placeholder process, before calling parent's dispatchBlurEvent().
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void handleBlurEvent() { }
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    String m_textAsOfLastFormControlChangeEvent;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_lastChangeWasUserEdit;
15002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_cachedSelectionStart;
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_cachedSelectionEnd;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TextFieldSelectionDirection m_cachedSelectionDirection;
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)inline bool isHTMLTextFormControlElement(const Element& element)
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
15843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    return element.isTextFormControl();
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)DEFINE_HTMLELEMENT_TYPE_CASTS_WITH_FUNCTION(HTMLTextFormControlElement);
162f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLTextFormControlElement* enclosingTextFormControl(const Position&);
1645d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)HTMLTextFormControlElement* enclosingTextFormControl(Node*);
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
169