1 /* 2 * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org) 3 * (C) 1999 Antti Koivisto (koivisto (at) kde.org) 4 * (C) 2000 Dirk Mueller (mueller (at) kde.org) 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 6 * 7 * This library is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Library General Public 9 * License as published by the Free Software Foundation; either 10 * version 2 of the License, or (at your option) any later version. 11 * 12 * This library is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Library General Public License for more details. 16 * 17 * You should have received a copy of the GNU Library General Public License 18 * along with this library; see the file COPYING.LIB. If not, write to 19 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 20 * Boston, MA 02110-1301, USA. 21 * 22 */ 23 24 #ifndef FormAssociatedElement_h 25 #define FormAssociatedElement_h 26 27 #include "platform/heap/Handle.h" 28 #include "wtf/WeakPtr.h" 29 #include "wtf/text/WTFString.h" 30 31 namespace blink { 32 33 class ContainerNode; 34 class Document; 35 class FormAttributeTargetObserver; 36 class FormDataList; 37 class HTMLElement; 38 class HTMLFormElement; 39 class Node; 40 class ValidityState; 41 class VisibleSelection; 42 43 class FormAssociatedElement : public WillBeGarbageCollectedMixin { 44 public: 45 virtual ~FormAssociatedElement(); 46 47 #if !ENABLE(OILPAN) 48 void ref() { refFormAssociatedElement(); } 49 void deref() { derefFormAssociatedElement(); } 50 #endif 51 52 static HTMLFormElement* findAssociatedForm(const HTMLElement*); 53 HTMLFormElement* form() const { return m_form.get(); } 54 ValidityState* validity(); 55 56 virtual bool isFormControlElement() const = 0; 57 virtual bool isFormControlElementWithState() const; 58 virtual bool isEnumeratable() const = 0; 59 virtual bool isLabelElement() const { return false; } 60 61 // Returns the 'name' attribute value. If this element has no name 62 // attribute, it returns an empty string instead of null string. 63 // Note that the 'name' IDL attribute doesn't use this function. 64 virtual const AtomicString& name() const; 65 66 // Override in derived classes to get the encoded name=value pair for submitting. 67 // Return true for a successful control (see HTML4-17.13.2). 68 virtual bool appendFormData(FormDataList&, bool) { return false; } 69 70 void resetFormOwner(); 71 72 void formRemovedFromTree(const Node& formRoot); 73 74 // ValidityState attribute implementations 75 bool customError() const; 76 77 // Override functions for patterMismatch, rangeOverflow, rangerUnderflow, 78 // stepMismatch, tooLong and valueMissing must call willValidate method. 79 virtual bool hasBadInput() const; 80 virtual bool patternMismatch() const; 81 virtual bool rangeOverflow() const; 82 virtual bool rangeUnderflow() const; 83 virtual bool stepMismatch() const; 84 virtual bool tooLong() const; 85 virtual bool typeMismatch() const; 86 virtual bool valueMissing() const; 87 virtual String validationMessage() const; 88 bool valid() const; 89 virtual void setCustomValidity(const String&); 90 91 void formAttributeTargetChanged(); 92 93 typedef WillBeHeapVector<RawPtrWillBeMember<FormAssociatedElement> > List; 94 95 protected: 96 FormAssociatedElement(); 97 98 virtual void trace(Visitor*); 99 void insertedInto(ContainerNode*); 100 void removedFrom(ContainerNode*); 101 void didMoveToNewDocument(Document& oldDocument); 102 103 // FIXME: Remove usage of setForm. resetFormOwner should be enough, and 104 // setForm is confusing. 105 void setForm(HTMLFormElement*); 106 void associateByParser(HTMLFormElement*); 107 void formAttributeChanged(); 108 109 // If you add an override of willChangeForm() or didChangeForm() to a class 110 // derived from this one, you will need to add a call to setForm(0) to the 111 // destructor of that class. 112 virtual void willChangeForm(); 113 virtual void didChangeForm(); 114 115 String customValidationMessage() const; 116 117 private: 118 #if !ENABLE(OILPAN) 119 virtual void refFormAssociatedElement() = 0; 120 virtual void derefFormAssociatedElement() = 0; 121 #endif 122 123 void setFormAttributeTargetObserver(PassOwnPtrWillBeRawPtr<FormAttributeTargetObserver>); 124 void resetFormAttributeTargetObserver(); 125 126 OwnPtrWillBeMember<FormAttributeTargetObserver> m_formAttributeTargetObserver; 127 #if ENABLE(OILPAN) 128 Member<HTMLFormElement> m_form; 129 #else 130 WeakPtr<HTMLFormElement> m_form; 131 #endif 132 OwnPtrWillBeMember<ValidityState> m_validityState; 133 String m_customValidationMessage; 134 // Non-Oilpan: Even if m_formWasSetByParser is true, m_form can be null 135 // because parentNode is not a strong reference and |this| and m_form don't 136 // die together. 137 // Oilpan: If m_formWasSetByParser is true, m_form is always non-null. 138 bool m_formWasSetByParser; 139 }; 140 141 HTMLElement* toHTMLElement(FormAssociatedElement*); 142 HTMLElement& toHTMLElement(FormAssociatedElement&); 143 const HTMLElement* toHTMLElement(const FormAssociatedElement*); 144 const HTMLElement& toHTMLElement(const FormAssociatedElement&); 145 146 } // namespace 147 148 #endif // FormAssociatedElement_h 149