• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2000 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.
6  * Copyright (C) 2009, 2010, 2011 Google Inc. All rights reserved.
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public License
19  * along with this library; see the file COPYING.LIB.  If not, write to
20  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21  * Boston, MA 02110-1301, USA.
22  *
23  */
24 
25 #ifndef HTMLTextFormControlElement_h
26 #define HTMLTextFormControlElement_h
27 
28 #include "core/html/HTMLFormControlElementWithState.h"
29 
30 namespace WebCore {
31 
32 class ExceptionState;
33 class Position;
34 class RenderTextControl;
35 class VisiblePosition;
36 
37 enum TextFieldSelectionDirection { SelectionHasNoDirection, SelectionHasForwardDirection, SelectionHasBackwardDirection };
38 enum TextFieldEventBehavior { DispatchNoEvent, DispatchChangeEvent, DispatchInputAndChangeEvent };
39 
40 class HTMLTextFormControlElement : public HTMLFormControlElementWithState {
41 public:
42     // Common flag for HTMLInputElement::tooLong() and HTMLTextAreaElement::tooLong().
43     enum NeedsToCheckDirtyFlag {CheckDirtyFlag, IgnoreDirtyFlag};
44 
45     virtual ~HTMLTextFormControlElement();
46 
47     void forwardEvent(Event*);
48 
49 
50     virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
51 
52     // The derived class should return true if placeholder processing is needed.
53     virtual bool supportsPlaceholder() const = 0;
54     String strippedPlaceholder() const;
55     bool placeholderShouldBeVisible() const;
56     HTMLElement* placeholderElement() const;
57     void updatePlaceholderVisibility(bool);
58 
59     VisiblePosition visiblePositionForIndex(int) const;
60     int indexForVisiblePosition(const VisiblePosition&) const;
61     int selectionStart() const;
62     int selectionEnd() const;
63     const AtomicString& selectionDirection() const;
64     void setSelectionStart(int);
65     void setSelectionEnd(int);
66     void setSelectionDirection(const String&);
67     void select();
68     virtual void setRangeText(const String& replacement, ExceptionState&);
69     virtual void setRangeText(const String& replacement, unsigned start, unsigned end, const String& selectionMode, ExceptionState&);
70     void setSelectionRange(int start, int end, const String& direction);
71     void setSelectionRange(int start, int end, TextFieldSelectionDirection = SelectionHasNoDirection);
72     PassRefPtr<Range> selection() const;
73     String selectedText() const;
74 
75     virtual void dispatchFormControlChangeEvent();
76 
77     virtual int maxLength() const = 0;
78     virtual String value() const = 0;
79 
80     HTMLElement* innerTextElement() const;
81 
82     void selectionChanged(bool userTriggered);
83     bool lastChangeWasUserEdit() const;
84     void setInnerTextValue(const String&);
85     String innerTextValue() const;
86 
87     String directionForFormData() const;
88 
setTextAsOfLastFormControlChangeEvent(const String & text)89     void setTextAsOfLastFormControlChangeEvent(const String& text) { m_textAsOfLastFormControlChangeEvent = text; }
90 
91 protected:
92     HTMLTextFormControlElement(const QualifiedName&, Document&, HTMLFormElement*);
93     bool isPlaceholderEmpty() const;
94     virtual void updatePlaceholderText() = 0;
95 
96     virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
97 
cacheSelection(int start,int end,TextFieldSelectionDirection direction)98     void cacheSelection(int start, int end, TextFieldSelectionDirection direction)
99     {
100         m_cachedSelectionStart = start;
101         m_cachedSelectionEnd = end;
102         m_cachedSelectionDirection = direction;
103     }
104 
105     void restoreCachedSelection();
hasCachedSelection()106     bool hasCachedSelection() const { return m_cachedSelectionStart >= 0; }
107 
108     virtual void defaultEventHandler(Event*);
109     virtual void subtreeHasChanged() = 0;
110 
setLastChangeWasNotUserEdit()111     void setLastChangeWasNotUserEdit() { m_lastChangeWasUserEdit = false; }
112 
113     String valueWithHardLineBreaks() const;
114 
115 private:
116     int computeSelectionStart() const;
117     int computeSelectionEnd() const;
118     TextFieldSelectionDirection computeSelectionDirection() const;
119 
120     virtual void dispatchFocusEvent(Element* oldFocusedElement, FocusDirection) OVERRIDE;
121     virtual void dispatchBlurEvent(Element* newFocusedElement) OVERRIDE;
122 
123     // Returns true if user-editable value is empty. Used to check placeholder visibility.
124     virtual bool isEmptyValue() const = 0;
125     // Returns true if suggested value is empty. Used to check placeholder visibility.
isEmptySuggestedValue()126     virtual bool isEmptySuggestedValue() const { return true; }
127     // Called in dispatchFocusEvent(), after placeholder process, before calling parent's dispatchFocusEvent().
handleFocusEvent(Element *,FocusDirection)128     virtual void handleFocusEvent(Element* /* oldFocusedNode */, FocusDirection) { }
129     // Called in dispatchBlurEvent(), after placeholder process, before calling parent's dispatchBlurEvent().
handleBlurEvent()130     virtual void handleBlurEvent() { }
131 
132     String m_textAsOfLastFormControlChangeEvent;
133     bool m_lastChangeWasUserEdit;
134 
135     int m_cachedSelectionStart;
136     int m_cachedSelectionEnd;
137     TextFieldSelectionDirection m_cachedSelectionDirection;
138 };
139 
isHTMLTextFormControlElement(const Node * node)140 inline bool isHTMLTextFormControlElement(const Node* node)
141 {
142     return node->isElementNode() && toElement(node)->isTextFormControl();
143 }
144 
isHTMLTextFormControlElement(const Node & node)145 inline bool isHTMLTextFormControlElement(const Node& node)
146 {
147     return node.isElementNode() && toElement(node).isTextFormControl();
148 }
149 
150 DEFINE_NODE_TYPE_CASTS_WITH_FUNCTION(HTMLTextFormControlElement);
151 
152 HTMLTextFormControlElement* enclosingTextFormControl(const Position&);
153 
154 } // namespace
155 
156 #endif
157