From 0076b3d38d643ee85284e01528cfb2f2f55d3642 Mon Sep 17 00:00:00 2001 From: "dbaron%fas.harvard.edu" Date: Sat, 16 Mar 2002 15:24:08 +0000 Subject: [PATCH] Improve performance of SelectorMatches using nsIContent::HasAttr, which was added a few months ago. r=bzbarsky sr=attinasi a=asa b=128739 git-svn-id: svn://10.0.0.236/trunk@116716 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/content/html/style/src/nsCSSStyleSheet.cpp | 13 ++++++++----- mozilla/layout/style/nsCSSStyleSheet.cpp | 13 ++++++++----- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp index 6d25d50daf2..d1ce83b139f 100644 --- a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp @@ -3663,16 +3663,19 @@ static PRBool SelectorMatches(RuleProcessorData &data, } else { result = localTrue; nsAttrSelector* attr = aSelector->mAttrList; - nsAutoString value; do { - nsresult attrState = data.mContent->GetAttr(attr->mNameSpace, attr->mAttr, value); - if (NS_FAILED(attrState) || (NS_CONTENT_ATTR_NOT_THERE == attrState)) { + if (!data.mContent->HasAttr(attr->mNameSpace, attr->mAttr)) { result = localFalse; } - else { + else if (attr->mFunction != NS_ATTR_FUNC_SET) { + nsAutoString value; + nsresult attrState = + data.mContent->GetAttr(attr->mNameSpace, attr->mAttr, value); + NS_ASSERTION(NS_SUCCEEDED(attrState) && + NS_CONTENT_ATTR_NOT_THERE != attrState, + "HasAttr lied or GetAttr failed"); PRBool isCaseSensitive = attr->mCaseSensitive; switch (attr->mFunction) { - case NS_ATTR_FUNC_SET: break; case NS_ATTR_FUNC_EQUALS: if (isCaseSensitive) { result = PRBool(localTrue == value.Equals(attr->mValue)); diff --git a/mozilla/layout/style/nsCSSStyleSheet.cpp b/mozilla/layout/style/nsCSSStyleSheet.cpp index 6d25d50daf2..d1ce83b139f 100644 --- a/mozilla/layout/style/nsCSSStyleSheet.cpp +++ b/mozilla/layout/style/nsCSSStyleSheet.cpp @@ -3663,16 +3663,19 @@ static PRBool SelectorMatches(RuleProcessorData &data, } else { result = localTrue; nsAttrSelector* attr = aSelector->mAttrList; - nsAutoString value; do { - nsresult attrState = data.mContent->GetAttr(attr->mNameSpace, attr->mAttr, value); - if (NS_FAILED(attrState) || (NS_CONTENT_ATTR_NOT_THERE == attrState)) { + if (!data.mContent->HasAttr(attr->mNameSpace, attr->mAttr)) { result = localFalse; } - else { + else if (attr->mFunction != NS_ATTR_FUNC_SET) { + nsAutoString value; + nsresult attrState = + data.mContent->GetAttr(attr->mNameSpace, attr->mAttr, value); + NS_ASSERTION(NS_SUCCEEDED(attrState) && + NS_CONTENT_ATTR_NOT_THERE != attrState, + "HasAttr lied or GetAttr failed"); PRBool isCaseSensitive = attr->mCaseSensitive; switch (attr->mFunction) { - case NS_ATTR_FUNC_SET: break; case NS_ATTR_FUNC_EQUALS: if (isCaseSensitive) { result = PRBool(localTrue == value.Equals(attr->mValue));