123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725 |
- /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
- /* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
- #ifndef __NS_SVGELEMENT_H__
- #define __NS_SVGELEMENT_H__
- /*
- nsSVGElement is the base class for all SVG content elements.
- It implements all the common DOM interfaces and handles attributes.
- */
- #include "mozilla/Attributes.h"
- #include "mozilla/css/StyleRule.h"
- #include "nsAutoPtr.h"
- #include "nsChangeHint.h"
- #include "nsCOMPtr.h"
- #include "nsCycleCollectionParticipant.h"
- #include "nsError.h"
- #include "mozilla/dom/DOMRect.h"
- #include "mozilla/dom/ElementInlines.h"
- #include "nsISupportsImpl.h"
- #include "nsStyledElement.h"
- #include "nsSVGClass.h"
- #include "nsIDOMSVGElement.h"
- #include "SVGContentUtils.h"
- class nsSVGAngle;
- class nsSVGBoolean;
- class nsSVGEnum;
- class nsSVGInteger;
- class nsSVGIntegerPair;
- class nsSVGLength2;
- class nsSVGNumber2;
- class nsSVGNumberPair;
- class nsSVGString;
- class nsSVGViewBox;
- namespace mozilla {
- namespace dom {
- class SVGSVGElement;
- static const unsigned short SVG_UNIT_TYPE_UNKNOWN = 0;
- static const unsigned short SVG_UNIT_TYPE_USERSPACEONUSE = 1;
- static const unsigned short SVG_UNIT_TYPE_OBJECTBOUNDINGBOX = 2;
- } // namespace dom
- class SVGAnimatedNumberList;
- class SVGNumberList;
- class SVGAnimatedLengthList;
- class SVGUserUnitList;
- class SVGAnimatedPointList;
- class SVGAnimatedPathSegList;
- class SVGAnimatedPreserveAspectRatio;
- class nsSVGAnimatedTransformList;
- class SVGStringList;
- class DOMSVGStringList;
- namespace gfx {
- class Matrix;
- } // namespace gfx
- } // namespace mozilla
- class gfxMatrix;
- struct nsSVGEnumMapping;
- typedef nsStyledElement nsSVGElementBase;
- class nsSVGElement : public nsSVGElementBase // nsIContent
- , public nsIDOMSVGElement
- {
- protected:
- explicit nsSVGElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo);
- friend nsresult NS_NewSVGElement(mozilla::dom::Element **aResult,
- already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo);
- nsresult Init();
- virtual ~nsSVGElement(){}
- public:
- virtual nsresult Clone(mozilla::dom::NodeInfo *aNodeInfo, nsINode **aResult) const MOZ_MUST_OVERRIDE override;
- typedef mozilla::SVGNumberList SVGNumberList;
- typedef mozilla::SVGAnimatedNumberList SVGAnimatedNumberList;
- typedef mozilla::SVGUserUnitList SVGUserUnitList;
- typedef mozilla::SVGAnimatedLengthList SVGAnimatedLengthList;
- typedef mozilla::SVGAnimatedPointList SVGAnimatedPointList;
- typedef mozilla::SVGAnimatedPathSegList SVGAnimatedPathSegList;
- typedef mozilla::SVGAnimatedPreserveAspectRatio SVGAnimatedPreserveAspectRatio;
- typedef mozilla::nsSVGAnimatedTransformList nsSVGAnimatedTransformList;
- typedef mozilla::SVGStringList SVGStringList;
- // nsISupports
- NS_DECL_ISUPPORTS_INHERITED
- void DidAnimateClass();
- // nsIContent interface methods
- virtual nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
- nsIContent* aBindingParent,
- bool aCompileEventHandlers) override;
- virtual nsresult UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
- bool aNotify) override;
- virtual nsChangeHint GetAttributeChangeHint(const nsIAtom* aAttribute,
- int32_t aModType) const override;
- virtual bool IsNodeOfType(uint32_t aFlags) const override;
- NS_IMETHOD WalkContentStyleRules(nsRuleWalker* aRuleWalker) override;
- void WalkAnimatedContentStyleRules(nsRuleWalker* aRuleWalker);
- NS_IMETHOD_(bool) IsAttributeMapped(const nsIAtom* aAttribute) const override;
- static const MappedAttributeEntry sFillStrokeMap[];
- static const MappedAttributeEntry sGraphicsMap[];
- static const MappedAttributeEntry sTextContentElementsMap[];
- static const MappedAttributeEntry sFontSpecificationMap[];
- static const MappedAttributeEntry sGradientStopMap[];
- static const MappedAttributeEntry sViewportsMap[];
- static const MappedAttributeEntry sMarkersMap[];
- static const MappedAttributeEntry sColorMap[];
- static const MappedAttributeEntry sFiltersMap[];
- static const MappedAttributeEntry sFEFloodMap[];
- static const MappedAttributeEntry sLightingEffectsMap[];
- static const MappedAttributeEntry sMaskMap[];
- NS_FORWARD_NSIDOMNODE_TO_NSINODE
- NS_FORWARD_NSIDOMELEMENT_TO_GENERIC
- NS_DECL_NSIDOMSVGELEMENT
- // Gets the element that establishes the rectangular viewport against which
- // we should resolve percentage lengths (our "coordinate context"). Returns
- // nullptr for outer <svg> or SVG without an <svg> parent (invalid SVG).
- mozilla::dom::SVGSVGElement* GetCtx() const;
- /**
- * Returns aMatrix pre-multiplied by (explicit or implicit) transforms that
- * are introduced by attributes on this element.
- *
- * If aWhich is eAllTransforms, then all the transforms from the coordinate
- * space established by this element for its children to the coordinate
- * space established by this element's parent element for this element, are
- * included.
- *
- * If aWhich is eUserSpaceToParent, then only the transforms from this
- * element's userspace to the coordinate space established by its parent is
- * included. This includes any transforms introduced by the 'transform'
- * attribute, transform animations and animateMotion, but not any offsets
- * due to e.g. 'x'/'y' attributes, or any transform due to a 'viewBox'
- * attribute. (SVG userspace is defined to be the coordinate space in which
- * coordinates on an element apply.)
- *
- * If aWhich is eChildToUserSpace, then only the transforms from the
- * coordinate space established by this element for its childre to this
- * elements userspace are included. This includes any offsets due to e.g.
- * 'x'/'y' attributes, and any transform due to a 'viewBox' attribute, but
- * does not include any transforms due to the 'transform' attribute.
- */
- virtual gfxMatrix PrependLocalTransformsTo(
- const gfxMatrix &aMatrix, SVGTransformTypes aWhich = eAllTransforms) const;
- // Setter for to set the current <animateMotion> transformation
- // Only visible for nsSVGGraphicElement, so it's a no-op here, and that
- // subclass has the useful implementation.
- virtual void SetAnimateMotionTransform(const mozilla::gfx::Matrix* aMatrix) {/*no-op*/}
- virtual const mozilla::gfx::Matrix* GetAnimateMotionTransform() const { return nullptr; }
- bool IsStringAnimatable(uint8_t aAttrEnum) {
- return GetStringInfo().mStringInfo[aAttrEnum].mIsAnimatable;
- }
- bool NumberAttrAllowsPercentage(uint8_t aAttrEnum) {
- return GetNumberInfo().mNumberInfo[aAttrEnum].mPercentagesAllowed;
- }
- virtual bool HasValidDimensions() const {
- return true;
- }
- void SetLength(nsIAtom* aName, const nsSVGLength2 &aLength);
- nsAttrValue WillChangeLength(uint8_t aAttrEnum);
- nsAttrValue WillChangeNumberPair(uint8_t aAttrEnum);
- nsAttrValue WillChangeIntegerPair(uint8_t aAttrEnum);
- nsAttrValue WillChangeAngle(uint8_t aAttrEnum);
- nsAttrValue WillChangeViewBox();
- nsAttrValue WillChangePreserveAspectRatio();
- nsAttrValue WillChangeNumberList(uint8_t aAttrEnum);
- nsAttrValue WillChangeLengthList(uint8_t aAttrEnum);
- nsAttrValue WillChangePointList();
- nsAttrValue WillChangePathSegList();
- nsAttrValue WillChangeTransformList();
- nsAttrValue WillChangeStringList(bool aIsConditionalProcessingAttribute,
- uint8_t aAttrEnum);
- void DidChangeLength(uint8_t aAttrEnum, const nsAttrValue& aEmptyOrOldValue);
- void DidChangeNumber(uint8_t aAttrEnum);
- void DidChangeNumberPair(uint8_t aAttrEnum,
- const nsAttrValue& aEmptyOrOldValue);
- void DidChangeInteger(uint8_t aAttrEnum);
- void DidChangeIntegerPair(uint8_t aAttrEnum,
- const nsAttrValue& aEmptyOrOldValue);
- void DidChangeAngle(uint8_t aAttrEnum, const nsAttrValue& aEmptyOrOldValue);
- void DidChangeBoolean(uint8_t aAttrEnum);
- void DidChangeEnum(uint8_t aAttrEnum);
- void DidChangeViewBox(const nsAttrValue& aEmptyOrOldValue);
- void DidChangePreserveAspectRatio(const nsAttrValue& aEmptyOrOldValue);
- void DidChangeNumberList(uint8_t aAttrEnum,
- const nsAttrValue& aEmptyOrOldValue);
- void DidChangeLengthList(uint8_t aAttrEnum,
- const nsAttrValue& aEmptyOrOldValue);
- void DidChangePointList(const nsAttrValue& aEmptyOrOldValue);
- void DidChangePathSegList(const nsAttrValue& aEmptyOrOldValue);
- void DidChangeTransformList(const nsAttrValue& aEmptyOrOldValue);
- void DidChangeString(uint8_t aAttrEnum) {}
- void DidChangeStringList(bool aIsConditionalProcessingAttribute,
- uint8_t aAttrEnum,
- const nsAttrValue& aEmptyOrOldValue);
- void DidAnimateLength(uint8_t aAttrEnum);
- void DidAnimateNumber(uint8_t aAttrEnum);
- void DidAnimateNumberPair(uint8_t aAttrEnum);
- void DidAnimateInteger(uint8_t aAttrEnum);
- void DidAnimateIntegerPair(uint8_t aAttrEnum);
- void DidAnimateAngle(uint8_t aAttrEnum);
- void DidAnimateBoolean(uint8_t aAttrEnum);
- void DidAnimateEnum(uint8_t aAttrEnum);
- void DidAnimateViewBox();
- void DidAnimatePreserveAspectRatio();
- void DidAnimateNumberList(uint8_t aAttrEnum);
- void DidAnimateLengthList(uint8_t aAttrEnum);
- void DidAnimatePointList();
- void DidAnimatePathSegList();
- void DidAnimateTransformList(int32_t aModType);
- void DidAnimateString(uint8_t aAttrEnum);
- enum {
- /**
- * Flag to indicate to GetAnimatedXxx() methods that the object being
- * requested should be allocated if it hasn't already been allocated, and
- * that the method should not return null. Only applicable to methods that
- * need to allocate the object that they return.
- */
- DO_ALLOCATE = 0x1
- };
- nsSVGLength2* GetAnimatedLength(const nsIAtom *aAttrName);
- void GetAnimatedLengthValues(float *aFirst, ...);
- void GetAnimatedNumberValues(float *aFirst, ...);
- void GetAnimatedIntegerValues(int32_t *aFirst, ...);
- SVGAnimatedNumberList* GetAnimatedNumberList(uint8_t aAttrEnum);
- SVGAnimatedNumberList* GetAnimatedNumberList(nsIAtom *aAttrName);
- void GetAnimatedLengthListValues(SVGUserUnitList *aFirst, ...);
- SVGAnimatedLengthList* GetAnimatedLengthList(uint8_t aAttrEnum);
- virtual SVGAnimatedPointList* GetAnimatedPointList() {
- return nullptr;
- }
- virtual SVGAnimatedPathSegList* GetAnimPathSegList() {
- // DOM interface 'SVGAnimatedPathData' (*inherited* by nsSVGPathElement)
- // has a member called 'animatedPathSegList' member, so we have a shorter
- // name so we don't get hidden by the GetAnimatedPathSegList declared by
- // NS_DECL_NSIDOMSVGANIMATEDPATHDATA.
- return nullptr;
- }
- /**
- * Get the nsSVGAnimatedTransformList for this element.
- *
- * Despite the fact that animated transform lists are used for a variety of
- * attributes, no SVG element uses more than one.
- *
- * It's relatively uncommon for elements to have their transform attribute
- * set, so to save memory the nsSVGAnimatedTransformList is not allocated until
- * the attribute is set/animated or its DOM wrapper is created. Callers that
- * require the nsSVGAnimatedTransformList to be allocated and for this method
- * to return non-null must pass the DO_ALLOCATE flag.
- */
- virtual nsSVGAnimatedTransformList* GetAnimatedTransformList(
- uint32_t aFlags = 0) {
- return nullptr;
- }
- virtual nsISMILAttr* GetAnimatedAttr(int32_t aNamespaceID, nsIAtom* aName) override;
- void AnimationNeedsResample();
- void FlushAnimations();
- virtual void RecompileScriptEventListeners() override;
- void GetStringBaseValue(uint8_t aAttrEnum, nsAString& aResult) const;
- void SetStringBaseValue(uint8_t aAttrEnum, const nsAString& aValue);
- virtual nsIAtom* GetPointListAttrName() const {
- return nullptr;
- }
- virtual nsIAtom* GetPathDataAttrName() const {
- return nullptr;
- }
- virtual nsIAtom* GetTransformListAttrName() const {
- return nullptr;
- }
- const nsAttrValue* GetAnimatedClassName() const
- {
- if (!mClassAttribute.IsAnimated()) {
- return nullptr;
- }
- return mClassAnimAttr;
- }
- virtual void ClearAnyCachedPath() {}
- virtual nsIDOMNode* AsDOMNode() final override { return this; }
- virtual bool IsTransformable() { return false; }
- // WebIDL
- mozilla::dom::SVGSVGElement* GetOwnerSVGElement();
- nsSVGElement* GetViewportElement();
- already_AddRefed<mozilla::dom::SVGAnimatedString> ClassName();
- virtual bool IsFocusableInternal(int32_t* aTabIndex, bool aWithMouse) override;
- protected:
- virtual JSObject* WrapNode(JSContext *cx, JS::Handle<JSObject*> aGivenProto) override;
- #ifdef DEBUG
- // We define BeforeSetAttr here and mark it final to ensure it is NOT used
- // by SVG elements.
- // This is because we're not currently passing the correct value for aValue to
- // BeforeSetAttr since it would involve allocating extra SVG value types.
- // See the comment in nsSVGElement::WillChangeValue.
- virtual nsresult BeforeSetAttr(int32_t aNamespaceID, nsIAtom* aName,
- const nsAttrValueOrString* aValue,
- bool aNotify) override final
- {
- return nsSVGElementBase::BeforeSetAttr(aNamespaceID, aName, aValue, aNotify);
- }
- #endif // DEBUG
- virtual nsresult AfterSetAttr(int32_t aNamespaceID, nsIAtom* aName,
- const nsAttrValue* aValue,
- const nsAttrValue* aOldValue,
- bool aNotify) override;
- virtual bool ParseAttribute(int32_t aNamespaceID, nsIAtom* aAttribute,
- const nsAString& aValue, nsAttrValue& aResult) override;
- static nsresult ReportAttributeParseFailure(nsIDocument* aDocument,
- nsIAtom* aAttribute,
- const nsAString& aValue);
- void UpdateContentStyleRule();
- void UpdateAnimatedContentStyleRule();
- mozilla::css::StyleRule* GetAnimatedContentStyleRule();
- nsAttrValue WillChangeValue(nsIAtom* aName);
- // aNewValue is set to the old value. This value may be invalid if
- // !StoresOwnData.
- void DidChangeValue(nsIAtom* aName, const nsAttrValue& aEmptyOrOldValue,
- nsAttrValue& aNewValue);
- void MaybeSerializeAttrBeforeRemoval(nsIAtom* aName, bool aNotify);
- static nsIAtom* GetEventNameForAttr(nsIAtom* aAttr);
- struct LengthInfo {
- nsIAtom** mName;
- float mDefaultValue;
- uint8_t mDefaultUnitType;
- uint8_t mCtxType;
- };
- struct LengthAttributesInfo {
- nsSVGLength2* mLengths;
- LengthInfo* mLengthInfo;
- uint32_t mLengthCount;
- LengthAttributesInfo(nsSVGLength2 *aLengths,
- LengthInfo *aLengthInfo,
- uint32_t aLengthCount) :
- mLengths(aLengths), mLengthInfo(aLengthInfo), mLengthCount(aLengthCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- struct NumberInfo {
- nsIAtom** mName;
- float mDefaultValue;
- bool mPercentagesAllowed;
- };
- struct NumberAttributesInfo {
- nsSVGNumber2* mNumbers;
- NumberInfo* mNumberInfo;
- uint32_t mNumberCount;
- NumberAttributesInfo(nsSVGNumber2 *aNumbers,
- NumberInfo *aNumberInfo,
- uint32_t aNumberCount) :
- mNumbers(aNumbers), mNumberInfo(aNumberInfo), mNumberCount(aNumberCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- struct NumberPairInfo {
- nsIAtom** mName;
- float mDefaultValue1;
- float mDefaultValue2;
- };
- struct NumberPairAttributesInfo {
- nsSVGNumberPair* mNumberPairs;
- NumberPairInfo* mNumberPairInfo;
- uint32_t mNumberPairCount;
- NumberPairAttributesInfo(nsSVGNumberPair *aNumberPairs,
- NumberPairInfo *aNumberPairInfo,
- uint32_t aNumberPairCount) :
- mNumberPairs(aNumberPairs), mNumberPairInfo(aNumberPairInfo),
- mNumberPairCount(aNumberPairCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- struct IntegerInfo {
- nsIAtom** mName;
- int32_t mDefaultValue;
- };
- struct IntegerAttributesInfo {
- nsSVGInteger* mIntegers;
- IntegerInfo* mIntegerInfo;
- uint32_t mIntegerCount;
- IntegerAttributesInfo(nsSVGInteger *aIntegers,
- IntegerInfo *aIntegerInfo,
- uint32_t aIntegerCount) :
- mIntegers(aIntegers), mIntegerInfo(aIntegerInfo), mIntegerCount(aIntegerCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- struct IntegerPairInfo {
- nsIAtom** mName;
- int32_t mDefaultValue1;
- int32_t mDefaultValue2;
- };
- struct IntegerPairAttributesInfo {
- nsSVGIntegerPair* mIntegerPairs;
- IntegerPairInfo* mIntegerPairInfo;
- uint32_t mIntegerPairCount;
- IntegerPairAttributesInfo(nsSVGIntegerPair *aIntegerPairs,
- IntegerPairInfo *aIntegerPairInfo,
- uint32_t aIntegerPairCount) :
- mIntegerPairs(aIntegerPairs), mIntegerPairInfo(aIntegerPairInfo),
- mIntegerPairCount(aIntegerPairCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- struct AngleInfo {
- nsIAtom** mName;
- float mDefaultValue;
- uint8_t mDefaultUnitType;
- };
- struct AngleAttributesInfo {
- nsSVGAngle* mAngles;
- AngleInfo* mAngleInfo;
- uint32_t mAngleCount;
- AngleAttributesInfo(nsSVGAngle *aAngles,
- AngleInfo *aAngleInfo,
- uint32_t aAngleCount) :
- mAngles(aAngles), mAngleInfo(aAngleInfo), mAngleCount(aAngleCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- struct BooleanInfo {
- nsIAtom** mName;
- bool mDefaultValue;
- };
- struct BooleanAttributesInfo {
- nsSVGBoolean* mBooleans;
- BooleanInfo* mBooleanInfo;
- uint32_t mBooleanCount;
- BooleanAttributesInfo(nsSVGBoolean *aBooleans,
- BooleanInfo *aBooleanInfo,
- uint32_t aBooleanCount) :
- mBooleans(aBooleans), mBooleanInfo(aBooleanInfo), mBooleanCount(aBooleanCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- friend class nsSVGEnum;
- struct EnumInfo {
- nsIAtom** mName;
- nsSVGEnumMapping* mMapping;
- uint16_t mDefaultValue;
- };
- struct EnumAttributesInfo {
- nsSVGEnum* mEnums;
- EnumInfo* mEnumInfo;
- uint32_t mEnumCount;
- EnumAttributesInfo(nsSVGEnum *aEnums,
- EnumInfo *aEnumInfo,
- uint32_t aEnumCount) :
- mEnums(aEnums), mEnumInfo(aEnumInfo), mEnumCount(aEnumCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- struct NumberListInfo {
- nsIAtom** mName;
- };
- struct NumberListAttributesInfo {
- SVGAnimatedNumberList* mNumberLists;
- NumberListInfo* mNumberListInfo;
- uint32_t mNumberListCount;
- NumberListAttributesInfo(SVGAnimatedNumberList *aNumberLists,
- NumberListInfo *aNumberListInfo,
- uint32_t aNumberListCount)
- : mNumberLists(aNumberLists)
- , mNumberListInfo(aNumberListInfo)
- , mNumberListCount(aNumberListCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- struct LengthListInfo {
- nsIAtom** mName;
- uint8_t mAxis;
- /**
- * Flag to indicate whether appending zeros to the end of the list would
- * change the rendering of the SVG for the attribute in question. For x and
- * y on the <text> element this is true, but for dx and dy on <text> this
- * is false. This flag is fed down to SVGLengthListSMILType so it can
- * determine if it can sensibly animate from-to lists of different lengths,
- * which is desirable in the case of dx and dy.
- */
- bool mCouldZeroPadList;
- };
- struct LengthListAttributesInfo {
- SVGAnimatedLengthList* mLengthLists;
- LengthListInfo* mLengthListInfo;
- uint32_t mLengthListCount;
- LengthListAttributesInfo(SVGAnimatedLengthList *aLengthLists,
- LengthListInfo *aLengthListInfo,
- uint32_t aLengthListCount)
- : mLengthLists(aLengthLists)
- , mLengthListInfo(aLengthListInfo)
- , mLengthListCount(aLengthListCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- struct StringInfo {
- nsIAtom** mName;
- int32_t mNamespaceID;
- bool mIsAnimatable;
- };
- struct StringAttributesInfo {
- nsSVGString* mStrings;
- StringInfo* mStringInfo;
- uint32_t mStringCount;
- StringAttributesInfo(nsSVGString *aStrings,
- StringInfo *aStringInfo,
- uint32_t aStringCount) :
- mStrings(aStrings), mStringInfo(aStringInfo), mStringCount(aStringCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- friend class mozilla::DOMSVGStringList;
- struct StringListInfo {
- nsIAtom** mName;
- };
- struct StringListAttributesInfo {
- SVGStringList* mStringLists;
- StringListInfo* mStringListInfo;
- uint32_t mStringListCount;
- StringListAttributesInfo(SVGStringList *aStringLists,
- StringListInfo *aStringListInfo,
- uint32_t aStringListCount) :
- mStringLists(aStringLists), mStringListInfo(aStringListInfo),
- mStringListCount(aStringListCount)
- {}
- void Reset(uint8_t aAttrEnum);
- };
- virtual LengthAttributesInfo GetLengthInfo();
- virtual NumberAttributesInfo GetNumberInfo();
- virtual NumberPairAttributesInfo GetNumberPairInfo();
- virtual IntegerAttributesInfo GetIntegerInfo();
- virtual IntegerPairAttributesInfo GetIntegerPairInfo();
- virtual AngleAttributesInfo GetAngleInfo();
- virtual BooleanAttributesInfo GetBooleanInfo();
- virtual EnumAttributesInfo GetEnumInfo();
- // We assume all viewboxes and preserveAspectRatios are alike
- // so we don't need to wrap the class
- virtual nsSVGViewBox *GetViewBox();
- virtual SVGAnimatedPreserveAspectRatio *GetPreserveAspectRatio();
- virtual NumberListAttributesInfo GetNumberListInfo();
- virtual LengthListAttributesInfo GetLengthListInfo();
- virtual StringAttributesInfo GetStringInfo();
- virtual StringListAttributesInfo GetStringListInfo();
- static nsSVGEnumMapping sSVGUnitTypesMap[];
- private:
- void UnsetAttrInternal(int32_t aNameSpaceID, nsIAtom* aAttribute,
- bool aNotify);
- nsSVGClass mClassAttribute;
- nsAutoPtr<nsAttrValue> mClassAnimAttr;
- RefPtr<mozilla::css::StyleRule> mContentStyleRule;
- };
- /**
- * A macro to implement the NS_NewSVGXXXElement() functions.
- */
- #define NS_IMPL_NS_NEW_SVG_ELEMENT(_elementName) \
- nsresult \
- NS_NewSVG##_elementName##Element(nsIContent **aResult, \
- already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo) \
- { \
- RefPtr<nsSVG##_elementName##Element> it = \
- new nsSVG##_elementName##Element(aNodeInfo); \
- \
- nsresult rv = it->Init(); \
- \
- if (NS_FAILED(rv)) { \
- return rv; \
- } \
- \
- it.forget(aResult); \
- \
- return rv; \
- }
- #define NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT(_elementName) \
- nsresult \
- NS_NewSVG##_elementName##Element(nsIContent **aResult, \
- already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo) \
- { \
- RefPtr<mozilla::dom::SVG##_elementName##Element> it = \
- new mozilla::dom::SVG##_elementName##Element(aNodeInfo); \
- \
- nsresult rv = it->Init(); \
- \
- if (NS_FAILED(rv)) { \
- return rv; \
- } \
- \
- it.forget(aResult); \
- \
- return rv; \
- }
- #define NS_IMPL_NS_NEW_NAMESPACED_SVG_ELEMENT_CHECK_PARSER(_elementName) \
- nsresult \
- NS_NewSVG##_elementName##Element(nsIContent **aResult, \
- already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo, \
- mozilla::dom::FromParser aFromParser) \
- { \
- RefPtr<mozilla::dom::SVG##_elementName##Element> it = \
- new mozilla::dom::SVG##_elementName##Element(aNodeInfo, aFromParser); \
- \
- nsresult rv = it->Init(); \
- \
- if (NS_FAILED(rv)) { \
- return rv; \
- } \
- \
- it.forget(aResult); \
- \
- return rv; \
- }
- // No unlinking, we'd need to null out the value pointer (the object it
- // points to is held by the element) and null-check it everywhere.
- #define NS_SVG_VAL_IMPL_CYCLE_COLLECTION(_val, _element) \
- NS_IMPL_CYCLE_COLLECTION_CLASS(_val) \
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_val) \
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_element) \
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
- NS_IMPL_CYCLE_COLLECTION_UNLINK_0(_val)
- #define NS_SVG_VAL_IMPL_CYCLE_COLLECTION_WRAPPERCACHED(_val, _element) \
- NS_IMPL_CYCLE_COLLECTION_CLASS(_val) \
- NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(_val) \
- NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER \
- NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(_val) \
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_element) \
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END \
- NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(_val) \
- NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER \
- NS_IMPL_CYCLE_COLLECTION_TRACE_END
- #endif // __NS_SVGELEMENT_H__
|