From ffc095055874fffd2168038ad42a55b003ddce44 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Fri, 11 Apr 2014 11:24:06 -0400 Subject: [PATCH] Bug 886416 - Move SVGLength to WebIDL; r=bzbarsky --- content/svg/content/src/DOMSVGLength.cpp | 353 ++++++++++++++---- content/svg/content/src/DOMSVGLength.h | 51 ++- content/svg/content/src/DOMSVGLengthList.cpp | 36 +- content/svg/content/src/DOMSVGLengthList.h | 33 +- content/svg/content/src/SVGAnimatedLength.cpp | 9 +- content/svg/content/src/SVGAnimatedLength.h | 8 +- content/svg/content/src/SVGSVGElement.cpp | 4 +- content/svg/content/src/SVGSVGElement.h | 3 +- content/svg/content/src/nsSVGLength2.cpp | 57 +-- content/svg/content/src/nsSVGLength2.h | 114 +----- dom/base/nsDOMClassInfo.cpp | 7 - dom/base/nsDOMClassInfoClasses.h | 1 - dom/bindings/Bindings.conf | 6 +- dom/webidl/SVGAnimatedLength.webidl | 2 - dom/webidl/SVGLength.webidl | 40 ++ dom/webidl/SVGLengthList.webidl | 2 - dom/webidl/moz.build | 1 + image/src/SVGDocumentWrapper.cpp | 3 +- 18 files changed, 419 insertions(+), 311 deletions(-) create mode 100644 dom/webidl/SVGLength.webidl diff --git a/content/svg/content/src/DOMSVGLength.cpp b/content/svg/content/src/DOMSVGLength.cpp index a2754a1fb45..84c34012ac7 100644 --- a/content/svg/content/src/DOMSVGLength.cpp +++ b/content/svg/content/src/DOMSVGLength.cpp @@ -9,14 +9,21 @@ #include "SVGLength.h" #include "SVGAnimatedLengthList.h" #include "nsSVGElement.h" +#include "nsSVGLength2.h" #include "nsIDOMSVGLength.h" #include "nsError.h" #include "nsMathUtils.h" +#include "mozilla/dom/SVGLengthBinding.h" +#include "nsSVGAttrTearoffTable.h" // See the architecture comment in DOMSVGAnimatedLengthList.h. namespace mozilla { +static nsSVGAttrTearoffTable + sBaseSVGLengthTearOffTable, + sAnimSVGLengthTearOffTable; + // We could use NS_IMPL_CYCLE_COLLECTION_1, except that in Unlink() we need to // clear our list's weak ref to us to be safe. (The other option would be to // not unlink and rely on the breaking of the other edges in the cycle, as @@ -29,23 +36,28 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMSVGLength) tmp->mList->mItems[tmp->mListIndex] = nullptr; } NS_IMPL_CYCLE_COLLECTION_UNLINK(mList) +NS_IMPL_CYCLE_COLLECTION_UNLINK(mSVGElement) +NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(DOMSVGLength) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mList) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSVGElement) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMSVGLength) +NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER +NS_IMPL_CYCLE_COLLECTION_TRACE_END + NS_IMPL_CYCLE_COLLECTING_ADDREF(DOMSVGLength) NS_IMPL_CYCLE_COLLECTING_RELEASE(DOMSVGLength) -} -DOMCI_DATA(SVGLength, mozilla::DOMSVGLength) -namespace mozilla { - NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DOMSVGLength) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_ENTRY(mozilla::DOMSVGLength) // pseudo-interface NS_INTERFACE_MAP_ENTRY(nsIDOMSVGLength) NS_INTERFACE_MAP_ENTRY(nsISupports) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(SVGLength) NS_INTERFACE_MAP_END //---------------------------------------------------------------------- @@ -91,6 +103,7 @@ DOMSVGLength::DOMSVGLength(DOMSVGLengthList *aList, , mIsAnimValItem(aIsAnimValItem) , mUnit(nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER) , mValue(0.0f) + , mVal(nullptr) { // These shifts are in sync with the members in the header. NS_ABORT_IF_FALSE(aList && @@ -98,6 +111,8 @@ DOMSVGLength::DOMSVGLength(DOMSVGLengthList *aList, aListIndex <= MaxListIndex(), "bad arg"); NS_ABORT_IF_FALSE(IndexIsValid(), "Bad index for DOMSVGNumber!"); + + SetIsDOMBinding(); } DOMSVGLength::DOMSVGLength() @@ -107,49 +122,126 @@ DOMSVGLength::DOMSVGLength() , mIsAnimValItem(false) , mUnit(nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER) , mValue(0.0f) + , mVal(nullptr) { + SetIsDOMBinding(); +} + +DOMSVGLength::DOMSVGLength(nsSVGLength2* aVal, nsSVGElement* aSVGElement, + bool aAnimVal) + : mList(nullptr) + , mListIndex(0) + , mAttrEnum(0) + , mIsAnimValItem(aAnimVal) + , mUnit(nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER) + , mValue(0.0f) + , mVal(aVal) + , mSVGElement(aSVGElement) +{ + SetIsDOMBinding(); +} + +DOMSVGLength::~DOMSVGLength() +{ + // Our mList's weak ref to us must be nulled out when we die. If GC has + // unlinked us using the cycle collector code, then that has already + // happened, and mList is null. + if (mList) { + mList->mItems[mListIndex] = nullptr; + } + + if (mVal) { + auto table = mIsAnimValItem ? sAnimSVGLengthTearOffTable : sBaseSVGLengthTearOffTable; + table.RemoveTearoff(mVal); + } +} + +already_AddRefed +DOMSVGLength::GetTearOff(nsSVGLength2* aVal, nsSVGElement* aSVGElement, + bool aAnimVal) +{ + auto table = aAnimVal ? sAnimSVGLengthTearOffTable : sBaseSVGLengthTearOffTable; + nsRefPtr domLength = table.GetTearoff(aVal); + if (!domLength) { + domLength = new DOMSVGLength(aVal, aSVGElement, aAnimVal); + table.AddTearoff(aVal, domLength); + } + + return domLength.forget(); +} + +uint16_t +DOMSVGLength::UnitType() +{ + if (mVal) { + if (mIsAnimValItem) { + mSVGElement->FlushAnimations(); + } + return mVal->mSpecifiedUnitType; + } + + if (mIsAnimValItem && HasOwner()) { + Element()->FlushAnimations(); // May make HasOwner() == false + } + return HasOwner() ? InternalItem().GetUnit() : mUnit; } NS_IMETHODIMP DOMSVGLength::GetUnitType(uint16_t* aUnit) { + *aUnit = UnitType(); + return NS_OK; +} + +float +DOMSVGLength::GetValue(ErrorResult& aRv) +{ + if (mVal) { + if (mIsAnimValItem) { + mSVGElement->FlushAnimations(); + return mVal->GetAnimValue(mSVGElement); + } + return mVal->GetBaseValue(mSVGElement); + } + if (mIsAnimValItem && HasOwner()) { Element()->FlushAnimations(); // May make HasOwner() == false } - *aUnit = HasOwner() ? InternalItem().GetUnit() : mUnit; - return NS_OK; + if (HasOwner()) { + float value = InternalItem().GetValueInUserUnits(Element(), Axis()); + if (!NS_finite(value)) { + aRv.Throw(NS_ERROR_FAILURE); + } + return value; + } else if (mUnit == nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER || + mUnit == nsIDOMSVGLength::SVG_LENGTHTYPE_PX) { + return mValue; + } + // else [SVGWG issue] Can't convert this length's value to user units + // ReportToConsole + aRv.Throw(NS_ERROR_FAILURE); + return 0.0f; } NS_IMETHODIMP DOMSVGLength::GetValue(float* aValue) { - if (mIsAnimValItem && HasOwner()) { - Element()->FlushAnimations(); // May make HasOwner() == false - } - if (HasOwner()) { - *aValue = InternalItem().GetValueInUserUnits(Element(), Axis()); - if (NS_finite(*aValue)) { - return NS_OK; - } - } else if (mUnit == nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER || - mUnit == nsIDOMSVGLength::SVG_LENGTHTYPE_PX) { - *aValue = mValue; - return NS_OK; - } - // else [SVGWG issue] Can't convert this length's value to user units - // ReportToConsole - return NS_ERROR_FAILURE; + ErrorResult rv; + *aValue = GetValue(rv); + return rv.ErrorCode(); } -NS_IMETHODIMP -DOMSVGLength::SetValue(float aUserUnitValue) +void +DOMSVGLength::SetValue(float aUserUnitValue, ErrorResult& aRv) { if (mIsAnimValItem) { - return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; + aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); + return; } - if (!NS_finite(aUserUnitValue)) { - return NS_ERROR_ILLEGAL_VALUE; + if (mVal) { + mVal->SetBaseValue(aUserUnitValue, mSVGElement, true); + return; } // Although the value passed in is in user units, this method does not turn @@ -160,7 +252,7 @@ DOMSVGLength::SetValue(float aUserUnitValue) if (HasOwner()) { if (InternalItem().GetValueInUserUnits(Element(), Axis()) == aUserUnitValue) { - return NS_OK; + return; } float uuPerUnit = InternalItem().GetUserUnitsPerUnit(Element(), Axis()); if (uuPerUnit > 0) { @@ -168,79 +260,142 @@ DOMSVGLength::SetValue(float aUserUnitValue) if (NS_finite(newValue)) { AutoChangeLengthNotifier notifier(this); InternalItem().SetValueAndUnit(newValue, InternalItem().GetUnit()); - return NS_OK; + return; } } } else if (mUnit == nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER || mUnit == nsIDOMSVGLength::SVG_LENGTHTYPE_PX) { mValue = aUserUnitValue; - return NS_OK; + return; } // else [SVGWG issue] Can't convert user unit value to this length's unit // ReportToConsole - return NS_ERROR_FAILURE; + aRv.Throw(NS_ERROR_FAILURE); +} + +NS_IMETHODIMP +DOMSVGLength::SetValue(float aUserUnitValue) +{ + if (!NS_finite(aUserUnitValue)) { + return NS_ERROR_ILLEGAL_VALUE; + } + + ErrorResult rv; + SetValue(aUserUnitValue, rv); + return rv.ErrorCode(); +} + +float +DOMSVGLength::ValueInSpecifiedUnits() +{ + if (mVal) { + if (mIsAnimValItem) { + mSVGElement->FlushAnimations(); + return mVal->mAnimVal; + } + return mVal->mBaseVal; + } + + if (mIsAnimValItem && HasOwner()) { + Element()->FlushAnimations(); // May make HasOwner() == false + } + return HasOwner() ? InternalItem().GetValueInCurrentUnits() : mValue; } NS_IMETHODIMP DOMSVGLength::GetValueInSpecifiedUnits(float* aValue) { - if (mIsAnimValItem && HasOwner()) { - Element()->FlushAnimations(); // May make HasOwner() == false - } - *aValue = HasOwner() ? InternalItem().GetValueInCurrentUnits() : mValue; + *aValue = ValueInSpecifiedUnits(); return NS_OK; } +void +DOMSVGLength::SetValueInSpecifiedUnits(float aValue, ErrorResult& aRv) +{ + if (mIsAnimValItem) { + aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); + return; + } + + if (mVal) { + mVal->SetBaseValueInSpecifiedUnits(aValue, mSVGElement, true); + return; + } + + if (HasOwner()) { + if (InternalItem().GetValueInCurrentUnits() == aValue) { + return; + } + AutoChangeLengthNotifier notifier(this); + InternalItem().SetValueInCurrentUnits(aValue); + return; + } + mValue = aValue; +} + NS_IMETHODIMP DOMSVGLength::SetValueInSpecifiedUnits(float aValue) { - if (mIsAnimValItem) { - return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; - } - if (!NS_finite(aValue)) { return NS_ERROR_ILLEGAL_VALUE; } + ErrorResult rv; + SetValueInSpecifiedUnits(aValue, rv); + return rv.ErrorCode(); +} + +void +DOMSVGLength::SetValueAsString(const nsAString& aValue, ErrorResult& aRv) +{ + if (mIsAnimValItem) { + aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); + return; + } + + if (mVal) { + mVal->SetBaseValueString(aValue, mSVGElement, true); + return; + } + + SVGLength value; + if (!value.SetValueFromString(aValue)) { + aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); + return; + } if (HasOwner()) { - if (InternalItem().GetValueInCurrentUnits() == aValue) { - return NS_OK; + if (InternalItem() == value) { + return; } AutoChangeLengthNotifier notifier(this); - InternalItem().SetValueInCurrentUnits(aValue); - return NS_OK; + InternalItem() = value; + return; } - mValue = aValue; - return NS_OK; + mValue = value.GetValueInCurrentUnits(); + mUnit = value.GetUnit(); } NS_IMETHODIMP DOMSVGLength::SetValueAsString(const nsAString& aValue) { - if (mIsAnimValItem) { - return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; - } - - SVGLength value; - if (!value.SetValueFromString(aValue)) { - return NS_ERROR_DOM_SYNTAX_ERR; - } - if (HasOwner()) { - if (InternalItem() == value) { - return NS_OK; - } - AutoChangeLengthNotifier notifier(this); - InternalItem() = value; - return NS_OK; - } - mValue = value.GetValueInCurrentUnits(); - mUnit = value.GetUnit(); - return NS_OK; + ErrorResult rv; + SetValueAsString(aValue, rv); + return rv.ErrorCode(); } NS_IMETHODIMP DOMSVGLength::GetValueAsString(nsAString& aValue) { + if (mVal) { + if (mIsAnimValItem) { + mSVGElement->FlushAnimations(); + mVal->GetAnimValueString(aValue); + } else { + mVal->GetBaseValueString(aValue); + } + return NS_OK; + } + if (mIsAnimValItem && HasOwner()) { Element()->FlushAnimations(); // May make HasOwner() == false } @@ -252,54 +407,76 @@ DOMSVGLength::GetValueAsString(nsAString& aValue) return NS_OK; } -NS_IMETHODIMP -DOMSVGLength::NewValueSpecifiedUnits(uint16_t aUnit, float aValue) +void +DOMSVGLength::NewValueSpecifiedUnits(uint16_t aUnit, float aValue, + ErrorResult& aRv) { if (mIsAnimValItem) { - return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; + aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); + return; } - if (!NS_finite(aValue)) { - return NS_ERROR_ILLEGAL_VALUE; + if (mVal) { + mVal->NewValueSpecifiedUnits(aUnit, aValue, mSVGElement); + return; } if (!SVGLength::IsValidUnitType(aUnit)) { - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR); + return; } if (HasOwner()) { if (InternalItem().GetUnit() == aUnit && InternalItem().GetValueInCurrentUnits() == aValue) { - return NS_OK; + return; } AutoChangeLengthNotifier notifier(this); InternalItem().SetValueAndUnit(aValue, uint8_t(aUnit)); - return NS_OK; + return; } mUnit = uint8_t(aUnit); mValue = aValue; - return NS_OK; } NS_IMETHODIMP -DOMSVGLength::ConvertToSpecifiedUnits(uint16_t aUnit) +DOMSVGLength::NewValueSpecifiedUnits(uint16_t aUnit, float aValue) +{ + if (!NS_finite(aValue)) { + return NS_ERROR_ILLEGAL_VALUE; + } + + ErrorResult rv; + NewValueSpecifiedUnits(aUnit, aValue, rv); + return rv.ErrorCode(); +} + +void +DOMSVGLength::ConvertToSpecifiedUnits(uint16_t aUnit, ErrorResult& aRv) { if (mIsAnimValItem) { - return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; + aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); + return; + } + + if (mVal) { + mVal->ConvertToSpecifiedUnits(aUnit, mSVGElement); + return; } if (!SVGLength::IsValidUnitType(aUnit)) { - return NS_ERROR_DOM_NOT_SUPPORTED_ERR; + aRv.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR); + return; } if (HasOwner()) { if (InternalItem().GetUnit() == aUnit) { - return NS_OK; + return; } float val = InternalItem().GetValueInSpecifiedUnit( aUnit, Element(), Axis()); if (NS_finite(val)) { AutoChangeLengthNotifier notifier(this); InternalItem().SetValueAndUnit(val, aUnit); - return NS_OK; + return; } } else { SVGLength len(mValue, mUnit); @@ -307,12 +484,26 @@ DOMSVGLength::ConvertToSpecifiedUnits(uint16_t aUnit) if (NS_finite(val)) { mValue = val; mUnit = aUnit; - return NS_OK; + return; } } // else [SVGWG issue] Can't convert unit // ReportToConsole - return NS_ERROR_FAILURE; + aRv.Throw(NS_ERROR_FAILURE); +} + +NS_IMETHODIMP +DOMSVGLength::ConvertToSpecifiedUnits(uint16_t aUnit) +{ + ErrorResult rv; + ConvertToSpecifiedUnits(aUnit, rv); + return rv.ErrorCode(); +} + +JSObject* +DOMSVGLength::WrapObject(JSContext* aCx) +{ + return dom::SVGLengthBinding::Wrap(aCx, this); } void diff --git a/content/svg/content/src/DOMSVGLength.h b/content/svg/content/src/DOMSVGLength.h index 703bcea1f36..5d2ced12b33 100644 --- a/content/svg/content/src/DOMSVGLength.h +++ b/content/svg/content/src/DOMSVGLength.h @@ -14,6 +14,7 @@ #include "nsTArray.h" #include "SVGLength.h" #include "mozilla/Attributes.h" +#include "nsWrapperCache.h" class nsSVGElement; @@ -29,6 +30,8 @@ class nsSVGElement; namespace mozilla { +class ErrorResult; + /** * Class DOMSVGLength * @@ -66,14 +69,20 @@ namespace mozilla { * if-else as appropriate. The bug for doing that work is: * https://bugzilla.mozilla.org/show_bug.cgi?id=571734 */ -class DOMSVGLength MOZ_FINAL : public nsIDOMSVGLength +class DOMSVGLength MOZ_FINAL : public nsIDOMSVGLength, + public nsWrapperCache { friend class AutoChangeLengthNotifier; + /** + * Ctor for creating the object returned by nsSVGLength2::ToDOMBaseVal/ToDOMAnimVal + */ + DOMSVGLength(nsSVGLength2* aVal, nsSVGElement* aSVGElement, bool aAnimVal); + public: NS_DECLARE_STATIC_IID_ACCESSOR(MOZILLA_DOMSVGLENGTH_IID) NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_CLASS(DOMSVGLength) + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMSVGLength) NS_DECL_NSIDOMSVGLENGTH /** @@ -90,14 +99,11 @@ public: */ DOMSVGLength(); - ~DOMSVGLength() { - // Our mList's weak ref to us must be nulled out when we die. If GC has - // unlinked us using the cycle collector code, then that has already - // happened, and mList is null. - if (mList) { - mList->mItems[mListIndex] = nullptr; - } - } + ~DOMSVGLength(); + + static already_AddRefed GetTearOff(nsSVGLength2* aVal, + nsSVGElement* aSVGElement, + bool aAnimVal); /** * Create an unowned copy of an owned length. The caller is responsible for @@ -156,9 +162,28 @@ public: SVGLength ToSVGLength(); + // WebIDL + uint16_t UnitType(); + float GetValue(ErrorResult& aRv); + void SetValue(float aValue, ErrorResult& aRv); + float ValueInSpecifiedUnits(); + void SetValueInSpecifiedUnits(float aValue, ErrorResult& aRv); + // The XPCOM GetValueAsString is good + void SetValueAsString(const nsAString& aValue, ErrorResult& aRv); + void NewValueSpecifiedUnits(uint16_t aUnit, float aValue, + ErrorResult& aRv); + void ConvertToSpecifiedUnits(uint16_t aUnit, ErrorResult& aRv); + + nsISupports* GetParentObject() const { + auto svgElement = mList ? Element() : mSVGElement.get(); + return static_cast (svgElement); + } + + JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; + private: - nsSVGElement* Element() { + nsSVGElement* Element() const { return mList->Element(); } @@ -201,6 +226,10 @@ private: // The following members are only used when we're not in a list: uint32_t mUnit:5; // can handle 31 units (the 10 SVG 1.1 units + rem, vw, vh, wm, calc + future additions) float mValue; + + // The following members are only used when we have an nsSVGLength2 + nsSVGLength2* mVal; // kept alive because it belongs to mSVGElement + nsRefPtr mSVGElement; }; NS_DEFINE_STATIC_IID_ACCESSOR(DOMSVGLength, MOZILLA_DOMSVGLENGTH_IID) diff --git a/content/svg/content/src/DOMSVGLengthList.cpp b/content/svg/content/src/DOMSVGLengthList.cpp index 86d23cd4de9..935f770e502 100644 --- a/content/svg/content/src/DOMSVGLengthList.cpp +++ b/content/svg/content/src/DOMSVGLengthList.cpp @@ -172,8 +172,8 @@ DOMSVGLengthList::Clear(ErrorResult& aError) } } -already_AddRefed -DOMSVGLengthList::Initialize(nsIDOMSVGLength *newItem, +already_AddRefed +DOMSVGLengthList::Initialize(DOMSVGLength& newItem, ErrorResult& error) { if (IsAnimValList()) { @@ -189,33 +189,33 @@ DOMSVGLengthList::Initialize(nsIDOMSVGLength *newItem, // clone of newItem, it would actually insert newItem. To prevent that from // happening we have to do the clone here, if necessary. - nsCOMPtr domItem = do_QueryInterface(newItem); + nsRefPtr domItem = &newItem; if (!domItem) { error.Throw(NS_ERROR_DOM_SVG_WRONG_TYPE_ERR); return nullptr; } if (domItem->HasOwner()) { - newItem = domItem->Copy(); + domItem = domItem->Copy(); } ErrorResult rv; Clear(rv); MOZ_ASSERT(!rv.Failed()); - return InsertItemBefore(newItem, 0, error); + return InsertItemBefore(*domItem, 0, error); } -already_AddRefed +already_AddRefed DOMSVGLengthList::GetItem(uint32_t index, ErrorResult& error) { bool found; - nsRefPtr item = IndexedGetter(index, found, error); + nsRefPtr item = IndexedGetter(index, found, error); if (!found) { error.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); } return item.forget(); } -already_AddRefed +already_AddRefed DOMSVGLengthList::IndexedGetter(uint32_t index, bool& found, ErrorResult& error) { if (IsAnimValList()) { @@ -228,8 +228,8 @@ DOMSVGLengthList::IndexedGetter(uint32_t index, bool& found, ErrorResult& error) return nullptr; } -already_AddRefed -DOMSVGLengthList::InsertItemBefore(nsIDOMSVGLength *newItem, +already_AddRefed +DOMSVGLengthList::InsertItemBefore(DOMSVGLength& newItem, uint32_t index, ErrorResult& error) { @@ -244,7 +244,7 @@ DOMSVGLengthList::InsertItemBefore(nsIDOMSVGLength *newItem, return nullptr; } - nsCOMPtr domItem = do_QueryInterface(newItem); + nsRefPtr domItem = &newItem; if (!domItem) { error.Throw(NS_ERROR_DOM_SVG_WRONG_TYPE_ERR); return nullptr; @@ -277,8 +277,8 @@ DOMSVGLengthList::InsertItemBefore(nsIDOMSVGLength *newItem, return domItem.forget(); } -already_AddRefed -DOMSVGLengthList::ReplaceItem(nsIDOMSVGLength *newItem, +already_AddRefed +DOMSVGLengthList::ReplaceItem(DOMSVGLength& newItem, uint32_t index, ErrorResult& error) { @@ -287,7 +287,7 @@ DOMSVGLengthList::ReplaceItem(nsIDOMSVGLength *newItem, return nullptr; } - nsCOMPtr domItem = do_QueryInterface(newItem); + nsRefPtr domItem = &newItem; if (!domItem) { error.Throw(NS_ERROR_DOM_SVG_WRONG_TYPE_ERR); return nullptr; @@ -317,7 +317,7 @@ DOMSVGLengthList::ReplaceItem(nsIDOMSVGLength *newItem, return domItem.forget(); } -already_AddRefed +already_AddRefed DOMSVGLengthList::RemoveItem(uint32_t index, ErrorResult& error) { @@ -338,7 +338,7 @@ DOMSVGLengthList::RemoveItem(uint32_t index, MaybeRemoveItemFromAnimValListAt(index); // We have to return the removed item, so get it, creating it if necessary: - nsCOMPtr result = GetItemAt(index); + nsCOMPtr result = GetItemAt(index); // Notify the DOM item of removal *before* modifying the lists so that the // DOM item can copy its *old* value: @@ -352,7 +352,7 @@ DOMSVGLengthList::RemoveItem(uint32_t index, return result.forget(); } -already_AddRefed +already_AddRefed DOMSVGLengthList::GetItemAt(uint32_t aIndex) { MOZ_ASSERT(aIndex < mItems.Length()); @@ -360,7 +360,7 @@ DOMSVGLengthList::GetItemAt(uint32_t aIndex) if (!mItems[aIndex]) { mItems[aIndex] = new DOMSVGLength(this, AttrEnum(), aIndex, IsAnimValList()); } - nsRefPtr result = mItems[aIndex]; + nsRefPtr result = mItems[aIndex]; return result.forget(); } diff --git a/content/svg/content/src/DOMSVGLengthList.h b/content/svg/content/src/DOMSVGLengthList.h index 23bc70ae52f..b2f54eab85c 100644 --- a/content/svg/content/src/DOMSVGLengthList.h +++ b/content/svg/content/src/DOMSVGLengthList.h @@ -15,7 +15,6 @@ #include "mozilla/Attributes.h" #include "mozilla/ErrorResult.h" -class nsIDOMSVGLength; class nsSVGElement; namespace mozilla { @@ -109,22 +108,22 @@ public: return LengthNoFlush(); } void Clear(ErrorResult& aError); - already_AddRefed Initialize(nsIDOMSVGLength *newItem, - ErrorResult& error); - already_AddRefed GetItem(uint32_t index, + already_AddRefed Initialize(DOMSVGLength& newItem, ErrorResult& error); - already_AddRefed IndexedGetter(uint32_t index, bool& found, - ErrorResult& error); - already_AddRefed InsertItemBefore(nsIDOMSVGLength *newItem, - uint32_t index, - ErrorResult& error); - already_AddRefed ReplaceItem(nsIDOMSVGLength *newItem, - uint32_t index, - ErrorResult& error); - already_AddRefed RemoveItem(uint32_t index, + already_AddRefed GetItem(uint32_t index, + ErrorResult& error); + already_AddRefed IndexedGetter(uint32_t index, bool& found, ErrorResult& error); - already_AddRefed AppendItem(nsIDOMSVGLength *newItem, - ErrorResult& error) + already_AddRefed InsertItemBefore(DOMSVGLength& newItem, + uint32_t index, + ErrorResult& error); + already_AddRefed ReplaceItem(DOMSVGLength& newItem, + uint32_t index, + ErrorResult& error); + already_AddRefed RemoveItem(uint32_t index, + ErrorResult& error); + already_AddRefed AppendItem(DOMSVGLength& newItem, + ErrorResult& error) { return InsertItemBefore(newItem, LengthNoFlush(), error); } @@ -164,8 +163,8 @@ private: */ SVGLengthList& InternalList() const; - /// Returns the nsIDOMSVGLength at aIndex, creating it if necessary. - already_AddRefed GetItemAt(uint32_t aIndex); + /// Returns the DOMSVGLength at aIndex, creating it if necessary. + already_AddRefed GetItemAt(uint32_t aIndex); void MaybeInsertNullInAnimValListAt(uint32_t aIndex); void MaybeRemoveItemFromAnimValListAt(uint32_t aIndex); diff --git a/content/svg/content/src/SVGAnimatedLength.cpp b/content/svg/content/src/SVGAnimatedLength.cpp index e6a0d0961c8..566a373fa4e 100644 --- a/content/svg/content/src/SVGAnimatedLength.cpp +++ b/content/svg/content/src/SVGAnimatedLength.cpp @@ -6,6 +6,7 @@ #include "mozilla/dom/SVGAnimatedLength.h" #include "mozilla/dom/SVGAnimatedLengthBinding.h" #include "nsSVGLength2.h" +#include "DOMSVGLength.h" namespace mozilla { namespace dom { @@ -21,18 +22,18 @@ SVGAnimatedLength::WrapObject(JSContext* aCx) return SVGAnimatedLengthBinding::Wrap(aCx, this); } -already_AddRefed +already_AddRefed SVGAnimatedLength::BaseVal() { - nsRefPtr angle; + nsRefPtr angle; mVal->ToDOMBaseVal(getter_AddRefs(angle), mSVGElement); return angle.forget(); } -already_AddRefed +already_AddRefed SVGAnimatedLength::AnimVal() { - nsRefPtr angle; + nsRefPtr angle; mVal->ToDOMAnimVal(getter_AddRefs(angle), mSVGElement); return angle.forget(); } diff --git a/content/svg/content/src/SVGAnimatedLength.h b/content/svg/content/src/SVGAnimatedLength.h index 72ad59f9c9e..6c9c2dfb7b0 100644 --- a/content/svg/content/src/SVGAnimatedLength.h +++ b/content/svg/content/src/SVGAnimatedLength.h @@ -10,9 +10,11 @@ #include "nsSVGElement.h" class nsSVGLength2; -class nsIDOMSVGLength; namespace mozilla { + +class DOMSVGLength; + namespace dom { class SVGAnimatedLength MOZ_FINAL : public nsWrapperCache @@ -30,8 +32,8 @@ public: // WebIDL nsSVGElement* GetParentObject() { return mSVGElement; } virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; - already_AddRefed BaseVal(); - already_AddRefed AnimVal(); + already_AddRefed BaseVal(); + already_AddRefed AnimVal(); protected: nsSVGLength2* mVal; // kept alive because it belongs to content diff --git a/content/svg/content/src/SVGSVGElement.cpp b/content/svg/content/src/SVGSVGElement.cpp index 6519bf9879c..6dd946a27c1 100644 --- a/content/svg/content/src/SVGSVGElement.cpp +++ b/content/svg/content/src/SVGSVGElement.cpp @@ -387,10 +387,10 @@ SVGSVGElement::CreateSVGNumber() return number.forget(); } -already_AddRefed +already_AddRefed SVGSVGElement::CreateSVGLength() { - nsCOMPtr length = new DOMSVGLength(); + nsCOMPtr length = new DOMSVGLength(); return length.forget(); } diff --git a/content/svg/content/src/SVGSVGElement.h b/content/svg/content/src/SVGSVGElement.h index eab38b24212..a4a588aa7ec 100644 --- a/content/svg/content/src/SVGSVGElement.h +++ b/content/svg/content/src/SVGSVGElement.h @@ -30,6 +30,7 @@ class nsSVGImageFrame; namespace mozilla { class AutoSVGRenderingState; class DOMSVGAnimatedPreserveAspectRatio; +class DOMSVGLength; class EventChainPreVisitor; class SVGFragmentIdentifier; @@ -239,7 +240,7 @@ public: void SetCurrentTime(float seconds); void DeselectAll(); already_AddRefed CreateSVGNumber(); - already_AddRefed CreateSVGLength(); + already_AddRefed CreateSVGLength(); already_AddRefed CreateSVGAngle(); already_AddRefed CreateSVGPoint(); already_AddRefed CreateSVGMatrix(); diff --git a/content/svg/content/src/nsSVGLength2.cpp b/content/svg/content/src/nsSVGLength2.cpp index dd6bb423dd7..90c9a31d779 100644 --- a/content/svg/content/src/nsSVGLength2.cpp +++ b/content/svg/content/src/nsSVGLength2.cpp @@ -15,32 +15,11 @@ #include "nsSVGAttrTearoffTable.h" #include "nsSVGIntegrationUtils.h" #include "nsTextFormatter.h" +#include "DOMSVGLength.h" using namespace mozilla; using namespace mozilla::dom; -NS_SVG_VAL_IMPL_CYCLE_COLLECTION(nsSVGLength2::DOMBaseVal, mSVGElement) - -NS_SVG_VAL_IMPL_CYCLE_COLLECTION(nsSVGLength2::DOMAnimVal, mSVGElement) - -NS_IMPL_CYCLE_COLLECTING_ADDREF(nsSVGLength2::DOMBaseVal) -NS_IMPL_CYCLE_COLLECTING_RELEASE(nsSVGLength2::DOMBaseVal) - -NS_IMPL_CYCLE_COLLECTING_ADDREF(nsSVGLength2::DOMAnimVal) -NS_IMPL_CYCLE_COLLECTING_RELEASE(nsSVGLength2::DOMAnimVal) - -NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsSVGLength2::DOMBaseVal) - NS_INTERFACE_MAP_ENTRY(nsIDOMSVGLength) - NS_INTERFACE_MAP_ENTRY(nsISupports) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(SVGLength) -NS_INTERFACE_MAP_END - -NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsSVGLength2::DOMAnimVal) - NS_INTERFACE_MAP_ENTRY(nsIDOMSVGLength) - NS_INTERFACE_MAP_ENTRY(nsISupports) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(SVGLength) -NS_INTERFACE_MAP_END - static nsIAtom** const unitMap[] = { nullptr, /* SVG_LENGTHTYPE_UNKNOWN */ @@ -58,10 +37,6 @@ static nsIAtom** const unitMap[] = static nsSVGAttrTearoffTable sSVGAnimatedLengthTearoffTable; -static nsSVGAttrTearoffTable - sBaseSVGLengthTearoffTable; -static nsSVGAttrTearoffTable - sAnimSVGLengthTearoffTable; /* Helper functions */ @@ -345,43 +320,25 @@ nsSVGLength2::NewValueSpecifiedUnits(uint16_t unitType, } nsresult -nsSVGLength2::ToDOMBaseVal(nsIDOMSVGLength **aResult, nsSVGElement *aSVGElement) +nsSVGLength2::ToDOMBaseVal(DOMSVGLength **aResult, nsSVGElement *aSVGElement) { - nsRefPtr domBaseVal = - sBaseSVGLengthTearoffTable.GetTearoff(this); - if (!domBaseVal) { - domBaseVal = new DOMBaseVal(this, aSVGElement); - sBaseSVGLengthTearoffTable.AddTearoff(this, domBaseVal); - } + nsRefPtr domBaseVal = + DOMSVGLength::GetTearOff(this, aSVGElement, false); domBaseVal.forget(aResult); return NS_OK; } -nsSVGLength2::DOMBaseVal::~DOMBaseVal() -{ - sBaseSVGLengthTearoffTable.RemoveTearoff(mVal); -} - nsresult -nsSVGLength2::ToDOMAnimVal(nsIDOMSVGLength **aResult, nsSVGElement *aSVGElement) +nsSVGLength2::ToDOMAnimVal(DOMSVGLength **aResult, nsSVGElement *aSVGElement) { - nsRefPtr domAnimVal = - sAnimSVGLengthTearoffTable.GetTearoff(this); - if (!domAnimVal) { - domAnimVal = new DOMAnimVal(this, aSVGElement); - sAnimSVGLengthTearoffTable.AddTearoff(this, domAnimVal); - } + nsRefPtr domAnimVal = + DOMSVGLength::GetTearOff(this, aSVGElement, true); domAnimVal.forget(aResult); return NS_OK; } -nsSVGLength2::DOMAnimVal::~DOMAnimVal() -{ - sAnimSVGLengthTearoffTable.RemoveTearoff(mVal); -} - /* Implementation */ nsresult diff --git a/content/svg/content/src/nsSVGLength2.h b/content/svg/content/src/nsSVGLength2.h index 4e5ca010343..a9923fda824 100644 --- a/content/svg/content/src/nsSVGLength2.h +++ b/content/svg/content/src/nsSVGLength2.h @@ -21,6 +21,7 @@ class nsIFrame; class nsSMILValue; namespace mozilla { +class DOMSVGLength; namespace dom { class SVGAnimatedLength; class SVGAnimationElement; @@ -31,6 +32,7 @@ class SVGSVGElement; class nsSVGLength2 { friend class mozilla::dom::SVGAnimatedLength; + friend class mozilla::DOMSVGLength; public: void Init(uint8_t aCtxType = SVGContentUtils::XY, uint8_t aAttrEnum = 0xff, @@ -131,118 +133,10 @@ private: nsresult NewValueSpecifiedUnits(uint16_t aUnitType, float aValue, nsSVGElement *aSVGElement); nsresult ConvertToSpecifiedUnits(uint16_t aUnitType, nsSVGElement *aSVGElement); - nsresult ToDOMBaseVal(nsIDOMSVGLength **aResult, nsSVGElement* aSVGElement); - nsresult ToDOMAnimVal(nsIDOMSVGLength **aResult, nsSVGElement* aSVGElement); + nsresult ToDOMBaseVal(mozilla::DOMSVGLength **aResult, nsSVGElement* aSVGElement); + nsresult ToDOMAnimVal(mozilla::DOMSVGLength **aResult, nsSVGElement* aSVGElement); public: - struct DOMBaseVal : public nsIDOMSVGLength - { - NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_CLASS(DOMBaseVal) - - DOMBaseVal(nsSVGLength2* aVal, nsSVGElement *aSVGElement) - : mVal(aVal), mSVGElement(aSVGElement) {} - virtual ~DOMBaseVal(); - - nsSVGLength2* mVal; // kept alive because it belongs to mSVGElement - nsRefPtr mSVGElement; - - NS_IMETHOD GetUnitType(uint16_t* aResult) MOZ_OVERRIDE - { *aResult = mVal->mSpecifiedUnitType; return NS_OK; } - - NS_IMETHOD GetValue(float* aResult) MOZ_OVERRIDE - { *aResult = mVal->GetBaseValue(mSVGElement); return NS_OK; } - NS_IMETHOD SetValue(float aValue) MOZ_OVERRIDE - { - if (!NS_finite(aValue)) { - return NS_ERROR_ILLEGAL_VALUE; - } - mVal->SetBaseValue(aValue, mSVGElement, true); - return NS_OK; - } - - NS_IMETHOD GetValueInSpecifiedUnits(float* aResult) MOZ_OVERRIDE - { *aResult = mVal->mBaseVal; return NS_OK; } - NS_IMETHOD SetValueInSpecifiedUnits(float aValue) MOZ_OVERRIDE - { - if (!NS_finite(aValue)) { - return NS_ERROR_ILLEGAL_VALUE; - } - mVal->SetBaseValueInSpecifiedUnits(aValue, mSVGElement, true); - return NS_OK; - } - - NS_IMETHOD SetValueAsString(const nsAString& aValue) MOZ_OVERRIDE - { return mVal->SetBaseValueString(aValue, mSVGElement, true); } - NS_IMETHOD GetValueAsString(nsAString& aValue) MOZ_OVERRIDE - { mVal->GetBaseValueString(aValue); return NS_OK; } - - NS_IMETHOD NewValueSpecifiedUnits(uint16_t unitType, - float valueInSpecifiedUnits) MOZ_OVERRIDE - { - return mVal->NewValueSpecifiedUnits(unitType, valueInSpecifiedUnits, - mSVGElement); } - - NS_IMETHOD ConvertToSpecifiedUnits(uint16_t unitType) MOZ_OVERRIDE - { return mVal->ConvertToSpecifiedUnits(unitType, mSVGElement); } - }; - - struct DOMAnimVal : public nsIDOMSVGLength - { - NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_CLASS(DOMAnimVal) - - DOMAnimVal(nsSVGLength2* aVal, nsSVGElement *aSVGElement) - : mVal(aVal), mSVGElement(aSVGElement) {} - virtual ~DOMAnimVal(); - - nsSVGLength2* mVal; // kept alive because it belongs to mSVGElement - nsRefPtr mSVGElement; - - // Script may have modified animation parameters or timeline -- DOM getters - // need to flush any resample requests to reflect these modifications. - NS_IMETHOD GetUnitType(uint16_t* aResult) MOZ_OVERRIDE - { - mSVGElement->FlushAnimations(); - *aResult = mVal->mSpecifiedUnitType; - return NS_OK; - } - - NS_IMETHOD GetValue(float* aResult) MOZ_OVERRIDE - { - mSVGElement->FlushAnimations(); - *aResult = mVal->GetAnimValue(mSVGElement); - return NS_OK; - } - NS_IMETHOD SetValue(float aValue) MOZ_OVERRIDE - { return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; } - - NS_IMETHOD GetValueInSpecifiedUnits(float* aResult) MOZ_OVERRIDE - { - mSVGElement->FlushAnimations(); - *aResult = mVal->mAnimVal; - return NS_OK; - } - NS_IMETHOD SetValueInSpecifiedUnits(float aValue) MOZ_OVERRIDE - { return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; } - - NS_IMETHOD SetValueAsString(const nsAString& aValue) MOZ_OVERRIDE - { return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; } - NS_IMETHOD GetValueAsString(nsAString& aValue) MOZ_OVERRIDE - { - mSVGElement->FlushAnimations(); - mVal->GetAnimValueString(aValue); - return NS_OK; - } - - NS_IMETHOD NewValueSpecifiedUnits(uint16_t unitType, - float valueInSpecifiedUnits) MOZ_OVERRIDE - { return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; } - - NS_IMETHOD ConvertToSpecifiedUnits(uint16_t unitType) MOZ_OVERRIDE - { return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; } - }; - struct SMILLength : public nsISMILAttr { public: diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index a4d2aef9c66..ba17e359a47 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -122,7 +122,6 @@ #include "nsIDOMXPathNSResolver.h" #include "nsIDOMXPathResult.h" -#include "nsIDOMSVGLength.h" #include "nsIDOMSVGNumber.h" // Storage includes @@ -365,8 +364,6 @@ static nsDOMClassInfoData sClassInfoData[] = { DOM_DEFAULT_SCRIPTABLE_FLAGS) // other SVG classes - NS_DEFINE_CLASSINFO_DATA(SVGLength, nsDOMGenericSH, - DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGNumber, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) @@ -1018,10 +1015,6 @@ nsDOMClassInfo::Init() // The SVG document // other SVG classes - DOM_CLASSINFO_MAP_BEGIN(SVGLength, nsIDOMSVGLength) - DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGLength) - DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(SVGNumber, nsIDOMSVGNumber) DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGNumber) DOM_CLASSINFO_MAP_END diff --git a/dom/base/nsDOMClassInfoClasses.h b/dom/base/nsDOMClassInfoClasses.h index f6e03dcd5ba..474844324e1 100644 --- a/dom/base/nsDOMClassInfoClasses.h +++ b/dom/base/nsDOMClassInfoClasses.h @@ -46,7 +46,6 @@ DOMCI_CLASS(CSSMozDocumentRule) DOMCI_CLASS(CSSSupportsRule) // other SVG classes -DOMCI_CLASS(SVGLength) DOMCI_CLASS(SVGNumber) // WindowUtils diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index 96cb751fa15..9aaba59d2f7 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -1055,6 +1055,11 @@ DOMInterfaces = { 'concrete': False, }, +'SVGLength': { + 'nativeType': 'mozilla::DOMSVGLength', + 'headerFile': 'DOMSVGLength.h' +}, + 'SVGLengthList': { 'nativeType': 'mozilla::DOMSVGLengthList', 'headerFile': 'DOMSVGLengthList.h' @@ -1916,7 +1921,6 @@ addExternalIface('Principal', nativeType='nsIPrincipal', addExternalIface('StackFrame', nativeType='nsIStackFrame', headerFile='nsIException.h', notflattened=True) addExternalIface('StyleSheetList') -addExternalIface('SVGLength') addExternalIface('SVGNumber') addExternalIface('URI', nativeType='nsIURI', headerFile='nsIURI.h', notflattened=True) diff --git a/dom/webidl/SVGAnimatedLength.webidl b/dom/webidl/SVGAnimatedLength.webidl index 223ccec3f21..f7fac144d3c 100644 --- a/dom/webidl/SVGAnimatedLength.webidl +++ b/dom/webidl/SVGAnimatedLength.webidl @@ -10,8 +10,6 @@ * liability, trademark and document use rules apply. */ -interface SVGLength; - interface SVGAnimatedLength { [Constant] readonly attribute SVGLength baseVal; diff --git a/dom/webidl/SVGLength.webidl b/dom/webidl/SVGLength.webidl new file mode 100644 index 00000000000..6d56132db08 --- /dev/null +++ b/dom/webidl/SVGLength.webidl @@ -0,0 +1,40 @@ +/* -*- Mode: IDL; tab-width: 2; 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/. + * + * The origin of this IDL file is + * http://www.w3.org/TR/SVG2/ + * + * Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C + * liability, trademark and document use rules apply. + */ + +interface SVGLength { + + // Length Unit Types + const unsigned short SVG_LENGTHTYPE_UNKNOWN = 0; + const unsigned short SVG_LENGTHTYPE_NUMBER = 1; + const unsigned short SVG_LENGTHTYPE_PERCENTAGE = 2; + const unsigned short SVG_LENGTHTYPE_EMS = 3; + const unsigned short SVG_LENGTHTYPE_EXS = 4; + const unsigned short SVG_LENGTHTYPE_PX = 5; + const unsigned short SVG_LENGTHTYPE_CM = 6; + const unsigned short SVG_LENGTHTYPE_MM = 7; + const unsigned short SVG_LENGTHTYPE_IN = 8; + const unsigned short SVG_LENGTHTYPE_PT = 9; + const unsigned short SVG_LENGTHTYPE_PC = 10; + + readonly attribute unsigned short unitType; + [Throws] + attribute float value; + [SetterThrows] + attribute float valueInSpecifiedUnits; + [SetterThrows] + attribute DOMString valueAsString; + + [Throws] + void newValueSpecifiedUnits(unsigned short unitType, float valueInSpecifiedUnits); + [Throws] + void convertToSpecifiedUnits(unsigned short unitType); +}; diff --git a/dom/webidl/SVGLengthList.webidl b/dom/webidl/SVGLengthList.webidl index 72a22e5e9df..c4fab44e4b7 100644 --- a/dom/webidl/SVGLengthList.webidl +++ b/dom/webidl/SVGLengthList.webidl @@ -10,8 +10,6 @@ * liability, trademark and document use rules apply. */ -interface SVGLength; - interface SVGLengthList { readonly attribute unsigned long numberOfItems; [Throws] diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build index 32e7e592ac8..ae32332faee 100644 --- a/dom/webidl/moz.build +++ b/dom/webidl/moz.build @@ -365,6 +365,7 @@ WEBIDL_FILES = [ 'SVGGradientElement.webidl', 'SVGGraphicsElement.webidl', 'SVGImageElement.webidl', + 'SVGLength.webidl', 'SVGLengthList.webidl', 'SVGLinearGradientElement.webidl', 'SVGLineElement.webidl', diff --git a/image/src/SVGDocumentWrapper.cpp b/image/src/SVGDocumentWrapper.cpp index a6a14a75f91..d5596bc5a7d 100644 --- a/image/src/SVGDocumentWrapper.cpp +++ b/image/src/SVGDocumentWrapper.cpp @@ -27,6 +27,7 @@ #include "nsSVGEffects.h" #include "mozilla/dom/SVGAnimatedLength.h" #include "nsMimeTypes.h" +#include "DOMSVGLength.h" // undef the GetCurrentTime macro defined in WinBase.h from the MS Platform SDK #undef GetCurrentTime @@ -85,7 +86,7 @@ SVGDocumentWrapper::GetWidthOrHeight(Dimension aDimension, NS_ENSURE_TRUE(domAnimLength, false); // Get the animated value from the object - nsRefPtr domLength = domAnimLength->AnimVal(); + nsRefPtr domLength = domAnimLength->AnimVal(); NS_ENSURE_TRUE(domLength, false); // Check if it's a percent value (and fail if so)