WIP for supporting setting the cssText property on css declarations through the CSS DOM, approved and partly reviewed by Pierre.

git-svn-id: svn://10.0.0.236/trunk@68135 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
jst%netscape.com 2000-05-03 21:42:00 +00:00
parent f94a42e025
commit 09a726c20d
17 changed files with 335 additions and 47 deletions

View File

@ -114,7 +114,10 @@ public:
virtual void DropReference(); virtual void DropReference();
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
PRBool aAllocate); PRBool aAllocate);
virtual nsresult ParseDeclaration(const nsString& aDecl); virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl);
virtual nsresult ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl);
virtual nsresult GetParent(nsISupports **aParent); virtual nsresult GetParent(nsISupports **aParent);
protected: protected:
@ -230,7 +233,33 @@ nsDOMCSSAttributeDeclaration::GetCSSDeclaration(nsICSSDeclaration **aDecl,
} }
nsresult nsresult
nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsString& aDecl) nsDOMCSSAttributeDeclaration::SetCSSDeclaration(nsICSSDeclaration *aDecl)
{
nsHTMLValue val;
nsIStyleRule* rule;
nsICSSStyleRule* cssRule;
nsresult result = NS_OK;
if (nsnull != mContent) {
mContent->GetHTMLAttribute(nsHTMLAtoms::style, val);
if (eHTMLUnit_ISupports == val.GetUnit()) {
rule = (nsIStyleRule*) val.GetISupportsValue();
result = rule->QueryInterface(kICSSStyleRuleIID, (void**)&cssRule);
if (NS_OK == result) {
cssRule->SetDeclaration(aDecl);
NS_RELEASE(cssRule);
}
NS_RELEASE(rule);
}
}
return result;
}
nsresult
nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl)
{ {
nsICSSDeclaration *decl; nsICSSDeclaration *decl;
nsresult result = GetCSSDeclaration(&decl, PR_TRUE); nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
@ -265,9 +294,34 @@ nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsString& aDecl)
if (doc) { if (doc) {
doc->BeginUpdate(); doc->BeginUpdate();
} }
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl, &hint); nsCOMPtr<nsICSSDeclaration> declClone;
decl->Clone(*getter_AddRefs(declClone));
if (aClearOldDecl) {
// This should be done with decl->Clear() once such a method exists.
nsAutoString propName;
PRUint32 count, i;
decl->Count(&count);
for (i = 0; i < count; i++) {
decl->GetNthProperty(0, propName);
nsCSSProperty prop = nsCSSProps::LookupProperty(propName);
nsCSSValue val;
decl->RemoveProperty(prop, val);
}
}
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
aParseOnlyOneDecl, &hint);
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
SetCSSDeclaration(declClone);
result = NS_OK;
}
if (doc) { if (doc) {
if (NS_SUCCEEDED(result)) { if (NS_SUCCEEDED(result) && result != NS_CSS_PARSER_DROP_DECLARATION) {
doc->AttributeChanged(mContent, kNameSpaceID_None, nsHTMLAtoms::style, hint); doc->AttributeChanged(mContent, kNameSpaceID_None, nsHTMLAtoms::style, hint);
} }
doc->EndUpdate(); doc->EndUpdate();

View File

@ -72,6 +72,7 @@ public:
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer, NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
nsIURI* aBaseURL, nsIURI* aBaseURL,
nsICSSDeclaration* aDeclaration, nsICSSDeclaration* aDeclaration,
PRBool aParseOnlyOneDecl,
PRInt32* aHint) = 0; PRInt32* aHint) = 0;
// Charset management method: // Charset management method:
@ -92,6 +93,10 @@ public:
#define NS_CSS_GETINFO_CSS2 ((PRUint32) 0x00000004L) #define NS_CSS_GETINFO_CSS2 ((PRUint32) 0x00000004L)
#define NS_CSS_GETINFO_CSS_FROSTING ((PRUint32) 0x00000008L) #define NS_CSS_GETINFO_CSS_FROSTING ((PRUint32) 0x00000008L)
// Success code that can be returned from ParseAndAppendDeclaration()
#define NS_CSS_PARSER_DROP_DECLARATION \
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_LAYOUT,1)
extern NS_HTML nsresult extern NS_HTML nsresult
NS_NewCSSParser(nsICSSParser** aInstancePtrResult); NS_NewCSSParser(nsICSSParser** aInstancePtrResult);

View File

@ -55,9 +55,6 @@ static NS_DEFINE_IID(kICSSParserIID, NS_ICSS_PARSER_IID);
static NS_DEFINE_IID(kICSSStyleSheetIID, NS_ICSS_STYLE_SHEET_IID); static NS_DEFINE_IID(kICSSStyleSheetIID, NS_ICSS_STYLE_SHEET_IID);
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID); static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
#define NS_CSS_PARSER_DROP_DECLARATION \
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_LAYOUT,1)
MOZ_DECL_CTOR_COUNTER(SelectorList); MOZ_DECL_CTOR_COUNTER(SelectorList);
@ -149,6 +146,7 @@ public:
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer, NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
nsIURI* aBaseURL, nsIURI* aBaseURL,
nsICSSDeclaration* aDeclaration, nsICSSDeclaration* aDeclaration,
PRBool aParseOnlyOneDecl,
PRInt32* aHint); PRInt32* aHint);
NS_IMETHOD GetCharset(/*out*/nsString &aCharsetDest) const; NS_IMETHOD GetCharset(/*out*/nsString &aCharsetDest) const;
@ -555,6 +553,7 @@ NS_IMETHODIMP
CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer, CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
nsIURI* aBaseURL, nsIURI* aBaseURL,
nsICSSDeclaration* aDeclaration, nsICSSDeclaration* aDeclaration,
PRBool aParseOnlyOneDecl,
PRInt32* aHint) PRInt32* aHint)
{ {
// NS_ASSERTION(nsnull != aBaseURL, "need base URL"); // NS_ASSERTION(nsnull != aBaseURL, "need base URL");
@ -581,15 +580,26 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
PRInt32 hint = NS_STYLE_HINT_NONE; PRInt32 hint = NS_STYLE_HINT_NONE;
if (! ParseDeclaration(errorCode, aDeclaration, PR_FALSE, hint)) {
hint = NS_STYLE_HINT_NONE;
}
if (nsnull != aHint) { if (nsnull != aHint) {
*aHint = hint; *aHint = hint;
} }
do {
if (ParseDeclaration(errorCode, aDeclaration, PR_FALSE, hint)) {
if (aHint && hint > *aHint) {
*aHint = hint;
}
} else {
if (errorCode != -1) { // -1 means EOF so we ignore that
rv = errorCode;
}
break;
}
} while (!aParseOnlyOneDecl);
ReleaseScanner(); ReleaseScanner();
return NS_OK; return rv;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------

View File

@ -793,7 +793,10 @@ public:
virtual void DropReference(void); virtual void DropReference(void);
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
PRBool aAllocate); PRBool aAllocate);
virtual nsresult ParseDeclaration(const nsString& aDecl); virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl);
virtual nsresult ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl);
virtual nsresult GetParent(nsISupports **aParent); virtual nsresult GetParent(nsISupports **aParent);
protected: protected:
@ -866,7 +869,19 @@ DOMCSSDeclarationImpl::GetCSSDeclaration(nsICSSDeclaration **aDecl,
} }
nsresult nsresult
DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl) DOMCSSDeclarationImpl::SetCSSDeclaration(nsICSSDeclaration *aDecl)
{
if (nsnull != mRule) {
mRule->SetDeclaration(aDecl);
}
return NS_OK;
}
nsresult
DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl)
{ {
nsICSSDeclaration *decl; nsICSSDeclaration *decl;
nsresult result = GetCSSDeclaration(&decl, PR_TRUE); nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
@ -904,9 +919,35 @@ DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl)
} }
if (NS_SUCCEEDED(result)) { if (NS_SUCCEEDED(result)) {
nsCOMPtr<nsICSSDeclaration> declClone;
decl->Clone(*getter_AddRefs(declClone));
NS_ENSURE_TRUE(declClone, NS_ERROR_OUT_OF_MEMORY);
if (aClearOldDecl) {
// This should be done with decl->Clear() once such a method exists.
nsAutoString propName;
PRUint32 count, i;
decl->Count(&count);
for (i = 0; i < count; i++) {
decl->GetNthProperty(0, propName);
nsCSSProperty prop = nsCSSProps::LookupProperty(propName);
nsCSSValue val;
decl->RemoveProperty(prop, val);
}
}
PRInt32 hint; PRInt32 hint;
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl, &hint); result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
if (NS_SUCCEEDED(result)) { aParseOnlyOneDecl, &hint);
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
SetCSSDeclaration(declClone);
result = NS_OK;
} else if (NS_SUCCEEDED(result)) {
if (cssSheet) { if (cssSheet) {
cssSheet->SetModified(PR_TRUE); cssSheet->SetModified(PR_TRUE);
} }

View File

@ -247,7 +247,7 @@ nsDOMCSSDeclaration::SetProperty(const nsString& aPropertyName,
declString.Append(aValue); declString.Append(aValue);
declString.Append(aPriority); declString.Append(aPriority);
return ParseDeclaration(declString); return ParseDeclaration(declString, PR_TRUE, PR_FALSE);
} }
NS_IMETHODIMP NS_IMETHODIMP

View File

@ -64,8 +64,12 @@ public:
virtual void DropReference() = 0; virtual void DropReference() = 0;
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
PRBool aAllocate) = 0; PRBool aAllocate) = 0;
// Note! This will only set the declaration if a style rule already exists
virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl) = 0;
virtual nsresult ParseDeclaration(const nsString& aDecl) = 0; virtual nsresult ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl) = 0;
virtual nsresult GetParent(nsISupports **aParent) = 0; virtual nsresult GetParent(nsISupports **aParent) = 0;
protected: protected:

View File

@ -114,7 +114,10 @@ public:
virtual void DropReference(); virtual void DropReference();
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
PRBool aAllocate); PRBool aAllocate);
virtual nsresult ParseDeclaration(const nsString& aDecl); virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl);
virtual nsresult ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl);
virtual nsresult GetParent(nsISupports **aParent); virtual nsresult GetParent(nsISupports **aParent);
protected: protected:
@ -230,7 +233,33 @@ nsDOMCSSAttributeDeclaration::GetCSSDeclaration(nsICSSDeclaration **aDecl,
} }
nsresult nsresult
nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsString& aDecl) nsDOMCSSAttributeDeclaration::SetCSSDeclaration(nsICSSDeclaration *aDecl)
{
nsHTMLValue val;
nsIStyleRule* rule;
nsICSSStyleRule* cssRule;
nsresult result = NS_OK;
if (nsnull != mContent) {
mContent->GetHTMLAttribute(nsHTMLAtoms::style, val);
if (eHTMLUnit_ISupports == val.GetUnit()) {
rule = (nsIStyleRule*) val.GetISupportsValue();
result = rule->QueryInterface(kICSSStyleRuleIID, (void**)&cssRule);
if (NS_OK == result) {
cssRule->SetDeclaration(aDecl);
NS_RELEASE(cssRule);
}
NS_RELEASE(rule);
}
}
return result;
}
nsresult
nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl)
{ {
nsICSSDeclaration *decl; nsICSSDeclaration *decl;
nsresult result = GetCSSDeclaration(&decl, PR_TRUE); nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
@ -265,9 +294,34 @@ nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsString& aDecl)
if (doc) { if (doc) {
doc->BeginUpdate(); doc->BeginUpdate();
} }
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl, &hint); nsCOMPtr<nsICSSDeclaration> declClone;
decl->Clone(*getter_AddRefs(declClone));
if (aClearOldDecl) {
// This should be done with decl->Clear() once such a method exists.
nsAutoString propName;
PRUint32 count, i;
decl->Count(&count);
for (i = 0; i < count; i++) {
decl->GetNthProperty(0, propName);
nsCSSProperty prop = nsCSSProps::LookupProperty(propName);
nsCSSValue val;
decl->RemoveProperty(prop, val);
}
}
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
aParseOnlyOneDecl, &hint);
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
SetCSSDeclaration(declClone);
result = NS_OK;
}
if (doc) { if (doc) {
if (NS_SUCCEEDED(result)) { if (NS_SUCCEEDED(result) && result != NS_CSS_PARSER_DROP_DECLARATION) {
doc->AttributeChanged(mContent, kNameSpaceID_None, nsHTMLAtoms::style, hint); doc->AttributeChanged(mContent, kNameSpaceID_None, nsHTMLAtoms::style, hint);
} }
doc->EndUpdate(); doc->EndUpdate();

View File

@ -72,6 +72,7 @@ public:
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer, NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
nsIURI* aBaseURL, nsIURI* aBaseURL,
nsICSSDeclaration* aDeclaration, nsICSSDeclaration* aDeclaration,
PRBool aParseOnlyOneDecl,
PRInt32* aHint) = 0; PRInt32* aHint) = 0;
// Charset management method: // Charset management method:
@ -92,6 +93,10 @@ public:
#define NS_CSS_GETINFO_CSS2 ((PRUint32) 0x00000004L) #define NS_CSS_GETINFO_CSS2 ((PRUint32) 0x00000004L)
#define NS_CSS_GETINFO_CSS_FROSTING ((PRUint32) 0x00000008L) #define NS_CSS_GETINFO_CSS_FROSTING ((PRUint32) 0x00000008L)
// Success code that can be returned from ParseAndAppendDeclaration()
#define NS_CSS_PARSER_DROP_DECLARATION \
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_LAYOUT,1)
extern NS_HTML nsresult extern NS_HTML nsresult
NS_NewCSSParser(nsICSSParser** aInstancePtrResult); NS_NewCSSParser(nsICSSParser** aInstancePtrResult);

View File

@ -55,9 +55,6 @@ static NS_DEFINE_IID(kICSSParserIID, NS_ICSS_PARSER_IID);
static NS_DEFINE_IID(kICSSStyleSheetIID, NS_ICSS_STYLE_SHEET_IID); static NS_DEFINE_IID(kICSSStyleSheetIID, NS_ICSS_STYLE_SHEET_IID);
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID); static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
#define NS_CSS_PARSER_DROP_DECLARATION \
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_LAYOUT,1)
MOZ_DECL_CTOR_COUNTER(SelectorList); MOZ_DECL_CTOR_COUNTER(SelectorList);
@ -149,6 +146,7 @@ public:
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer, NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
nsIURI* aBaseURL, nsIURI* aBaseURL,
nsICSSDeclaration* aDeclaration, nsICSSDeclaration* aDeclaration,
PRBool aParseOnlyOneDecl,
PRInt32* aHint); PRInt32* aHint);
NS_IMETHOD GetCharset(/*out*/nsString &aCharsetDest) const; NS_IMETHOD GetCharset(/*out*/nsString &aCharsetDest) const;
@ -555,6 +553,7 @@ NS_IMETHODIMP
CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer, CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
nsIURI* aBaseURL, nsIURI* aBaseURL,
nsICSSDeclaration* aDeclaration, nsICSSDeclaration* aDeclaration,
PRBool aParseOnlyOneDecl,
PRInt32* aHint) PRInt32* aHint)
{ {
// NS_ASSERTION(nsnull != aBaseURL, "need base URL"); // NS_ASSERTION(nsnull != aBaseURL, "need base URL");
@ -581,15 +580,26 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
PRInt32 hint = NS_STYLE_HINT_NONE; PRInt32 hint = NS_STYLE_HINT_NONE;
if (! ParseDeclaration(errorCode, aDeclaration, PR_FALSE, hint)) {
hint = NS_STYLE_HINT_NONE;
}
if (nsnull != aHint) { if (nsnull != aHint) {
*aHint = hint; *aHint = hint;
} }
do {
if (ParseDeclaration(errorCode, aDeclaration, PR_FALSE, hint)) {
if (aHint && hint > *aHint) {
*aHint = hint;
}
} else {
if (errorCode != -1) { // -1 means EOF so we ignore that
rv = errorCode;
}
break;
}
} while (!aParseOnlyOneDecl);
ReleaseScanner(); ReleaseScanner();
return NS_OK; return rv;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------

View File

@ -793,7 +793,10 @@ public:
virtual void DropReference(void); virtual void DropReference(void);
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
PRBool aAllocate); PRBool aAllocate);
virtual nsresult ParseDeclaration(const nsString& aDecl); virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl);
virtual nsresult ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl);
virtual nsresult GetParent(nsISupports **aParent); virtual nsresult GetParent(nsISupports **aParent);
protected: protected:
@ -866,7 +869,19 @@ DOMCSSDeclarationImpl::GetCSSDeclaration(nsICSSDeclaration **aDecl,
} }
nsresult nsresult
DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl) DOMCSSDeclarationImpl::SetCSSDeclaration(nsICSSDeclaration *aDecl)
{
if (nsnull != mRule) {
mRule->SetDeclaration(aDecl);
}
return NS_OK;
}
nsresult
DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl)
{ {
nsICSSDeclaration *decl; nsICSSDeclaration *decl;
nsresult result = GetCSSDeclaration(&decl, PR_TRUE); nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
@ -904,9 +919,35 @@ DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl)
} }
if (NS_SUCCEEDED(result)) { if (NS_SUCCEEDED(result)) {
nsCOMPtr<nsICSSDeclaration> declClone;
decl->Clone(*getter_AddRefs(declClone));
NS_ENSURE_TRUE(declClone, NS_ERROR_OUT_OF_MEMORY);
if (aClearOldDecl) {
// This should be done with decl->Clear() once such a method exists.
nsAutoString propName;
PRUint32 count, i;
decl->Count(&count);
for (i = 0; i < count; i++) {
decl->GetNthProperty(0, propName);
nsCSSProperty prop = nsCSSProps::LookupProperty(propName);
nsCSSValue val;
decl->RemoveProperty(prop, val);
}
}
PRInt32 hint; PRInt32 hint;
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl, &hint); result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
if (NS_SUCCEEDED(result)) { aParseOnlyOneDecl, &hint);
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
SetCSSDeclaration(declClone);
result = NS_OK;
} else if (NS_SUCCEEDED(result)) {
if (cssSheet) { if (cssSheet) {
cssSheet->SetModified(PR_TRUE); cssSheet->SetModified(PR_TRUE);
} }

View File

@ -247,7 +247,7 @@ nsDOMCSSDeclaration::SetProperty(const nsString& aPropertyName,
declString.Append(aValue); declString.Append(aValue);
declString.Append(aPriority); declString.Append(aPriority);
return ParseDeclaration(declString); return ParseDeclaration(declString, PR_TRUE, PR_FALSE);
} }
NS_IMETHODIMP NS_IMETHODIMP

View File

@ -64,8 +64,12 @@ public:
virtual void DropReference() = 0; virtual void DropReference() = 0;
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
PRBool aAllocate) = 0; PRBool aAllocate) = 0;
// Note! This will only set the declaration if a style rule already exists
virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl) = 0;
virtual nsresult ParseDeclaration(const nsString& aDecl) = 0; virtual nsresult ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl) = 0;
virtual nsresult GetParent(nsISupports **aParent) = 0; virtual nsresult GetParent(nsISupports **aParent) = 0;
protected: protected:

View File

@ -55,9 +55,6 @@ static NS_DEFINE_IID(kICSSParserIID, NS_ICSS_PARSER_IID);
static NS_DEFINE_IID(kICSSStyleSheetIID, NS_ICSS_STYLE_SHEET_IID); static NS_DEFINE_IID(kICSSStyleSheetIID, NS_ICSS_STYLE_SHEET_IID);
static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID); static NS_DEFINE_IID(kIStyleSheetIID, NS_ISTYLE_SHEET_IID);
#define NS_CSS_PARSER_DROP_DECLARATION \
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_LAYOUT,1)
MOZ_DECL_CTOR_COUNTER(SelectorList); MOZ_DECL_CTOR_COUNTER(SelectorList);
@ -149,6 +146,7 @@ public:
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer, NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
nsIURI* aBaseURL, nsIURI* aBaseURL,
nsICSSDeclaration* aDeclaration, nsICSSDeclaration* aDeclaration,
PRBool aParseOnlyOneDecl,
PRInt32* aHint); PRInt32* aHint);
NS_IMETHOD GetCharset(/*out*/nsString &aCharsetDest) const; NS_IMETHOD GetCharset(/*out*/nsString &aCharsetDest) const;
@ -555,6 +553,7 @@ NS_IMETHODIMP
CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer, CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
nsIURI* aBaseURL, nsIURI* aBaseURL,
nsICSSDeclaration* aDeclaration, nsICSSDeclaration* aDeclaration,
PRBool aParseOnlyOneDecl,
PRInt32* aHint) PRInt32* aHint)
{ {
// NS_ASSERTION(nsnull != aBaseURL, "need base URL"); // NS_ASSERTION(nsnull != aBaseURL, "need base URL");
@ -581,15 +580,26 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
PRInt32 hint = NS_STYLE_HINT_NONE; PRInt32 hint = NS_STYLE_HINT_NONE;
if (! ParseDeclaration(errorCode, aDeclaration, PR_FALSE, hint)) {
hint = NS_STYLE_HINT_NONE;
}
if (nsnull != aHint) { if (nsnull != aHint) {
*aHint = hint; *aHint = hint;
} }
do {
if (ParseDeclaration(errorCode, aDeclaration, PR_FALSE, hint)) {
if (aHint && hint > *aHint) {
*aHint = hint;
}
} else {
if (errorCode != -1) { // -1 means EOF so we ignore that
rv = errorCode;
}
break;
}
} while (!aParseOnlyOneDecl);
ReleaseScanner(); ReleaseScanner();
return NS_OK; return rv;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------

View File

@ -793,7 +793,10 @@ public:
virtual void DropReference(void); virtual void DropReference(void);
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
PRBool aAllocate); PRBool aAllocate);
virtual nsresult ParseDeclaration(const nsString& aDecl); virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl);
virtual nsresult ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl);
virtual nsresult GetParent(nsISupports **aParent); virtual nsresult GetParent(nsISupports **aParent);
protected: protected:
@ -866,7 +869,19 @@ DOMCSSDeclarationImpl::GetCSSDeclaration(nsICSSDeclaration **aDecl,
} }
nsresult nsresult
DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl) DOMCSSDeclarationImpl::SetCSSDeclaration(nsICSSDeclaration *aDecl)
{
if (nsnull != mRule) {
mRule->SetDeclaration(aDecl);
}
return NS_OK;
}
nsresult
DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl)
{ {
nsICSSDeclaration *decl; nsICSSDeclaration *decl;
nsresult result = GetCSSDeclaration(&decl, PR_TRUE); nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
@ -904,9 +919,35 @@ DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl)
} }
if (NS_SUCCEEDED(result)) { if (NS_SUCCEEDED(result)) {
nsCOMPtr<nsICSSDeclaration> declClone;
decl->Clone(*getter_AddRefs(declClone));
NS_ENSURE_TRUE(declClone, NS_ERROR_OUT_OF_MEMORY);
if (aClearOldDecl) {
// This should be done with decl->Clear() once such a method exists.
nsAutoString propName;
PRUint32 count, i;
decl->Count(&count);
for (i = 0; i < count; i++) {
decl->GetNthProperty(0, propName);
nsCSSProperty prop = nsCSSProps::LookupProperty(propName);
nsCSSValue val;
decl->RemoveProperty(prop, val);
}
}
PRInt32 hint; PRInt32 hint;
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl, &hint); result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
if (NS_SUCCEEDED(result)) { aParseOnlyOneDecl, &hint);
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
SetCSSDeclaration(declClone);
result = NS_OK;
} else if (NS_SUCCEEDED(result)) {
if (cssSheet) { if (cssSheet) {
cssSheet->SetModified(PR_TRUE); cssSheet->SetModified(PR_TRUE);
} }

View File

@ -247,7 +247,7 @@ nsDOMCSSDeclaration::SetProperty(const nsString& aPropertyName,
declString.Append(aValue); declString.Append(aValue);
declString.Append(aPriority); declString.Append(aPriority);
return ParseDeclaration(declString); return ParseDeclaration(declString, PR_TRUE, PR_FALSE);
} }
NS_IMETHODIMP NS_IMETHODIMP

View File

@ -64,8 +64,12 @@ public:
virtual void DropReference() = 0; virtual void DropReference() = 0;
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl, virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
PRBool aAllocate) = 0; PRBool aAllocate) = 0;
// Note! This will only set the declaration if a style rule already exists
virtual nsresult SetCSSDeclaration(nsICSSDeclaration *aDecl) = 0;
virtual nsresult ParseDeclaration(const nsString& aDecl) = 0; virtual nsresult ParseDeclaration(const nsString& aDecl,
PRBool aParseOnlyOneDecl,
PRBool aClearOldDecl) = 0;
virtual nsresult GetParent(nsISupports **aParent) = 0; virtual nsresult GetParent(nsISupports **aParent) = 0;
protected: protected:

View File

@ -72,6 +72,7 @@ public:
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer, NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
nsIURI* aBaseURL, nsIURI* aBaseURL,
nsICSSDeclaration* aDeclaration, nsICSSDeclaration* aDeclaration,
PRBool aParseOnlyOneDecl,
PRInt32* aHint) = 0; PRInt32* aHint) = 0;
// Charset management method: // Charset management method:
@ -92,6 +93,10 @@ public:
#define NS_CSS_GETINFO_CSS2 ((PRUint32) 0x00000004L) #define NS_CSS_GETINFO_CSS2 ((PRUint32) 0x00000004L)
#define NS_CSS_GETINFO_CSS_FROSTING ((PRUint32) 0x00000008L) #define NS_CSS_GETINFO_CSS_FROSTING ((PRUint32) 0x00000008L)
// Success code that can be returned from ParseAndAppendDeclaration()
#define NS_CSS_PARSER_DROP_DECLARATION \
NS_ERROR_GENERATE_SUCCESS(NS_ERROR_MODULE_LAYOUT,1)
extern NS_HTML nsresult extern NS_HTML nsresult
NS_NewCSSParser(nsICSSParser** aInstancePtrResult); NS_NewCSSParser(nsICSSParser** aInstancePtrResult);