layout/svg/nsSVGPatternFrame.h

Tue, 06 Jan 2015 21:39:09 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Tue, 06 Jan 2015 21:39:09 +0100
branch
TOR_BUG_9701
changeset 8
97036ab72558
permissions
-rw-r--r--

Conditionally force memory storage according to privacy.thirdparty.isolate;
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 __NS_SVGPATTERNFRAME_H__
     7 #define __NS_SVGPATTERNFRAME_H__
     9 #include "mozilla/Attributes.h"
    10 #include "gfxMatrix.h"
    11 #include "mozilla/gfx/2D.h"
    12 #include "nsSVGPaintServerFrame.h"
    14 class gfxASurface;
    15 class gfxContext;
    16 class nsIFrame;
    17 class nsSVGElement;
    18 class nsSVGLength2;
    19 class nsSVGPathGeometryFrame;
    20 class nsSVGViewBox;
    22 namespace mozilla {
    23 class SVGAnimatedPreserveAspectRatio;
    24 class nsSVGAnimatedTransformList;
    25 } // namespace mozilla
    27 typedef nsSVGPaintServerFrame  nsSVGPatternFrameBase;
    29 /**
    30  * Patterns can refer to other patterns. We create an nsSVGPaintingProperty
    31  * with property type nsGkAtoms::href to track the referenced pattern.
    32  */
    33 class nsSVGPatternFrame : public nsSVGPatternFrameBase
    34 {
    35 public:
    36   NS_DECL_FRAMEARENA_HELPERS
    38   friend nsIFrame* NS_NewSVGPatternFrame(nsIPresShell* aPresShell,
    39                                          nsStyleContext* aContext);
    41   nsSVGPatternFrame(nsStyleContext* aContext);
    43   // nsSVGPaintServerFrame methods:
    44   virtual already_AddRefed<gfxPattern>
    45     GetPaintServerPattern(nsIFrame *aSource,
    46                           const gfxMatrix& aContextMatrix,
    47                           nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
    48                           float aOpacity,
    49                           const gfxRect *aOverrideBounds) MOZ_OVERRIDE;
    51 public:
    52   typedef mozilla::SVGAnimatedPreserveAspectRatio SVGAnimatedPreserveAspectRatio;
    54   // nsSVGContainerFrame methods:
    55   virtual gfxMatrix GetCanvasTM(uint32_t aFor,
    56                                 nsIFrame* aTransformRoot = nullptr) MOZ_OVERRIDE;
    58   // nsIFrame interface:
    59   virtual nsresult AttributeChanged(int32_t         aNameSpaceID,
    60                                     nsIAtom*        aAttribute,
    61                                     int32_t         aModType) MOZ_OVERRIDE;
    63 #ifdef DEBUG
    64   virtual void Init(nsIContent*      aContent,
    65                     nsIFrame*        aParent,
    66                     nsIFrame*        aPrevInFlow) MOZ_OVERRIDE;
    67 #endif
    69   /**
    70    * Get the "type" of the frame
    71    *
    72    * @see nsGkAtoms::svgPatternFrame
    73    */
    74   virtual nsIAtom* GetType() const MOZ_OVERRIDE;
    76 #ifdef DEBUG_FRAME_DUMP
    77   virtual nsresult GetFrameName(nsAString& aResult) const MOZ_OVERRIDE
    78   {
    79     return MakeFrameName(NS_LITERAL_STRING("SVGPattern"), aResult);
    80   }
    81 #endif // DEBUG
    83 protected:
    84   // Internal methods for handling referenced patterns
    85   class AutoPatternReferencer;
    86   nsSVGPatternFrame* GetReferencedPattern();
    87   nsSVGPatternFrame* GetReferencedPatternIfNotInUse();
    89   // Accessors to lookup pattern attributes
    90   uint16_t GetEnumValue(uint32_t aIndex, nsIContent *aDefault);
    91   uint16_t GetEnumValue(uint32_t aIndex)
    92   {
    93     return GetEnumValue(aIndex, mContent);
    94   }
    95   mozilla::nsSVGAnimatedTransformList* GetPatternTransformList(
    96       nsIContent* aDefault);
    97   gfxMatrix GetPatternTransform();
    98   const nsSVGViewBox &GetViewBox(nsIContent *aDefault);
    99   const nsSVGViewBox &GetViewBox() { return GetViewBox(mContent); }
   100   const SVGAnimatedPreserveAspectRatio &GetPreserveAspectRatio(
   101       nsIContent *aDefault);
   102   const SVGAnimatedPreserveAspectRatio &GetPreserveAspectRatio()
   103   {
   104     return GetPreserveAspectRatio(mContent);
   105   }
   106   const nsSVGLength2 *GetLengthValue(uint32_t aIndex, nsIContent *aDefault);
   107   const nsSVGLength2 *GetLengthValue(uint32_t aIndex)
   108   {
   109     return GetLengthValue(aIndex, mContent);
   110   }
   112   nsresult PaintPattern(gfxASurface **surface,
   113                         gfxMatrix *patternMatrix,
   114                         const gfxMatrix &aContextMatrix,
   115                         nsIFrame *aSource,
   116                         nsStyleSVGPaint nsStyleSVG::*aFillOrStroke,
   117                         float aGraphicOpacity,
   118                         const gfxRect *aOverrideBounds);
   119   nsIFrame*  GetPatternFirstChild();
   120   gfxRect    GetPatternRect(uint16_t aPatternUnits,
   121                             const gfxRect &bbox,
   122                             const Matrix &callerCTM,
   123                             nsIFrame *aTarget);
   124   gfxMatrix  ConstructCTM(const nsSVGViewBox& aViewBox,
   125                           uint16_t aPatternContentUnits,
   126                           uint16_t aPatternUnits,
   127                           const gfxRect &callerBBox,
   128                           const Matrix &callerCTM,
   129                           nsIFrame *aTarget);
   131 private:
   132   // this is a *temporary* reference to the frame of the element currently
   133   // referencing our pattern.  This must be temporary because different
   134   // referencing frames will all reference this one frame
   135   nsSVGPathGeometryFrame           *mSource;
   136   nsAutoPtr<gfxMatrix>              mCTM;
   138 protected:
   139   // This flag is used to detect loops in xlink:href processing
   140   bool                              mLoopFlag;
   141   bool                              mNoHRefURI;
   142 };
   144 #endif

mercurial