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:
parent
f94a42e025
commit
09a726c20d
@ -114,7 +114,10 @@ public:
|
||||
virtual void DropReference();
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
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);
|
||||
|
||||
protected:
|
||||
@ -230,7 +233,33 @@ nsDOMCSSAttributeDeclaration::GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
}
|
||||
|
||||
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;
|
||||
nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
|
||||
@ -265,9 +294,34 @@ nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsString& aDecl)
|
||||
if (doc) {
|
||||
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 (NS_SUCCEEDED(result)) {
|
||||
if (NS_SUCCEEDED(result) && result != NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None, nsHTMLAtoms::style, hint);
|
||||
}
|
||||
doc->EndUpdate();
|
||||
|
||||
@ -72,6 +72,7 @@ public:
|
||||
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
nsIURI* aBaseURL,
|
||||
nsICSSDeclaration* aDeclaration,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint) = 0;
|
||||
|
||||
// Charset management method:
|
||||
@ -92,6 +93,10 @@ public:
|
||||
#define NS_CSS_GETINFO_CSS2 ((PRUint32) 0x00000004L)
|
||||
#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
|
||||
NS_NewCSSParser(nsICSSParser** aInstancePtrResult);
|
||||
|
||||
|
||||
@ -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(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);
|
||||
|
||||
@ -149,6 +146,7 @@ public:
|
||||
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
nsIURI* aBaseURL,
|
||||
nsICSSDeclaration* aDeclaration,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint);
|
||||
|
||||
NS_IMETHOD GetCharset(/*out*/nsString &aCharsetDest) const;
|
||||
@ -555,6 +553,7 @@ NS_IMETHODIMP
|
||||
CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
nsIURI* aBaseURL,
|
||||
nsICSSDeclaration* aDeclaration,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint)
|
||||
{
|
||||
// NS_ASSERTION(nsnull != aBaseURL, "need base URL");
|
||||
@ -581,15 +580,26 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
|
||||
PRInt32 hint = NS_STYLE_HINT_NONE;
|
||||
|
||||
if (! ParseDeclaration(errorCode, aDeclaration, PR_FALSE, hint)) {
|
||||
hint = NS_STYLE_HINT_NONE;
|
||||
}
|
||||
if (nsnull != aHint) {
|
||||
*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();
|
||||
return NS_OK;
|
||||
return rv;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
@ -793,7 +793,10 @@ public:
|
||||
virtual void DropReference(void);
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
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);
|
||||
|
||||
protected:
|
||||
@ -866,7 +869,19 @@ DOMCSSDeclarationImpl::GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
}
|
||||
|
||||
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;
|
||||
nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
|
||||
@ -904,9 +919,35 @@ DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl)
|
||||
}
|
||||
|
||||
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;
|
||||
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl, &hint);
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
|
||||
aParseOnlyOneDecl, &hint);
|
||||
|
||||
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
SetCSSDeclaration(declClone);
|
||||
result = NS_OK;
|
||||
} else if (NS_SUCCEEDED(result)) {
|
||||
if (cssSheet) {
|
||||
cssSheet->SetModified(PR_TRUE);
|
||||
}
|
||||
|
||||
@ -247,7 +247,7 @@ nsDOMCSSDeclaration::SetProperty(const nsString& aPropertyName,
|
||||
declString.Append(aValue);
|
||||
declString.Append(aPriority);
|
||||
|
||||
return ParseDeclaration(declString);
|
||||
return ParseDeclaration(declString, PR_TRUE, PR_FALSE);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
||||
@ -64,8 +64,12 @@ public:
|
||||
virtual void DropReference() = 0;
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
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;
|
||||
|
||||
protected:
|
||||
|
||||
@ -114,7 +114,10 @@ public:
|
||||
virtual void DropReference();
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
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);
|
||||
|
||||
protected:
|
||||
@ -230,7 +233,33 @@ nsDOMCSSAttributeDeclaration::GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
}
|
||||
|
||||
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;
|
||||
nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
|
||||
@ -265,9 +294,34 @@ nsDOMCSSAttributeDeclaration::ParseDeclaration(const nsString& aDecl)
|
||||
if (doc) {
|
||||
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 (NS_SUCCEEDED(result)) {
|
||||
if (NS_SUCCEEDED(result) && result != NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
doc->AttributeChanged(mContent, kNameSpaceID_None, nsHTMLAtoms::style, hint);
|
||||
}
|
||||
doc->EndUpdate();
|
||||
|
||||
@ -72,6 +72,7 @@ public:
|
||||
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
nsIURI* aBaseURL,
|
||||
nsICSSDeclaration* aDeclaration,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint) = 0;
|
||||
|
||||
// Charset management method:
|
||||
@ -92,6 +93,10 @@ public:
|
||||
#define NS_CSS_GETINFO_CSS2 ((PRUint32) 0x00000004L)
|
||||
#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
|
||||
NS_NewCSSParser(nsICSSParser** aInstancePtrResult);
|
||||
|
||||
|
||||
@ -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(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);
|
||||
|
||||
@ -149,6 +146,7 @@ public:
|
||||
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
nsIURI* aBaseURL,
|
||||
nsICSSDeclaration* aDeclaration,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint);
|
||||
|
||||
NS_IMETHOD GetCharset(/*out*/nsString &aCharsetDest) const;
|
||||
@ -555,6 +553,7 @@ NS_IMETHODIMP
|
||||
CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
nsIURI* aBaseURL,
|
||||
nsICSSDeclaration* aDeclaration,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint)
|
||||
{
|
||||
// NS_ASSERTION(nsnull != aBaseURL, "need base URL");
|
||||
@ -581,15 +580,26 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
|
||||
PRInt32 hint = NS_STYLE_HINT_NONE;
|
||||
|
||||
if (! ParseDeclaration(errorCode, aDeclaration, PR_FALSE, hint)) {
|
||||
hint = NS_STYLE_HINT_NONE;
|
||||
}
|
||||
if (nsnull != aHint) {
|
||||
*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();
|
||||
return NS_OK;
|
||||
return rv;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
@ -793,7 +793,10 @@ public:
|
||||
virtual void DropReference(void);
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
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);
|
||||
|
||||
protected:
|
||||
@ -866,7 +869,19 @@ DOMCSSDeclarationImpl::GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
}
|
||||
|
||||
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;
|
||||
nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
|
||||
@ -904,9 +919,35 @@ DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl)
|
||||
}
|
||||
|
||||
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;
|
||||
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl, &hint);
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
|
||||
aParseOnlyOneDecl, &hint);
|
||||
|
||||
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
SetCSSDeclaration(declClone);
|
||||
result = NS_OK;
|
||||
} else if (NS_SUCCEEDED(result)) {
|
||||
if (cssSheet) {
|
||||
cssSheet->SetModified(PR_TRUE);
|
||||
}
|
||||
|
||||
@ -247,7 +247,7 @@ nsDOMCSSDeclaration::SetProperty(const nsString& aPropertyName,
|
||||
declString.Append(aValue);
|
||||
declString.Append(aPriority);
|
||||
|
||||
return ParseDeclaration(declString);
|
||||
return ParseDeclaration(declString, PR_TRUE, PR_FALSE);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
||||
@ -64,8 +64,12 @@ public:
|
||||
virtual void DropReference() = 0;
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
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;
|
||||
|
||||
protected:
|
||||
|
||||
@ -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(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);
|
||||
|
||||
@ -149,6 +146,7 @@ public:
|
||||
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
nsIURI* aBaseURL,
|
||||
nsICSSDeclaration* aDeclaration,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint);
|
||||
|
||||
NS_IMETHOD GetCharset(/*out*/nsString &aCharsetDest) const;
|
||||
@ -555,6 +553,7 @@ NS_IMETHODIMP
|
||||
CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
nsIURI* aBaseURL,
|
||||
nsICSSDeclaration* aDeclaration,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint)
|
||||
{
|
||||
// NS_ASSERTION(nsnull != aBaseURL, "need base URL");
|
||||
@ -581,15 +580,26 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
|
||||
PRInt32 hint = NS_STYLE_HINT_NONE;
|
||||
|
||||
if (! ParseDeclaration(errorCode, aDeclaration, PR_FALSE, hint)) {
|
||||
hint = NS_STYLE_HINT_NONE;
|
||||
}
|
||||
if (nsnull != aHint) {
|
||||
*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();
|
||||
return NS_OK;
|
||||
return rv;
|
||||
}
|
||||
|
||||
//----------------------------------------------------------------------
|
||||
|
||||
@ -793,7 +793,10 @@ public:
|
||||
virtual void DropReference(void);
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
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);
|
||||
|
||||
protected:
|
||||
@ -866,7 +869,19 @@ DOMCSSDeclarationImpl::GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
}
|
||||
|
||||
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;
|
||||
nsresult result = GetCSSDeclaration(&decl, PR_TRUE);
|
||||
@ -904,9 +919,35 @@ DOMCSSDeclarationImpl::ParseDeclaration(const nsString& aDecl)
|
||||
}
|
||||
|
||||
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;
|
||||
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl, &hint);
|
||||
if (NS_SUCCEEDED(result)) {
|
||||
result = cssParser->ParseAndAppendDeclaration(aDecl, baseURI, decl,
|
||||
aParseOnlyOneDecl, &hint);
|
||||
|
||||
if (result == NS_CSS_PARSER_DROP_DECLARATION) {
|
||||
SetCSSDeclaration(declClone);
|
||||
result = NS_OK;
|
||||
} else if (NS_SUCCEEDED(result)) {
|
||||
if (cssSheet) {
|
||||
cssSheet->SetModified(PR_TRUE);
|
||||
}
|
||||
|
||||
@ -247,7 +247,7 @@ nsDOMCSSDeclaration::SetProperty(const nsString& aPropertyName,
|
||||
declString.Append(aValue);
|
||||
declString.Append(aPriority);
|
||||
|
||||
return ParseDeclaration(declString);
|
||||
return ParseDeclaration(declString, PR_TRUE, PR_FALSE);
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
|
||||
@ -64,8 +64,12 @@ public:
|
||||
virtual void DropReference() = 0;
|
||||
virtual nsresult GetCSSDeclaration(nsICSSDeclaration **aDecl,
|
||||
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;
|
||||
|
||||
protected:
|
||||
|
||||
@ -72,6 +72,7 @@ public:
|
||||
NS_IMETHOD ParseAndAppendDeclaration(const nsString& aBuffer,
|
||||
nsIURI* aBaseURL,
|
||||
nsICSSDeclaration* aDeclaration,
|
||||
PRBool aParseOnlyOneDecl,
|
||||
PRInt32* aHint) = 0;
|
||||
|
||||
// Charset management method:
|
||||
@ -92,6 +93,10 @@ public:
|
||||
#define NS_CSS_GETINFO_CSS2 ((PRUint32) 0x00000004L)
|
||||
#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
|
||||
NS_NewCSSParser(nsICSSParser** aInstancePtrResult);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user