LCOV - code coverage report
Current view: top level - accessible/base - TextAttrs.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 53 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 50 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       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/. */
       5             : 
       6             : #ifndef nsTextAttrs_h_
       7             : #define nsTextAttrs_h_
       8             : 
       9             : #include "nsCOMPtr.h"
      10             : #include "nsColor.h"
      11             : #include "nsStyleConsts.h"
      12             : 
      13             : class nsIFrame;
      14             : class nsIPersistentProperties;
      15             : class nsIContent;
      16             : class nsDeviceContext;
      17             : 
      18             : namespace mozilla {
      19             : namespace a11y {
      20             : 
      21             : class Accessible;
      22             : class HyperTextAccessible;
      23             : 
      24             : /**
      25             :  * Used to expose text attributes for the hyper text accessible (see
      26             :  * HyperTextAccessible class).
      27             :  *
      28             :  * @note "invalid: spelling" text attribute is implemented entirely in
      29             :  *       HyperTextAccessible class.
      30             :  */
      31             : class TextAttrsMgr
      32             : {
      33             : public:
      34             :   /**
      35             :    * Constructor. Used to expose default text attributes.
      36             :    */
      37           0 :   explicit TextAttrsMgr(HyperTextAccessible* aHyperTextAcc) :
      38             :     mOffsetAcc(nullptr),  mHyperTextAcc(aHyperTextAcc),
      39           0 :     mOffsetAccIdx(-1), mIncludeDefAttrs(true) { }
      40             : 
      41             :   /**
      42             :    * Constructor. Used to expose text attributes at the given offset.
      43             :    *
      44             :    * @param aHyperTextAcc    [in] hyper text accessible text attributes are
      45             :    *                          calculated for
      46             :    * @param aIncludeDefAttrs [optional] indicates whether default text
      47             :    *                          attributes should be included into list of exposed
      48             :    *                          text attributes
      49             :    * @param oOffsetAcc       [optional] offset an accessible the text attributes
      50             :    *                          should be calculated for
      51             :    * @param oOffsetAccIdx    [optional] index in parent of offset accessible
      52             :    */
      53           0 :   TextAttrsMgr(HyperTextAccessible* aHyperTextAcc,
      54             :                bool aIncludeDefAttrs,
      55             :                Accessible* aOffsetAcc,
      56           0 :                int32_t aOffsetAccIdx) :
      57             :     mOffsetAcc(aOffsetAcc), mHyperTextAcc(aHyperTextAcc),
      58           0 :     mOffsetAccIdx(aOffsetAccIdx), mIncludeDefAttrs(aIncludeDefAttrs) { }
      59             : 
      60             :   /*
      61             :    * Return text attributes and hyper text offsets where these attributes are
      62             :    * applied. Offsets are calculated in the case of non default attributes.
      63             :    *
      64             :    * @note In the case of default attributes pointers on hyper text offsets
      65             :    *       must be skipped.
      66             :    *
      67             :    * @param aAttributes    [in, out] text attributes list
      68             :    * @param aStartHTOffset [out, optional] start hyper text offset
      69             :    * @param aEndHTOffset   [out, optional] end hyper text offset
      70             :    */
      71             :   void GetAttributes(nsIPersistentProperties* aAttributes,
      72             :                      uint32_t* aStartHTOffset = nullptr,
      73             :                      uint32_t* aEndHTOffset = nullptr);
      74             : 
      75             : protected:
      76             :   /**
      77             :    * Calculates range (start and end offsets) of text where the text attributes
      78             :    * are stretched. New offsets may be smaller if one of text attributes changes
      79             :    * its value before or after the given offsets.
      80             :    *
      81             :    * @param aTextAttrArray  [in] text attributes array
      82             :    * @param aAttrArrayLen   [in] text attributes array length
      83             :    * @param aStartHTOffset  [in, out] the start offset
      84             :    * @param aEndHTOffset    [in, out] the end offset
      85             :    */
      86             :   class TextAttr;
      87             :   void GetRange(TextAttr* aAttrArray[], uint32_t aAttrArrayLen,
      88             :                 uint32_t* aStartOffset, uint32_t* aEndOffset);
      89             : 
      90             : private:
      91             :   Accessible* mOffsetAcc;
      92             :   HyperTextAccessible* mHyperTextAcc;
      93             :   int32_t mOffsetAccIdx;
      94             :   bool mIncludeDefAttrs;
      95             : 
      96             : protected:
      97             : 
      98             :   /**
      99             :    * Interface class of text attribute class implementations.
     100             :    */
     101           0 :   class TextAttr
     102             :   {
     103             :   public:
     104             :     /**
     105             :      * Expose the text attribute to the given attribute set.
     106             :      *
     107             :      * @param aAttributes           [in] the given attribute set
     108             :      * @param aIncludeDefAttrValue  [in] if true then attribute is exposed even
     109             :      *                               if its value is the same as default one
     110             :      */
     111             :     virtual void Expose(nsIPersistentProperties* aAttributes,
     112             :                         bool aIncludeDefAttrValue) = 0;
     113             : 
     114             :     /**
     115             :      * Return true if the text attribute value on the given element equals with
     116             :      * predefined attribute value.
     117             :      */
     118             :     virtual bool Equal(Accessible* aAccessible) = 0;
     119             :   };
     120             : 
     121             : 
     122             :   /**
     123             :    * Base class to work with text attributes. See derived classes below.
     124             :    */
     125             :   template<class T>
     126           0 :   class TTextAttr : public TextAttr
     127             :   {
     128             :   public:
     129           0 :     explicit TTextAttr(bool aGetRootValue) : mGetRootValue(aGetRootValue) {}
     130             : 
     131             :     // TextAttr
     132           0 :     virtual void Expose(nsIPersistentProperties* aAttributes,
     133             :                         bool aIncludeDefAttrValue) override
     134             :     {
     135           0 :       if (mGetRootValue) {
     136           0 :         if (mIsRootDefined)
     137           0 :           ExposeValue(aAttributes, mRootNativeValue);
     138           0 :         return;
     139             :       }
     140             : 
     141           0 :       if (mIsDefined) {
     142           0 :         if (aIncludeDefAttrValue || mRootNativeValue != mNativeValue)
     143           0 :           ExposeValue(aAttributes, mNativeValue);
     144           0 :         return;
     145             :       }
     146             : 
     147           0 :       if (aIncludeDefAttrValue && mIsRootDefined)
     148           0 :         ExposeValue(aAttributes, mRootNativeValue);
     149             :     }
     150             : 
     151           0 :     virtual bool Equal(Accessible* aAccessible) override
     152             :     {
     153           0 :       T nativeValue;
     154           0 :       bool isDefined = GetValueFor(aAccessible, &nativeValue);
     155             : 
     156           0 :       if (!mIsDefined && !isDefined)
     157           0 :         return true;
     158             : 
     159           0 :       if (mIsDefined && isDefined)
     160           0 :         return nativeValue == mNativeValue;
     161             : 
     162           0 :       if (mIsDefined)
     163           0 :         return mNativeValue == mRootNativeValue;
     164             : 
     165           0 :       return nativeValue == mRootNativeValue;
     166             :     }
     167             : 
     168             :   protected:
     169             : 
     170             :     // Expose the text attribute with the given value to attribute set.
     171             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     172             :                              const T& aValue) = 0;
     173             : 
     174             :     // Return native value for the given DOM element.
     175             :     virtual bool GetValueFor(Accessible* aAccessible, T* aValue) = 0;
     176             : 
     177             :     // Indicates if root value should be exposed.
     178             :     bool mGetRootValue;
     179             : 
     180             :     // Native value and flag indicating if the value is defined (initialized in
     181             :     // derived classes). Note, undefined native value means it is inherited
     182             :     // from root.
     183             :     MOZ_INIT_OUTSIDE_CTOR T mNativeValue;
     184             :     MOZ_INIT_OUTSIDE_CTOR bool mIsDefined;
     185             : 
     186             :     // Native root value and flag indicating if the value is defined  (initialized
     187             :     // in derived classes).
     188             :     MOZ_INIT_OUTSIDE_CTOR T mRootNativeValue;
     189             :     MOZ_INIT_OUTSIDE_CTOR bool mIsRootDefined;
     190             :   };
     191             : 
     192             : 
     193             :   /**
     194             :    * Class is used for the work with 'language' text attribute.
     195             :    */
     196             :   class LangTextAttr : public TTextAttr<nsString>
     197             :   {
     198             :   public:
     199             :     LangTextAttr(HyperTextAccessible* aRoot, nsIContent* aRootElm,
     200             :                  nsIContent* aElm);
     201             :     virtual ~LangTextAttr();
     202             : 
     203             :   protected:
     204             : 
     205             :     // TextAttr
     206             :     virtual bool GetValueFor(Accessible* aAccessible, nsString* aValue) override;
     207             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     208             :                              const nsString& aValue) override;
     209             : 
     210             :   private:
     211             :     nsCOMPtr<nsIContent> mRootContent;
     212             :   };
     213             : 
     214             : 
     215             :   /**
     216             :    * Class is used for the 'invalid' text attribute. Note, it calculated
     217             :    * the attribute from aria-invalid attribute only; invalid:spelling attribute
     218             :    * calculated from misspelled text in the editor is managed by
     219             :    * HyperTextAccessible and applied on top of the value from aria-invalid.
     220             :    */
     221             :   class InvalidTextAttr : public TTextAttr<uint32_t>
     222             :   {
     223             :   public:
     224             :     InvalidTextAttr(nsIContent* aRootElm, nsIContent* aElm);
     225           0 :     virtual ~InvalidTextAttr() { };
     226             : 
     227             :   protected:
     228             : 
     229             :     enum {
     230             :       eFalse,
     231             :       eGrammar,
     232             :       eSpelling,
     233             :       eTrue
     234             :     };
     235             : 
     236             :     // TextAttr
     237             :     virtual bool GetValueFor(Accessible* aAccessible, uint32_t* aValue) override;
     238             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     239             :                              const uint32_t& aValue) override;
     240             : 
     241             :   private:
     242             :     bool GetValue(nsIContent* aElm, uint32_t* aValue);
     243             :     nsIContent* mRootElm;
     244             :   };
     245             : 
     246             : 
     247             :   /**
     248             :    * Class is used for the work with 'background-color' text attribute.
     249             :    */
     250             :   class BGColorTextAttr : public TTextAttr<nscolor>
     251             :   {
     252             :   public:
     253             :     BGColorTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame);
     254           0 :     virtual ~BGColorTextAttr() { }
     255             : 
     256             :   protected:
     257             : 
     258             :     // TextAttr
     259             :     virtual bool GetValueFor(Accessible* aAccessible, nscolor* aValue)
     260             :       override;
     261             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     262             :                              const nscolor& aValue) override;
     263             : 
     264             :   private:
     265             :     bool GetColor(nsIFrame* aFrame, nscolor* aColor);
     266             :     nsIFrame* mRootFrame;
     267             :   };
     268             : 
     269             : 
     270             :   /**
     271             :    * Class is used for the work with 'color' text attribute.
     272             :    */
     273             :   class ColorTextAttr : public TTextAttr<nscolor>
     274             :   {
     275             :   public:
     276             :     ColorTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame);
     277           0 :     virtual ~ColorTextAttr() { }
     278             : 
     279             :   protected:
     280             : 
     281             :     // TTextAttr
     282             :     virtual bool GetValueFor(Accessible* aAccessible, nscolor* aValue)
     283             :       override;
     284             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     285             :                              const nscolor& aValue) override;
     286             :   };
     287             : 
     288             : 
     289             :   /**
     290             :    * Class is used for the work with "font-family" text attribute.
     291             :    */
     292             :   class FontFamilyTextAttr : public TTextAttr<nsString>
     293             :   {
     294             :   public:
     295             :     FontFamilyTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame);
     296           0 :     virtual ~FontFamilyTextAttr() { }
     297             : 
     298             :   protected:
     299             : 
     300             :     // TTextAttr
     301             :     virtual bool GetValueFor(Accessible* aAccessible, nsString* aValue)
     302             :       override;
     303             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     304             :                              const nsString& aValue) override;
     305             : 
     306             :   private:
     307             : 
     308             :     bool GetFontFamily(nsIFrame* aFrame, nsString& aFamily);
     309             :   };
     310             : 
     311             : 
     312             :   /**
     313             :    * Class is used for the work with "font-size" text attribute.
     314             :    */
     315             :   class FontSizeTextAttr : public TTextAttr<nscoord>
     316             :   {
     317             :   public:
     318             :     FontSizeTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame);
     319           0 :     virtual ~FontSizeTextAttr() { }
     320             : 
     321             :   protected:
     322             : 
     323             :     // TTextAttr
     324             :     virtual bool GetValueFor(Accessible* aAccessible, nscoord* aValue)
     325             :       override;
     326             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     327             :                              const nscoord& aValue) override;
     328             : 
     329             :   private:
     330             :     nsDeviceContext* mDC;
     331             :   };
     332             : 
     333             : 
     334             :   /**
     335             :    * Class is used for the work with "font-style" text attribute.
     336             :    */
     337             :   class FontStyleTextAttr : public TTextAttr<nscoord>
     338             :   {
     339             :   public:
     340             :     FontStyleTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame);
     341           0 :     virtual ~FontStyleTextAttr() { }
     342             : 
     343             :   protected:
     344             : 
     345             :     // TTextAttr
     346             :     virtual bool GetValueFor(Accessible* aContent, nscoord* aValue)
     347             :       override;
     348             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     349             :                              const nscoord& aValue) override;
     350             :   };
     351             : 
     352             : 
     353             :   /**
     354             :    * Class is used for the work with "font-weight" text attribute.
     355             :    */
     356             :   class FontWeightTextAttr : public TTextAttr<int32_t>
     357             :   {
     358             :   public:
     359             :     FontWeightTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame);
     360           0 :     virtual ~FontWeightTextAttr() { }
     361             : 
     362             :   protected:
     363             : 
     364             :     // TTextAttr
     365             :     virtual bool GetValueFor(Accessible* aAccessible, int32_t* aValue)
     366             :       override;
     367             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     368             :                              const int32_t& aValue) override;
     369             : 
     370             :   private:
     371             :     int32_t GetFontWeight(nsIFrame* aFrame);
     372             :   };
     373             : 
     374             :   /**
     375             :    * Class is used for the work with 'auto-generated' text attribute.
     376             :    */
     377             :   class AutoGeneratedTextAttr : public TTextAttr<bool>
     378             :   {
     379             :   public:
     380             :     AutoGeneratedTextAttr(HyperTextAccessible* aHyperTextAcc,
     381             :                           Accessible* aAccessible);
     382           0 :     virtual ~AutoGeneratedTextAttr() { }
     383             : 
     384             :   protected:
     385             :     // TextAttr
     386             :     virtual bool GetValueFor(Accessible* aAccessible, bool* aValue)
     387             :       override;
     388             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     389             :                              const bool& aValue) override;
     390             :   };
     391             : 
     392             : 
     393             :   /**
     394             :    * TextDecorTextAttr class is used for the work with
     395             :    * "text-line-through-style", "text-line-through-color",
     396             :    * "text-underline-style" and "text-underline-color" text attributes.
     397             :    */
     398             : 
     399             :   class TextDecorValue
     400             :   {
     401             :   public:
     402           0 :     TextDecorValue() { }
     403             :     explicit TextDecorValue(nsIFrame* aFrame);
     404             : 
     405           0 :     nscolor Color() const { return mColor; }
     406           0 :     uint8_t Style() const { return mStyle; }
     407             : 
     408           0 :     bool IsDefined() const
     409           0 :       { return IsUnderline() || IsLineThrough(); }
     410           0 :     bool IsUnderline() const
     411           0 :       { return mLine & NS_STYLE_TEXT_DECORATION_LINE_UNDERLINE; }
     412           0 :     bool IsLineThrough() const
     413           0 :       { return mLine & NS_STYLE_TEXT_DECORATION_LINE_LINE_THROUGH; }
     414             : 
     415           0 :     bool operator ==(const TextDecorValue& aValue)
     416             :     {
     417           0 :       return mColor == aValue.mColor && mLine == aValue.mLine &&
     418           0 :         mStyle == aValue.mStyle;
     419             :     }
     420           0 :     bool operator !=(const TextDecorValue& aValue)
     421           0 :       { return !(*this == aValue); }
     422             : 
     423             :   private:
     424             :     nscolor mColor;
     425             :     uint8_t mLine;
     426             :     uint8_t mStyle;
     427             :   };
     428             : 
     429             :   class TextDecorTextAttr : public TTextAttr<TextDecorValue>
     430             :   {
     431             :   public:
     432             :     TextDecorTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame);
     433           0 :     virtual ~TextDecorTextAttr() { }
     434             : 
     435             :   protected:
     436             : 
     437             :     // TextAttr
     438             :     virtual bool GetValueFor(Accessible* aAccessible, TextDecorValue* aValue)
     439             :       override;
     440             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     441             :                              const TextDecorValue& aValue) override;
     442             :   };
     443             : 
     444             :   /**
     445             :    * Class is used for the work with "text-position" text attribute.
     446             :    */
     447             : 
     448             :   enum TextPosValue {
     449             :     eTextPosNone = 0,
     450             :     eTextPosBaseline,
     451             :     eTextPosSub,
     452             :     eTextPosSuper
     453             :   };
     454             : 
     455             :   class TextPosTextAttr : public TTextAttr<TextPosValue>
     456             :   {
     457             :   public:
     458             :     TextPosTextAttr(nsIFrame* aRootFrame, nsIFrame* aFrame);
     459           0 :     virtual ~TextPosTextAttr() { }
     460             : 
     461             :   protected:
     462             : 
     463             :     // TextAttr
     464             :     virtual bool GetValueFor(Accessible* aAccessible, TextPosValue* aValue)
     465             :       override;
     466             :     virtual void ExposeValue(nsIPersistentProperties* aAttributes,
     467             :                              const TextPosValue& aValue) override;
     468             : 
     469             :   private:
     470             :     TextPosValue GetTextPosValue(nsIFrame* aFrame) const;
     471             :   };
     472             : 
     473             : }; // TextAttrMgr
     474             : 
     475             : } // namespace a11y
     476             : } // namespace mozilla
     477             : 
     478             : #endif

Generated by: LCOV version 1.13