From 3bdd5c558b71ce3c5aba71eef2633d730c8ceae3 Mon Sep 17 00:00:00 2001 From: "dbaron%dbaron.org" Date: Tue, 24 Jun 2003 05:40:37 +0000 Subject: [PATCH] Implement the DOM interfaces for CSS style rules on a wrapper object which allows the immutable rule object to be swapped out underneath. b=188803 r+sr=bzbarsky git-svn-id: svn://10.0.0.236/trunk@144087 18797224-902f-48f8-a5cc-f745e15eee43 --- .../html/style/public/nsICSSStyleSheet.h | 1 + mozilla/content/html/style/src/Makefile.in | 1 + mozilla/content/html/style/src/nsCSSRules.cpp | 31 +- .../content/html/style/src/nsCSSStyleRule.cpp | 321 +++++++++++++----- .../html/style/src/nsCSSStyleSheet.cpp | 52 ++- .../style/src/nsDOMCSSAttrDeclaration.cpp | 6 +- .../html/style/src/nsDOMCSSAttrDeclaration.h | 2 +- .../html/style/src/nsDOMCSSDeclaration.cpp | 17 - .../html/style/src/nsDOMCSSDeclaration.h | 19 +- mozilla/content/html/style/src/nsICSSRule.h | 3 + .../content/html/style/src/nsICSSStyleRule.h | 8 + .../style/src/nsICSSStyleRuleDOMWrapper.h | 55 +++ .../inspector/base/public/inIDOMUtils.idl | 2 +- .../inspector/base/src/inDOMUtils.cpp | 25 +- .../content/viewers/styleRules/styleRules.js | 13 +- .../layout/mathml/base/src/nsMathMLFrame.cpp | 4 +- mozilla/layout/style/nsCSSRules.cpp | 31 +- mozilla/layout/style/nsCSSStyleRule.cpp | 321 +++++++++++++----- mozilla/layout/style/nsCSSStyleSheet.cpp | 52 ++- .../layout/style/nsDOMCSSAttrDeclaration.cpp | 6 +- .../layout/style/nsDOMCSSAttrDeclaration.h | 2 +- mozilla/layout/style/nsDOMCSSDeclaration.cpp | 17 - mozilla/layout/style/nsDOMCSSDeclaration.h | 19 +- mozilla/layout/style/nsICSSRule.h | 3 + mozilla/layout/style/nsICSSStyleRule.h | 8 + .../layout/style/nsICSSStyleRuleDOMWrapper.h | 55 +++ mozilla/layout/style/nsICSSStyleSheet.h | 1 + 27 files changed, 757 insertions(+), 318 deletions(-) create mode 100644 mozilla/content/html/style/src/nsICSSStyleRuleDOMWrapper.h create mode 100644 mozilla/layout/style/nsICSSStyleRuleDOMWrapper.h diff --git a/mozilla/content/html/style/public/nsICSSStyleSheet.h b/mozilla/content/html/style/public/nsICSSStyleSheet.h index 7c863be0dba..86b8ed94989 100644 --- a/mozilla/content/html/style/public/nsICSSStyleSheet.h +++ b/mozilla/content/html/style/public/nsICSSStyleSheet.h @@ -83,6 +83,7 @@ public: NS_IMETHOD SetOwningNode(nsIDOMNode* aOwningNode) = 0; NS_IMETHOD SetOwnerRule(nsICSSImportRule* aOwnerRule) = 0; + NS_IMETHOD GetOwnerRule(nsICSSImportRule** aOwnerRule) = 0; // get head of namespace chain for sheet NS_IMETHOD GetNameSpace(nsINameSpace*& aNameSpace) const = 0; diff --git a/mozilla/content/html/style/src/Makefile.in b/mozilla/content/html/style/src/Makefile.in index 2db567de4b2..fca18ea5864 100644 --- a/mozilla/content/html/style/src/Makefile.in +++ b/mozilla/content/html/style/src/Makefile.in @@ -85,6 +85,7 @@ EXPORTS = \ nsICSSRule.h \ nsICSSGroupRule.h \ nsICSSStyleRule.h \ + nsICSSStyleRuleDOMWrapper.h \ nsICSSImportRule.h \ nsICSSMediaRule.h \ nsICSSNameSpaceRule.h \ diff --git a/mozilla/content/html/style/src/nsCSSRules.cpp b/mozilla/content/html/style/src/nsCSSRules.cpp index a70066583fe..b666afe719f 100644 --- a/mozilla/content/html/style/src/nsCSSRules.cpp +++ b/mozilla/content/html/style/src/nsCSSRules.cpp @@ -70,17 +70,20 @@ NS_IMETHOD GetStyleSheet(nsIStyleSheet*& aSheet) const; \ NS_IMETHOD SetStyleSheet(nsICSSStyleSheet* aSheet); \ NS_IMETHOD SetParentRule(nsICSSGroupRule* aRule); \ +NS_IMETHOD GetDOMRule(nsIDOMCSSRule** aDOMRule); \ NS_IMETHOD MapRuleInfoInto(nsRuleData* aRuleData); #define IMPL_STYLE_RULE_INHERIT(_class, super) \ NS_IMETHODIMP _class::GetStyleSheet(nsIStyleSheet*& aSheet) const { return super::GetStyleSheet(aSheet); } \ NS_IMETHODIMP _class::SetStyleSheet(nsICSSStyleSheet* aSheet) { return super::SetStyleSheet(aSheet); } \ NS_IMETHODIMP _class::SetParentRule(nsICSSGroupRule* aRule) { return super::SetParentRule(aRule); } \ +NS_IMETHODIMP _class::GetDOMRule(nsIDOMCSSRule** aDOMRule) { return CallQueryInterface(this, aDOMRule); } \ NS_IMETHODIMP _class::MapRuleInfoInto(nsRuleData* aRuleData) { return NS_OK; } #define IMPL_STYLE_RULE_INHERIT2(_class, super) \ NS_IMETHODIMP _class::GetStyleSheet(nsIStyleSheet*& aSheet) const { return super::GetStyleSheet(aSheet); } \ NS_IMETHODIMP _class::SetParentRule(nsICSSGroupRule* aRule) { return super::SetParentRule(aRule); } \ +NS_IMETHODIMP _class::GetDOMRule(nsIDOMCSSRule** aDOMRule) { return CallQueryInterface(this, aDOMRule); } \ NS_IMETHODIMP _class::MapRuleInfoInto(nsRuleData* aRuleData) { return NS_OK; } // ------------------------------- @@ -151,7 +154,7 @@ CSSGroupRuleRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn) result = mGroupRule->GetStyleRuleAt(aIndex, *getter_AddRefs(rule)); if (rule) { - result = CallQueryInterface(rule, aReturn); + result = rule->GetDOMRule(aReturn); } else if (result == NS_ERROR_ILLEGAL_VALUE) { result = NS_OK; // per spec: "Return Value ... null if ... not a valid index." } @@ -329,7 +332,7 @@ NS_IMETHODIMP CSSCharsetRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) { if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); + return mParentRule->GetDOMRule(aParentRule); } *aParentRule = nsnull; return NS_OK; @@ -589,7 +592,7 @@ NS_IMETHODIMP CSSImportRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) { if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); + return mParentRule->GetDOMRule(aParentRule); } *aParentRule = nsnull; return NS_OK; @@ -1019,14 +1022,16 @@ CSSMediaRuleImpl::GetCssText(nsAString& aCssText) if (mRules) { mRules->Count(&count); for (index = 0; index < count; index++) { - nsCOMPtr rule; - mRules->QueryElementAt(index, NS_GET_IID(nsIDOMCSSRule), getter_AddRefs(rule)); - if (rule) { - nsAutoString tempString; - rule->GetCssText(tempString); - aCssText.Append(NS_LITERAL_STRING(" ")); - aCssText.Append(tempString); - aCssText.Append(NS_LITERAL_STRING("\n")); + nsCOMPtr rule; + mRules->GetElementAt(index, getter_AddRefs(rule)); + nsCOMPtr domRule; + rule->GetDOMRule(getter_AddRefs(domRule)); + if (domRule) { + nsAutoString cssText; + domRule->GetCssText(cssText); + aCssText.Append(NS_LITERAL_STRING(" ") + + cssText + + NS_LITERAL_STRING("\n")); } } } @@ -1056,7 +1061,7 @@ NS_IMETHODIMP CSSMediaRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) { if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); + return mParentRule->GetDOMRule(aParentRule); } *aParentRule = nsnull; return NS_OK; @@ -1333,7 +1338,7 @@ NS_IMETHODIMP CSSNameSpaceRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) { if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); + return mParentRule->GetDOMRule(aParentRule); } *aParentRule = nsnull; return NS_OK; diff --git a/mozilla/content/html/style/src/nsCSSStyleRule.cpp b/mozilla/content/html/style/src/nsCSSStyleRule.cpp index 88c3e99cca0..99d4dd01160 100644 --- a/mozilla/content/html/style/src/nsCSSStyleRule.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleRule.cpp @@ -58,8 +58,7 @@ #include "nsUnitConversion.h" #include "nsIFontMetrics.h" #include "nsIDOMCSSStyleSheet.h" -#include "nsIDOMCSSRule.h" -#include "nsIDOMCSSStyleRule.h" +#include "nsICSSStyleRuleDOMWrapper.h" #include "nsIDOMCSSStyleDeclaration.h" #include "nsDOMCSSDeclaration.h" #include "nsINameSpaceManager.h" @@ -853,44 +852,97 @@ CSSImportantRule::List(FILE* out, PRInt32 aIndent) const } #endif -// -- DOMCSSDeclarationImpl ------------------------------- +// -------------------------------------------------------- + +class DOMCSSStyleRuleImpl; class DOMCSSDeclarationImpl : public nsDOMCSSDeclaration { public: DOMCSSDeclarationImpl(nsICSSStyleRule *aRule); - ~DOMCSSDeclarationImpl(void); + virtual ~DOMCSSDeclarationImpl(void); + virtual nsresult GetParentRule(nsIDOMCSSRule **aParent); virtual void DropReference(void); virtual nsresult GetCSSDeclaration(nsCSSDeclaration **aDecl, PRBool aAllocate); virtual nsresult GetCSSParsingEnvironment(nsIURI** aURI, nsICSSLoader** aCSSLoader, nsICSSParser** aCSSParser); - virtual nsresult GetParent(nsISupports **aParent); virtual nsresult DeclarationChanged(); + // Override |AddRef| and |Release| for being a member of + // |DOMCSSStyleRuleImpl|. + NS_IMETHOD_(nsrefcnt) AddRef(void); + NS_IMETHOD_(nsrefcnt) Release(void); + + friend class DOMCSSStyleRuleImpl; + protected: + // This reference is not reference-counted. The rule object tells us + // when it's about to go away. nsICSSStyleRule *mRule; + + inline DOMCSSStyleRuleImpl* DomRule(); + +private: + // NOT TO BE IMPLEMENTED + // This object cannot be allocated on its own. It must be a member of + // DOMCSSStyleRuleImpl. + void* operator new(size_t size) CPP_THROW_NEW; +}; + +class DOMCSSStyleRuleImpl : public nsICSSStyleRuleDOMWrapper +{ +public: + DOMCSSStyleRuleImpl(nsICSSStyleRule *aRule); + virtual ~DOMCSSStyleRuleImpl(); + + NS_DECL_ISUPPORTS + NS_DECL_NSIDOMCSSRULE + NS_DECL_NSIDOMCSSSTYLERULE + + // nsICSSStyleRuleDOMWrapper + NS_IMETHOD GetCSSStyleRule(nsICSSStyleRule **aResult); + + DOMCSSDeclarationImpl* DOMDeclaration() { return &mDOMDeclaration; } + + friend class DOMCSSDeclarationImpl; + +protected: + DOMCSSDeclarationImpl mDOMDeclaration; + + nsICSSStyleRule* Rule() { + return mDOMDeclaration.mRule; + } }; MOZ_DECL_CTOR_COUNTER(DOMCSSDeclarationImpl) DOMCSSDeclarationImpl::DOMCSSDeclarationImpl(nsICSSStyleRule *aRule) + : mRule(aRule) { MOZ_COUNT_CTOR(DOMCSSDeclarationImpl); - - // This reference is not reference-counted. The rule - // object tells us when its about to go away. - mRule = aRule; } DOMCSSDeclarationImpl::~DOMCSSDeclarationImpl(void) { + NS_ASSERTION(!mRule, "DropReference not called."); + MOZ_COUNT_DTOR(DOMCSSDeclarationImpl); } -void +inline DOMCSSStyleRuleImpl* DOMCSSDeclarationImpl::DomRule() +{ + return NS_REINTERPRET_CAST(DOMCSSStyleRuleImpl*, + NS_REINTERPRET_CAST(char*, this) - + offsetof(DOMCSSStyleRuleImpl, mDOMDeclaration)); +} + +NS_IMPL_ADDREF_USING_AGGREGATOR(DOMCSSDeclarationImpl, DomRule()) +NS_IMPL_RELEASE_USING_AGGREGATOR(DOMCSSDeclarationImpl, DomRule()) + +void DOMCSSDeclarationImpl::DropReference(void) { mRule = nsnull; @@ -940,6 +992,7 @@ DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aURI, } } } + // XXXldb Why bother if |mRule| is null? if (*aCSSLoader) { result = (*aCSSLoader)->GetParserFor(nsnull, aCSSParser); } else { @@ -950,17 +1003,16 @@ DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aURI, } nsresult -DOMCSSDeclarationImpl::GetParent(nsISupports **aParent) +DOMCSSDeclarationImpl::GetParentRule(nsIDOMCSSRule **aParent) { NS_ENSURE_ARG_POINTER(aParent); - if (mRule) { - return CallQueryInterface(mRule, aParent); + if (!mRule) { + *aParent = nsnull; + return NS_OK; } - *aParent = nsnull; - - return NS_OK; + return mRule->GetDOMRule(aParent); } nsresult @@ -987,7 +1039,11 @@ DOMCSSDeclarationImpl::DeclarationChanged() if (!mRule) return NS_ERROR_OUT_OF_MEMORY; nsrefcnt cnt = mRule->Release(); - NS_ASSERTION(cnt != 0, "container didn't take ownership"); + if (cnt == 0) { + NS_NOTREACHED("container didn't take ownership"); + mRule = nsnull; + return NS_ERROR_UNEXPECTED; + } if (owningDoc) { owningDoc->StyleRuleChanged(sheet, oldRule, mRule); @@ -996,11 +1052,124 @@ DOMCSSDeclarationImpl::DeclarationChanged() return NS_OK; } +DOMCSSStyleRuleImpl::DOMCSSStyleRuleImpl(nsICSSStyleRule* aRule) + : mDOMDeclaration(aRule) +{ +} + +DOMCSSStyleRuleImpl::~DOMCSSStyleRuleImpl() +{ +} + +NS_INTERFACE_MAP_BEGIN(DOMCSSStyleRuleImpl) + NS_INTERFACE_MAP_ENTRY(nsICSSStyleRuleDOMWrapper) + NS_INTERFACE_MAP_ENTRY(nsIDOMCSSStyleRule) + NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule) + NS_INTERFACE_MAP_ENTRY(nsISupports) + NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSStyleRule) +NS_INTERFACE_MAP_END + +NS_IMPL_ADDREF(DOMCSSStyleRuleImpl) +NS_IMPL_RELEASE(DOMCSSStyleRuleImpl) + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetType(PRUint16* aType) +{ + *aType = nsIDOMCSSRule::STYLE_RULE; + + return NS_OK; +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetCssText(nsAString& aCssText) +{ + if (!Rule()) { + aCssText.Truncate(); + return NS_OK; + } + return Rule()->GetCssText(aCssText); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::SetCssText(const nsAString& aCssText) +{ + if (!Rule()) { + return NS_OK; + } + return Rule()->SetCssText(aCssText); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetParentStyleSheet(nsIDOMCSSStyleSheet** aSheet) +{ + if (!Rule()) { + *aSheet = nsnull; + return NS_OK; + } + nsCOMPtr sheet; + Rule()->GetParentStyleSheet(getter_AddRefs(sheet)); + if (!sheet) { + *aSheet = nsnull; + return NS_OK; + } + return CallQueryInterface(sheet, aSheet); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) +{ + if (!Rule()) { + *aParentRule = nsnull; + return NS_OK; + } + nsCOMPtr rule; + Rule()->GetParentRule(getter_AddRefs(rule)); + if (!rule) { + *aParentRule = nsnull; + return NS_OK; + } + return rule->GetDOMRule(aParentRule); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetSelectorText(nsAString& aSelectorText) +{ + if (!Rule()) { + aSelectorText.Truncate(); + return NS_OK; + } + return Rule()->GetSelectorText(aSelectorText); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::SetSelectorText(const nsAString& aSelectorText) +{ + if (!Rule()) { + return NS_OK; + } + return Rule()->SetSelectorText(aSelectorText); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetStyle(nsIDOMCSSStyleDeclaration** aStyle) +{ + *aStyle = &mDOMDeclaration; + NS_ADDREF(*aStyle); + return NS_OK; +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetCSSStyleRule(nsICSSStyleRule **aResult) +{ + *aResult = Rule(); + NS_IF_ADDREF(*aResult); + return NS_OK; +} + // -- nsCSSStyleRule ------------------------------- class CSSStyleRuleImpl : public nsCSSRule, - public nsICSSStyleRule, - public nsIDOMCSSStyleRule + public nsICSSStyleRule { public: CSSStyleRuleImpl(nsCSSSelectorList* aSelector, @@ -1032,9 +1201,18 @@ public: NS_IMETHOD SetParentRule(nsICSSGroupRule* aRule); + virtual nsresult GetCssText(nsAString& aCssText); + virtual nsresult SetCssText(const nsAString& aCssText); + virtual nsresult GetParentStyleSheet(nsICSSStyleSheet** aSheet); + virtual nsresult GetParentRule(nsICSSGroupRule** aParentRule); + virtual nsresult GetSelectorText(nsAString& aSelectorText); + virtual nsresult SetSelectorText(const nsAString& aSelectorText); + NS_IMETHOD GetType(PRInt32& aType) const; NS_IMETHOD Clone(nsICSSRule*& aClone) const; + NS_IMETHOD GetDOMRule(nsIDOMCSSRule** aDOMRule); + virtual already_AddRefed DeclarationChanged(PRBool aHandleContainer); @@ -1045,12 +1223,6 @@ public: NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0) const; #endif - // nsIDOMCSSRule interface - NS_DECL_NSIDOMCSSRULE - - // nsIDOMCSSStyleRule interface - NS_DECL_NSIDOMCSSSTYLERULE - private: // These are not supported and are not implemented! CSSStyleRuleImpl& operator=(const CSSStyleRuleImpl& aCopy); @@ -1062,7 +1234,7 @@ protected: nsCSSSelectorList* mSelector; // null for style attribute nsCSSDeclaration* mDeclaration; CSSImportantRule* mImportantRule; - DOMCSSDeclarationImpl* mDOMDeclaration; + DOMCSSStyleRuleImpl* mDOMRule; PRUint32 mLineNumber; }; @@ -1072,7 +1244,7 @@ CSSStyleRuleImpl::CSSStyleRuleImpl(nsCSSSelectorList* aSelector, mSelector(aSelector), mDeclaration(aDeclaration), mImportantRule(nsnull), - mDOMDeclaration(nsnull) + mDOMRule(nsnull) { if (mDeclaration) mDeclaration->AddRef(); @@ -1084,7 +1256,7 @@ CSSStyleRuleImpl::CSSStyleRuleImpl(const CSSStyleRuleImpl& aCopy) mSelector(aCopy.mSelector ? aCopy.mSelector->Clone() : nsnull), mDeclaration(aCopy.mDeclaration ? aCopy.mDeclaration->Clone() : nsnull), mImportantRule(nsnull), - mDOMDeclaration(nsnull) + mDOMRule(nsnull) { if (mDeclaration) mDeclaration->AddRef(); @@ -1098,11 +1270,11 @@ CSSStyleRuleImpl::CSSStyleRuleImpl(CSSStyleRuleImpl& aCopy, mSelector(aCopy.mSelector), mDeclaration(aDeclaration), mImportantRule(nsnull), - mDOMDeclaration(aCopy.mDOMDeclaration) + mDOMRule(aCopy.mDOMRule) { - // The DOM declaration is replacing |aCopy| with |this|, so transfer - // the reverse pointer as well. - aCopy.mDOMDeclaration = nsnull; + // The DOM rule is replacing |aCopy| with |this|, so transfer + // the reverse pointer as well (and transfer ownership). + aCopy.mDOMRule = nsnull; // Transfer ownership of selector and declaration: NS_ASSERTION(aDeclaration == aCopy.mDeclaration, "declaration mismatch"); @@ -1126,8 +1298,9 @@ CSSStyleRuleImpl::~CSSStyleRuleImpl(void) NS_RELEASE(mImportantRule); mImportantRule = nsnull; } - if (nsnull != mDOMDeclaration) { - mDOMDeclaration->DropReference(); + if (mDOMRule) { + mDOMRule->DOMDeclaration()->DropReference(); + NS_RELEASE(mDOMRule); } } @@ -1136,16 +1309,11 @@ NS_INTERFACE_MAP_BEGIN(CSSStyleRuleImpl) NS_INTERFACE_MAP_ENTRY(nsICSSStyleRule) NS_INTERFACE_MAP_ENTRY(nsICSSRule) NS_INTERFACE_MAP_ENTRY(nsIStyleRule) - NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule) - NS_INTERFACE_MAP_ENTRY(nsIDOMCSSStyleRule) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsICSSStyleRule) - NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSStyleRule) NS_INTERFACE_MAP_END - -NS_IMPL_ADDREF_INHERITED(CSSStyleRuleImpl, nsCSSRule); -NS_IMPL_RELEASE_INHERITED(CSSStyleRuleImpl, nsCSSRule); - +NS_IMPL_ADDREF_INHERITED(CSSStyleRuleImpl, nsCSSRule) +NS_IMPL_RELEASE_INHERITED(CSSStyleRuleImpl, nsCSSRule) nsCSSSelectorList* CSSStyleRuleImpl::Selector(void) { @@ -1225,6 +1393,22 @@ CSSStyleRuleImpl::Clone(nsICSSRule*& aClone) const return CallQueryInterface(clone, &aClone); } +NS_IMETHODIMP +CSSStyleRuleImpl::GetDOMRule(nsIDOMCSSRule** aDOMRule) +{ + if (!mDOMRule) { + mDOMRule = new DOMCSSStyleRuleImpl(this); + if (!mDOMRule) { + *aDOMRule = nsnull; + return NS_ERROR_OUT_OF_MEMORY; + } + NS_ADDREF(mDOMRule); + } + *aDOMRule = mDOMRule; + NS_ADDREF(*aDOMRule); + return NS_OK; +} + /* virtual */ already_AddRefed CSSStyleRuleImpl::DeclarationChanged(PRBool aHandleContainer) { @@ -1235,7 +1419,7 @@ CSSStyleRuleImpl::DeclarationChanged(PRBool aHandleContainer) NS_ADDREF(clone); // for return - if (aHandleContainer) { + if (aHandleContainer && mSheet) { if (mParentRule) { mSheet->ReplaceRuleInGroup(mParentRule, this, clone); } else { @@ -1277,15 +1461,7 @@ CSSStyleRuleImpl::List(FILE* out, PRInt32 aIndent) const } #endif -NS_IMETHODIMP -CSSStyleRuleImpl::GetType(PRUint16* aType) -{ - *aType = nsIDOMCSSRule::STYLE_RULE; - - return NS_OK; -} - -NS_IMETHODIMP +/* virtual */ nsresult CSSStyleRuleImpl::GetCssText(nsAString& aCssText) { if (mSelector) { @@ -1305,34 +1481,30 @@ CSSStyleRuleImpl::GetCssText(nsAString& aCssText) return NS_OK; } -NS_IMETHODIMP +/* virtual */ nsresult CSSStyleRuleImpl::SetCssText(const nsAString& aCssText) { // XXX TBI - need to re-parse rule & declaration return NS_OK; } -NS_IMETHODIMP -CSSStyleRuleImpl::GetParentStyleSheet(nsIDOMCSSStyleSheet** aSheet) +/* virtual */ nsresult +CSSStyleRuleImpl::GetParentStyleSheet(nsICSSStyleSheet** aSheet) { - if (mSheet) { - return CallQueryInterface(mSheet, aSheet); - } - *aSheet = nsnull; + *aSheet = mSheet; + NS_IF_ADDREF(*aSheet); return NS_OK; } -NS_IMETHODIMP -CSSStyleRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) +/* virtual */ nsresult +CSSStyleRuleImpl::GetParentRule(nsICSSGroupRule** aParentRule) { - if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); - } - *aParentRule = nsnull; + *aParentRule = mParentRule; + NS_IF_ADDREF(*aParentRule); return NS_OK; } -NS_IMETHODIMP +/* virtual */ nsresult CSSStyleRuleImpl::GetSelectorText(nsAString& aSelectorText) { if (mSelector) @@ -1342,7 +1514,7 @@ CSSStyleRuleImpl::GetSelectorText(nsAString& aSelectorText) return NS_OK; } -NS_IMETHODIMP +/* virtual */ nsresult CSSStyleRuleImpl::SetSelectorText(const nsAString& aSelectorText) { // XXX TBI - get a parser and re-parse the selectors, @@ -1351,23 +1523,6 @@ CSSStyleRuleImpl::SetSelectorText(const nsAString& aSelectorText) return NS_OK; } -NS_IMETHODIMP -CSSStyleRuleImpl::GetStyle(nsIDOMCSSStyleDeclaration** aStyle) -{ - if (nsnull == mDOMDeclaration) { - mDOMDeclaration = new DOMCSSDeclarationImpl(this); - if (nsnull == mDOMDeclaration) { - return NS_ERROR_OUT_OF_MEMORY; - } - NS_ADDREF(mDOMDeclaration); - } - - *aStyle = mDOMDeclaration; - NS_ADDREF(mDOMDeclaration); - - return NS_OK; -} - nsresult NS_NewCSSStyleRule(nsICSSStyleRule** aInstancePtrResult, nsCSSSelectorList* aSelector, diff --git a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp index 5ed752ba5f4..88e5865ca53 100644 --- a/mozilla/content/html/style/src/nsCSSStyleSheet.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleSheet.cpp @@ -79,7 +79,7 @@ #include "nsIDOMHTMLOptionElement.h" #include "nsIDOMStyleSheetList.h" #include "nsIDOMCSSStyleSheet.h" -#include "nsIDOMCSSStyleRule.h" +#include "nsIDOMCSSRule.h" #include "nsIDOMCSSImportRule.h" #include "nsIDOMCSSRuleList.h" #include "nsIDOMMediaList.h" @@ -833,6 +833,7 @@ public: NS_IMETHOD SetOwningDocument(nsIDocument* aDocument); NS_IMETHOD SetOwningNode(nsIDOMNode* aOwningNode); NS_IMETHOD SetOwnerRule(nsICSSImportRule* aOwnerRule); + NS_IMETHOD GetOwnerRule(nsICSSImportRule** aOwnerRule); NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor, nsIStyleRuleProcessor* aPrevProcessor); @@ -1000,7 +1001,7 @@ CSSRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn) result = mStyleSheet->GetStyleRuleAt(aIndex, *getter_AddRefs(rule)); if (rule) { - result = CallQueryInterface(rule, aReturn); + result = rule->GetDOMRule(aReturn); mRulesAccessed = PR_TRUE; // signal to never share rules again } else if (result == NS_ERROR_ILLEGAL_VALUE) { result = NS_OK; // per spec: "Return Value ... null if ... not a valid index." @@ -1998,6 +1999,14 @@ CSSStyleSheetImpl::SetOwnerRule(nsICSSImportRule* aOwnerRule) return NS_OK; } +NS_IMETHODIMP +CSSStyleSheetImpl::GetOwnerRule(nsICSSImportRule** aOwnerRule) +{ + *aOwnerRule = mOwnerRule; + NS_IF_ADDREF(*aOwnerRule); + return NS_OK; +} + NS_IMETHODIMP CSSStyleSheetImpl::ContainsStyleSheet(nsIURI* aURL, PRBool& aContains, nsIStyleSheet** aTheChild /*=nsnull*/) { @@ -2571,7 +2580,7 @@ NS_IMETHODIMP CSSStyleSheetImpl::GetOwnerRule(nsIDOMCSSRule** aOwnerRule) { if (mOwnerRule) { - return CallQueryInterface(mOwnerRule, aOwnerRule); + return mOwnerRule->GetDOMRule(aOwnerRule); } *aOwnerRule = nsnull; @@ -2877,14 +2886,9 @@ CSSStyleSheetImpl::DeleteRuleFromGroup(nsICSSGroupRule* aGroup, PRUint32 aIndex) NS_ENSURE_SUCCESS(result, result); // check that the rule actually belongs to this sheet! - nsCOMPtr domRule(do_QueryInterface(rule)); - nsCOMPtr ruleSheet; - result = domRule->GetParentStyleSheet(getter_AddRefs(ruleSheet)); - NS_ENSURE_SUCCESS(result, result); - nsCOMPtr thisSheet; - this->QueryInterface(NS_GET_IID(nsIDOMCSSStyleSheet), getter_AddRefs(thisSheet)); - - if (thisSheet != ruleSheet) { + nsCOMPtr ruleSheet; + rule->GetStyleSheet(*getter_AddRefs(ruleSheet)); + if (this != ruleSheet) { return NS_ERROR_INVALID_ARG; } @@ -2921,14 +2925,9 @@ CSSStyleSheetImpl::InsertRuleIntoGroup(const nsAString & aRule, nsICSSGroupRule* NS_ASSERTION(mInner && mInner->mComplete, "No inserting into an incomplete sheet!"); // check that the group actually belongs to this sheet! - nsCOMPtr domGroup(do_QueryInterface(aGroup)); - nsCOMPtr groupSheet; - result = domGroup->GetParentStyleSheet(getter_AddRefs(groupSheet)); - NS_ENSURE_SUCCESS(result, result); - nsCOMPtr thisSheet; - this->QueryInterface(NS_GET_IID(nsIDOMCSSStyleSheet), getter_AddRefs(thisSheet)); - - if (thisSheet != groupSheet) { + nsCOMPtr groupSheet; + aGroup->GetStyleSheet(*getter_AddRefs(groupSheet)); + if (this != groupSheet) { return NS_ERROR_INVALID_ARG; } @@ -3017,9 +3016,8 @@ CSSStyleSheetImpl::ReplaceRuleInGroup(nsICSSGroupRule* aGroup, "No replacing in an incomplete sheet!"); #ifdef DEBUG { - nsCOMPtr domGroup(do_QueryInterface(aGroup)); - nsCOMPtr groupSheet; - domGroup->GetParentStyleSheet(getter_AddRefs(groupSheet)); + nsCOMPtr groupSheet; + aGroup->GetStyleSheet(*getter_AddRefs(groupSheet)); NS_ASSERTION(this == groupSheet, "group doesn't belong to this sheet"); } #endif @@ -3046,16 +3044,14 @@ CSSStyleSheetImpl::StyleSheetLoaded(nsICSSStyleSheet*aSheet, PRBool aNotify) #endif if (mDocument && aNotify) { - nsCOMPtr domSheet(do_QueryInterface(aSheet)); - NS_ENSURE_TRUE(domSheet, NS_ERROR_UNEXPECTED); - - nsCOMPtr ownerRule; - domSheet->GetOwnerRule(getter_AddRefs(ownerRule)); - NS_ENSURE_TRUE(ownerRule, NS_ERROR_UNEXPECTED); + nsCOMPtr ownerRule; + aSheet->GetOwnerRule(getter_AddRefs(ownerRule)); nsresult rv = mDocument->BeginUpdate(); NS_ENSURE_SUCCESS(rv, rv); + // XXXldb @import rules shouldn't even implement nsIStyleRule (but + // they do)! nsCOMPtr styleRule(do_QueryInterface(ownerRule)); rv = mDocument->StyleRuleAdded(this, styleRule); diff --git a/mozilla/content/html/style/src/nsDOMCSSAttrDeclaration.cpp b/mozilla/content/html/style/src/nsDOMCSSAttrDeclaration.cpp index e8790a53644..0cc92946a50 100644 --- a/mozilla/content/html/style/src/nsDOMCSSAttrDeclaration.cpp +++ b/mozilla/content/html/style/src/nsDOMCSSAttrDeclaration.cpp @@ -196,13 +196,11 @@ nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(nsIURI** aBaseURI, } nsresult -nsDOMCSSAttributeDeclaration::GetParent(nsISupports **aParent) +nsDOMCSSAttributeDeclaration::GetParentRule(nsIDOMCSSRule **aParent) { NS_ENSURE_ARG_POINTER(aParent); - *aParent = mContent; - NS_IF_ADDREF(*aParent); - + *aParent = nsnull; return NS_OK; } diff --git a/mozilla/content/html/style/src/nsDOMCSSAttrDeclaration.h b/mozilla/content/html/style/src/nsDOMCSSAttrDeclaration.h index 97575e4e098..43ec25aaa27 100644 --- a/mozilla/content/html/style/src/nsDOMCSSAttrDeclaration.h +++ b/mozilla/content/html/style/src/nsDOMCSSAttrDeclaration.h @@ -63,7 +63,7 @@ public: virtual nsresult GetCSSParsingEnvironment(nsIURI** aBaseURI, nsICSSLoader** aCSSLoader, nsICSSParser** aCSSParser); - virtual nsresult GetParent(nsISupports **aParent); + virtual nsresult GetParentRule(nsIDOMCSSRule **aParent); protected: virtual nsresult DeclarationChanged(); diff --git a/mozilla/content/html/style/src/nsDOMCSSDeclaration.cpp b/mozilla/content/html/style/src/nsDOMCSSDeclaration.cpp index 4ccba2920e5..36bebf84ccf 100644 --- a/mozilla/content/html/style/src/nsDOMCSSDeclaration.cpp +++ b/mozilla/content/html/style/src/nsDOMCSSDeclaration.cpp @@ -148,23 +148,6 @@ nsDOMCSSDeclaration::GetLength(PRUint32* aLength) return result; } -NS_IMETHODIMP -nsDOMCSSDeclaration::GetParentRule(nsIDOMCSSRule** aParentRule) -{ - NS_ENSURE_ARG_POINTER(aParentRule); - *aParentRule = nsnull; - - nsCOMPtr parent; - - GetParent(getter_AddRefs(parent)); - - if (parent) { - CallQueryInterface(parent, aParentRule); - } - - return NS_OK; -} - NS_IMETHODIMP nsDOMCSSDeclaration::GetPropertyCSSValue(const nsAString& aPropertyName, nsIDOMCSSValue** aReturn) diff --git a/mozilla/content/html/style/src/nsDOMCSSDeclaration.h b/mozilla/content/html/style/src/nsDOMCSSDeclaration.h index 9421f67683e..b24fbdcebff 100644 --- a/mozilla/content/html/style/src/nsDOMCSSDeclaration.h +++ b/mozilla/content/html/style/src/nsDOMCSSDeclaration.h @@ -57,7 +57,23 @@ public: NS_DECL_ISUPPORTS - NS_DECL_NSIDOMCSSSTYLEDECLARATION + // Require subclasses to implement |GetParentRule|. + //NS_DECL_NSIDOMCSSSTYLEDECLARATION + NS_IMETHOD GetCssText(nsAString & aCssText); + NS_IMETHOD SetCssText(const nsAString & aCssText); + NS_IMETHOD GetPropertyValue(const nsAString & propertyName, + nsAString & _retval); + NS_IMETHOD GetPropertyCSSValue(const nsAString & propertyName, + nsIDOMCSSValue **_retval); + NS_IMETHOD RemoveProperty(const nsAString & propertyName, + nsAString & _retval); + NS_IMETHOD GetPropertyPriority(const nsAString & propertyName, + nsAString & _retval); + NS_IMETHOD SetProperty(const nsAString & propertyName, + const nsAString & value, const nsAString & priority); + NS_IMETHOD GetLength(PRUint32 *aLength); + NS_IMETHOD Item(PRUint32 index, nsAString & _retval); + NS_IMETHOD GetParentRule(nsIDOMCSSRule * *aParentRule) = 0; virtual void DropReference() = 0; protected: @@ -66,7 +82,6 @@ protected: // propagate. virtual nsresult GetCSSDeclaration(nsCSSDeclaration **aDecl, PRBool aAllocate) = 0; - virtual nsresult GetParent(nsISupports **aParent) = 0; virtual nsresult DeclarationChanged() = 0; // This will only fail if it can't get a parser. This means it can diff --git a/mozilla/content/html/style/src/nsICSSRule.h b/mozilla/content/html/style/src/nsICSSRule.h index bd8556efe91..037d0fef34b 100644 --- a/mozilla/content/html/style/src/nsICSSRule.h +++ b/mozilla/content/html/style/src/nsICSSRule.h @@ -42,6 +42,7 @@ class nsICSSStyleSheet; class nsICSSGroupRule; +class nsIDOMCSSRule; class nsAString; // IID for the nsICSSRule interface {b9791e20-1a04-11d3-805a-006008159b5a} @@ -69,6 +70,8 @@ public: NS_IMETHOD SetParentRule(nsICSSGroupRule* aRule) = 0; NS_IMETHOD Clone(nsICSSRule*& aClone) const = 0; + + NS_IMETHOD GetDOMRule(nsIDOMCSSRule** aDOMRule) = 0; }; /* Define global NS_New* functions for rules that don't need their own diff --git a/mozilla/content/html/style/src/nsICSSStyleRule.h b/mozilla/content/html/style/src/nsICSSStyleRule.h index 943a60fe860..076c7c30be3 100644 --- a/mozilla/content/html/style/src/nsICSSStyleRule.h +++ b/mozilla/content/html/style/src/nsICSSStyleRule.h @@ -217,6 +217,14 @@ public: // Hook for inspector. virtual nsresult GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) = 0; + + // hooks for DOM rule + virtual nsresult GetCssText(nsAString& aCssText) = 0; + virtual nsresult SetCssText(const nsAString& aCssText) = 0; + virtual nsresult GetParentStyleSheet(nsICSSStyleSheet** aSheet) = 0; + virtual nsresult GetParentRule(nsICSSGroupRule** aParentRule) = 0; + virtual nsresult GetSelectorText(nsAString& aSelectorText) = 0; + virtual nsresult SetSelectorText(const nsAString& aSelectorText) = 0; }; nsresult diff --git a/mozilla/content/html/style/src/nsICSSStyleRuleDOMWrapper.h b/mozilla/content/html/style/src/nsICSSStyleRuleDOMWrapper.h new file mode 100644 index 00000000000..a6edcb862ca --- /dev/null +++ b/mozilla/content/html/style/src/nsICSSStyleRuleDOMWrapper.h @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is nsICSSStyleRuleDOMWrapper.h. + * + * The Initial Developer of the Original Code is L. David Baron. + * Portions created by the Initial Developer are Copyright (C) 2003 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * L. David Baron (original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsICSSStyleRuleDOMWrapper_h_ +#define nsICSSStyleRuleDOMWrapper_h_ + +#include "nsIDOMCSSStyleRule.h" + +// IID for the nsICSSStyleRuleDOMWrapper interface +// {476a4290-1194-4099-8f2d-a1ccc9bdd676} +#define NS_ICSS_STYLE_RULE_DOM_WRAPPER_IID \ +{0x476a4290, 0x1194, 0x4099, {0x8f, 0x2d, 0xa1, 0xcc, 0xc9, 0xbd, 0xd6, 0x76}} + +class nsICSSStyleRuleDOMWrapper : public nsIDOMCSSStyleRule { +public: + NS_DEFINE_STATIC_IID_ACCESSOR(NS_ICSS_STYLE_RULE_DOM_WRAPPER_IID) + + NS_IMETHOD GetCSSStyleRule(nsICSSStyleRule** aResult) = 0; +}; + +#endif /* !defined(nsICSSStyleRuleDOMWrapper_h_) */ diff --git a/mozilla/extensions/inspector/base/public/inIDOMUtils.idl b/mozilla/extensions/inspector/base/public/inIDOMUtils.idl index ea80cc0edda..021ba0b9ba6 100644 --- a/mozilla/extensions/inspector/base/public/inIDOMUtils.idl +++ b/mozilla/extensions/inspector/base/public/inIDOMUtils.idl @@ -51,7 +51,7 @@ interface nsIDOMNode; interface inIDOMUtils : nsISupports { // CSS utilities - nsISupportsArray getStyleRules(in nsIDOMElement aElement); + nsISupportsArray getCSSStyleRules(in nsIDOMElement aElement); unsigned long getRuleLine(in nsIDOMCSSStyleRule aRule); // DOM Node utilities diff --git a/mozilla/extensions/inspector/base/src/inDOMUtils.cpp b/mozilla/extensions/inspector/base/src/inDOMUtils.cpp index 0ea619e6bd1..fd179dff81d 100644 --- a/mozilla/extensions/inspector/base/src/inDOMUtils.cpp +++ b/mozilla/extensions/inspector/base/src/inDOMUtils.cpp @@ -52,7 +52,7 @@ #include "nsRuleNode.h" #include "nsIStyleRule.h" #include "nsICSSStyleRule.h" -#include "nsIDOMCSSStyleRule.h" +#include "nsICSSStyleRuleDOMWrapper.h" #include "nsIDOMWindowInternal.h" static NS_DEFINE_CID(kInspectorCSSUtilsCID, NS_INSPECTORCSSUTILS_CID); @@ -152,7 +152,8 @@ inDOMUtils::GetParentForNode(nsIDOMNode* aNode, } NS_IMETHODIMP -inDOMUtils::GetStyleRules(nsIDOMElement *aElement, nsISupportsArray **_retval) +inDOMUtils::GetCSSStyleRules(nsIDOMElement *aElement, + nsISupportsArray **_retval) { if (!aElement) return NS_ERROR_NULL_POINTER; @@ -167,12 +168,18 @@ inDOMUtils::GetStyleRules(nsIDOMElement *aElement, nsISupportsArray **_retval) mCSSUtils->GetRuleNodeForContent(content, &ruleNode); nsCOMPtr srule; + nsCOMPtr cssRule; + nsCOMPtr domRule; for (PRBool isRoot; mCSSUtils->IsRuleNodeRoot(ruleNode, &isRoot), !isRoot; mCSSUtils->GetRuleNodeParent(ruleNode, &ruleNode)) { mCSSUtils->GetRuleNodeRule(ruleNode, getter_AddRefs(srule)); - rules->InsertElementAt(srule, 0); + cssRule = do_QueryInterface(srule); + if (cssRule) { + cssRule->GetDOMRule(getter_AddRefs(domRule)); + rules->InsertElementAt(domRule, 0); + } } *_retval = rules; @@ -184,10 +191,14 @@ inDOMUtils::GetStyleRules(nsIDOMElement *aElement, nsISupportsArray **_retval) NS_IMETHODIMP inDOMUtils::GetRuleLine(nsIDOMCSSStyleRule *aRule, PRUint32 *_retval) { - if (!aRule) return NS_OK; - nsCOMPtr rule = aRule; - nsCOMPtr cssrule = do_QueryInterface(rule); - *_retval = cssrule->GetLineNumber(); + *_retval = 0; + if (!aRule) + return NS_OK; + nsCOMPtr rule = do_QueryInterface(aRule); + nsCOMPtr cssrule; + rule->GetCSSStyleRule(getter_AddRefs(cssrule)); + if (cssrule) + *_retval = cssrule->GetLineNumber(); return NS_OK; } diff --git a/mozilla/extensions/inspector/resources/content/viewers/styleRules/styleRules.js b/mozilla/extensions/inspector/resources/content/viewers/styleRules/styleRules.js index 8dc3e2146ef..b53b4b83215 100644 --- a/mozilla/extensions/inspector/resources/content/viewers/styleRules/styleRules.js +++ b/mozilla/extensions/inspector/resources/content/viewers/styleRules/styleRules.js @@ -330,18 +330,7 @@ function StyleRuleView(aObject) if (doesQI(aObject, "nsIDOMCSSStyleSheet")) { this.mSheetRules = aObject.cssRules; } else { - this.mRules = this.mDOMUtils.getStyleRules(aObject); - } - - if (this.mRules) { - for (var i = this.mRules.Count(); i >= 0; --i) { - var rule = this.mRules.GetElementAt(i); - try { - rule = XPCU.QI(rule, "nsIDOMCSSStyleRule"); - } catch (ex) { - this.mRules.RemoveElement(rule); - } - } + this.mRules = this.mDOMUtils.getCSSStyleRules(aObject); } } diff --git a/mozilla/layout/mathml/base/src/nsMathMLFrame.cpp b/mozilla/layout/mathml/base/src/nsMathMLFrame.cpp index 87fb8d30451..ed7fa327fee 100644 --- a/mozilla/layout/mathml/base/src/nsMathMLFrame.cpp +++ b/mozilla/layout/mathml/base/src/nsMathMLFrame.cpp @@ -30,7 +30,7 @@ #include "nsICSSStyleSheet.h" #include "nsIDOMCSSStyleSheet.h" #include "nsICSSRule.h" -#include "nsIDOMCSSStyleRule.h" +#include "nsICSSStyleRule.h" #include "nsStyleChangeList.h" #include "nsIFrameManager.h" #include "nsNetUtil.h" @@ -670,7 +670,7 @@ nsMathMLFrame::MapAttributesIntoCSS(nsIPresContext* aPresContext, nsAutoString tmpSelector; nsCOMPtr tmpRule; cssSheet->GetStyleRuleAt(k, *getter_AddRefs(tmpRule)); - nsCOMPtr tmpStyleRule(do_QueryInterface(tmpRule)); + nsCOMPtr tmpStyleRule = do_QueryInterface(tmpRule); tmpStyleRule->GetSelectorText(tmpSelector); if (tmpSelector.Equals(selector)) { k = -1; diff --git a/mozilla/layout/style/nsCSSRules.cpp b/mozilla/layout/style/nsCSSRules.cpp index a70066583fe..b666afe719f 100644 --- a/mozilla/layout/style/nsCSSRules.cpp +++ b/mozilla/layout/style/nsCSSRules.cpp @@ -70,17 +70,20 @@ NS_IMETHOD GetStyleSheet(nsIStyleSheet*& aSheet) const; \ NS_IMETHOD SetStyleSheet(nsICSSStyleSheet* aSheet); \ NS_IMETHOD SetParentRule(nsICSSGroupRule* aRule); \ +NS_IMETHOD GetDOMRule(nsIDOMCSSRule** aDOMRule); \ NS_IMETHOD MapRuleInfoInto(nsRuleData* aRuleData); #define IMPL_STYLE_RULE_INHERIT(_class, super) \ NS_IMETHODIMP _class::GetStyleSheet(nsIStyleSheet*& aSheet) const { return super::GetStyleSheet(aSheet); } \ NS_IMETHODIMP _class::SetStyleSheet(nsICSSStyleSheet* aSheet) { return super::SetStyleSheet(aSheet); } \ NS_IMETHODIMP _class::SetParentRule(nsICSSGroupRule* aRule) { return super::SetParentRule(aRule); } \ +NS_IMETHODIMP _class::GetDOMRule(nsIDOMCSSRule** aDOMRule) { return CallQueryInterface(this, aDOMRule); } \ NS_IMETHODIMP _class::MapRuleInfoInto(nsRuleData* aRuleData) { return NS_OK; } #define IMPL_STYLE_RULE_INHERIT2(_class, super) \ NS_IMETHODIMP _class::GetStyleSheet(nsIStyleSheet*& aSheet) const { return super::GetStyleSheet(aSheet); } \ NS_IMETHODIMP _class::SetParentRule(nsICSSGroupRule* aRule) { return super::SetParentRule(aRule); } \ +NS_IMETHODIMP _class::GetDOMRule(nsIDOMCSSRule** aDOMRule) { return CallQueryInterface(this, aDOMRule); } \ NS_IMETHODIMP _class::MapRuleInfoInto(nsRuleData* aRuleData) { return NS_OK; } // ------------------------------- @@ -151,7 +154,7 @@ CSSGroupRuleRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn) result = mGroupRule->GetStyleRuleAt(aIndex, *getter_AddRefs(rule)); if (rule) { - result = CallQueryInterface(rule, aReturn); + result = rule->GetDOMRule(aReturn); } else if (result == NS_ERROR_ILLEGAL_VALUE) { result = NS_OK; // per spec: "Return Value ... null if ... not a valid index." } @@ -329,7 +332,7 @@ NS_IMETHODIMP CSSCharsetRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) { if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); + return mParentRule->GetDOMRule(aParentRule); } *aParentRule = nsnull; return NS_OK; @@ -589,7 +592,7 @@ NS_IMETHODIMP CSSImportRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) { if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); + return mParentRule->GetDOMRule(aParentRule); } *aParentRule = nsnull; return NS_OK; @@ -1019,14 +1022,16 @@ CSSMediaRuleImpl::GetCssText(nsAString& aCssText) if (mRules) { mRules->Count(&count); for (index = 0; index < count; index++) { - nsCOMPtr rule; - mRules->QueryElementAt(index, NS_GET_IID(nsIDOMCSSRule), getter_AddRefs(rule)); - if (rule) { - nsAutoString tempString; - rule->GetCssText(tempString); - aCssText.Append(NS_LITERAL_STRING(" ")); - aCssText.Append(tempString); - aCssText.Append(NS_LITERAL_STRING("\n")); + nsCOMPtr rule; + mRules->GetElementAt(index, getter_AddRefs(rule)); + nsCOMPtr domRule; + rule->GetDOMRule(getter_AddRefs(domRule)); + if (domRule) { + nsAutoString cssText; + domRule->GetCssText(cssText); + aCssText.Append(NS_LITERAL_STRING(" ") + + cssText + + NS_LITERAL_STRING("\n")); } } } @@ -1056,7 +1061,7 @@ NS_IMETHODIMP CSSMediaRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) { if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); + return mParentRule->GetDOMRule(aParentRule); } *aParentRule = nsnull; return NS_OK; @@ -1333,7 +1338,7 @@ NS_IMETHODIMP CSSNameSpaceRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) { if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); + return mParentRule->GetDOMRule(aParentRule); } *aParentRule = nsnull; return NS_OK; diff --git a/mozilla/layout/style/nsCSSStyleRule.cpp b/mozilla/layout/style/nsCSSStyleRule.cpp index 88c3e99cca0..99d4dd01160 100644 --- a/mozilla/layout/style/nsCSSStyleRule.cpp +++ b/mozilla/layout/style/nsCSSStyleRule.cpp @@ -58,8 +58,7 @@ #include "nsUnitConversion.h" #include "nsIFontMetrics.h" #include "nsIDOMCSSStyleSheet.h" -#include "nsIDOMCSSRule.h" -#include "nsIDOMCSSStyleRule.h" +#include "nsICSSStyleRuleDOMWrapper.h" #include "nsIDOMCSSStyleDeclaration.h" #include "nsDOMCSSDeclaration.h" #include "nsINameSpaceManager.h" @@ -853,44 +852,97 @@ CSSImportantRule::List(FILE* out, PRInt32 aIndent) const } #endif -// -- DOMCSSDeclarationImpl ------------------------------- +// -------------------------------------------------------- + +class DOMCSSStyleRuleImpl; class DOMCSSDeclarationImpl : public nsDOMCSSDeclaration { public: DOMCSSDeclarationImpl(nsICSSStyleRule *aRule); - ~DOMCSSDeclarationImpl(void); + virtual ~DOMCSSDeclarationImpl(void); + virtual nsresult GetParentRule(nsIDOMCSSRule **aParent); virtual void DropReference(void); virtual nsresult GetCSSDeclaration(nsCSSDeclaration **aDecl, PRBool aAllocate); virtual nsresult GetCSSParsingEnvironment(nsIURI** aURI, nsICSSLoader** aCSSLoader, nsICSSParser** aCSSParser); - virtual nsresult GetParent(nsISupports **aParent); virtual nsresult DeclarationChanged(); + // Override |AddRef| and |Release| for being a member of + // |DOMCSSStyleRuleImpl|. + NS_IMETHOD_(nsrefcnt) AddRef(void); + NS_IMETHOD_(nsrefcnt) Release(void); + + friend class DOMCSSStyleRuleImpl; + protected: + // This reference is not reference-counted. The rule object tells us + // when it's about to go away. nsICSSStyleRule *mRule; + + inline DOMCSSStyleRuleImpl* DomRule(); + +private: + // NOT TO BE IMPLEMENTED + // This object cannot be allocated on its own. It must be a member of + // DOMCSSStyleRuleImpl. + void* operator new(size_t size) CPP_THROW_NEW; +}; + +class DOMCSSStyleRuleImpl : public nsICSSStyleRuleDOMWrapper +{ +public: + DOMCSSStyleRuleImpl(nsICSSStyleRule *aRule); + virtual ~DOMCSSStyleRuleImpl(); + + NS_DECL_ISUPPORTS + NS_DECL_NSIDOMCSSRULE + NS_DECL_NSIDOMCSSSTYLERULE + + // nsICSSStyleRuleDOMWrapper + NS_IMETHOD GetCSSStyleRule(nsICSSStyleRule **aResult); + + DOMCSSDeclarationImpl* DOMDeclaration() { return &mDOMDeclaration; } + + friend class DOMCSSDeclarationImpl; + +protected: + DOMCSSDeclarationImpl mDOMDeclaration; + + nsICSSStyleRule* Rule() { + return mDOMDeclaration.mRule; + } }; MOZ_DECL_CTOR_COUNTER(DOMCSSDeclarationImpl) DOMCSSDeclarationImpl::DOMCSSDeclarationImpl(nsICSSStyleRule *aRule) + : mRule(aRule) { MOZ_COUNT_CTOR(DOMCSSDeclarationImpl); - - // This reference is not reference-counted. The rule - // object tells us when its about to go away. - mRule = aRule; } DOMCSSDeclarationImpl::~DOMCSSDeclarationImpl(void) { + NS_ASSERTION(!mRule, "DropReference not called."); + MOZ_COUNT_DTOR(DOMCSSDeclarationImpl); } -void +inline DOMCSSStyleRuleImpl* DOMCSSDeclarationImpl::DomRule() +{ + return NS_REINTERPRET_CAST(DOMCSSStyleRuleImpl*, + NS_REINTERPRET_CAST(char*, this) - + offsetof(DOMCSSStyleRuleImpl, mDOMDeclaration)); +} + +NS_IMPL_ADDREF_USING_AGGREGATOR(DOMCSSDeclarationImpl, DomRule()) +NS_IMPL_RELEASE_USING_AGGREGATOR(DOMCSSDeclarationImpl, DomRule()) + +void DOMCSSDeclarationImpl::DropReference(void) { mRule = nsnull; @@ -940,6 +992,7 @@ DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aURI, } } } + // XXXldb Why bother if |mRule| is null? if (*aCSSLoader) { result = (*aCSSLoader)->GetParserFor(nsnull, aCSSParser); } else { @@ -950,17 +1003,16 @@ DOMCSSDeclarationImpl::GetCSSParsingEnvironment(nsIURI** aURI, } nsresult -DOMCSSDeclarationImpl::GetParent(nsISupports **aParent) +DOMCSSDeclarationImpl::GetParentRule(nsIDOMCSSRule **aParent) { NS_ENSURE_ARG_POINTER(aParent); - if (mRule) { - return CallQueryInterface(mRule, aParent); + if (!mRule) { + *aParent = nsnull; + return NS_OK; } - *aParent = nsnull; - - return NS_OK; + return mRule->GetDOMRule(aParent); } nsresult @@ -987,7 +1039,11 @@ DOMCSSDeclarationImpl::DeclarationChanged() if (!mRule) return NS_ERROR_OUT_OF_MEMORY; nsrefcnt cnt = mRule->Release(); - NS_ASSERTION(cnt != 0, "container didn't take ownership"); + if (cnt == 0) { + NS_NOTREACHED("container didn't take ownership"); + mRule = nsnull; + return NS_ERROR_UNEXPECTED; + } if (owningDoc) { owningDoc->StyleRuleChanged(sheet, oldRule, mRule); @@ -996,11 +1052,124 @@ DOMCSSDeclarationImpl::DeclarationChanged() return NS_OK; } +DOMCSSStyleRuleImpl::DOMCSSStyleRuleImpl(nsICSSStyleRule* aRule) + : mDOMDeclaration(aRule) +{ +} + +DOMCSSStyleRuleImpl::~DOMCSSStyleRuleImpl() +{ +} + +NS_INTERFACE_MAP_BEGIN(DOMCSSStyleRuleImpl) + NS_INTERFACE_MAP_ENTRY(nsICSSStyleRuleDOMWrapper) + NS_INTERFACE_MAP_ENTRY(nsIDOMCSSStyleRule) + NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule) + NS_INTERFACE_MAP_ENTRY(nsISupports) + NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSStyleRule) +NS_INTERFACE_MAP_END + +NS_IMPL_ADDREF(DOMCSSStyleRuleImpl) +NS_IMPL_RELEASE(DOMCSSStyleRuleImpl) + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetType(PRUint16* aType) +{ + *aType = nsIDOMCSSRule::STYLE_RULE; + + return NS_OK; +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetCssText(nsAString& aCssText) +{ + if (!Rule()) { + aCssText.Truncate(); + return NS_OK; + } + return Rule()->GetCssText(aCssText); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::SetCssText(const nsAString& aCssText) +{ + if (!Rule()) { + return NS_OK; + } + return Rule()->SetCssText(aCssText); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetParentStyleSheet(nsIDOMCSSStyleSheet** aSheet) +{ + if (!Rule()) { + *aSheet = nsnull; + return NS_OK; + } + nsCOMPtr sheet; + Rule()->GetParentStyleSheet(getter_AddRefs(sheet)); + if (!sheet) { + *aSheet = nsnull; + return NS_OK; + } + return CallQueryInterface(sheet, aSheet); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) +{ + if (!Rule()) { + *aParentRule = nsnull; + return NS_OK; + } + nsCOMPtr rule; + Rule()->GetParentRule(getter_AddRefs(rule)); + if (!rule) { + *aParentRule = nsnull; + return NS_OK; + } + return rule->GetDOMRule(aParentRule); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetSelectorText(nsAString& aSelectorText) +{ + if (!Rule()) { + aSelectorText.Truncate(); + return NS_OK; + } + return Rule()->GetSelectorText(aSelectorText); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::SetSelectorText(const nsAString& aSelectorText) +{ + if (!Rule()) { + return NS_OK; + } + return Rule()->SetSelectorText(aSelectorText); +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetStyle(nsIDOMCSSStyleDeclaration** aStyle) +{ + *aStyle = &mDOMDeclaration; + NS_ADDREF(*aStyle); + return NS_OK; +} + +NS_IMETHODIMP +DOMCSSStyleRuleImpl::GetCSSStyleRule(nsICSSStyleRule **aResult) +{ + *aResult = Rule(); + NS_IF_ADDREF(*aResult); + return NS_OK; +} + // -- nsCSSStyleRule ------------------------------- class CSSStyleRuleImpl : public nsCSSRule, - public nsICSSStyleRule, - public nsIDOMCSSStyleRule + public nsICSSStyleRule { public: CSSStyleRuleImpl(nsCSSSelectorList* aSelector, @@ -1032,9 +1201,18 @@ public: NS_IMETHOD SetParentRule(nsICSSGroupRule* aRule); + virtual nsresult GetCssText(nsAString& aCssText); + virtual nsresult SetCssText(const nsAString& aCssText); + virtual nsresult GetParentStyleSheet(nsICSSStyleSheet** aSheet); + virtual nsresult GetParentRule(nsICSSGroupRule** aParentRule); + virtual nsresult GetSelectorText(nsAString& aSelectorText); + virtual nsresult SetSelectorText(const nsAString& aSelectorText); + NS_IMETHOD GetType(PRInt32& aType) const; NS_IMETHOD Clone(nsICSSRule*& aClone) const; + NS_IMETHOD GetDOMRule(nsIDOMCSSRule** aDOMRule); + virtual already_AddRefed DeclarationChanged(PRBool aHandleContainer); @@ -1045,12 +1223,6 @@ public: NS_IMETHOD List(FILE* out = stdout, PRInt32 aIndent = 0) const; #endif - // nsIDOMCSSRule interface - NS_DECL_NSIDOMCSSRULE - - // nsIDOMCSSStyleRule interface - NS_DECL_NSIDOMCSSSTYLERULE - private: // These are not supported and are not implemented! CSSStyleRuleImpl& operator=(const CSSStyleRuleImpl& aCopy); @@ -1062,7 +1234,7 @@ protected: nsCSSSelectorList* mSelector; // null for style attribute nsCSSDeclaration* mDeclaration; CSSImportantRule* mImportantRule; - DOMCSSDeclarationImpl* mDOMDeclaration; + DOMCSSStyleRuleImpl* mDOMRule; PRUint32 mLineNumber; }; @@ -1072,7 +1244,7 @@ CSSStyleRuleImpl::CSSStyleRuleImpl(nsCSSSelectorList* aSelector, mSelector(aSelector), mDeclaration(aDeclaration), mImportantRule(nsnull), - mDOMDeclaration(nsnull) + mDOMRule(nsnull) { if (mDeclaration) mDeclaration->AddRef(); @@ -1084,7 +1256,7 @@ CSSStyleRuleImpl::CSSStyleRuleImpl(const CSSStyleRuleImpl& aCopy) mSelector(aCopy.mSelector ? aCopy.mSelector->Clone() : nsnull), mDeclaration(aCopy.mDeclaration ? aCopy.mDeclaration->Clone() : nsnull), mImportantRule(nsnull), - mDOMDeclaration(nsnull) + mDOMRule(nsnull) { if (mDeclaration) mDeclaration->AddRef(); @@ -1098,11 +1270,11 @@ CSSStyleRuleImpl::CSSStyleRuleImpl(CSSStyleRuleImpl& aCopy, mSelector(aCopy.mSelector), mDeclaration(aDeclaration), mImportantRule(nsnull), - mDOMDeclaration(aCopy.mDOMDeclaration) + mDOMRule(aCopy.mDOMRule) { - // The DOM declaration is replacing |aCopy| with |this|, so transfer - // the reverse pointer as well. - aCopy.mDOMDeclaration = nsnull; + // The DOM rule is replacing |aCopy| with |this|, so transfer + // the reverse pointer as well (and transfer ownership). + aCopy.mDOMRule = nsnull; // Transfer ownership of selector and declaration: NS_ASSERTION(aDeclaration == aCopy.mDeclaration, "declaration mismatch"); @@ -1126,8 +1298,9 @@ CSSStyleRuleImpl::~CSSStyleRuleImpl(void) NS_RELEASE(mImportantRule); mImportantRule = nsnull; } - if (nsnull != mDOMDeclaration) { - mDOMDeclaration->DropReference(); + if (mDOMRule) { + mDOMRule->DOMDeclaration()->DropReference(); + NS_RELEASE(mDOMRule); } } @@ -1136,16 +1309,11 @@ NS_INTERFACE_MAP_BEGIN(CSSStyleRuleImpl) NS_INTERFACE_MAP_ENTRY(nsICSSStyleRule) NS_INTERFACE_MAP_ENTRY(nsICSSRule) NS_INTERFACE_MAP_ENTRY(nsIStyleRule) - NS_INTERFACE_MAP_ENTRY(nsIDOMCSSRule) - NS_INTERFACE_MAP_ENTRY(nsIDOMCSSStyleRule) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsICSSStyleRule) - NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(CSSStyleRule) NS_INTERFACE_MAP_END - -NS_IMPL_ADDREF_INHERITED(CSSStyleRuleImpl, nsCSSRule); -NS_IMPL_RELEASE_INHERITED(CSSStyleRuleImpl, nsCSSRule); - +NS_IMPL_ADDREF_INHERITED(CSSStyleRuleImpl, nsCSSRule) +NS_IMPL_RELEASE_INHERITED(CSSStyleRuleImpl, nsCSSRule) nsCSSSelectorList* CSSStyleRuleImpl::Selector(void) { @@ -1225,6 +1393,22 @@ CSSStyleRuleImpl::Clone(nsICSSRule*& aClone) const return CallQueryInterface(clone, &aClone); } +NS_IMETHODIMP +CSSStyleRuleImpl::GetDOMRule(nsIDOMCSSRule** aDOMRule) +{ + if (!mDOMRule) { + mDOMRule = new DOMCSSStyleRuleImpl(this); + if (!mDOMRule) { + *aDOMRule = nsnull; + return NS_ERROR_OUT_OF_MEMORY; + } + NS_ADDREF(mDOMRule); + } + *aDOMRule = mDOMRule; + NS_ADDREF(*aDOMRule); + return NS_OK; +} + /* virtual */ already_AddRefed CSSStyleRuleImpl::DeclarationChanged(PRBool aHandleContainer) { @@ -1235,7 +1419,7 @@ CSSStyleRuleImpl::DeclarationChanged(PRBool aHandleContainer) NS_ADDREF(clone); // for return - if (aHandleContainer) { + if (aHandleContainer && mSheet) { if (mParentRule) { mSheet->ReplaceRuleInGroup(mParentRule, this, clone); } else { @@ -1277,15 +1461,7 @@ CSSStyleRuleImpl::List(FILE* out, PRInt32 aIndent) const } #endif -NS_IMETHODIMP -CSSStyleRuleImpl::GetType(PRUint16* aType) -{ - *aType = nsIDOMCSSRule::STYLE_RULE; - - return NS_OK; -} - -NS_IMETHODIMP +/* virtual */ nsresult CSSStyleRuleImpl::GetCssText(nsAString& aCssText) { if (mSelector) { @@ -1305,34 +1481,30 @@ CSSStyleRuleImpl::GetCssText(nsAString& aCssText) return NS_OK; } -NS_IMETHODIMP +/* virtual */ nsresult CSSStyleRuleImpl::SetCssText(const nsAString& aCssText) { // XXX TBI - need to re-parse rule & declaration return NS_OK; } -NS_IMETHODIMP -CSSStyleRuleImpl::GetParentStyleSheet(nsIDOMCSSStyleSheet** aSheet) +/* virtual */ nsresult +CSSStyleRuleImpl::GetParentStyleSheet(nsICSSStyleSheet** aSheet) { - if (mSheet) { - return CallQueryInterface(mSheet, aSheet); - } - *aSheet = nsnull; + *aSheet = mSheet; + NS_IF_ADDREF(*aSheet); return NS_OK; } -NS_IMETHODIMP -CSSStyleRuleImpl::GetParentRule(nsIDOMCSSRule** aParentRule) +/* virtual */ nsresult +CSSStyleRuleImpl::GetParentRule(nsICSSGroupRule** aParentRule) { - if (mParentRule) { - return CallQueryInterface(mParentRule, aParentRule); - } - *aParentRule = nsnull; + *aParentRule = mParentRule; + NS_IF_ADDREF(*aParentRule); return NS_OK; } -NS_IMETHODIMP +/* virtual */ nsresult CSSStyleRuleImpl::GetSelectorText(nsAString& aSelectorText) { if (mSelector) @@ -1342,7 +1514,7 @@ CSSStyleRuleImpl::GetSelectorText(nsAString& aSelectorText) return NS_OK; } -NS_IMETHODIMP +/* virtual */ nsresult CSSStyleRuleImpl::SetSelectorText(const nsAString& aSelectorText) { // XXX TBI - get a parser and re-parse the selectors, @@ -1351,23 +1523,6 @@ CSSStyleRuleImpl::SetSelectorText(const nsAString& aSelectorText) return NS_OK; } -NS_IMETHODIMP -CSSStyleRuleImpl::GetStyle(nsIDOMCSSStyleDeclaration** aStyle) -{ - if (nsnull == mDOMDeclaration) { - mDOMDeclaration = new DOMCSSDeclarationImpl(this); - if (nsnull == mDOMDeclaration) { - return NS_ERROR_OUT_OF_MEMORY; - } - NS_ADDREF(mDOMDeclaration); - } - - *aStyle = mDOMDeclaration; - NS_ADDREF(mDOMDeclaration); - - return NS_OK; -} - nsresult NS_NewCSSStyleRule(nsICSSStyleRule** aInstancePtrResult, nsCSSSelectorList* aSelector, diff --git a/mozilla/layout/style/nsCSSStyleSheet.cpp b/mozilla/layout/style/nsCSSStyleSheet.cpp index 5ed752ba5f4..88e5865ca53 100644 --- a/mozilla/layout/style/nsCSSStyleSheet.cpp +++ b/mozilla/layout/style/nsCSSStyleSheet.cpp @@ -79,7 +79,7 @@ #include "nsIDOMHTMLOptionElement.h" #include "nsIDOMStyleSheetList.h" #include "nsIDOMCSSStyleSheet.h" -#include "nsIDOMCSSStyleRule.h" +#include "nsIDOMCSSRule.h" #include "nsIDOMCSSImportRule.h" #include "nsIDOMCSSRuleList.h" #include "nsIDOMMediaList.h" @@ -833,6 +833,7 @@ public: NS_IMETHOD SetOwningDocument(nsIDocument* aDocument); NS_IMETHOD SetOwningNode(nsIDOMNode* aOwningNode); NS_IMETHOD SetOwnerRule(nsICSSImportRule* aOwnerRule); + NS_IMETHOD GetOwnerRule(nsICSSImportRule** aOwnerRule); NS_IMETHOD GetStyleRuleProcessor(nsIStyleRuleProcessor*& aProcessor, nsIStyleRuleProcessor* aPrevProcessor); @@ -1000,7 +1001,7 @@ CSSRuleListImpl::Item(PRUint32 aIndex, nsIDOMCSSRule** aReturn) result = mStyleSheet->GetStyleRuleAt(aIndex, *getter_AddRefs(rule)); if (rule) { - result = CallQueryInterface(rule, aReturn); + result = rule->GetDOMRule(aReturn); mRulesAccessed = PR_TRUE; // signal to never share rules again } else if (result == NS_ERROR_ILLEGAL_VALUE) { result = NS_OK; // per spec: "Return Value ... null if ... not a valid index." @@ -1998,6 +1999,14 @@ CSSStyleSheetImpl::SetOwnerRule(nsICSSImportRule* aOwnerRule) return NS_OK; } +NS_IMETHODIMP +CSSStyleSheetImpl::GetOwnerRule(nsICSSImportRule** aOwnerRule) +{ + *aOwnerRule = mOwnerRule; + NS_IF_ADDREF(*aOwnerRule); + return NS_OK; +} + NS_IMETHODIMP CSSStyleSheetImpl::ContainsStyleSheet(nsIURI* aURL, PRBool& aContains, nsIStyleSheet** aTheChild /*=nsnull*/) { @@ -2571,7 +2580,7 @@ NS_IMETHODIMP CSSStyleSheetImpl::GetOwnerRule(nsIDOMCSSRule** aOwnerRule) { if (mOwnerRule) { - return CallQueryInterface(mOwnerRule, aOwnerRule); + return mOwnerRule->GetDOMRule(aOwnerRule); } *aOwnerRule = nsnull; @@ -2877,14 +2886,9 @@ CSSStyleSheetImpl::DeleteRuleFromGroup(nsICSSGroupRule* aGroup, PRUint32 aIndex) NS_ENSURE_SUCCESS(result, result); // check that the rule actually belongs to this sheet! - nsCOMPtr domRule(do_QueryInterface(rule)); - nsCOMPtr ruleSheet; - result = domRule->GetParentStyleSheet(getter_AddRefs(ruleSheet)); - NS_ENSURE_SUCCESS(result, result); - nsCOMPtr thisSheet; - this->QueryInterface(NS_GET_IID(nsIDOMCSSStyleSheet), getter_AddRefs(thisSheet)); - - if (thisSheet != ruleSheet) { + nsCOMPtr ruleSheet; + rule->GetStyleSheet(*getter_AddRefs(ruleSheet)); + if (this != ruleSheet) { return NS_ERROR_INVALID_ARG; } @@ -2921,14 +2925,9 @@ CSSStyleSheetImpl::InsertRuleIntoGroup(const nsAString & aRule, nsICSSGroupRule* NS_ASSERTION(mInner && mInner->mComplete, "No inserting into an incomplete sheet!"); // check that the group actually belongs to this sheet! - nsCOMPtr domGroup(do_QueryInterface(aGroup)); - nsCOMPtr groupSheet; - result = domGroup->GetParentStyleSheet(getter_AddRefs(groupSheet)); - NS_ENSURE_SUCCESS(result, result); - nsCOMPtr thisSheet; - this->QueryInterface(NS_GET_IID(nsIDOMCSSStyleSheet), getter_AddRefs(thisSheet)); - - if (thisSheet != groupSheet) { + nsCOMPtr groupSheet; + aGroup->GetStyleSheet(*getter_AddRefs(groupSheet)); + if (this != groupSheet) { return NS_ERROR_INVALID_ARG; } @@ -3017,9 +3016,8 @@ CSSStyleSheetImpl::ReplaceRuleInGroup(nsICSSGroupRule* aGroup, "No replacing in an incomplete sheet!"); #ifdef DEBUG { - nsCOMPtr domGroup(do_QueryInterface(aGroup)); - nsCOMPtr groupSheet; - domGroup->GetParentStyleSheet(getter_AddRefs(groupSheet)); + nsCOMPtr groupSheet; + aGroup->GetStyleSheet(*getter_AddRefs(groupSheet)); NS_ASSERTION(this == groupSheet, "group doesn't belong to this sheet"); } #endif @@ -3046,16 +3044,14 @@ CSSStyleSheetImpl::StyleSheetLoaded(nsICSSStyleSheet*aSheet, PRBool aNotify) #endif if (mDocument && aNotify) { - nsCOMPtr domSheet(do_QueryInterface(aSheet)); - NS_ENSURE_TRUE(domSheet, NS_ERROR_UNEXPECTED); - - nsCOMPtr ownerRule; - domSheet->GetOwnerRule(getter_AddRefs(ownerRule)); - NS_ENSURE_TRUE(ownerRule, NS_ERROR_UNEXPECTED); + nsCOMPtr ownerRule; + aSheet->GetOwnerRule(getter_AddRefs(ownerRule)); nsresult rv = mDocument->BeginUpdate(); NS_ENSURE_SUCCESS(rv, rv); + // XXXldb @import rules shouldn't even implement nsIStyleRule (but + // they do)! nsCOMPtr styleRule(do_QueryInterface(ownerRule)); rv = mDocument->StyleRuleAdded(this, styleRule); diff --git a/mozilla/layout/style/nsDOMCSSAttrDeclaration.cpp b/mozilla/layout/style/nsDOMCSSAttrDeclaration.cpp index e8790a53644..0cc92946a50 100644 --- a/mozilla/layout/style/nsDOMCSSAttrDeclaration.cpp +++ b/mozilla/layout/style/nsDOMCSSAttrDeclaration.cpp @@ -196,13 +196,11 @@ nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(nsIURI** aBaseURI, } nsresult -nsDOMCSSAttributeDeclaration::GetParent(nsISupports **aParent) +nsDOMCSSAttributeDeclaration::GetParentRule(nsIDOMCSSRule **aParent) { NS_ENSURE_ARG_POINTER(aParent); - *aParent = mContent; - NS_IF_ADDREF(*aParent); - + *aParent = nsnull; return NS_OK; } diff --git a/mozilla/layout/style/nsDOMCSSAttrDeclaration.h b/mozilla/layout/style/nsDOMCSSAttrDeclaration.h index 97575e4e098..43ec25aaa27 100644 --- a/mozilla/layout/style/nsDOMCSSAttrDeclaration.h +++ b/mozilla/layout/style/nsDOMCSSAttrDeclaration.h @@ -63,7 +63,7 @@ public: virtual nsresult GetCSSParsingEnvironment(nsIURI** aBaseURI, nsICSSLoader** aCSSLoader, nsICSSParser** aCSSParser); - virtual nsresult GetParent(nsISupports **aParent); + virtual nsresult GetParentRule(nsIDOMCSSRule **aParent); protected: virtual nsresult DeclarationChanged(); diff --git a/mozilla/layout/style/nsDOMCSSDeclaration.cpp b/mozilla/layout/style/nsDOMCSSDeclaration.cpp index 4ccba2920e5..36bebf84ccf 100644 --- a/mozilla/layout/style/nsDOMCSSDeclaration.cpp +++ b/mozilla/layout/style/nsDOMCSSDeclaration.cpp @@ -148,23 +148,6 @@ nsDOMCSSDeclaration::GetLength(PRUint32* aLength) return result; } -NS_IMETHODIMP -nsDOMCSSDeclaration::GetParentRule(nsIDOMCSSRule** aParentRule) -{ - NS_ENSURE_ARG_POINTER(aParentRule); - *aParentRule = nsnull; - - nsCOMPtr parent; - - GetParent(getter_AddRefs(parent)); - - if (parent) { - CallQueryInterface(parent, aParentRule); - } - - return NS_OK; -} - NS_IMETHODIMP nsDOMCSSDeclaration::GetPropertyCSSValue(const nsAString& aPropertyName, nsIDOMCSSValue** aReturn) diff --git a/mozilla/layout/style/nsDOMCSSDeclaration.h b/mozilla/layout/style/nsDOMCSSDeclaration.h index 9421f67683e..b24fbdcebff 100644 --- a/mozilla/layout/style/nsDOMCSSDeclaration.h +++ b/mozilla/layout/style/nsDOMCSSDeclaration.h @@ -57,7 +57,23 @@ public: NS_DECL_ISUPPORTS - NS_DECL_NSIDOMCSSSTYLEDECLARATION + // Require subclasses to implement |GetParentRule|. + //NS_DECL_NSIDOMCSSSTYLEDECLARATION + NS_IMETHOD GetCssText(nsAString & aCssText); + NS_IMETHOD SetCssText(const nsAString & aCssText); + NS_IMETHOD GetPropertyValue(const nsAString & propertyName, + nsAString & _retval); + NS_IMETHOD GetPropertyCSSValue(const nsAString & propertyName, + nsIDOMCSSValue **_retval); + NS_IMETHOD RemoveProperty(const nsAString & propertyName, + nsAString & _retval); + NS_IMETHOD GetPropertyPriority(const nsAString & propertyName, + nsAString & _retval); + NS_IMETHOD SetProperty(const nsAString & propertyName, + const nsAString & value, const nsAString & priority); + NS_IMETHOD GetLength(PRUint32 *aLength); + NS_IMETHOD Item(PRUint32 index, nsAString & _retval); + NS_IMETHOD GetParentRule(nsIDOMCSSRule * *aParentRule) = 0; virtual void DropReference() = 0; protected: @@ -66,7 +82,6 @@ protected: // propagate. virtual nsresult GetCSSDeclaration(nsCSSDeclaration **aDecl, PRBool aAllocate) = 0; - virtual nsresult GetParent(nsISupports **aParent) = 0; virtual nsresult DeclarationChanged() = 0; // This will only fail if it can't get a parser. This means it can diff --git a/mozilla/layout/style/nsICSSRule.h b/mozilla/layout/style/nsICSSRule.h index bd8556efe91..037d0fef34b 100644 --- a/mozilla/layout/style/nsICSSRule.h +++ b/mozilla/layout/style/nsICSSRule.h @@ -42,6 +42,7 @@ class nsICSSStyleSheet; class nsICSSGroupRule; +class nsIDOMCSSRule; class nsAString; // IID for the nsICSSRule interface {b9791e20-1a04-11d3-805a-006008159b5a} @@ -69,6 +70,8 @@ public: NS_IMETHOD SetParentRule(nsICSSGroupRule* aRule) = 0; NS_IMETHOD Clone(nsICSSRule*& aClone) const = 0; + + NS_IMETHOD GetDOMRule(nsIDOMCSSRule** aDOMRule) = 0; }; /* Define global NS_New* functions for rules that don't need their own diff --git a/mozilla/layout/style/nsICSSStyleRule.h b/mozilla/layout/style/nsICSSStyleRule.h index 943a60fe860..076c7c30be3 100644 --- a/mozilla/layout/style/nsICSSStyleRule.h +++ b/mozilla/layout/style/nsICSSStyleRule.h @@ -217,6 +217,14 @@ public: // Hook for inspector. virtual nsresult GetValue(nsCSSProperty aProperty, nsCSSValue& aValue) = 0; + + // hooks for DOM rule + virtual nsresult GetCssText(nsAString& aCssText) = 0; + virtual nsresult SetCssText(const nsAString& aCssText) = 0; + virtual nsresult GetParentStyleSheet(nsICSSStyleSheet** aSheet) = 0; + virtual nsresult GetParentRule(nsICSSGroupRule** aParentRule) = 0; + virtual nsresult GetSelectorText(nsAString& aSelectorText) = 0; + virtual nsresult SetSelectorText(const nsAString& aSelectorText) = 0; }; nsresult diff --git a/mozilla/layout/style/nsICSSStyleRuleDOMWrapper.h b/mozilla/layout/style/nsICSSStyleRuleDOMWrapper.h new file mode 100644 index 00000000000..a6edcb862ca --- /dev/null +++ b/mozilla/layout/style/nsICSSStyleRuleDOMWrapper.h @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is nsICSSStyleRuleDOMWrapper.h. + * + * The Initial Developer of the Original Code is L. David Baron. + * Portions created by the Initial Developer are Copyright (C) 2003 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * L. David Baron (original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#ifndef nsICSSStyleRuleDOMWrapper_h_ +#define nsICSSStyleRuleDOMWrapper_h_ + +#include "nsIDOMCSSStyleRule.h" + +// IID for the nsICSSStyleRuleDOMWrapper interface +// {476a4290-1194-4099-8f2d-a1ccc9bdd676} +#define NS_ICSS_STYLE_RULE_DOM_WRAPPER_IID \ +{0x476a4290, 0x1194, 0x4099, {0x8f, 0x2d, 0xa1, 0xcc, 0xc9, 0xbd, 0xd6, 0x76}} + +class nsICSSStyleRuleDOMWrapper : public nsIDOMCSSStyleRule { +public: + NS_DEFINE_STATIC_IID_ACCESSOR(NS_ICSS_STYLE_RULE_DOM_WRAPPER_IID) + + NS_IMETHOD GetCSSStyleRule(nsICSSStyleRule** aResult) = 0; +}; + +#endif /* !defined(nsICSSStyleRuleDOMWrapper_h_) */ diff --git a/mozilla/layout/style/nsICSSStyleSheet.h b/mozilla/layout/style/nsICSSStyleSheet.h index 7c863be0dba..86b8ed94989 100644 --- a/mozilla/layout/style/nsICSSStyleSheet.h +++ b/mozilla/layout/style/nsICSSStyleSheet.h @@ -83,6 +83,7 @@ public: NS_IMETHOD SetOwningNode(nsIDOMNode* aOwningNode) = 0; NS_IMETHOD SetOwnerRule(nsICSSImportRule* aOwnerRule) = 0; + NS_IMETHOD GetOwnerRule(nsICSSImportRule** aOwnerRule) = 0; // get head of namespace chain for sheet NS_IMETHOD GetNameSpace(nsINameSpace*& aNameSpace) const = 0;