Issue #2490 - Part 13: Convert media, supports, and moz-document rules to WebIDL.

This also converts the internal ConditionRule and GroupingRule classes.
This commit is contained in:
Moonchild 2024-04-03 15:52:14 +02:00 committed by roytam1
commit d1b6a584b8
14 changed files with 272 additions and 93 deletions

View file

@ -35,6 +35,9 @@
#include "mozilla/dom/CSSStyleDeclarationBinding.h"
#include "mozilla/dom/CSSNamespaceRuleBinding.h"
#include "mozilla/dom/CSSImportRuleBinding.h"
#include "mozilla/dom/CSSMediaRuleBinding.h"
#include "mozilla/dom/CSSSupportsRuleBinding.h"
#include "mozilla/dom/CSSMozDocumentRuleBinding.h"
#include "StyleRule.h"
#include "nsFont.h"
#include "nsIURI.h"
@ -602,43 +605,85 @@ GroupRule::AppendRulesToCssText(nsAString& aCssText) const
// nsIDOMCSSMediaRule or nsIDOMCSSMozDocumentRule methods
nsresult
GroupRule::GetCssRules(nsIDOMCSSRuleList* *aRuleList)
{
NS_ADDREF(*aRuleList = CssRules());
return NS_OK;
}
CSSRuleList*
GroupRule::CssRules()
{
if (!mRuleCollection) {
mRuleCollection = new css::GroupRuleRuleList(this);
}
NS_ADDREF(*aRuleList = mRuleCollection);
return NS_OK;
return mRuleCollection;
}
nsresult
GroupRule::InsertRule(const nsAString & aRule, uint32_t aIndex, uint32_t* _retval)
{
ErrorResult rv;
*_retval = InsertRule(aRule, aIndex, rv);
return rv.StealNSResult();
}
uint32_t
GroupRule::InsertRule(const nsAString& aRule, uint32_t aIndex, ErrorResult& aRv)
{
CSSStyleSheet* sheet = GetStyleSheet();
NS_ENSURE_TRUE(sheet, NS_ERROR_FAILURE);
if (aIndex > uint32_t(mRules.Count()))
return NS_ERROR_DOM_INDEX_SIZE_ERR;
if (NS_WARN_IF(!sheet)) {
aRv.Throw(NS_ERROR_FAILURE);
return 0;
}
if (aIndex > uint32_t(mRules.Count())) {
aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
return 0;
}
NS_ASSERTION(uint32_t(mRules.Count()) <= INT32_MAX,
"Too many style rules!");
return sheet->InsertRuleIntoGroup(aRule, this, aIndex, _retval);
uint32_t retval;
nsresult rv =
sheet->InsertRuleIntoGroup(aRule, this, aIndex, &retval);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
return 0;
}
return retval;
}
nsresult
GroupRule::DeleteRule(uint32_t aIndex)
{
CSSStyleSheet* sheet = GetStyleSheet();
NS_ENSURE_TRUE(sheet, NS_ERROR_FAILURE);
ErrorResult rv;
DeleteRule(aIndex, rv);
return rv.StealNSResult();
}
if (aIndex >= uint32_t(mRules.Count()))
return NS_ERROR_DOM_INDEX_SIZE_ERR;
void
GroupRule::DeleteRule(uint32_t aIndex, ErrorResult& aRv)
{
CSSStyleSheet* sheet = GetStyleSheet();
if (NS_WARN_IF(!sheet)) {
aRv.Throw(NS_ERROR_FAILURE);
return;
}
if (aIndex >= uint32_t(mRules.Count())) {
aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR);
return;
}
NS_ASSERTION(uint32_t(mRules.Count()) <= INT32_MAX,
"Too many style rules!");
return sheet->DeleteRuleFromGroup(this, aIndex);
nsresult rv = sheet->DeleteRuleFromGroup(this, aIndex);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
}
}
/* virtual */ size_t
@ -655,20 +700,31 @@ GroupRule::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
return n;
}
ConditionRule::ConditionRule(uint32_t aLineNumber, uint32_t aColumnNumber)
: GroupRule(aLineNumber, aColumnNumber)
{
}
ConditionRule::ConditionRule(const ConditionRule& aCopy)
: GroupRule(aCopy)
{
}
ConditionRule::~ConditionRule()
{
}
// -------------------------------------------
// nsICSSMediaRule
//
MediaRule::MediaRule(uint32_t aLineNumber, uint32_t aColumnNumber)
: GroupRule(aLineNumber, aColumnNumber)
: ConditionRule(aLineNumber, aColumnNumber)
{
SetIsNotDOMBinding();
}
MediaRule::MediaRule(const MediaRule& aCopy)
: GroupRule(aCopy)
: ConditionRule(aCopy)
{
SetIsNotDOMBinding();
if (aCopy.mMedia) {
mMedia = aCopy.mMedia->Clone();
// XXXldb This doesn't really make sense.
@ -683,18 +739,17 @@ MediaRule::~MediaRule()
}
}
NS_IMPL_ADDREF_INHERITED(MediaRule, GroupRule)
NS_IMPL_RELEASE_INHERITED(MediaRule, GroupRule)
NS_IMPL_ADDREF_INHERITED(MediaRule, ConditionRule)
NS_IMPL_RELEASE_INHERITED(MediaRule, ConditionRule)
// QueryInterface implementation for MediaRule
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(MediaRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSGroupingRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSConditionRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSMediaRule)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(CSSMediaRule)
NS_INTERFACE_MAP_END_INHERITING(GroupRule)
NS_INTERFACE_MAP_END_INHERITING(ConditionRule)
NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaRule, GroupRule,
NS_IMPL_CYCLE_COLLECTION_INHERITED(MediaRule, ConditionRule,
mMedia)
/* virtual */ void
@ -764,6 +819,14 @@ MediaRule::Type() const
return nsIDOMCSSRule::MEDIA_RULE;
}
nsMediaList*
MediaRule::Media() const
{
// In practice, if we end up being parsed at all, we have non-null mMedia. So
// it's OK to claim we don't return null here.
return mMedia;
}
void
MediaRule::GetCssTextImpl(nsAString& aCssText) const
{
@ -802,6 +865,15 @@ MediaRule::GetConditionText(nsAString& aConditionText)
NS_IMETHODIMP
MediaRule::SetConditionText(const nsAString& aConditionText)
{
ErrorResult rv;
SetConditionText(aConditionText, rv);
return rv.StealNSResult();
}
void
MediaRule::SetConditionText(const nsAString& aConditionText,
ErrorResult& aRv)
{
if (!mMedia) {
RefPtr<nsMediaList> media = new nsMediaList();
@ -809,11 +881,16 @@ MediaRule::SetConditionText(const nsAString& aConditionText)
nsresult rv = media->SetMediaText(aConditionText);
if (NS_SUCCEEDED(rv)) {
mMedia = media;
} else {
aRv.Throw(rv);
}
return rv;
return;
}
return mMedia->SetMediaText(aConditionText);
nsresult rv = mMedia->SetMediaText(aConditionText);
if (NS_FAILED(rv)) {
aRv.Throw(rv);
}
}
// nsIDOMCSSMediaRule methods
@ -852,8 +929,7 @@ MediaRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
/* virtual */ JSObject*
MediaRule::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
return CSSMediaRuleBinding::Wrap(aCx, this, aGivenProto);
}
void
@ -867,32 +943,29 @@ MediaRule::AppendConditionText(nsAString& aOutput) const
}
DocumentRule::DocumentRule(uint32_t aLineNumber, uint32_t aColumnNumber)
: GroupRule(aLineNumber, aColumnNumber)
: ConditionRule(aLineNumber, aColumnNumber)
{
SetIsNotDOMBinding();
}
DocumentRule::DocumentRule(const DocumentRule& aCopy)
: GroupRule(aCopy)
: ConditionRule(aCopy)
, mURLs(new URL(*aCopy.mURLs))
{
SetIsNotDOMBinding();
}
DocumentRule::~DocumentRule()
{
}
NS_IMPL_ADDREF_INHERITED(DocumentRule, GroupRule)
NS_IMPL_RELEASE_INHERITED(DocumentRule, GroupRule)
NS_IMPL_ADDREF_INHERITED(DocumentRule, ConditionRule)
NS_IMPL_RELEASE_INHERITED(DocumentRule, ConditionRule)
// QueryInterface implementation for DocumentRule
NS_INTERFACE_MAP_BEGIN(DocumentRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSGroupingRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSConditionRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSMozDocumentRule)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(CSSMozDocumentRule)
NS_INTERFACE_MAP_END_INHERITING(GroupRule)
NS_INTERFACE_MAP_END_INHERITING(ConditionRule)
#ifdef DEBUG
/* virtual */ void
@ -996,6 +1069,13 @@ DocumentRule::SetConditionText(const nsAString& aConditionText)
return NS_ERROR_NOT_IMPLEMENTED;
}
void
DocumentRule::SetConditionText(const nsAString& aConditionText,
ErrorResult& aRv)
{
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
}
// GroupRule interface
/* virtual */ bool
DocumentRule::UseForPresentation(nsPresContext* aPresContext,
@ -1075,8 +1155,7 @@ DocumentRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
DocumentRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
return CSSMozDocumentRuleBinding::Wrap(aCx, this, aGivenProto);
}
void
@ -2659,11 +2738,10 @@ namespace mozilla {
CSSSupportsRule::CSSSupportsRule(bool aConditionMet,
const nsString& aCondition,
uint32_t aLineNumber, uint32_t aColumnNumber)
: css::GroupRule(aLineNumber, aColumnNumber)
: css::ConditionRule(aLineNumber, aColumnNumber)
, mUseGroup(aConditionMet)
, mCondition(aCondition)
{
SetIsNotDOMBinding();
}
CSSSupportsRule::~CSSSupportsRule()
@ -2671,11 +2749,10 @@ CSSSupportsRule::~CSSSupportsRule()
}
CSSSupportsRule::CSSSupportsRule(const CSSSupportsRule& aCopy)
: css::GroupRule(aCopy),
: css::ConditionRule(aCopy),
mUseGroup(aCopy.mUseGroup),
mCondition(aCopy.mCondition)
{
SetIsNotDOMBinding();
}
#ifdef DEBUG
@ -2716,16 +2793,15 @@ CSSSupportsRule::UseForPresentation(nsPresContext* aPresContext,
return mUseGroup;
}
NS_IMPL_ADDREF_INHERITED(CSSSupportsRule, css::GroupRule)
NS_IMPL_RELEASE_INHERITED(CSSSupportsRule, css::GroupRule)
NS_IMPL_ADDREF_INHERITED(CSSSupportsRule, css::ConditionRule)
NS_IMPL_RELEASE_INHERITED(CSSSupportsRule, css::ConditionRule)
// QueryInterface implementation for CSSSupportsRule
NS_INTERFACE_MAP_BEGIN(CSSSupportsRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSGroupingRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSConditionRule)
NS_INTERFACE_MAP_ENTRY(nsIDOMCSSSupportsRule)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(CSSSupportsRule)
NS_INTERFACE_MAP_END_INHERITING(GroupRule)
NS_INTERFACE_MAP_END_INHERITING(ConditionRule)
uint16_t
CSSSupportsRule::Type() const
@ -2774,6 +2850,13 @@ CSSSupportsRule::SetConditionText(const nsAString& aConditionText)
return NS_ERROR_NOT_IMPLEMENTED;
}
void
CSSSupportsRule::SetConditionText(const nsAString& aConditionText,
ErrorResult& aRv)
{
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
}
/* virtual */ size_t
CSSSupportsRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
@ -2787,8 +2870,7 @@ CSSSupportsRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
CSSSupportsRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
return CSSSupportsRuleBinding::Wrap(aCx, this, aGivenProto);
}
} // namespace mozilla