summaryrefslogtreecommitdiffstats
path: root/dom/html/nsIFormControl.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/html/nsIFormControl.h')
-rw-r--r--dom/html/nsIFormControl.h315
1 files changed, 315 insertions, 0 deletions
diff --git a/dom/html/nsIFormControl.h b/dom/html/nsIFormControl.h
new file mode 100644
index 000000000..aaa92146c
--- /dev/null
+++ b/dom/html/nsIFormControl.h
@@ -0,0 +1,315 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+#ifndef nsIFormControl_h___
+#define nsIFormControl_h___
+
+#include "mozilla/EventForwards.h"
+#include "nsISupports.h"
+
+class nsIDOMHTMLFormElement;
+class nsPresState;
+
+namespace mozilla {
+namespace dom {
+class Element;
+class HTMLFieldSetElement;
+class HTMLFormSubmission;
+} // namespace dom
+} // namespace mozilla
+
+enum FormControlsTypes {
+ NS_FORM_FIELDSET = 1,
+ NS_FORM_OUTPUT,
+ NS_FORM_SELECT,
+ NS_FORM_TEXTAREA,
+ NS_FORM_OBJECT,
+ eFormControlsWithoutSubTypesMax,
+ // After this, all types will have sub-types which introduce new enum lists.
+ // eFormControlsWithoutSubTypesMax let us know if the previous types values
+ // are not overlapping with sub-types/masks.
+
+ // Elements with different types, the value is used as a mask.
+ // When changing the order, adding or removing elements, be sure to update
+ // the static_assert checks accordingly.
+ NS_FORM_BUTTON_ELEMENT = 0x40, // 0b01000000
+ NS_FORM_INPUT_ELEMENT = 0x80 // 0b10000000
+};
+
+enum ButtonElementTypes : uint8_t {
+ NS_FORM_BUTTON_BUTTON = NS_FORM_BUTTON_ELEMENT + 1,
+ NS_FORM_BUTTON_RESET,
+ NS_FORM_BUTTON_SUBMIT,
+ eButtonElementTypesMax
+};
+
+enum InputElementTypes : uint8_t {
+ NS_FORM_INPUT_BUTTON = NS_FORM_INPUT_ELEMENT + 1,
+ NS_FORM_INPUT_CHECKBOX,
+ NS_FORM_INPUT_COLOR,
+ NS_FORM_INPUT_DATE,
+ NS_FORM_INPUT_EMAIL,
+ NS_FORM_INPUT_FILE,
+ NS_FORM_INPUT_HIDDEN,
+ NS_FORM_INPUT_RESET,
+ NS_FORM_INPUT_IMAGE,
+ NS_FORM_INPUT_MONTH,
+ NS_FORM_INPUT_NUMBER,
+ NS_FORM_INPUT_PASSWORD,
+ NS_FORM_INPUT_RADIO,
+ NS_FORM_INPUT_SEARCH,
+ NS_FORM_INPUT_SUBMIT,
+ NS_FORM_INPUT_TEL,
+ NS_FORM_INPUT_TEXT,
+ NS_FORM_INPUT_TIME,
+ NS_FORM_INPUT_URL,
+ NS_FORM_INPUT_RANGE,
+ NS_FORM_INPUT_WEEK,
+ NS_FORM_INPUT_DATETIME_LOCAL,
+ eInputElementTypesMax
+};
+
+static_assert(static_cast<uint32_t>(eFormControlsWithoutSubTypesMax) <
+ static_cast<uint32_t>(NS_FORM_BUTTON_ELEMENT),
+ "Too many FormControlsTypes without sub-types");
+static_assert(static_cast<uint32_t>(eButtonElementTypesMax) <
+ static_cast<uint32_t>(NS_FORM_INPUT_ELEMENT),
+ "Too many ButtonElementTypes");
+static_assert(static_cast<uint32_t>(eInputElementTypesMax) < 1<<8,
+ "Too many form control types");
+
+#define NS_IFORMCONTROL_IID \
+{ 0x4b89980c, 0x4dcd, 0x428f, \
+ { 0xb7, 0xad, 0x43, 0x5b, 0x93, 0x29, 0x79, 0xec } }
+
+/**
+ * Interface which all form controls (e.g. buttons, checkboxes, text,
+ * radio buttons, select, etc) implement in addition to their dom specific
+ * interface.
+ */
+class nsIFormControl : public nsISupports
+{
+public:
+
+ NS_DECLARE_STATIC_IID_ACCESSOR(NS_IFORMCONTROL_IID)
+
+ /**
+ * Get the fieldset for this form control.
+ * @return the fieldset
+ */
+ virtual mozilla::dom::HTMLFieldSetElement *GetFieldSet() = 0;
+
+ /**
+ * Get the form for this form control.
+ * @return the form
+ */
+ virtual mozilla::dom::Element *GetFormElement() = 0;
+
+ /**
+ * Set the form for this form control.
+ * @param aForm the form. This must not be null.
+ *
+ * @note that when setting the form the control is not added to the
+ * form. It adds itself when it gets bound to the tree thereafter,
+ * so that it can be properly sorted with the other controls in the
+ * form.
+ */
+ virtual void SetForm(nsIDOMHTMLFormElement* aForm) = 0;
+
+ /**
+ * Tell the control to forget about its form.
+ *
+ * @param aRemoveFromForm set false if you do not want this element removed
+ * from the form. (Used by nsFormControlList::Clear())
+ */
+ virtual void ClearForm(bool aRemoveFromForm) = 0;
+
+ /**
+ * Get the type of this control as an int (see NS_FORM_* above)
+ * @return the type of this control
+ */
+ NS_IMETHOD_(uint32_t) GetType() const = 0 ;
+
+ /**
+ * Reset this form control (as it should be when the user clicks the Reset
+ * button)
+ */
+ NS_IMETHOD Reset() = 0;
+
+ /**
+ * Tells the form control to submit its names and values to the form
+ * submission object
+ * @param aFormSubmission the form submission to notify of names/values/files
+ * to submit
+ */
+ NS_IMETHOD
+ SubmitNamesValues(mozilla::dom::HTMLFormSubmission* aFormSubmission) = 0;
+
+ /**
+ * Save to presentation state. The form control will determine whether it
+ * has anything to save and if so, create an entry in the layout history for
+ * its pres context.
+ */
+ NS_IMETHOD SaveState() = 0;
+
+ /**
+ * Restore from presentation state. You pass in the presentation state for
+ * this form control (generated with GenerateStateKey() + "-C") and the form
+ * control will grab its state from there.
+ *
+ * @param aState the pres state to use to restore the control
+ * @return true if the form control was a checkbox and its
+ * checked state was restored, false otherwise.
+ */
+ virtual bool RestoreState(nsPresState* aState) = 0;
+
+ virtual bool AllowDrop() = 0;
+
+ /**
+ * Returns whether this is a control which submits the form when activated by
+ * the user.
+ * @return whether this is a submit control.
+ */
+ inline bool IsSubmitControl() const;
+
+ /**
+ * Returns whether this is a text control.
+ * @param aExcludePassword to have NS_FORM_INPUT_PASSWORD returning false.
+ * @return whether this is a text control.
+ */
+ inline bool IsTextControl(bool aExcludePassword) const;
+
+ /**
+ * Returns true if this is a text control or a number control.
+ * @param aExcludePassword to have NS_FORM_INPUT_PASSWORD returning false.
+ * @return true if this is a text control or a number control.
+ */
+ inline bool IsTextOrNumberControl(bool aExcludePassword) const;
+
+ /**
+ * Returns whether this is a single line text control.
+ * @param aExcludePassword to have NS_FORM_INPUT_PASSWORD returning false.
+ * @return whether this is a single line text control.
+ */
+ inline bool IsSingleLineTextControl(bool aExcludePassword) const;
+
+ /**
+ * Returns whether this is a submittable form control.
+ * @return whether this is a submittable form control.
+ */
+ inline bool IsSubmittableControl() const;
+
+ /**
+ * Returns whether this form control can have draggable children.
+ * @return whether this form control can have draggable children.
+ */
+ inline bool AllowDraggableChildren() const;
+
+ virtual bool IsDisabledForEvents(mozilla::EventMessage aMessage)
+ {
+ return false;
+ }
+protected:
+
+ /**
+ * Returns whether mType corresponds to a single line text control type.
+ * @param aExcludePassword to have NS_FORM_INPUT_PASSWORD ignored.
+ * @param aType the type to be tested.
+ * @return whether mType corresponds to a single line text control type.
+ */
+ inline static bool IsSingleLineTextControl(bool aExcludePassword, uint32_t aType);
+
+ /**
+ * Returns whether this is a auto-focusable form control.
+ * @return whether this is a auto-focusable form control.
+ */
+ inline bool IsAutofocusable() const;
+};
+
+bool
+nsIFormControl::IsSubmitControl() const
+{
+ uint32_t type = GetType();
+ return type == NS_FORM_INPUT_SUBMIT ||
+ type == NS_FORM_INPUT_IMAGE ||
+ type == NS_FORM_BUTTON_SUBMIT;
+}
+
+bool
+nsIFormControl::IsTextControl(bool aExcludePassword) const
+{
+ uint32_t type = GetType();
+ return type == NS_FORM_TEXTAREA ||
+ IsSingleLineTextControl(aExcludePassword, type);
+}
+
+bool
+nsIFormControl::IsTextOrNumberControl(bool aExcludePassword) const
+{
+ return IsTextControl(aExcludePassword) || GetType() == NS_FORM_INPUT_NUMBER;
+}
+
+bool
+nsIFormControl::IsSingleLineTextControl(bool aExcludePassword) const
+{
+ return IsSingleLineTextControl(aExcludePassword, GetType());
+}
+
+/*static*/
+bool
+nsIFormControl::IsSingleLineTextControl(bool aExcludePassword, uint32_t aType)
+{
+ return aType == NS_FORM_INPUT_TEXT ||
+ aType == NS_FORM_INPUT_EMAIL ||
+ aType == NS_FORM_INPUT_SEARCH ||
+ aType == NS_FORM_INPUT_TEL ||
+ aType == NS_FORM_INPUT_URL ||
+ // TODO: those are temporary until bug 773205 is fixed.
+#if defined(MOZ_WIDGET_ANDROID) || defined(MOZ_WIDGET_GONK)
+ // On Android/B2G, date/time input appears as a normal text box.
+ aType == NS_FORM_INPUT_TIME ||
+#endif
+ aType == NS_FORM_INPUT_DATE ||
+ aType == NS_FORM_INPUT_MONTH ||
+ aType == NS_FORM_INPUT_WEEK ||
+ aType == NS_FORM_INPUT_DATETIME_LOCAL ||
+ (!aExcludePassword && aType == NS_FORM_INPUT_PASSWORD);
+}
+
+bool
+nsIFormControl::IsSubmittableControl() const
+{
+ // TODO: keygen should be in that list, see bug 101019.
+ uint32_t type = GetType();
+ return type == NS_FORM_OBJECT ||
+ type == NS_FORM_TEXTAREA ||
+ type == NS_FORM_SELECT ||
+ // type == NS_FORM_KEYGEN ||
+ type & NS_FORM_BUTTON_ELEMENT ||
+ type & NS_FORM_INPUT_ELEMENT;
+}
+
+bool
+nsIFormControl::AllowDraggableChildren() const
+{
+ uint32_t type = GetType();
+ return type == NS_FORM_OBJECT ||
+ type == NS_FORM_FIELDSET ||
+ type == NS_FORM_OUTPUT;
+}
+
+bool
+nsIFormControl::IsAutofocusable() const
+{
+ uint32_t type = GetType();
+ return type & NS_FORM_INPUT_ELEMENT ||
+ type & NS_FORM_BUTTON_ELEMENT ||
+ type == NS_FORM_TEXTAREA ||
+ type == NS_FORM_SELECT;
+}
+
+NS_DEFINE_STATIC_IID_ACCESSOR(nsIFormControl, NS_IFORMCONTROL_IID)
+
+#endif /* nsIFormControl_h___ */