summaryrefslogtreecommitdiffstats
path: root/dom/html/TextControlElement.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/html/TextControlElement.h')
-rw-r--r--dom/html/TextControlElement.h249
1 files changed, 249 insertions, 0 deletions
diff --git a/dom/html/TextControlElement.h b/dom/html/TextControlElement.h
new file mode 100644
index 0000000000..abca471953
--- /dev/null
+++ b/dom/html/TextControlElement.h
@@ -0,0 +1,249 @@
+/* -*- 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 mozilla_TextControlElement_h
+#define mozilla_TextControlElement_h
+
+#include "mozilla/dom/FromParser.h"
+#include "mozilla/dom/NodeInfo.h"
+#include "nsGenericHTMLElement.h"
+
+class nsIContent;
+class nsISelectionController;
+class nsFrameSelection;
+class nsTextControlFrame;
+
+namespace mozilla {
+
+class ErrorResult;
+class TextControlState;
+class TextEditor;
+
+/**
+ * This abstract class is used for the text control frame to get the editor and
+ * selection controller objects, and some helper properties.
+ */
+class TextControlElement : public nsGenericHTMLFormControlElementWithState {
+ public:
+ TextControlElement(already_AddRefed<dom::NodeInfo>&& aNodeInfo,
+ dom::FromParser aFromParser, FormControlType aType)
+ : nsGenericHTMLFormControlElementWithState(std::move(aNodeInfo),
+ aFromParser, aType){};
+
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(
+ TextControlElement, nsGenericHTMLFormControlElementWithState)
+
+ /**
+ * Return true always, i.e., even if this is an <input> but the type is not
+ * for a single line text control, this returns true. Use
+ * IsSingleLineTextControlOrTextArea() if you want to know whether this may
+ * work with a TextEditor.
+ */
+ bool IsTextControlElement() const final { return true; }
+
+ virtual bool IsSingleLineTextControlOrTextArea() const = 0;
+
+ NS_IMPL_FROMNODE_HELPER(TextControlElement, IsTextControlElement())
+
+ /**
+ * Tell the control that value has been deliberately changed (or not).
+ */
+ virtual void SetValueChanged(bool) = 0;
+
+ /**
+ * Find out whether this is a single line text control. (text or password)
+ * @return whether this is a single line text control
+ */
+ virtual bool IsSingleLineTextControl() const = 0;
+
+ /**
+ * Find out whether this control is a textarea.
+ * @return whether this is a textarea text control
+ */
+ virtual bool IsTextArea() const = 0;
+
+ /**
+ * Find out whether this is a password control (input type=password)
+ * @return whether this is a password ontrol
+ */
+ virtual bool IsPasswordTextControl() const = 0;
+
+ /**
+ * Get the cols attribute (if textarea) or a default
+ * @return the number of columns to use
+ */
+ virtual int32_t GetCols() = 0;
+
+ /**
+ * Get the column index to wrap at, or -1 if we shouldn't wrap
+ */
+ virtual int32_t GetWrapCols() = 0;
+
+ /**
+ * Get the rows attribute (if textarea) or a default
+ * @return the number of rows to use
+ */
+ virtual int32_t GetRows() = 0;
+
+ /**
+ * Get the default value of the text control
+ */
+ virtual void GetDefaultValueFromContent(nsAString& aValue,
+ bool aForDisplay) = 0;
+
+ /**
+ * Return true if the value of the control has been changed.
+ */
+ virtual bool ValueChanged() const = 0;
+
+ /**
+ * Returns the used maxlength attribute value.
+ */
+ virtual int32_t UsedMaxLength() const = 0;
+
+ /**
+ * Get the current value of the text editor.
+ *
+ * @param aValue the buffer to retrieve the value in
+ */
+ virtual void GetTextEditorValue(nsAString& aValue) const = 0;
+
+ /**
+ * Get the editor object associated with the text editor.
+ * The return value is null if the control does not support an editor
+ * (for example, if it is a checkbox.)
+ * Note that GetTextEditor() creates editor if it hasn't been created yet.
+ * If you need editor only when the editor is there, you should use
+ * GetTextEditorWithoutCreation().
+ */
+ MOZ_CAN_RUN_SCRIPT virtual TextEditor* GetTextEditor() = 0;
+ virtual TextEditor* GetTextEditorWithoutCreation() const = 0;
+
+ /**
+ * Get the selection controller object associated with the text editor.
+ * The return value is null if the control does not support an editor
+ * (for example, if it is a checkbox.)
+ */
+ virtual nsISelectionController* GetSelectionController() = 0;
+
+ virtual nsFrameSelection* GetConstFrameSelection() = 0;
+
+ virtual TextControlState* GetTextControlState() const = 0;
+
+ /**
+ * Binds a frame to the text control. This is performed when a frame
+ * is created for the content node.
+ * Be aware, this must be called with script blocker.
+ */
+ virtual nsresult BindToFrame(nsTextControlFrame* aFrame) = 0;
+
+ /**
+ * Unbinds a frame from the text control. This is performed when a frame
+ * belonging to a content node is destroyed.
+ */
+ MOZ_CAN_RUN_SCRIPT virtual void UnbindFromFrame(
+ nsTextControlFrame* aFrame) = 0;
+
+ /**
+ * Creates an editor for the text control. This should happen when
+ * a frame has been created for the text control element, but the created
+ * editor may outlive the frame itself.
+ */
+ MOZ_CAN_RUN_SCRIPT virtual nsresult CreateEditor() = 0;
+
+ /**
+ * Update preview value for the text control.
+ */
+ virtual void SetPreviewValue(const nsAString& aValue) = 0;
+
+ /**
+ * Get the current preview value for text control.
+ */
+ virtual void GetPreviewValue(nsAString& aValue) = 0;
+
+ /**
+ * Enable preview for text control.
+ */
+ virtual void EnablePreview() = 0;
+
+ /**
+ * Find out whether this control enables preview for form autofoll.
+ */
+ virtual bool IsPreviewEnabled() = 0;
+
+ /**
+ * Initialize the keyboard event listeners.
+ */
+ virtual void InitializeKeyboardEventListeners() = 0;
+
+ enum class ValueChangeKind {
+ Internal,
+ Script,
+ UserInteraction,
+ };
+
+ /**
+ * Callback called whenever the value is changed.
+ *
+ * aKnownNewValue can be used to avoid value lookups if present (might be
+ * null, if the caller doesn't know the specific value that got set).
+ */
+ virtual void OnValueChanged(ValueChangeKind, bool aNewValueEmpty,
+ const nsAString* aKnownNewValue) = 0;
+
+ void OnValueChanged(ValueChangeKind aKind, const nsAString& aNewValue) {
+ return OnValueChanged(aKind, aNewValue.IsEmpty(), &aNewValue);
+ }
+
+ /**
+ * Helpers for value manipulation from SetRangeText.
+ */
+ virtual void GetValueFromSetRangeText(nsAString& aValue) = 0;
+ MOZ_CAN_RUN_SCRIPT virtual nsresult SetValueFromSetRangeText(
+ const nsAString& aValue) = 0;
+
+ static const int32_t DEFAULT_COLS = 20;
+ static const int32_t DEFAULT_ROWS = 1;
+ static const int32_t DEFAULT_ROWS_TEXTAREA = 2;
+ static const int32_t DEFAULT_UNDO_CAP = 1000;
+
+ // wrap can be one of these three values.
+ typedef enum {
+ eHTMLTextWrap_Off = 1, // "off"
+ eHTMLTextWrap_Hard = 2, // "hard"
+ eHTMLTextWrap_Soft = 3 // the default
+ } nsHTMLTextWrap;
+
+ static bool GetWrapPropertyEnum(nsIContent* aContent,
+ nsHTMLTextWrap& aWrapProp);
+
+ /**
+ * Does the editor have a selection cache?
+ *
+ * Note that this function has the side effect of making the editor for input
+ * elements be initialized eagerly.
+ */
+ virtual bool HasCachedSelection() = 0;
+
+ static already_AddRefed<TextControlElement>
+ GetTextControlElementFromEditingHost(nsIContent* aHost);
+
+ protected:
+ virtual ~TextControlElement() = default;
+
+ // The focusability state of this form control. eUnfocusable means that it
+ // shouldn't be focused at all, eInactiveWindow means it's in an inactive
+ // window, eActiveWindow means it's in an active window.
+ enum class FocusTristate { eUnfocusable, eInactiveWindow, eActiveWindow };
+
+ // Get our focus state.
+ FocusTristate FocusState();
+};
+
+} // namespace mozilla
+
+#endif // mozilla_TextControlElement_h