layout/mathml/nsMathMLFrame.h

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     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 nsMathMLFrame_h___
     7 #define nsMathMLFrame_h___
     9 #include "mozilla/Attributes.h"
    10 #include "nsFontMetrics.h"
    11 #include "nsMathMLOperators.h"
    12 #include "nsIMathMLFrame.h"
    13 #include "nsLayoutUtils.h"
    14 #include "nsBoundingMetrics.h"
    15 #include "nsIFrame.h"
    17 class nsMathMLChar;
    18 class nsCSSValue;
    19 class nsDisplayListSet;
    21 // Concrete base class with default methods that derived MathML frames can override
    22 class nsMathMLFrame : public nsIMathMLFrame {
    23 public:
    25   // nsIMathMLFrame ---
    27   virtual bool
    28   IsSpaceLike() MOZ_OVERRIDE {
    29     return NS_MATHML_IS_SPACE_LIKE(mPresentationData.flags);
    30   }
    32   NS_IMETHOD
    33   GetBoundingMetrics(nsBoundingMetrics& aBoundingMetrics) MOZ_OVERRIDE {
    34     aBoundingMetrics = mBoundingMetrics;
    35     return NS_OK;
    36   }
    38   NS_IMETHOD
    39   SetBoundingMetrics(const nsBoundingMetrics& aBoundingMetrics) MOZ_OVERRIDE {
    40     mBoundingMetrics = aBoundingMetrics;
    41     return NS_OK;
    42   }
    44   NS_IMETHOD
    45   SetReference(const nsPoint& aReference) MOZ_OVERRIDE {
    46     mReference = aReference;
    47     return NS_OK;
    48   }
    50   virtual eMathMLFrameType GetMathMLFrameType() MOZ_OVERRIDE;
    52   NS_IMETHOD
    53   Stretch(nsRenderingContext& aRenderingContext,
    54           nsStretchDirection   aStretchDirection,
    55           nsBoundingMetrics&   aContainerSize,
    56           nsHTMLReflowMetrics& aDesiredStretchSize) MOZ_OVERRIDE
    57   {
    58     return NS_OK;
    59   }
    61   NS_IMETHOD
    62   GetEmbellishData(nsEmbellishData& aEmbellishData) MOZ_OVERRIDE {
    63     aEmbellishData = mEmbellishData;
    64     return NS_OK;
    65   }
    67   NS_IMETHOD
    68   GetPresentationData(nsPresentationData& aPresentationData) MOZ_OVERRIDE {
    69     aPresentationData = mPresentationData;
    70     return NS_OK;
    71   }
    73   NS_IMETHOD
    74   InheritAutomaticData(nsIFrame* aParent) MOZ_OVERRIDE;
    76   NS_IMETHOD
    77   TransmitAutomaticData() MOZ_OVERRIDE
    78   {
    79     return NS_OK;
    80   }
    82   NS_IMETHOD
    83   UpdatePresentationData(uint32_t        aFlagsValues,
    84                          uint32_t        aFlagsToUpdate) MOZ_OVERRIDE;
    86   NS_IMETHOD
    87   UpdatePresentationDataFromChildAt(int32_t         aFirstIndex,
    88                                     int32_t         aLastIndex,
    89                                     uint32_t        aFlagsValues,
    90                                     uint32_t        aFlagsToUpdate) MOZ_OVERRIDE
    91   {
    92     return NS_OK;
    93   }
    95   uint8_t
    96   ScriptIncrement(nsIFrame* aFrame) MOZ_OVERRIDE
    97   {
    98     return 0;
    99   }
   101   bool
   102   IsMrowLike() MOZ_OVERRIDE
   103   {
   104     return false;
   105   }
   107   // helper to give a style context suitable for doing the stretching to the
   108   // MathMLChar. Frame classes that use this should make the extra style contexts
   109   // accessible to the Style System via Get/Set AdditionalStyleContext.
   110   static void
   111   ResolveMathMLCharStyle(nsPresContext*  aPresContext,
   112                          nsIContent*      aContent,
   113                          nsStyleContext*  aParenStyleContext,
   114                          nsMathMLChar*    aMathMLChar);
   116   // helper to get the mEmbellishData of a frame
   117   // The MathML REC precisely defines an "embellished operator" as:
   118   // - an <mo> element;
   119   // - or one of the elements <msub>, <msup>, <msubsup>, <munder>, <mover>,
   120   //   <munderover>, <mmultiscripts>, <mfrac>, or <semantics>, whose first 
   121   //   argument exists and is an embellished operator;
   122   //- or one of the elements <mstyle>, <mphantom>, or <mpadded>, such that
   123   //   an <mrow> containing the same arguments would be an embellished
   124   //   operator;
   125   // - or an <maction> element whose selected subexpression exists and is an
   126   //   embellished operator;
   127   // - or an <mrow> whose arguments consist (in any order) of one embellished
   128   //   operator and zero or more spacelike elements.
   129   static void
   130   GetEmbellishDataFrom(nsIFrame*        aFrame,
   131                        nsEmbellishData& aEmbellishData);
   133   // helper to get the presentation data of a frame. If aClimbTree is
   134   // set to true and the frame happens to be surrounded by non-MathML
   135   // helper frames needed for its support, we walk up the frame hierarchy
   136   // until we reach a MathML ancestor or the <root> math element.
   137   static void
   138   GetPresentationDataFrom(nsIFrame*           aFrame,
   139                           nsPresentationData& aPresentationData,
   140                           bool                aClimbTree = true);
   142   // utilities to parse and retrieve numeric values in CSS units
   143   // All values are stored in twips.
   144   // @pre  aLengthValue is the default length value of the attribute.
   145   // @post aLengthValue is the length value computed from the attribute.
   146   static void ParseNumericValue(const nsString&   aString,
   147                                 nscoord*          aLengthValue,
   148                                 uint32_t          aFlags,
   149                                 nsPresContext*    aPresContext,
   150                                 nsStyleContext*   aStyleContext);
   152   static nscoord 
   153   CalcLength(nsPresContext*   aPresContext,
   154              nsStyleContext*   aStyleContext,
   155              const nsCSSValue& aCSSValue);
   157   static eMathMLFrameType
   158   GetMathMLFrameTypeFor(nsIFrame* aFrame)
   159   {
   160     if (aFrame->IsFrameOfType(nsIFrame::eMathML)) {
   161       nsIMathMLFrame* mathMLFrame = do_QueryFrame(aFrame);
   162       if (mathMLFrame)
   163         return mathMLFrame->GetMathMLFrameType();
   164     }
   165     return eMathMLFrameType_UNKNOWN;
   166   }
   168   // estimate of the italic correction
   169   static void
   170   GetItalicCorrection(nsBoundingMetrics& aBoundingMetrics,
   171                       nscoord&           aItalicCorrection)
   172   {
   173     aItalicCorrection = aBoundingMetrics.rightBearing - aBoundingMetrics.width;
   174     if (0 > aItalicCorrection) {
   175       aItalicCorrection = 0;
   176     }
   177   }
   179   static void
   180   GetItalicCorrection(nsBoundingMetrics& aBoundingMetrics,
   181                       nscoord&           aLeftItalicCorrection,
   182                       nscoord&           aRightItalicCorrection)
   183   {
   184     aRightItalicCorrection = aBoundingMetrics.rightBearing - aBoundingMetrics.width;
   185     if (0 > aRightItalicCorrection) {
   186       aRightItalicCorrection = 0;
   187     }
   188     aLeftItalicCorrection = -aBoundingMetrics.leftBearing;
   189     if (0 > aLeftItalicCorrection) {
   190       aLeftItalicCorrection = 0;
   191     }
   192   }
   194   // helper methods for getting sup/subdrop's from a child
   195   static void 
   196   GetSubDropFromChild(nsIFrame*       aChild,
   197                       nscoord&        aSubDrop) 
   198   {
   199     nsRefPtr<nsFontMetrics> fm;
   200     nsLayoutUtils::GetFontMetricsForFrame(aChild, getter_AddRefs(fm));
   201     GetSubDrop(fm, aSubDrop);
   202   }
   204   static void 
   205   GetSupDropFromChild(nsIFrame*       aChild,
   206                       nscoord&        aSupDrop) 
   207   {
   208     nsRefPtr<nsFontMetrics> fm;
   209     nsLayoutUtils::GetFontMetricsForFrame(aChild, getter_AddRefs(fm));
   210     GetSupDrop(fm, aSupDrop);
   211   }
   213   static void
   214   GetSkewCorrectionFromChild(nsIFrame*       aChild,
   215                              nscoord&        aSkewCorrection) 
   216   {
   217     // default is 0
   218     // individual classes should over-ride this method if necessary
   219     aSkewCorrection = 0;
   220   }
   222   // 2 levels of subscript shifts
   223   static void
   224   GetSubScriptShifts(nsFontMetrics* fm, 
   225                      nscoord&        aSubScriptShift1, 
   226                      nscoord&        aSubScriptShift2)
   227   {
   228     nscoord xHeight = fm->XHeight();
   229     aSubScriptShift1 = NSToCoordRound(150.000f/430.556f * xHeight);
   230     aSubScriptShift2 = NSToCoordRound(247.217f/430.556f * xHeight);
   231   }
   233   // 3 levels of superscript shifts
   234   static void
   235   GetSupScriptShifts(nsFontMetrics* fm, 
   236                      nscoord&        aSupScriptShift1, 
   237                      nscoord&        aSupScriptShift2, 
   238                      nscoord&        aSupScriptShift3)
   239   {
   240     nscoord xHeight = fm->XHeight();
   241     aSupScriptShift1 = NSToCoordRound(412.892f/430.556f * xHeight);
   242     aSupScriptShift2 = NSToCoordRound(362.892f/430.556f * xHeight);
   243     aSupScriptShift3 = NSToCoordRound(288.889f/430.556f * xHeight);
   244   }
   246   // these are TeX specific params not found in ordinary fonts
   248   static void
   249   GetSubDrop(nsFontMetrics* fm,
   250              nscoord&        aSubDrop)
   251   {
   252     nscoord xHeight = fm->XHeight();
   253     aSubDrop = NSToCoordRound(50.000f/430.556f * xHeight);
   254   }
   256   static void
   257   GetSupDrop(nsFontMetrics* fm,
   258              nscoord&        aSupDrop)
   259   {
   260     nscoord xHeight = fm->XHeight();
   261     aSupDrop = NSToCoordRound(386.108f/430.556f * xHeight);
   262   }
   264   static void
   265   GetNumeratorShifts(nsFontMetrics* fm, 
   266                      nscoord&        numShift1, 
   267                      nscoord&        numShift2, 
   268                      nscoord&        numShift3)
   269   {
   270     nscoord xHeight = fm->XHeight();
   271     numShift1 = NSToCoordRound(676.508f/430.556f * xHeight);
   272     numShift2 = NSToCoordRound(393.732f/430.556f * xHeight);
   273     numShift3 = NSToCoordRound(443.731f/430.556f * xHeight);
   274   }
   276   static void
   277   GetDenominatorShifts(nsFontMetrics* fm, 
   278                        nscoord&        denShift1, 
   279                        nscoord&        denShift2)
   280   {
   281     nscoord xHeight = fm->XHeight();
   282     denShift1 = NSToCoordRound(685.951f/430.556f * xHeight);
   283     denShift2 = NSToCoordRound(344.841f/430.556f * xHeight);
   284   }
   286   static void
   287   GetEmHeight(nsFontMetrics* fm,
   288               nscoord&        emHeight)
   289   {
   290 #if 0
   291     // should switch to this API in order to scale with changes of TextZoom
   292     emHeight = fm->EmHeight();
   293 #else
   294     emHeight = NSToCoordRound(float(fm->Font().size));
   295 #endif
   296   }
   298   static void
   299   GetAxisHeight (nsFontMetrics* fm,
   300                  nscoord&        axisHeight)
   301   {
   302     axisHeight = NSToCoordRound(250.000f/430.556f * fm->XHeight());
   303   }
   305   static void
   306   GetBigOpSpacings(nsFontMetrics* fm, 
   307                    nscoord&        bigOpSpacing1,
   308                    nscoord&        bigOpSpacing2,
   309                    nscoord&        bigOpSpacing3,
   310                    nscoord&        bigOpSpacing4,
   311                    nscoord&        bigOpSpacing5)
   312   {
   313     nscoord xHeight = fm->XHeight();
   314     bigOpSpacing1 = NSToCoordRound(111.111f/430.556f * xHeight);
   315     bigOpSpacing2 = NSToCoordRound(166.667f/430.556f * xHeight);
   316     bigOpSpacing3 = NSToCoordRound(200.000f/430.556f * xHeight);
   317     bigOpSpacing4 = NSToCoordRound(600.000f/430.556f * xHeight);
   318     bigOpSpacing5 = NSToCoordRound(100.000f/430.556f * xHeight);
   319   }
   321   static void
   322   GetRuleThickness(nsFontMetrics* fm,
   323                    nscoord&        ruleThickness)
   324   {
   325     nscoord xHeight = fm->XHeight();
   326     ruleThickness = NSToCoordRound(40.000f/430.556f * xHeight);
   327   }
   329   // Some parameters are not accurately obtained using the x-height.
   330   // Here are some slower variants to obtain the desired metrics
   331   // by actually measuring some characters
   332   static void
   333   GetRuleThickness(nsRenderingContext& aRenderingContext, 
   334                    nsFontMetrics*      aFontMetrics,
   335                    nscoord&             aRuleThickness);
   337   static void
   338   GetAxisHeight(nsRenderingContext& aRenderingContext, 
   339                 nsFontMetrics*      aFontMetrics,
   340                 nscoord&             aAxisHeight);
   342 protected:
   343 #if defined(DEBUG) && defined(SHOW_BOUNDING_BOX)
   344   nsresult DisplayBoundingMetrics(nsDisplayListBuilder* aBuilder,
   345                                   nsIFrame* aFrame, const nsPoint& aPt,
   346                                   const nsBoundingMetrics& aMetrics,
   347                                   const nsDisplayListSet& aLists);
   348 #endif
   350   /**
   351    * Display a solid rectangle in the frame's text color. Used for drawing
   352    * fraction separators and root/sqrt overbars.
   353    */
   354   void DisplayBar(nsDisplayListBuilder* aBuilder,
   355                   nsIFrame* aFrame, const nsRect& aRect,
   356                   const nsDisplayListSet& aLists);
   358   // information about the presentation policy of the frame
   359   nsPresentationData mPresentationData;
   361   // information about a container that is an embellished operator
   362   nsEmbellishData mEmbellishData;
   364   // Metrics that _exactly_ enclose the text of the frame
   365   nsBoundingMetrics mBoundingMetrics;
   367   // Reference point of the frame: mReference.y is the baseline
   368   nsPoint mReference; 
   369 };
   371 #endif /* nsMathMLFrame_h___ */

mercurial