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;