LCOV - code coverage report
Current view: top level - dom/svg - SVGUseElement.h (source / functions) Hit Total Coverage
Test: output.info Lines: 3 11 27.3 %
Date: 2017-07-14 16:53:18 Functions: 3 9 33.3 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
       2             : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
       3             : /* This Source Code Form is subject to the terms of the Mozilla Public
       4             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       5             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
       6             : 
       7             : #ifndef mozilla_dom_SVGUseElement_h
       8             : #define mozilla_dom_SVGUseElement_h
       9             : 
      10             : #include "mozilla/dom/FromParser.h"
      11             : #include "nsReferencedElement.h"
      12             : #include "nsStubMutationObserver.h"
      13             : #include "mozilla/dom/SVGGraphicsElement.h"
      14             : #include "nsSVGLength2.h"
      15             : #include "nsSVGString.h"
      16             : #include "nsTArray.h"
      17             : 
      18             : class nsIContent;
      19             : class nsSVGUseFrame;
      20             : 
      21             : nsresult
      22             : NS_NewSVGSVGElement(nsIContent **aResult,
      23             :                     already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
      24             :                     mozilla::dom::FromParser aFromParser);
      25             : nsresult NS_NewSVGUseElement(nsIContent **aResult,
      26             :                              already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
      27             : 
      28             : namespace mozilla {
      29             : struct URLExtraData;
      30             : 
      31             : namespace dom {
      32             : 
      33             : typedef SVGGraphicsElement SVGUseElementBase;
      34             : 
      35             : class SVGUseElement final : public SVGUseElementBase,
      36             :                             public nsStubMutationObserver
      37             : {
      38             :   friend class ::nsSVGUseFrame;
      39             : protected:
      40             :   friend nsresult (::NS_NewSVGUseElement(nsIContent **aResult,
      41             :                                          already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo));
      42             :   explicit SVGUseElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
      43             :   virtual ~SVGUseElement();
      44             :   virtual JSObject* WrapNode(JSContext *cx, JS::Handle<JSObject*> aGivenProto) override;
      45             : 
      46             : public:
      47             :   // interfaces:
      48             : 
      49             :   NS_DECL_ISUPPORTS_INHERITED
      50          29 :   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(SVGUseElement, SVGUseElementBase)
      51             : 
      52             :   NS_DECL_NSIMUTATIONOBSERVER_CHARACTERDATACHANGED
      53             :   NS_DECL_NSIMUTATIONOBSERVER_ATTRIBUTECHANGED
      54             :   NS_DECL_NSIMUTATIONOBSERVER_CONTENTAPPENDED
      55             :   NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED
      56             :   NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED
      57             :   NS_DECL_NSIMUTATIONOBSERVER_NODEWILLBEDESTROYED
      58             : 
      59             :   // for nsSVGUseFrame's nsIAnonymousContentCreator implementation.
      60             :   nsIContent* CreateAnonymousContent();
      61           0 :   nsIContent* GetAnonymousContent() const { return mClone; }
      62             :   void DestroyAnonymousContent();
      63             : 
      64             :   // nsSVGElement specializations:
      65             :   virtual gfxMatrix PrependLocalTransformsTo(
      66             :     const gfxMatrix &aMatrix,
      67             :     SVGTransformTypes aWhich = eAllTransforms) const override;
      68             :   virtual bool HasValidDimensions() const override;
      69             : 
      70             :   // nsIContent interface
      71             :   virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult,
      72             :                          bool aPreallocateChildren) const override;
      73             :   NS_IMETHOD_(bool) IsAttributeMapped(const nsIAtom* aAttribute) const override;
      74             : 
      75             :   // WebIDL
      76             :   already_AddRefed<SVGAnimatedString> Href();
      77             :   already_AddRefed<SVGAnimatedLength> X();
      78             :   already_AddRefed<SVGAnimatedLength> Y();
      79             :   already_AddRefed<SVGAnimatedLength> Width();
      80             :   already_AddRefed<SVGAnimatedLength> Height();
      81             : 
      82             :   nsIURI* GetSourceDocURI();
      83          46 :   URLExtraData* GetContentURLData() const { return mContentURLData; }
      84             : 
      85             : protected:
      86           0 :   class SourceReference : public nsReferencedElement {
      87             :   public:
      88          29 :     explicit SourceReference(SVGUseElement* aContainer) : mContainer(aContainer) {}
      89             :   protected:
      90           0 :     virtual void ElementChanged(Element* aFrom, Element* aTo) override {
      91           0 :       nsReferencedElement::ElementChanged(aFrom, aTo);
      92           0 :       if (aFrom) {
      93           0 :         aFrom->RemoveMutationObserver(mContainer);
      94             :       }
      95           0 :       mContainer->TriggerReclone();
      96           0 :     }
      97             :   private:
      98             :     SVGUseElement* mContainer;
      99             :   };
     100             : 
     101             :   virtual LengthAttributesInfo GetLengthInfo() override;
     102             :   virtual StringAttributesInfo GetStringInfo() override;
     103             : 
     104             :   /**
     105             :    * Returns true if our width and height should be used, or false if they
     106             :    * should be ignored. As per the spec, this depends on the type of the
     107             :    * element that we're referencing.
     108             :    */
     109             :   bool OurWidthAndHeightAreUsed() const;
     110             :   void SyncWidthOrHeight(nsIAtom *aName);
     111             :   void LookupHref();
     112             :   void TriggerReclone();
     113             :   void UnlinkSource();
     114             : 
     115             :   enum { ATTR_X, ATTR_Y, ATTR_WIDTH, ATTR_HEIGHT };
     116             :   nsSVGLength2 mLengthAttributes[4];
     117             :   static LengthInfo sLengthInfo[4];
     118             : 
     119             :   enum { HREF, XLINK_HREF };
     120             :   nsSVGString mStringAttributes[2];
     121             :   static StringInfo sStringInfo[2];
     122             : 
     123             :   nsCOMPtr<nsIContent> mOriginal; // if we've been cloned, our "real" copy
     124             :   nsCOMPtr<nsIContent> mClone;    // cloned tree
     125             :   SourceReference      mSource;   // observed element
     126             :   RefPtr<URLExtraData> mContentURLData; // URL data for its anonymous content
     127             : };
     128             : 
     129             : } // namespace dom
     130             : } // namespace mozilla
     131             : 
     132             : #endif // mozilla_dom_SVGUseElement_h

Generated by: LCOV version 1.13