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
|