Home | History | Annotate | Download | only in html
      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 HTMLFormElement_h
     25 #define HTMLFormElement_h
     26 
     27 #include "core/html/HTMLElement.h"
     28 #include "core/html/HTMLFormControlElement.h"
     29 #include "core/html/forms/RadioButtonGroupScope.h"
     30 #include "core/loader/FormSubmission.h"
     31 #include "wtf/OwnPtr.h"
     32 #include "wtf/WeakPtr.h"
     33 
     34 namespace WTF{
     35 class TextEncoding;
     36 }
     37 
     38 namespace blink {
     39 
     40 class Event;
     41 class FormAssociatedElement;
     42 class FormData;
     43 class GenericEventQueue;
     44 class HTMLFormControlElement;
     45 class HTMLFormControlsCollection;
     46 class HTMLImageElement;
     47 class HTMLInputElement;
     48 
     49 class HTMLFormElement FINAL : public HTMLElement {
     50     DEFINE_WRAPPERTYPEINFO();
     51 public:
     52     static PassRefPtrWillBeRawPtr<HTMLFormElement> create(Document&);
     53     virtual ~HTMLFormElement();
     54     virtual void trace(Visitor*) OVERRIDE;
     55 
     56     PassRefPtrWillBeRawPtr<HTMLFormControlsCollection> elements();
     57     void getNamedElements(const AtomicString&, WillBeHeapVector<RefPtrWillBeMember<Element> >&);
     58 
     59     unsigned length() const;
     60     HTMLElement* item(unsigned index);
     61 
     62     String enctype() const { return m_attributes.encodingType(); }
     63     void setEnctype(const AtomicString&);
     64 
     65     String encoding() const { return m_attributes.encodingType(); }
     66     void setEncoding(const AtomicString& value) { setEnctype(value); }
     67 
     68     bool shouldAutocomplete() const;
     69 
     70     void associate(FormAssociatedElement&);
     71     void disassociate(FormAssociatedElement&);
     72     void associate(HTMLImageElement&);
     73     void disassociate(HTMLImageElement&);
     74 #if !ENABLE(OILPAN)
     75     WeakPtr<HTMLFormElement> createWeakPtr();
     76 #endif
     77     void didAssociateByParser();
     78 
     79     void prepareForSubmission(Event*);
     80     void submit();
     81     void submitFromJavaScript();
     82     void reset();
     83 
     84     void setDemoted(bool);
     85 
     86     void submitImplicitly(Event*, bool fromImplicitSubmissionTrigger);
     87 
     88     String name() const;
     89 
     90     bool noValidate() const;
     91 
     92     const AtomicString& action() const;
     93 
     94     String method() const;
     95     void setMethod(const AtomicString&);
     96 
     97     bool wasUserSubmitted() const;
     98 
     99     HTMLFormControlElement* defaultButton() const;
    100 
    101     bool checkValidity();
    102 
    103     enum AutocompleteResult {
    104         AutocompleteResultSuccess,
    105         AutocompleteResultErrorDisabled,
    106         AutocompleteResultErrorCancel,
    107         AutocompleteResultErrorInvalid,
    108     };
    109 
    110     void requestAutocomplete();
    111     void finishRequestAutocomplete(AutocompleteResult);
    112 
    113     DEFINE_ATTRIBUTE_EVENT_LISTENER(autocomplete);
    114     DEFINE_ATTRIBUTE_EVENT_LISTENER(autocompleteerror);
    115 
    116     RadioButtonGroupScope& radioButtonGroupScope() { return m_radioButtonGroupScope; }
    117 
    118     const FormAssociatedElement::List& associatedElements() const;
    119     const WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> >& imageElements();
    120 
    121     void anonymousNamedGetter(const AtomicString& name, RefPtrWillBeRawPtr<RadioNodeList>&, RefPtrWillBeRawPtr<Element>&);
    122 
    123 private:
    124     explicit HTMLFormElement(Document&);
    125 
    126     virtual bool rendererIsNeeded(const RenderStyle&) OVERRIDE;
    127     virtual InsertionNotificationRequest insertedInto(ContainerNode*) OVERRIDE;
    128     virtual void removedFrom(ContainerNode*) OVERRIDE;
    129     virtual void finishParsingChildren() OVERRIDE;
    130 
    131     virtual void handleLocalEvents(Event*) OVERRIDE;
    132 
    133     virtual void attributeWillChange(const QualifiedName&, const AtomicString& oldValue, const AtomicString& newValue) OVERRIDE;
    134     virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
    135     virtual bool isURLAttribute(const Attribute&) const OVERRIDE;
    136     virtual bool hasLegalLinkAttribute(const QualifiedName&) const OVERRIDE;
    137 
    138     virtual bool shouldRegisterAsNamedItem() const OVERRIDE { return true; }
    139 
    140     virtual void copyNonAttributePropertiesFromElement(const Element&) OVERRIDE;
    141 
    142     void submitDialog(PassRefPtrWillBeRawPtr<FormSubmission>);
    143     void submit(Event*, bool activateSubmitButton, bool processingUserGesture, FormSubmissionTrigger);
    144 
    145     void scheduleFormSubmission(PassRefPtrWillBeRawPtr<FormSubmission>);
    146 
    147     void collectAssociatedElements(Node& root, FormAssociatedElement::List&) const;
    148     void collectImageElements(Node& root, WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> >&);
    149 
    150     // Returns true if the submission should proceed.
    151     bool validateInteractively(Event*);
    152 
    153     // Validates each of the controls, and stores controls of which 'invalid'
    154     // event was not canceled to the specified vector. Returns true if there
    155     // are any invalid controls in this form.
    156     bool checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement> >*);
    157 
    158     Element* elementFromPastNamesMap(const AtomicString&);
    159     void addToPastNamesMap(Element*, const AtomicString& pastName);
    160     void removeFromPastNamesMap(HTMLElement&);
    161 
    162     typedef WillBeHeapHashMap<AtomicString, RawPtrWillBeMember<Element> > PastNamesMap;
    163 
    164     FormSubmission::Attributes m_attributes;
    165     OwnPtrWillBeMember<PastNamesMap> m_pastNamesMap;
    166 
    167     RadioButtonGroupScope m_radioButtonGroupScope;
    168 
    169     // Do not access m_associatedElements directly. Use associatedElements() instead.
    170     FormAssociatedElement::List m_associatedElements;
    171     // Do not access m_imageElements directly. Use imageElements() instead.
    172     WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement> > m_imageElements;
    173 #if !ENABLE(OILPAN)
    174     WeakPtrFactory<HTMLFormElement> m_weakPtrFactory;
    175 #endif
    176     bool m_associatedElementsAreDirty : 1;
    177     bool m_imageElementsAreDirty : 1;
    178     bool m_hasElementsAssociatedByParser : 1;
    179     bool m_didFinishParsingChildren : 1;
    180 
    181     bool m_wasUserSubmitted : 1;
    182     bool m_isSubmittingOrInUserJSSubmitEvent : 1;
    183     bool m_shouldSubmit : 1;
    184 
    185     bool m_isInResetFunction : 1;
    186 
    187     bool m_wasDemoted : 1;
    188 
    189     OwnPtrWillBeMember<GenericEventQueue> m_pendingAutocompleteEventsQueue;
    190 };
    191 
    192 } // namespace blink
    193 
    194 #endif // HTMLFormElement_h
    195