layout/forms/nsTextControlFrame.h

Wed, 31 Dec 2014 13:27:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 13:27:57 +0100
branch
TOR_BUG_3246
changeset 6
8bccb770b82d
permissions
-rw-r--r--

Ignore runtime configuration files generated during quality assurance.

     1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     6 #ifndef nsTextControlFrame_h___
     7 #define nsTextControlFrame_h___
     9 #include "mozilla/Attributes.h"
    10 #include "nsContainerFrame.h"
    11 #include "nsIAnonymousContentCreator.h"
    12 #include "nsITextControlFrame.h"
    13 #include "nsITextControlElement.h"
    14 #include "nsIStatefulFrame.h"
    16 class nsISelectionController;
    17 class EditorInitializerEntryTracker;
    18 class nsTextEditorState;
    19 class nsIEditor;
    20 namespace mozilla {
    21 namespace dom {
    22 class Element;
    23 }
    24 }
    26 class nsTextControlFrame : public nsContainerFrame,
    27                            public nsIAnonymousContentCreator,
    28                            public nsITextControlFrame,
    29                            public nsIStatefulFrame
    30 {
    31 public:
    32   NS_DECL_FRAMEARENA_HELPERS
    34   NS_DECLARE_FRAME_PROPERTY(ContentScrollPos, DestroyPoint)
    36   nsTextControlFrame(nsIPresShell* aShell, nsStyleContext* aContext);
    37   virtual ~nsTextControlFrame();
    39   virtual void DestroyFrom(nsIFrame* aDestructRoot) MOZ_OVERRIDE;
    41   virtual nsIScrollableFrame* GetScrollTargetFrame() MOZ_OVERRIDE {
    42     return do_QueryFrame(GetFirstPrincipalChild());
    43   }
    45   virtual nscoord GetMinWidth(nsRenderingContext* aRenderingContext) MOZ_OVERRIDE;
    46   virtual nscoord GetPrefWidth(nsRenderingContext* aRenderingContext) MOZ_OVERRIDE;
    48   virtual nsSize ComputeAutoSize(nsRenderingContext *aRenderingContext,
    49                                  nsSize aCBSize, nscoord aAvailableWidth,
    50                                  nsSize aMargin, nsSize aBorder,
    51                                  nsSize aPadding, bool aShrinkWrap) MOZ_OVERRIDE;
    53   virtual nsresult Reflow(nsPresContext*           aPresContext,
    54                           nsHTMLReflowMetrics&     aDesiredSize,
    55                           const nsHTMLReflowState& aReflowState,
    56                           nsReflowStatus&          aStatus) MOZ_OVERRIDE;
    58   virtual nsSize GetMinSize(nsBoxLayoutState& aBoxLayoutState) MOZ_OVERRIDE;
    59   virtual bool IsCollapsed() MOZ_OVERRIDE;
    61   virtual bool IsLeaf() const MOZ_OVERRIDE;
    63 #ifdef ACCESSIBILITY
    64   virtual mozilla::a11y::AccType AccessibleType() MOZ_OVERRIDE;
    65 #endif
    67 #ifdef DEBUG_FRAME_DUMP
    68   virtual nsresult GetFrameName(nsAString& aResult) const MOZ_OVERRIDE
    69   {
    70     aResult.AssignLiteral("nsTextControlFrame");
    71     return NS_OK;
    72   }
    73 #endif
    75   virtual bool IsFrameOfType(uint32_t aFlags) const MOZ_OVERRIDE
    76   {
    77     // nsStackFrame is already both of these, but that's somewhat bogus,
    78     // and we really mean it.
    79     return nsContainerFrame::IsFrameOfType(aFlags &
    80       ~(nsIFrame::eReplaced | nsIFrame::eReplacedContainsBlock));
    81   }
    83   // nsIAnonymousContentCreator
    84   virtual nsresult CreateAnonymousContent(nsTArray<ContentInfo>& aElements) MOZ_OVERRIDE;
    85   virtual void AppendAnonymousContentTo(nsBaseContentList& aElements,
    86                                         uint32_t aFilter) MOZ_OVERRIDE;
    88   // Utility methods to set current widget state
    90   virtual nsresult SetInitialChildList(ChildListID     aListID,
    91                                        nsFrameList&    aChildList) MOZ_OVERRIDE;
    93   virtual void BuildDisplayList(nsDisplayListBuilder*   aBuilder,
    94                                 const nsRect&           aDirtyRect,
    95                                 const nsDisplayListSet& aLists) MOZ_OVERRIDE;
    97   virtual mozilla::dom::Element* GetPseudoElement(nsCSSPseudoElements::Type aType) MOZ_OVERRIDE;
    99 //==== BEGIN NSIFORMCONTROLFRAME
   100   virtual void SetFocus(bool aOn , bool aRepaint) MOZ_OVERRIDE; 
   101   virtual nsresult SetFormProperty(nsIAtom* aName, const nsAString& aValue) MOZ_OVERRIDE;
   103 //==== END NSIFORMCONTROLFRAME
   105 //==== NSITEXTCONTROLFRAME
   107   NS_IMETHOD    GetEditor(nsIEditor **aEditor) MOZ_OVERRIDE;
   108   NS_IMETHOD    SetSelectionStart(int32_t aSelectionStart) MOZ_OVERRIDE;
   109   NS_IMETHOD    SetSelectionEnd(int32_t aSelectionEnd) MOZ_OVERRIDE;
   110   NS_IMETHOD    SetSelectionRange(int32_t aSelectionStart,
   111                                   int32_t aSelectionEnd,
   112                                   SelectionDirection aDirection = eNone) MOZ_OVERRIDE;
   113   NS_IMETHOD    GetSelectionRange(int32_t* aSelectionStart,
   114                                   int32_t* aSelectionEnd,
   115                                   SelectionDirection* aDirection = nullptr) MOZ_OVERRIDE;
   116   NS_IMETHOD    GetOwnedSelectionController(nsISelectionController** aSelCon) MOZ_OVERRIDE;
   117   virtual nsFrameSelection* GetOwnedFrameSelection() MOZ_OVERRIDE;
   119   nsresult GetPhonetic(nsAString& aPhonetic) MOZ_OVERRIDE;
   121   /**
   122    * Ensure mEditor is initialized with the proper flags and the default value.
   123    * @throws NS_ERROR_NOT_INITIALIZED if mEditor has not been created
   124    * @throws various and sundry other things
   125    */
   126   virtual nsresult EnsureEditorInitialized() MOZ_OVERRIDE;
   128 //==== END NSITEXTCONTROLFRAME
   130 //==== NSISTATEFULFRAME
   132   NS_IMETHOD SaveState(nsPresState** aState) MOZ_OVERRIDE;
   133   NS_IMETHOD RestoreState(nsPresState* aState) MOZ_OVERRIDE;
   135 //=== END NSISTATEFULFRAME
   137 //==== OVERLOAD of nsIFrame
   138   virtual nsIAtom* GetType() const MOZ_OVERRIDE;
   140   /** handler for attribute changes to mContent */
   141   virtual nsresult AttributeChanged(int32_t         aNameSpaceID,
   142                                     nsIAtom*        aAttribute,
   143                                     int32_t         aModType) MOZ_OVERRIDE;
   145   nsresult GetText(nsString& aText);
   147   virtual nsresult PeekOffset(nsPeekOffsetStruct *aPos) MOZ_OVERRIDE;
   149   NS_DECL_QUERYFRAME
   151   // Temp reference to scriptrunner
   152   // We could make these auto-Revoking via the "delete" entry for safety
   153   NS_DECLARE_FRAME_PROPERTY(TextControlInitializer, nullptr)
   155 protected:
   156   /**
   157    * Launch the reflow on the child frames - see nsTextControlFrame::Reflow()
   158    */
   159   void ReflowTextControlChild(nsIFrame*                aFrame,
   160                               nsPresContext*           aPresContext,
   161                               const nsHTMLReflowState& aReflowState,
   162                               nsReflowStatus&          aStatus,
   163                               nsHTMLReflowMetrics& aParentDesiredSize);
   165 public: //for methods who access nsTextControlFrame directly
   166   void SetValueChanged(bool aValueChanged);
   168   // called by the focus listener
   169   nsresult MaybeBeginSecureKeyboardInput();
   170   void MaybeEndSecureKeyboardInput();
   172 #define DEFINE_TEXTCTRL_FORWARDER(type, name)                                  \
   173   type name() {                                                                \
   174     nsCOMPtr<nsITextControlElement> txtCtrl = do_QueryInterface(GetContent()); \
   175     NS_ASSERTION(txtCtrl, "Content not a text control element");               \
   176     return txtCtrl->name();                                                    \
   177   }
   178 #define DEFINE_TEXTCTRL_CONST_FORWARDER(type, name)                            \
   179   type name() const {                                                          \
   180     nsCOMPtr<nsITextControlElement> txtCtrl = do_QueryInterface(GetContent()); \
   181     NS_ASSERTION(txtCtrl, "Content not a text control element");               \
   182     return txtCtrl->name();                                                    \
   183   }
   185   DEFINE_TEXTCTRL_CONST_FORWARDER(bool, IsSingleLineTextControl)
   186   DEFINE_TEXTCTRL_CONST_FORWARDER(bool, IsTextArea)
   187   DEFINE_TEXTCTRL_CONST_FORWARDER(bool, IsPlainTextControl)
   188   DEFINE_TEXTCTRL_CONST_FORWARDER(bool, IsPasswordTextControl)
   189   DEFINE_TEXTCTRL_FORWARDER(int32_t, GetCols)
   190   DEFINE_TEXTCTRL_FORWARDER(int32_t, GetWrapCols)
   191   DEFINE_TEXTCTRL_FORWARDER(int32_t, GetRows)
   193 #undef DEFINE_TEXTCTRL_CONST_FORWARDER
   194 #undef DEFINE_TEXTCTRL_FORWARDER
   196 protected:
   197   class EditorInitializer;
   198   friend class EditorInitializer;
   199   friend class nsTextEditorState; // needs access to UpdateValueDisplay
   201   class EditorInitializer : public nsRunnable {
   202   public:
   203     EditorInitializer(nsTextControlFrame* aFrame) :
   204       mFrame(aFrame) {}
   206     NS_IMETHOD Run() MOZ_OVERRIDE;
   208     // avoids use of nsWeakFrame
   209     void Revoke() {
   210       mFrame = nullptr;
   211     }
   213   private:
   214     nsTextControlFrame* mFrame;
   215   };
   217   class ScrollOnFocusEvent;
   218   friend class ScrollOnFocusEvent;
   220   class ScrollOnFocusEvent : public nsRunnable {
   221   public:
   222     ScrollOnFocusEvent(nsTextControlFrame* aFrame) :
   223       mFrame(aFrame) {}
   225     NS_DECL_NSIRUNNABLE
   227     void Revoke() {
   228       mFrame = nullptr;
   229     }
   231   private:
   232     nsTextControlFrame* mFrame;
   233   };
   235   nsresult OffsetToDOMPoint(int32_t aOffset, nsIDOMNode** aResult, int32_t* aPosition);
   237   /**
   238    * Update the textnode under our anonymous div to show the new
   239    * value. This should only be called when we have no editor yet.
   240    * @throws NS_ERROR_UNEXPECTED if the div has no text content
   241    */
   242   nsresult UpdateValueDisplay(bool aNotify,
   243                               bool aBeforeEditorInit = false,
   244                               const nsAString *aValue = nullptr);
   246   /**
   247    * Get the maxlength attribute
   248    * @param aMaxLength the value of the max length attr
   249    * @returns false if attr not defined
   250    */
   251   bool GetMaxLength(int32_t* aMaxLength);
   253   /**
   254    * Find out whether an attribute exists on the content or not.
   255    * @param aAtt the attribute to determine the existence of
   256    * @returns false if it does not exist
   257    */
   258   bool AttributeExists(nsIAtom *aAtt) const
   259   { return mContent && mContent->HasAttr(kNameSpaceID_None, aAtt); }
   261   /**
   262    * We call this when we are being destroyed or removed from the PFM.
   263    * @param aPresContext the current pres context
   264    */
   265   void PreDestroy();
   267   // Compute our intrinsic size.  This does not include any borders, paddings,
   268   // etc.  Just the size of our actual area for the text (and the scrollbars,
   269   // for <textarea>).
   270   nsresult CalcIntrinsicSize(nsRenderingContext* aRenderingContext,
   271                              nsSize&             aIntrinsicSize,
   272                              float               aFontSizeInflation);
   274   nsresult ScrollSelectionIntoView() MOZ_OVERRIDE;
   276 private:
   277   //helper methods
   278   nsresult SetSelectionInternal(nsIDOMNode *aStartNode, int32_t aStartOffset,
   279                                 nsIDOMNode *aEndNode, int32_t aEndOffset,
   280                                 SelectionDirection aDirection = eNone);
   281   nsresult SelectAllOrCollapseToEndOfText(bool aSelect);
   282   nsresult SetSelectionEndPoints(int32_t aSelStart, int32_t aSelEnd,
   283                                  SelectionDirection aDirection = eNone);
   285   /**
   286    * Return the root DOM element, and implicitly initialize the editor if needed.
   287    */
   288   mozilla::dom::Element* GetRootNodeAndInitializeEditor();
   289   nsresult GetRootNodeAndInitializeEditor(nsIDOMElement **aRootElement);
   291   void FinishedInitializer() {
   292     Properties().Delete(TextControlInitializer());
   293   }
   295 private:
   296   // these packed bools could instead use the high order bits on mState, saving 4 bytes 
   297   bool mEditorHasBeenInitialized;
   298   bool mIsProcessing;
   299   // Keep track if we have asked a placeholder node creation.
   300   bool mUsePlaceholder;
   302 #ifdef DEBUG
   303   bool mInEditorInitialization;
   304   friend class EditorInitializerEntryTracker;
   305 #endif
   307   nsRevocableEventPtr<ScrollOnFocusEvent> mScrollEvent;
   308 };
   310 #endif

mercurial