author | Cameron McCormack <cam@mcc.id.au> |
Fri, 08 Apr 2011 10:44:03 +1200 | |
changeset 67630 | 149b54c11f2afd3401990dc757a6046aec9b7535 |
parent 67629 | f4790a0a4cb8ba643ab17942573a17a67dbc11c9 |
child 67631 | 0e3ddf2b44135ee02b87cee831d866f55809a7eb |
push id | 1 |
push user | root |
push date | Tue, 26 Apr 2011 22:38:44 +0000 |
treeherder | mozilla-beta@bfdb6e623a36 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jwatt, bzbarsky |
bugs | 631437 |
milestone | 2.2a1pre |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/content/svg/content/src/DOMSVGLengthList.cpp +++ b/content/svg/content/src/DOMSVGLengthList.cpp @@ -87,16 +87,31 @@ namespace mozilla { NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DOMSVGLengthList) NS_INTERFACE_MAP_ENTRY(nsIDOMSVGLengthList) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(SVGLengthList) NS_INTERFACE_MAP_END +nsIDOMSVGLength* +DOMSVGLengthList::GetItemWithoutAddRef(PRUint32 aIndex) +{ +#ifdef MOZ_SMIL + if (IsAnimValList()) { + Element()->FlushAnimations(); + } +#endif + if (aIndex < Length()) { + EnsureItemAt(aIndex); + return mItems[aIndex]; + } + return nsnull; +} + void DOMSVGLengthList::InternalListLengthWillChange(PRUint32 aNewLength) { PRUint32 oldLength = mItems.Length(); if (aNewLength > DOMSVGLength::MaxListIndex()) { // It's safe to get out of sync with our internal list as long as we have // FEWER items than it does. @@ -205,28 +220,22 @@ DOMSVGLengthList::Initialize(nsIDOMSVGLe Clear(); return InsertItemBefore(newItem, 0, _retval); } NS_IMETHODIMP DOMSVGLengthList::GetItem(PRUint32 index, nsIDOMSVGLength **_retval) { -#ifdef MOZ_SMIL - if (IsAnimValList()) { - Element()->FlushAnimations(); + *_retval = GetItemWithoutAddRef(index); + if (!*_retval) { + return NS_ERROR_DOM_INDEX_SIZE_ERR; } -#endif - if (index < Length()) { - EnsureItemAt(index); - NS_ADDREF(*_retval = mItems[index]); - return NS_OK; - } - *_retval = nsnull; - return NS_ERROR_DOM_INDEX_SIZE_ERR; + NS_ADDREF(*_retval); + return NS_OK; } NS_IMETHODIMP DOMSVGLengthList::InsertItemBefore(nsIDOMSVGLength *newItem, PRUint32 index, nsIDOMSVGLength **_retval) { *_retval = nsnull; @@ -362,16 +371,22 @@ DOMSVGLengthList::RemoveItem(PRUint32 in NS_IMETHODIMP DOMSVGLengthList::AppendItem(nsIDOMSVGLength *newItem, nsIDOMSVGLength **_retval) { return InsertItemBefore(newItem, Length(), _retval); } +NS_IMETHODIMP +DOMSVGLengthList::GetLength(PRUint32 *aNumberOfItems) +{ + return GetNumberOfItems(aNumberOfItems); +} + void DOMSVGLengthList::EnsureItemAt(PRUint32 aIndex) { if (!mItems[aIndex]) { mItems[aIndex] = new DOMSVGLength(this, AttrEnum(), aIndex, IsAnimValList()); } }
--- a/content/svg/content/src/DOMSVGLengthList.h +++ b/content/svg/content/src/DOMSVGLengthList.h @@ -104,16 +104,18 @@ public: PRUint32 Length() const { NS_ABORT_IF_FALSE(mItems.Length() == 0 || mItems.Length() == const_cast<DOMSVGLengthList*>(this)->InternalList().Length(), "DOM wrapper's list length is out of sync"); return mItems.Length(); } + nsIDOMSVGLength* GetItemWithoutAddRef(PRUint32 aIndex); + /// Called to notify us to syncronize our length and detach excess items. void InternalListLengthWillChange(PRUint32 aNewLength); private: nsSVGElement* Element() { return mAList->mElement; }
--- a/content/svg/content/src/DOMSVGNumberList.cpp +++ b/content/svg/content/src/DOMSVGNumberList.cpp @@ -87,16 +87,31 @@ namespace mozilla { NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DOMSVGNumberList) NS_INTERFACE_MAP_ENTRY(nsIDOMSVGNumberList) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(SVGNumberList) NS_INTERFACE_MAP_END +nsIDOMSVGNumber* +DOMSVGNumberList::GetItemWithoutAddRef(PRUint32 aIndex) +{ +#ifdef MOZ_SMIL + if (IsAnimValList()) { + Element()->FlushAnimations(); + } +#endif + if (aIndex < Length()) { + EnsureItemAt(aIndex); + return mItems[aIndex]; + } + return nsnull; +} + void DOMSVGNumberList::InternalListLengthWillChange(PRUint32 aNewLength) { PRUint32 oldLength = mItems.Length(); if (aNewLength > DOMSVGNumber::MaxListIndex()) { // It's safe to get out of sync with our internal list as long as we have // FEWER items than it does. @@ -205,28 +220,22 @@ DOMSVGNumberList::Initialize(nsIDOMSVGNu Clear(); return InsertItemBefore(newItem, 0, _retval); } NS_IMETHODIMP DOMSVGNumberList::GetItem(PRUint32 index, nsIDOMSVGNumber **_retval) { -#ifdef MOZ_SMIL - if (IsAnimValList()) { - Element()->FlushAnimations(); + *_retval = GetItemWithoutAddRef(index); + if (!*_retval) { + return NS_ERROR_DOM_INDEX_SIZE_ERR; } -#endif - if (index < Length()) { - EnsureItemAt(index); - NS_ADDREF(*_retval = mItems[index]); - return NS_OK; - } - *_retval = nsnull; - return NS_ERROR_DOM_INDEX_SIZE_ERR; + NS_ADDREF(*_retval); + return NS_OK; } NS_IMETHODIMP DOMSVGNumberList::InsertItemBefore(nsIDOMSVGNumber *newItem, PRUint32 index, nsIDOMSVGNumber **_retval) { *_retval = nsnull; @@ -362,16 +371,22 @@ DOMSVGNumberList::RemoveItem(PRUint32 in NS_IMETHODIMP DOMSVGNumberList::AppendItem(nsIDOMSVGNumber *newItem, nsIDOMSVGNumber **_retval) { return InsertItemBefore(newItem, Length(), _retval); } +NS_IMETHODIMP +DOMSVGNumberList::GetLength(PRUint32 *aNumberOfItems) +{ + return GetNumberOfItems(aNumberOfItems); +} + void DOMSVGNumberList::EnsureItemAt(PRUint32 aIndex) { if (!mItems[aIndex]) { mItems[aIndex] = new DOMSVGNumber(this, AttrEnum(), aIndex, IsAnimValList()); } }
--- a/content/svg/content/src/DOMSVGNumberList.h +++ b/content/svg/content/src/DOMSVGNumberList.h @@ -103,16 +103,18 @@ public: PRUint32 Length() const { NS_ABORT_IF_FALSE(mItems.Length() == 0 || mItems.Length() == const_cast<DOMSVGNumberList*>(this)->InternalList().Length(), "DOM wrapper's list length is out of sync"); return mItems.Length(); } + nsIDOMSVGNumber* GetItemWithoutAddRef(PRUint32 aIndex); + /// Called to notify us to syncronize our length and detach excess items. void InternalListLengthWillChange(PRUint32 aNewLength); private: nsSVGElement* Element() { return mAList->mElement; }
--- a/content/svg/content/src/DOMSVGPathSegList.cpp +++ b/content/svg/content/src/DOMSVGPathSegList.cpp @@ -91,16 +91,31 @@ DOMSVGPathSegList::~DOMSVGPathSegList() // There are now no longer any references to us held by script or list items. // Note we must use GetAnimValKey/GetBaseValKey here, NOT InternalList()! void *key = mIsAnimValList ? InternalAList().GetAnimValKey() : InternalAList().GetBaseValKey(); sSVGPathSegListTearoffTable.RemoveTearoff(key); } +nsIDOMSVGPathSeg* +DOMSVGPathSegList::GetItemWithoutAddRef(PRUint32 aIndex) +{ +#ifdef MOZ_SMIL + if (IsAnimValList()) { + Element()->FlushAnimations(); + } +#endif + if (aIndex < Length()) { + EnsureItemAt(aIndex); + return ItemAt(aIndex); + } + return nsnull; +} + void DOMSVGPathSegList::InternalListWillChangeTo(const SVGPathData& aNewValue) { // When the number of items in our internal counterpart changes, we MUST stay // in sync. Everything in the scary comment in // DOMSVGLengthList::InternalBaseValListWillChangeTo applies here just as // much, but we have the additional issue that failing to stay in sync would // mean that - assuming we aren't reading bad memory - we would likely end up @@ -300,28 +315,22 @@ DOMSVGPathSegList::Initialize(nsIDOMSVGP Clear(); return InsertItemBefore(aNewItem, 0, _retval); } NS_IMETHODIMP DOMSVGPathSegList::GetItem(PRUint32 aIndex, nsIDOMSVGPathSeg **_retval) { -#ifdef MOZ_SMIL - if (IsAnimValList()) { - Element()->FlushAnimations(); + *_retval = GetItemWithoutAddRef(aIndex); + if (!*_retval) { + return NS_ERROR_DOM_INDEX_SIZE_ERR; } -#endif - if (aIndex < Length()) { - EnsureItemAt(aIndex); - NS_ADDREF(*_retval = ItemAt(aIndex)); - return NS_OK; - } - *_retval = nsnull; - return NS_ERROR_DOM_INDEX_SIZE_ERR; + NS_ADDREF(*_retval); + return NS_OK; } NS_IMETHODIMP DOMSVGPathSegList::InsertItemBefore(nsIDOMSVGPathSeg *aNewItem, PRUint32 aIndex, nsIDOMSVGPathSeg **_retval) { *_retval = nsnull; @@ -493,16 +502,22 @@ DOMSVGPathSegList::RemoveItem(PRUint32 a NS_IMETHODIMP DOMSVGPathSegList::AppendItem(nsIDOMSVGPathSeg *aNewItem, nsIDOMSVGPathSeg **_retval) { return InsertItemBefore(aNewItem, Length(), _retval); } +NS_IMETHODIMP +DOMSVGPathSegList::GetLength(PRUint32 *aNumberOfItems) +{ + return GetNumberOfItems(aNumberOfItems); +} + void DOMSVGPathSegList::EnsureItemAt(PRUint32 aIndex) { if (!ItemAt(aIndex)) { ItemAt(aIndex) = DOMSVGPathSeg::CreateFor(this, aIndex, IsAnimValList()); } }
--- a/content/svg/content/src/DOMSVGPathSegList.h +++ b/content/svg/content/src/DOMSVGPathSegList.h @@ -121,16 +121,18 @@ public: PRUint32 Length() const { NS_ABORT_IF_FALSE(mItems.Length() == 0 || mItems.Length() == const_cast<DOMSVGPathSegList*>(this)->InternalList().CountItems(), "DOM wrapper's list length is out of sync"); return mItems.Length(); } + nsIDOMSVGPathSeg* GetItemWithoutAddRef(PRUint32 aIndex); + /** * WATCH OUT! If you add code to call this on a baseVal wrapper, then you * must also call it on the animVal wrapper too if necessary!! See other * callers! * * Called by internal code to notify us when we need to sync the length of * this DOM list with its internal list. This is called immediately prior to * the length of the internal list being changed so that any DOM list items
--- a/content/svg/content/src/DOMSVGPointList.cpp +++ b/content/svg/content/src/DOMSVGPointList.cpp @@ -111,16 +111,31 @@ DOMSVGPointList::~DOMSVGPointList() // There are now no longer any references to us held by script or list items. // Note we must use GetAnimValKey/GetBaseValKey here, NOT InternalList()! void *key = mIsAnimValList ? InternalAList().GetAnimValKey() : InternalAList().GetBaseValKey(); sSVGPointListTearoffTable.RemoveTearoff(key); } +nsIDOMSVGPoint* +DOMSVGPointList::GetItemWithoutAddRef(PRUint32 aIndex) +{ +#ifdef MOZ_SMIL + if (IsAnimValList()) { + Element()->FlushAnimations(); + } +#endif + if (aIndex < Length()) { + EnsureItemAt(aIndex); + return mItems[aIndex]; + } + return nsnull; +} + void DOMSVGPointList::InternalListWillChangeTo(const SVGPointList& aNewValue) { // When the number of items in our internal counterpart changes, we MUST stay // in sync. Everything in the scary comment in // DOMSVGLengthList::InternalBaseValListWillChangeTo applies here too! PRUint32 oldLength = mItems.Length(); @@ -256,28 +271,22 @@ DOMSVGPointList::Initialize(nsIDOMSVGPoi Clear(); return InsertItemBefore(aNewItem, 0, _retval); } NS_IMETHODIMP DOMSVGPointList::GetItem(PRUint32 aIndex, nsIDOMSVGPoint **_retval) { -#ifdef MOZ_SMIL - if (IsAnimValList()) { - Element()->FlushAnimations(); + *_retval = GetItemWithoutAddRef(aIndex); + if (!*_retval) { + return NS_ERROR_DOM_INDEX_SIZE_ERR; } -#endif - if (aIndex < Length()) { - EnsureItemAt(aIndex); - NS_ADDREF(*_retval = mItems[aIndex]); - return NS_OK; - } - *_retval = nsnull; - return NS_ERROR_DOM_INDEX_SIZE_ERR; + NS_ADDREF(*_retval); + return NS_OK; } NS_IMETHODIMP DOMSVGPointList::InsertItemBefore(nsIDOMSVGPoint *aNewItem, PRUint32 aIndex, nsIDOMSVGPoint **_retval) { *_retval = nsnull; @@ -413,16 +422,22 @@ DOMSVGPointList::RemoveItem(PRUint32 aIn NS_IMETHODIMP DOMSVGPointList::AppendItem(nsIDOMSVGPoint *aNewItem, nsIDOMSVGPoint **_retval) { return InsertItemBefore(aNewItem, Length(), _retval); } +NS_IMETHODIMP +DOMSVGPointList::GetLength(PRUint32 *aNumberOfItems) +{ + return GetNumberOfItems(aNumberOfItems); +} + void DOMSVGPointList::EnsureItemAt(PRUint32 aIndex) { if (!mItems[aIndex]) { mItems[aIndex] = new DOMSVGPoint(this, aIndex, IsAnimValList()); } }
--- a/content/svg/content/src/DOMSVGPointList.h +++ b/content/svg/content/src/DOMSVGPointList.h @@ -121,16 +121,18 @@ public: PRUint32 Length() const { NS_ABORT_IF_FALSE(mItems.Length() == 0 || mItems.Length() == const_cast<DOMSVGPointList*>(this)->InternalList().Length(), "DOM wrapper's list length is out of sync"); return mItems.Length(); } + nsIDOMSVGPoint* GetItemWithoutAddRef(PRUint32 aIndex); + /** * WATCH OUT! If you add code to call this on a baseVal wrapper, then you * must also call it on the animVal wrapper too if necessary!! See other * callers! * * Called by internal code to notify us when we need to sync the length of * this DOM list with its internal list. This is called immediately prior to * the length of the internal list being changed so that any DOM list items
--- a/content/svg/content/src/nsSVGTransformList.h +++ b/content/svg/content/src/nsSVGTransformList.h @@ -73,16 +73,17 @@ public: NS_IMETHOD DidModifySVGObservable (nsISVGValue* observable, modificationType aModType); // nsISupportsWeakReference // implementation inherited from nsSupportsWeakReference // other methods: + nsIDOMSVGTransform* GetItemWithoutAddRef(PRInt32 index); nsIDOMSVGTransform* ElementAt(PRInt32 index); PRBool AppendElement(nsIDOMSVGTransform* aElement); static already_AddRefed<nsIDOMSVGMatrix> GetConsolidationMatrix(nsIDOMSVGTransformList *transforms); protected: PRInt32 ParseParameterList(char *paramstr, float *vars, PRInt32 nvars); void ReleaseTransforms();
--- a/content/svg/content/test/Makefile.in +++ b/content/svg/content/test/Makefile.in @@ -79,16 +79,17 @@ include $(topsrcdir)/config/rules.mk test_SVGAnimatedImageSMILDisabled.html \ animated-svg-image-helper.html \ animated-svg-image-helper.svg \ test_SVGLengthList.xhtml \ test_SVGLengthList-2.xhtml \ test_SVGPathSegList.xhtml \ test_SVGStyleElement.xhtml \ test_SVGxxxList.xhtml \ + test_SVGxxxListIndexing.xhtml \ test_switch.xhtml \ switch-helper.svg \ test_text.html \ text-helper.svg \ test_transform.xhtml \ test_valueAsString.xhtml \ test_valueLeaks.xhtml \ viewport-helper.svg \
new file mode 100644 --- /dev/null +++ b/content/svg/content/test/test_SVGxxxListIndexing.xhtml @@ -0,0 +1,83 @@ +<html xmlns="http://www.w3.org/1999/xhtml"> +<!-- +https://bugzilla.mozilla.org/show_bug.cgi?id=631437 +--> +<head> + <title>Tests the array indexing and .length on SVGXXXList objects</title> + <script type="text/javascript" src="/MochiKit/packed.js"></script> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> +</head> +<body> +<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=631437">Mozilla Bug 631437</a> +<svg xmlns="http://www.w3.org/2000/svg" id="svg"> + <text id="text" x="10 20 30" rotate="40 50 60">abcde</text> + <path id="path" d="M0,0 L100,100"/> + <polygon id="poly" points="50,50 70,70 90,50"/> +</svg> +<script type="text/javascript;version=1.8"><![CDATA[ +var text = document.getElementById("text"), + path = document.getElementById("path"), + poly = document.getElementById("poly"); + +function CheckList(aListObject, aExpectedListLength, aListDescription) +{ + is(aListObject.numberOfItems, aExpectedListLength, aListDescription + ".numberOfItems"); + is(aListObject.numberOfItems, aExpectedListLength, aListDescription + ".length"); + for (let i = 0; i < aListObject.length; i++) { + let item = aListObject.getItem(i); + ok(aListObject[i] === item, aListDescription + "[" + i + "]"); + } + ok(aListObject[aListObject.length] === void 0, aListDescription + "[outOfBounds]"); +} + +var tests = [ + { element: text, + attribute: "x", + listProperty: "x.baseVal", + type: "SVGLengthList", + subtests: [ { values: null, length: 3 }, + { values: "40", length: 1 }, + { values: "1em 2em 3em 4em 5em", length: 5 } ] }, + { element: text, + attribute: "rotate", + listProperty: "rotate.baseVal", + type: "SVGNumberList", + subtests: [ { values: null, length: 3 }, + { values: "10", length: 1 }, + { values: "1 2 3 4 5", length: 5 } ] }, + { element: path, + attribute: "d", + listProperty: "pathSegList", + type: "SVGPathSegList", + subtests: [ { values: null, length: 2 }, + { values: "M50,50", length: 1 }, + { values: "M0,0 h10 v20 h30 v40", length: 5 } ] }, + { element: poly, + attribute: "points", + listProperty: "animatedPoints", + type: "SVGPointList", + subtests: [ { values: null, length: 3 }, + { values: "100,100", length: 1 }, + { values: "0,0 10,10 20,0 30,10 40,0", length: 5 } ] } +]; + +for each (let test in tests) { + let list = test.element; + for each (let property in test.listProperty.split(".")) { + list = list[property]; + } + + for each (let subtest in test.subtests) { + if (subtest.values) { + test.element.setAttribute(test.attribute, subtest.values); + } + + CheckList(list, subtest.length, + test.type + ": " + test.element.localName + "." + + test.listProperty); + } +} +]]></script> +</body> +</html>
--- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -354,34 +354,33 @@ #include "nsTreeColumns.h" #endif #include "nsIDOMXPathException.h" #include "nsIDOMXPathExpression.h" #include "nsIDOMNSXPathExpression.h" #include "nsIDOMXPathNSResolver.h" #include "nsIDOMXPathResult.h" -#ifdef MOZ_SVG #include "nsIDOMGetSVGDocument.h" #include "nsIDOMSVGAElement.h" #include "nsIDOMSVGAltGlyphElement.h" #include "nsIDOMSVGAngle.h" #include "nsIDOMSVGAnimatedAngle.h" #include "nsIDOMSVGAnimatedBoolean.h" #include "nsIDOMSVGAnimatedEnum.h" #include "nsIDOMSVGAnimatedInteger.h" #include "nsIDOMSVGAnimatedLength.h" #include "nsIDOMSVGAnimatedLengthList.h" #include "nsIDOMSVGAnimatedNumber.h" #include "nsIDOMSVGAnimatedNumberList.h" #include "nsIDOMSVGAnimatedPathData.h" #include "nsIDOMSVGAnimatedPoints.h" -#include "nsIDOMSVGAnimPresAspRatio.h" #include "nsIDOMSVGAnimatedRect.h" #include "nsIDOMSVGAnimatedString.h" +#include "nsIDOMSVGAnimPresAspRatio.h" #ifdef MOZ_SMIL #include "nsIDOMSVGAnimateElement.h" #include "nsIDOMSVGAnimateTransformElement.h" #include "nsIDOMSVGAnimateMotionElement.h" #include "nsIDOMSVGMpathElement.h" #include "nsIDOMSVGSetElement.h" #include "nsIDOMSVGAnimationElement.h" #include "nsIDOMElementTimeControl.h" @@ -434,22 +433,21 @@ #include "nsIDOMSVGSymbolElement.h" #include "nsIDOMSVGTextElement.h" #include "nsIDOMSVGTextPathElement.h" #include "nsIDOMSVGTitleElement.h" #include "nsIDOMSVGTransform.h" #include "nsIDOMSVGTransformable.h" #include "nsIDOMSVGTransformList.h" #include "nsIDOMSVGTSpanElement.h" +#include "nsIDOMSVGUnitTypes.h" #include "nsIDOMSVGURIReference.h" #include "nsIDOMSVGUseElement.h" -#include "nsIDOMSVGUnitTypes.h" #include "nsIDOMSVGZoomAndPan.h" #include "nsIDOMSVGZoomEvent.h" -#endif // MOZ_SVG #include "nsIDOMCanvasRenderingContext2D.h" #include "nsIDOMWebGLRenderingContext.h" #include "nsIImageDocument.h" // Storage includes #include "nsDOMStorage.h" @@ -483,30 +481,35 @@ #include "nsIDOMMozTouchEvent.h" #include "nsIEventListenerService.h" #include "nsIFrameMessageManager.h" #include "mozilla/dom/Element.h" #include "nsHTMLSelectElement.h" #include "nsHTMLLegendElement.h" -using namespace mozilla::dom; +#include "DOMSVGLengthList.h" +#include "DOMSVGNumberList.h" +#include "DOMSVGPathSegList.h" +#include "DOMSVGPointList.h" #include "mozilla/dom/indexedDB/IDBFactory.h" #include "mozilla/dom/indexedDB/IDBRequest.h" #include "mozilla/dom/indexedDB/IDBDatabase.h" #include "mozilla/dom/indexedDB/IDBEvents.h" #include "mozilla/dom/indexedDB/IDBObjectStore.h" #include "mozilla/dom/indexedDB/IDBTransaction.h" #include "mozilla/dom/indexedDB/IDBCursor.h" #include "mozilla/dom/indexedDB/IDBKeyRange.h" #include "mozilla/dom/indexedDB/IDBIndex.h" #include "nsIIDBDatabaseException.h" #include "nsIDOMEventException.h" +using namespace mozilla::dom; + static NS_DEFINE_CID(kDOMSOF_CID, NS_DOM_SCRIPT_OBJECT_FACTORY_CID); static const char kDOMStringBundleURL[] = "chrome://global/locale/dom/dom.properties"; // NOTE: DEFAULT_SCRIPTABLE_FLAGS and DOM_DEFAULT_SCRIPTABLE_FLAGS // are defined in nsIDOMClassInfo.h. @@ -986,17 +989,16 @@ static nsDOMClassInfoData sClassInfoData #endif NS_DEFINE_CLASSINFO_DATA(CSSMozDocumentRule, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(BeforeUnloadEvent, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) -#ifdef MOZ_SVG // SVG document NS_DEFINE_CLASSINFO_DATA(SVGDocument, nsDocumentSH, DOCUMENT_SCRIPTABLE_FLAGS) // SVG element classes NS_DEFINE_CLASSINFO_DATA(SVGAElement, nsElementSH, ELEMENT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGAltGlyphElement, nsElementSH, @@ -1152,24 +1154,24 @@ static nsDOMClassInfoData sClassInfoData NS_DEFINE_CLASSINFO_DATA(SVGAnimatedTransformList, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGEvent, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGException, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGLength, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(SVGLengthList, nsDOMGenericSH, - DOM_DEFAULT_SCRIPTABLE_FLAGS) + NS_DEFINE_CLASSINFO_DATA(SVGLengthList, nsSVGLengthListSH, + ARRAY_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGMatrix, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGNumber, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(SVGNumberList, nsDOMGenericSH, - DOM_DEFAULT_SCRIPTABLE_FLAGS) + NS_DEFINE_CLASSINFO_DATA(SVGNumberList, nsSVGNumberListSH, + ARRAY_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPathSegArcAbs, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPathSegArcRel, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPathSegClosePath, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPathSegCurvetoCubicAbs, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) @@ -1194,37 +1196,36 @@ static nsDOMClassInfoData sClassInfoData NS_DEFINE_CLASSINFO_DATA(SVGPathSegLinetoHorizontalRel, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPathSegLinetoRel, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPathSegLinetoVerticalAbs, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPathSegLinetoVerticalRel, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(SVGPathSegList, nsDOMGenericSH, - DOM_DEFAULT_SCRIPTABLE_FLAGS) + NS_DEFINE_CLASSINFO_DATA(SVGPathSegList, nsSVGPathSegListSH, + ARRAY_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPathSegMovetoAbs, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPathSegMovetoRel, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPoint, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(SVGPointList, nsDOMGenericSH, - DOM_DEFAULT_SCRIPTABLE_FLAGS) + NS_DEFINE_CLASSINFO_DATA(SVGPointList, nsSVGPointListSH, + ARRAY_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGPreserveAspectRatio, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGRect, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGTransform, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGTransformList, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(SVGZoomEvent, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) -#endif // MOZ_SVG NS_DEFINE_CLASSINFO_DATA(HTMLCanvasElement, nsElementSH, ELEMENT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(CanvasRenderingContext2D, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(CanvasGradient, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(CanvasPattern, nsDOMGenericSH, @@ -1295,20 +1296,18 @@ static nsDOMClassInfoData sClassInfoData NS_DEFINE_CLASSINFO_DATA(XMLHttpRequest, nsEventTargetSH, EVENTTARGET_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(ClientRect, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(ClientRectList, nsClientRectListSH, ARRAY_SCRIPTABLE_FLAGS) -#ifdef MOZ_SVG NS_DEFINE_CLASSINFO_DATA(SVGForeignObjectElement, nsElementSH, ELEMENT_SCRIPTABLE_FLAGS) -#endif NS_DEFINE_CLASSINFO_DATA(XULCommandEvent, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(CommandEvent, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(OfflineResourceList, nsOfflineResourceListSH, ARRAY_SCRIPTABLE_FLAGS) @@ -2583,19 +2582,17 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_BEGIN(HTMLDivElement, nsIDOMHTMLDivElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLDivElement) DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(HTMLEmbedElement, nsIDOMHTMLEmbedElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLEmbedElement) -#ifdef MOZ_SVG DOM_CLASSINFO_MAP_ENTRY(nsIDOMGetSVGDocument) -#endif DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(HTMLFieldSetElement, nsIDOMHTMLFieldSetElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLFieldSetElement) DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END @@ -2640,19 +2637,17 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_BEGIN(HTMLHtmlElement, nsIDOMHTMLHtmlElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLHtmlElement) DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(HTMLIFrameElement, nsIDOMHTMLIFrameElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLIFrameElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMNSHTMLFrameElement) -#ifdef MOZ_SVG DOM_CLASSINFO_MAP_ENTRY(nsIDOMGetSVGDocument) -#endif DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(HTMLImageElement, nsIDOMHTMLImageElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLImageElement) DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END @@ -2709,19 +2704,17 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_BEGIN(HTMLOListElement, nsIDOMHTMLOListElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLOListElement) DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(HTMLObjectElement, nsIDOMHTMLObjectElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLObjectElement) -#ifdef MOZ_SVG DOM_CLASSINFO_MAP_ENTRY(nsIDOMGetSVGDocument) -#endif DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(HTMLOptGroupElement, nsIDOMHTMLOptGroupElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLOptGroupElement) DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END @@ -3040,17 +3033,16 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_ENTRY(nsIDOMCSSMozDocumentRule) DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(BeforeUnloadEvent, nsIDOMBeforeUnloadEvent) DOM_CLASSINFO_MAP_ENTRY(nsIDOMBeforeUnloadEvent) DOM_CLASSINFO_EVENT_MAP_ENTRIES DOM_CLASSINFO_MAP_END -#ifdef MOZ_SVG #define DOM_CLASSINFO_SVG_ELEMENT_MAP_ENTRIES \ DOM_CLASSINFO_MAP_ENTRY(nsIDOMNSEventTarget) \ DOM_CLASSINFO_MAP_ENTRY(nsIDOMEventTarget) \ DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGElement) \ DOM_CLASSINFO_MAP_ENTRY(nsIDOMNSElement) \ DOM_CLASSINFO_MAP_ENTRY(nsIDOM3Node) \ DOM_CLASSINFO_MAP_ENTRY(nsIDOMNodeSelector) @@ -3697,17 +3689,16 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_BEGIN(SVGTransformList, nsIDOMSVGTransformList) DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGTransformList) DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(SVGZoomEvent, nsIDOMSVGZoomEvent) DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGZoomEvent) DOM_CLASSINFO_UI_EVENT_MAP_ENTRIES DOM_CLASSINFO_MAP_END -#endif // MOZ_SVG DOM_CLASSINFO_MAP_BEGIN(HTMLCanvasElement, nsIDOMHTMLCanvasElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMHTMLCanvasElement) DOM_CLASSINFO_GENERIC_HTML_MAP_ENTRIES DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(CanvasRenderingContext2D, nsIDOMCanvasRenderingContext2D) DOM_CLASSINFO_MAP_ENTRY(nsIDOMCanvasRenderingContext2D) @@ -3797,22 +3788,20 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN_NO_CLASS_IF(XMLHttpProgressEvent, nsIDOMEvent) DOM_CLASSINFO_MAP_ENTRY(nsIDOMLSProgressEvent) DOM_CLASSINFO_MAP_ENTRY(nsIDOMProgressEvent) DOM_CLASSINFO_EVENT_MAP_ENTRIES DOM_CLASSINFO_MAP_END -#ifdef MOZ_SVG DOM_CLASSINFO_MAP_BEGIN(SVGForeignObjectElement, nsIDOMSVGForeignObjectElement) DOM_CLASSINFO_MAP_ENTRY(nsIDOMSVGForeignObjectElement) DOM_CLASSINFO_SVG_GRAPHIC_ELEMENT_MAP_ENTRIES DOM_CLASSINFO_MAP_END -#endif DOM_CLASSINFO_MAP_BEGIN(XULCommandEvent, nsIDOMXULCommandEvent) DOM_CLASSINFO_MAP_ENTRY(nsIDOMXULCommandEvent) DOM_CLASSINFO_UI_EVENT_MAP_ENTRIES DOM_CLASSINFO_MAP_END DOM_CLASSINFO_MAP_BEGIN(CommandEvent, nsIDOMCommandEvent) DOM_CLASSINFO_MAP_ENTRY(nsIDOMCommandEvent) @@ -7211,17 +7200,17 @@ nsNodeSH::PreCreate(nsISupports *nativeO #ifdef DEBUG { nsCOMPtr<nsINode> node_qi(do_QueryInterface(nativeObj)); // If this assertion fires the QI implementation for the object in // question doesn't use the nsINode pointer as the nsISupports // pointer. That must be fixed, or we'll crash... - NS_ASSERTION(node_qi == node, "Uh, fix QI!"); + NS_ABORT_IF_FALSE(node_qi == node, "Uh, fix QI!"); } #endif // Make sure that we get the owner document of the content node, in case // we're in document teardown. If we are, it's important to *not* use // globalObj as the nodes parent since that would give the node the // principal of globalObj (i.e. the principal of the document that's being // loaded) and not the principal of the document that's being unloaded. @@ -7748,17 +7737,17 @@ nsElementSH::PreCreate(nsISupports *nati #ifdef DEBUG { nsCOMPtr<nsIContent> content_qi(do_QueryInterface(nativeObj)); // If this assertion fires the QI implementation for the object in // question doesn't use the nsIContent pointer as the nsISupports // pointer. That must be fixed, or we'll crash... - NS_ASSERTION(content_qi == element, "Uh, fix QI!"); + NS_ABORT_IF_FALSE(content_qi == element, "Uh, fix QI!"); } #endif nsIDocument *doc = element->HasFlag(NODE_FORCE_XBL_BINDINGS) ? element->GetOwnerDoc() : element->GetCurrentDoc(); if (!doc) { @@ -7793,17 +7782,17 @@ nsElementSH::PostCreate(nsIXPConnectWrap #ifdef DEBUG { nsCOMPtr<nsIContent> content_qi(do_QueryWrappedNative(wrapper)); // If this assertion fires the QI implementation for the object in // question doesn't use the nsIContent pointer as the nsISupports // pointer. That must be fixed, or we'll crash... - NS_ASSERTION(content_qi == element, "Uh, fix QI!"); + NS_ABORT_IF_FALSE(content_qi == element, "Uh, fix QI!"); } #endif nsIDocument* doc; if (element->HasFlag(NODE_FORCE_XBL_BINDINGS)) { doc = element->GetOwnerDoc(); } else { @@ -8065,17 +8054,17 @@ nsNodeListSH::GetLength(nsIXPConnectWrap nsINodeList* list = static_cast<nsINodeList*>(GetNative(wrapper, obj)); #ifdef DEBUG { nsCOMPtr<nsINodeList> list_qi = do_QueryWrappedNative(wrapper, obj); // If this assertion fires the QI implementation for the object in // question doesn't use the nsINodeList pointer as the nsISupports // pointer. That must be fixed, or we'll crash... - NS_ASSERTION(list_qi == list, "Uh, fix QI!"); + NS_ABORT_IF_FALSE(list_qi == list, "Uh, fix QI!"); } #endif return list->GetLength(length); } nsISupports* nsNodeListSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, @@ -8084,17 +8073,17 @@ nsNodeListSH::GetItemAt(nsISupports *aNa nsINodeList* list = static_cast<nsINodeList*>(aNative); #ifdef DEBUG { nsCOMPtr<nsINodeList> list_qi = do_QueryInterface(aNative); // If this assertion fires the QI implementation for the object in // question doesn't use the nsINodeList pointer as the nsISupports // pointer. That must be fixed, or we'll crash... - NS_ASSERTION(list_qi == list, "Uh, fix QI!"); + NS_ABORT_IF_FALSE(list_qi == list, "Uh, fix QI!"); } #endif nsINode *node; *aCache = node = list->GetNodeAt(aIndex); return node; } @@ -8247,17 +8236,17 @@ nsHTMLCollectionSH::GetLength(nsIXPConne #ifdef DEBUG { nsCOMPtr<nsIHTMLCollection> collection_qi = do_QueryWrappedNative(wrapper, obj); // If this assertion fires the QI implementation for the object in // question doesn't use the nsIHTMLCollection pointer as the nsISupports // pointer. That must be fixed, or we'll crash... - NS_ASSERTION(collection_qi == collection, "Uh, fix QI!"); + NS_ABORT_IF_FALSE(collection_qi == collection, "Uh, fix QI!"); } #endif return collection->GetLength(length); } nsISupports* nsHTMLCollectionSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, @@ -8266,17 +8255,17 @@ nsHTMLCollectionSH::GetItemAt(nsISupport nsIHTMLCollection* collection = static_cast<nsIHTMLCollection*>(aNative); #ifdef DEBUG { nsCOMPtr<nsIHTMLCollection> collection_qi = do_QueryInterface(aNative); // If this assertion fires the QI implementation for the object in // question doesn't use the nsIHTMLCollection pointer as the nsISupports // pointer. That must be fixed, or we'll crash... - NS_ASSERTION(collection_qi == collection, "Uh, fix QI!"); + NS_ABORT_IF_FALSE(collection_qi == collection, "Uh, fix QI!"); } #endif nsINode *item; *aCache = item = collection->GetNodeAt(aIndex, aResult); return item; } @@ -8289,17 +8278,17 @@ nsHTMLCollectionSH::GetNamedItem(nsISupp nsIHTMLCollection* collection = static_cast<nsIHTMLCollection*>(aNative); #ifdef DEBUG { nsCOMPtr<nsIHTMLCollection> collection_qi = do_QueryInterface(aNative); // If this assertion fires the QI implementation for the object in // question doesn't use the nsIHTMLCollection pointer as the nsISupports // pointer. That must be fixed, or we'll crash... - NS_ASSERTION(collection_qi == collection, "Uh, fix QI!"); + NS_ABORT_IF_FALSE(collection_qi == collection, "Uh, fix QI!"); } #endif return collection->GetNamedItem(aName, aCache, aResult); } // ContentList helper @@ -10172,17 +10161,17 @@ nsCSSRuleListSH::GetItemAt(nsISupports * nsICSSRuleList* list = static_cast<nsICSSRuleList*>(aNative); #ifdef DEBUG { nsCOMPtr<nsICSSRuleList> list_qi = do_QueryInterface(aNative); // If this assertion fires the QI implementation for the object in // question doesn't use the nsICSSRuleList pointer as the nsISupports // pointer. That must be fixed, or we'll crash... - NS_ASSERTION(list_qi == list, "Uh, fix QI!"); + NS_ABORT_IF_FALSE(list_qi == list, "Uh, fix QI!"); } #endif return list->GetItemAt(aIndex, aResult); } // ClientRectList scriptable helper @@ -10779,8 +10768,30 @@ nsOfflineResourceListSH::GetStringAt(nsI nsISupports* nsFileListSH::GetItemAt(nsISupports *aNative, PRUint32 aIndex, nsWrapperCache **aCache, nsresult *aResult) { nsDOMFileList* list = nsDOMFileList::FromSupports(aNative); return list->GetItemAt(aIndex); } + +// Template for SVGXXXList helpers +template<class ListInterfaceType, class ListType> nsISupports* +nsSVGListSH<ListInterfaceType, ListType>::GetItemAt(nsISupports *aNative, + PRUint32 aIndex, + nsWrapperCache **aCache, + nsresult *aResult) +{ + ListType* list = static_cast<ListType*>(static_cast<ListInterfaceType*>(aNative)); +#ifdef DEBUG + { + nsCOMPtr<ListInterfaceType> list_qi = do_QueryInterface(aNative); + + // If this assertion fires the QI implementation for the object in + // question doesn't use the nsIDOMSVGXXXList pointer as the nsISupports + // pointer. That must be fixed, or we'll crash... + NS_ABORT_IF_FALSE(list_qi == list, "Uh, fix QI!"); + } +#endif + + return list->GetItemWithoutAddRef(aIndex); +}
--- a/dom/base/nsDOMClassInfo.h +++ b/dom/base/nsDOMClassInfo.h @@ -44,24 +44,41 @@ #include "nsIXPCScriptable.h" #include "jsapi.h" #include "nsIScriptSecurityManager.h" #include "nsIScriptContext.h" #include "nsDOMJSUtils.h" // for GetScriptContextFromJSContext #include "nsIScriptGlobalObject.h" #include "nsContentUtils.h" -class nsIDOMWindow; +namespace mozilla { +class DOMSVGLengthList; +class DOMSVGNumberList; +class DOMSVGPathSegList; +class DOMSVGPointList; +} +class nsGlobalWindow; +class nsIDOMDocument; class nsIDOMNSHTMLOptionCollection; -class nsIPluginInstance; +class nsIDOMNodeList; +class nsIDOMSVGLength; +class nsIDOMSVGLengthList; +class nsIDOMSVGNumber; +class nsIDOMSVGNumberList; +class nsIDOMSVGPathSeg; +class nsIDOMSVGPathSegList; +class nsIDOMSVGPoint; +class nsIDOMSVGPointList; +class nsIDOMSVGTransform; +class nsIDOMSVGTransformList; +class nsIDOMWindow; class nsIForm; -class nsIDOMNodeList; -class nsIDOMDocument; class nsIHTMLDocument; -class nsGlobalWindow; +class nsIPluginInstance; +class nsSVGTransformList; struct nsDOMClassInfoData; typedef nsIClassInfo* (*nsDOMClassInfoConstructorFnc) (nsDOMClassInfoData* aData); typedef nsresult (*nsDOMConstructorFunc)(nsISupports** aNewObject); @@ -1834,9 +1851,35 @@ public: } static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) { return new nsWebGLViewportHandlerSH(aData); } }; + +// Template for SVGXXXList helpers + +template<class ListInterfaceType, class ListType> +class nsSVGListSH : public nsArraySH +{ +protected: + nsSVGListSH(nsDOMClassInfoData* aData) : nsArraySH(aData) + { + } + +public: + virtual nsISupports* GetItemAt(nsISupports *aNative, PRUint32 aIndex, + nsWrapperCache **aCache, nsresult *aResult); + + static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) + { + return new nsSVGListSH(aData); + } +}; + +typedef nsSVGListSH<nsIDOMSVGLengthList, mozilla::DOMSVGLengthList> nsSVGLengthListSH; +typedef nsSVGListSH<nsIDOMSVGNumberList, mozilla::DOMSVGNumberList> nsSVGNumberListSH; +typedef nsSVGListSH<nsIDOMSVGPathSegList, mozilla::DOMSVGPathSegList> nsSVGPathSegListSH; +typedef nsSVGListSH<nsIDOMSVGPointList, mozilla::DOMSVGPointList> nsSVGPointListSH; + #endif /* nsDOMClassInfo_h___ */
--- a/dom/dom-config.mk +++ b/dom/dom-config.mk @@ -9,16 +9,17 @@ DOM_SRCDIRS = \ dom/src/notification \ dom/src/threads \ content/xbl/src \ content/xul/document/src \ content/events/src \ content/base/src \ content/html/content/src \ content/html/document/src \ + content/svg/content/src \ layout/generic \ layout/style \ layout/xul/base/src \ layout/xul/base/src/tree/src \ $(NULL) LOCAL_INCLUDES += $(DOM_SRCDIRS:%=-I$(topsrcdir)/%) DEFINES += -D_IMPL_NS_LAYOUT
--- a/dom/interfaces/svg/nsIDOMSVGLengthList.idl +++ b/dom/interfaces/svg/nsIDOMSVGLengthList.idl @@ -35,29 +35,29 @@ * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "domstubs.idl" interface nsIDOMSVGLength; -[scriptable, uuid(a8760fcd-3de5-446a-a009-5cf877e7a4df)] +[scriptable, uuid(f8c89734-d6b4-4a56-bdf5-1ce1104dc1ab)] interface nsIDOMSVGLengthList : nsISupports { readonly attribute unsigned long numberOfItems; + readonly attribute unsigned long length; // synonym for numberOfItems void clear(); // raises(nsIDOMDOMException); nsIDOMSVGLength initialize(in nsIDOMSVGLength newItem ); // raises(nsIDOMDOMException, nsIDOMSVGException); nsIDOMSVGLength getItem(in unsigned long index); // raises(nsIDOMDOMException); nsIDOMSVGLength insertItemBefore(in nsIDOMSVGLength newItem, in unsigned long index); // raises(nsIDOMDOMException, nsIDOMSVGException); nsIDOMSVGLength replaceItem(in nsIDOMSVGLength newItem, in unsigned long index); // raises(nsIDOMDOMException, nsIDOMSVGException); nsIDOMSVGLength removeItem(in unsigned long index); // raises(nsIDOMDOMException); nsIDOMSVGLength appendItem(in nsIDOMSVGLength newItem); // raises(nsIDOMDOMException, nsIDOMSVGException); }; -
--- a/dom/interfaces/svg/nsIDOMSVGNumberList.idl +++ b/dom/interfaces/svg/nsIDOMSVGNumberList.idl @@ -35,29 +35,29 @@ * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "domstubs.idl" interface nsIDOMSVGNumber; -[scriptable, uuid(59364ec4-faf1-460f-bf58-e6a6a2769a3a)] +[scriptable, uuid(8e303812-38b4-4780-9f8c-9ddbfcb26c81)] interface nsIDOMSVGNumberList : nsISupports { readonly attribute unsigned long numberOfItems; + readonly attribute unsigned long length; // synonym for numberOfItems void clear(); // raises(nsIDOMDOMException); nsIDOMSVGNumber initialize(in nsIDOMSVGNumber newItem ); // raises(nsIDOMDOMException, nsIDOMSVGException); nsIDOMSVGNumber getItem(in unsigned long index); // raises(nsIDOMDOMException); nsIDOMSVGNumber insertItemBefore(in nsIDOMSVGNumber newItem, in unsigned long index); // raises(nsIDOMDOMException, nsIDOMSVGException); nsIDOMSVGNumber replaceItem(in nsIDOMSVGNumber newItem, in unsigned long index); // raises(nsIDOMDOMException, nsIDOMSVGException); nsIDOMSVGNumber removeItem(in unsigned long index); // raises(nsIDOMDOMException); nsIDOMSVGNumber appendItem(in nsIDOMSVGNumber newItem); // raises(nsIDOMDOMException, nsIDOMSVGException); }; -
--- a/dom/interfaces/svg/nsIDOMSVGPathSegList.idl +++ b/dom/interfaces/svg/nsIDOMSVGPathSegList.idl @@ -35,29 +35,29 @@ * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "domstubs.idl" interface nsIDOMSVGPathSeg; -[scriptable, uuid(94a6db98-3f34-4529-a35f-89ef49713795)] +[scriptable, uuid(1e4efb5c-7b0f-4338-a92e-6ca5402b303c)] interface nsIDOMSVGPathSegList : nsISupports { readonly attribute unsigned long numberOfItems; + readonly attribute unsigned long length; // synonym for numberOfItems void clear(); // raises(nsIDOMDOMException); nsIDOMSVGPathSeg initialize(in nsIDOMSVGPathSeg newItem ); // raises(nsIDOMDOMException, nsIDOMSVGException); nsIDOMSVGPathSeg getItem(in unsigned long index); // raises(nsIDOMDOMException); nsIDOMSVGPathSeg insertItemBefore(in nsIDOMSVGPathSeg newItem, in unsigned long index); // raises(nsIDOMDOMException, nsIDOMSVGException); nsIDOMSVGPathSeg replaceItem(in nsIDOMSVGPathSeg newItem, in unsigned long index); // raises(nsIDOMDOMException, nsIDOMSVGException); nsIDOMSVGPathSeg removeItem(in unsigned long index); // raises(nsIDOMDOMException); nsIDOMSVGPathSeg appendItem(in nsIDOMSVGPathSeg newItem); // raises(nsIDOMDOMException, nsIDOMSVGException); }; -
--- a/dom/interfaces/svg/nsIDOMSVGPointList.idl +++ b/dom/interfaces/svg/nsIDOMSVGPointList.idl @@ -35,20 +35,21 @@ * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #include "domstubs.idl" interface nsIDOMSVGPoint; -[scriptable, uuid(4c12af24-0fc2-4fe7-b71d-5d6b41d463c1)] +[scriptable, uuid(7bb28750-7238-4083-b5f4-4def4646a637)] interface nsIDOMSVGPointList : nsISupports { readonly attribute unsigned long numberOfItems; + readonly attribute unsigned long length; // synonym for numberOfItems void clear(); // raises( DOMException ); nsIDOMSVGPoint initialize(in nsIDOMSVGPoint newItem); // raises( DOMException, SVGException ); nsIDOMSVGPoint getItem (in unsigned long index); // raises( DOMException ); nsIDOMSVGPoint insertItemBefore(in nsIDOMSVGPoint newItem, in unsigned long index);