Back out 92f2cf2f42b2 (bug 754592) for causing regression

This commit is contained in:
Robert Longson 2012-09-04 14:53:04 -07:00
parent d165dedcc9
commit 11234826b0
3 changed files with 32 additions and 94 deletions

View File

@ -185,7 +185,7 @@ DOMSVGStringList::InternalList()
{
if (mIsConditionalProcessingAttribute) {
nsCOMPtr<DOMSVGTests> tests = do_QueryInterface(mElement);
return *tests->GetOrCreateStringListAttribute(mAttrEnum);
return tests->mStringListAttributes[mAttrEnum];
}
return mElement->GetStringListInfo().mStringLists[mAttrEnum];
}

View File

@ -5,7 +5,6 @@
#include "DOMSVGTests.h"
#include "DOMSVGStringList.h"
#include "nsError.h" // For NS_PROPTABLE_PROP_OVERWRITTEN
#include "nsSVGFeatures.h"
#include "nsSVGSwitchElement.h"
#include "nsCharSeparatedTokenizer.h"
@ -24,13 +23,18 @@ nsIAtom** DOMSVGTests::sStringListNames[3] =
&nsGkAtoms::systemLanguage,
};
DOMSVGTests::DOMSVGTests()
{
mStringListAttributes[LANGUAGE].SetIsCommaSeparated(true);
}
/* readonly attribute nsIDOMSVGStringList requiredFeatures; */
NS_IMETHODIMP
DOMSVGTests::GetRequiredFeatures(nsIDOMSVGStringList * *aRequiredFeatures)
{
nsCOMPtr<nsSVGElement> element = do_QueryInterface(this);
*aRequiredFeatures = DOMSVGStringList::GetDOMWrapper(
GetOrCreateStringListAttribute(FEATURES), element, true, FEATURES).get();
&mStringListAttributes[FEATURES], element, true, FEATURES).get();
return NS_OK;
}
@ -40,7 +44,7 @@ DOMSVGTests::GetRequiredExtensions(nsIDOMSVGStringList * *aRequiredExtensions)
{
nsCOMPtr<nsSVGElement> element = do_QueryInterface(this);
*aRequiredExtensions = DOMSVGStringList::GetDOMWrapper(
GetOrCreateStringListAttribute(EXTENSIONS), element, true, EXTENSIONS).get();
&mStringListAttributes[EXTENSIONS], element, true, EXTENSIONS).get();
return NS_OK;
}
@ -50,7 +54,7 @@ DOMSVGTests::GetSystemLanguage(nsIDOMSVGStringList * *aSystemLanguage)
{
nsCOMPtr<nsSVGElement> element = do_QueryInterface(this);
*aSystemLanguage = DOMSVGStringList::GetDOMWrapper(
GetOrCreateStringListAttribute(LANGUAGE), element, true, LANGUAGE).get();
&mStringListAttributes[LANGUAGE], element, true, LANGUAGE).get();
return NS_OK;
}
@ -80,19 +84,15 @@ DOMSVGTests::GetBestLanguagePreferenceRank(const nsSubstring& aAcceptLangs) cons
int32_t lowestRank = -1;
const SVGStringList *languageStringList = GetStringListAttribute(LANGUAGE);
if (!languageStringList) {
return lowestRank;
}
for (uint32_t i = 0; i < languageStringList->Length(); i++) {
for (uint32_t i = 0; i < mStringListAttributes[LANGUAGE].Length(); i++) {
nsCharSeparatedTokenizer languageTokenizer(aAcceptLangs, ',');
int32_t index = 0;
while (languageTokenizer.hasMoreTokens()) {
const nsSubstring &languageToken = languageTokenizer.nextToken();
bool exactMatch = (languageToken == (*languageStringList)[i]);
bool exactMatch = (languageToken == mStringListAttributes[LANGUAGE][i]);
bool prefixOnlyMatch =
!exactMatch &&
nsStyleUtil::DashMatchCompare((*languageStringList)[i],
nsStyleUtil::DashMatchCompare(mStringListAttributes[LANGUAGE][i],
languageTokenizer.nextToken(),
defaultComparator);
if (index == 0 && exactMatch) {
@ -115,16 +115,15 @@ bool
DOMSVGTests::PassesConditionalProcessingTests(const nsString *aAcceptLangs) const
{
// Required Features
const SVGStringList *featuresStringList = GetStringListAttribute(FEATURES);
if (featuresStringList && featuresStringList->IsExplicitlySet()) {
if (featuresStringList->IsEmpty()) {
if (mStringListAttributes[FEATURES].IsExplicitlySet()) {
if (mStringListAttributes[FEATURES].IsEmpty()) {
return false;
}
nsCOMPtr<nsIContent> content(
do_QueryInterface(const_cast<DOMSVGTests*>(this)));
for (uint32_t i = 0; i < featuresStringList->Length(); i++) {
if (!nsSVGFeatures::HasFeature(content, (*featuresStringList)[i])) {
for (uint32_t i = 0; i < mStringListAttributes[FEATURES].Length(); i++) {
if (!nsSVGFeatures::HasFeature(content, mStringListAttributes[FEATURES][i])) {
return false;
}
}
@ -137,13 +136,12 @@ DOMSVGTests::PassesConditionalProcessingTests(const nsString *aAcceptLangs) cons
// go beyond the feature set defined in the SVG specification.
// Each extension is identified by a URI reference.
// For now, claim that mozilla's SVG implementation supports XHTML and MathML.
const SVGStringList *extensionsStringList = GetStringListAttribute(EXTENSIONS);
if (extensionsStringList && extensionsStringList->IsExplicitlySet()) {
if (extensionsStringList->IsEmpty()) {
if (mStringListAttributes[EXTENSIONS].IsExplicitlySet()) {
if (mStringListAttributes[EXTENSIONS].IsEmpty()) {
return false;
}
for (uint32_t i = 0; i < extensionsStringList->Length(); i++) {
if (!nsSVGFeatures::HasExtension((*extensionsStringList)[i])) {
for (uint32_t i = 0; i < mStringListAttributes[EXTENSIONS].Length(); i++) {
if (!nsSVGFeatures::HasExtension(mStringListAttributes[EXTENSIONS][i])) {
return false;
}
}
@ -160,9 +158,8 @@ DOMSVGTests::PassesConditionalProcessingTests(const nsString *aAcceptLangs) cons
// or if one of the languages indicated by user preferences exactly equals a
// prefix of one of the languages given in the value of this parameter such
// that the first tag character following the prefix is "-".
const SVGStringList *languageStringList = GetStringListAttribute(LANGUAGE);
if (languageStringList && languageStringList->IsExplicitlySet()) {
if (languageStringList->IsEmpty()) {
if (mStringListAttributes[LANGUAGE].IsExplicitlySet()) {
if (mStringListAttributes[LANGUAGE].IsEmpty()) {
return false;
}
@ -177,10 +174,10 @@ DOMSVGTests::PassesConditionalProcessingTests(const nsString *aAcceptLangs) cons
const nsDefaultStringComparator defaultComparator;
for (uint32_t i = 0; i < languageStringList->Length(); i++) {
for (uint32_t i = 0; i < mStringListAttributes[LANGUAGE].Length(); i++) {
nsCharSeparatedTokenizer languageTokenizer(acceptLangs, ',');
while (languageTokenizer.hasMoreTokens()) {
if (nsStyleUtil::DashMatchCompare((*languageStringList)[i],
if (nsStyleUtil::DashMatchCompare(mStringListAttributes[LANGUAGE][i],
languageTokenizer.nextToken(),
defaultComparator)) {
return true;
@ -200,12 +197,9 @@ DOMSVGTests::ParseConditionalProcessingAttribute(nsIAtom* aAttribute,
{
for (uint32_t i = 0; i < ArrayLength(sStringListNames); i++) {
if (aAttribute == *sStringListNames[i]) {
SVGStringList *stringList = GetOrCreateStringListAttribute(i);
if (stringList) {
nsresult rv = stringList->SetValue(aValue);
if (NS_FAILED(rv)) {
stringList->Clear();
}
nsresult rv = mStringListAttributes[i].SetValue(aValue);
if (NS_FAILED(rv)) {
mStringListAttributes[i].Clear();
}
MaybeInvalidate();
return true;
@ -219,69 +213,13 @@ DOMSVGTests::UnsetAttr(const nsIAtom* aAttribute)
{
for (uint32_t i = 0; i < ArrayLength(sStringListNames); i++) {
if (aAttribute == *sStringListNames[i]) {
SVGStringList *stringList = GetStringListAttribute(i);
if (stringList) {
// don't destroy the property in case there are tear-offs
// referring to it
stringList->Clear();
MaybeInvalidate();
}
mStringListAttributes[i].Clear();
MaybeInvalidate();
return;
}
}
}
// Callback function, for freeing uint64_t values stored in property table
// when the element goes away
static void
ReleaseStringListPropertyValue(void* aObject, /* unused */
nsIAtom* aPropertyName, /* unused */
void* aPropertyValue,
void* aData /* unused */)
{
SVGStringList* valPtr =
static_cast<SVGStringList*>(aPropertyValue);
delete valPtr;
}
SVGStringList*
DOMSVGTests::GetStringListAttribute(uint8_t aAttrEnum) const
{
nsIAtom *attrName = GetAttrName(aAttrEnum);
const nsCOMPtr<nsSVGElement> element =
do_QueryInterface(const_cast<DOMSVGTests*>(this));
return static_cast<SVGStringList*>(element->GetProperty(attrName));
}
SVGStringList*
DOMSVGTests::GetOrCreateStringListAttribute(uint8_t aAttrEnum) const
{
SVGStringList* stringListPtr = GetStringListAttribute(aAttrEnum);
if (stringListPtr) {
return stringListPtr;
}
nsIAtom *attrName = GetAttrName(aAttrEnum);
const nsCOMPtr<nsSVGElement> element =
do_QueryInterface(const_cast<DOMSVGTests*>(this));
stringListPtr = new SVGStringList();
stringListPtr->SetIsCommaSeparated(aAttrEnum == LANGUAGE);
nsresult rv = element->SetProperty(attrName,
stringListPtr,
ReleaseStringListPropertyValue,
true);
NS_ABORT_IF_FALSE(rv != NS_PROPTABLE_PROP_OVERWRITTEN,
"Setting property value when it's already set...?");
if (NS_LIKELY(NS_SUCCEEDED(rv))) {
return stringListPtr;
}
// property-insertion failed (e.g. OOM in property-table code)
delete stringListPtr;
return nullptr;
}
nsIAtom*
DOMSVGTests::GetAttrName(uint8_t aAttrEnum) const
{
@ -293,7 +231,7 @@ DOMSVGTests::GetAttrValue(uint8_t aAttrEnum, nsAttrValue& aValue) const
{
MOZ_ASSERT(aAttrEnum < ArrayLength(sStringListNames),
"aAttrEnum out of range");
aValue.SetTo(*GetOrCreateStringListAttribute(aAttrEnum), nullptr);
aValue.SetTo(mStringListAttributes[aAttrEnum], nullptr);
}
void

View File

@ -24,6 +24,7 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIDOMSVGTESTS
DOMSVGTests();
virtual ~DOMSVGTests() {}
friend class mozilla::DOMSVGStringList;
@ -79,14 +80,13 @@ public:
void UnsetAttr(const nsIAtom* aAttribute);
nsIAtom* GetAttrName(uint8_t aAttrEnum) const;
SVGStringList* GetStringListAttribute(uint8_t aAttrEnum) const;
SVGStringList* GetOrCreateStringListAttribute(uint8_t aAttrEnum) const;
void GetAttrValue(uint8_t aAttrEnum, nsAttrValue &aValue) const;
void MaybeInvalidate();
private:
enum { FEATURES, EXTENSIONS, LANGUAGE };
SVGStringList mStringListAttributes[3];
static nsIAtom** sStringListNames[3];
};