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