Issue #2490 - Part 1: Make all CSS rules cycle-collected.

This commit is contained in:
Moonchild 2024-03-29 18:18:36 +01:00 committed by roytam1
commit d6ec56a4c4
11 changed files with 237 additions and 85 deletions

View file

@ -1460,8 +1460,15 @@ StyleRule::StyleRule(const StyleRule& aCopy)
StyleRule::~StyleRule()
{
delete mSelector;
DropReferences();
}
void
StyleRule::DropReferences()
{
if (mDOMRule) {
mDOMRule->DOMDeclaration()->DropReference();
mDOMRule = nullptr;
}
if (mDeclaration) {
@ -1470,18 +1477,36 @@ StyleRule::~StyleRule()
}
// QueryInterface implementation for StyleRule
NS_INTERFACE_MAP_BEGIN(StyleRule)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(StyleRule)
if (aIID.Equals(NS_GET_IID(mozilla::css::StyleRule))) {
*aInstancePtr = this;
NS_ADDREF_THIS();
return NS_OK;
}
else
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, mozilla::css::Rule)
NS_INTERFACE_MAP_END
NS_INTERFACE_MAP_END_INHERITING(Rule)
NS_IMPL_ADDREF(StyleRule)
NS_IMPL_RELEASE(StyleRule)
NS_IMPL_ADDREF_INHERITED(StyleRule, Rule)
NS_IMPL_RELEASE_INHERITED(StyleRule, Rule)
NS_IMPL_CYCLE_COLLECTION_CLASS(StyleRule)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(StyleRule, Rule)
tmp->DropReferences();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(StyleRule, Rule)
// Keep this in sync with IsCCLeaf.
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDOMRule)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
bool
StyleRule::IsCCLeaf() const
{
if (!Rule::IsCCLeaf()) {
return false;
}
return !mDOMRule || !mDOMRule->DOMDeclaration()->PreservingWrapper();
}
/* virtual */ int32_t
StyleRule::GetType() const