Bug 990160 - Cycle collect nsCSSRuleProcessor. r=bz

This commit is contained in:
Andrew McCreight 2014-06-19 14:36:53 -07:00
parent 303b54cc27
commit 368491119e
2 changed files with 30 additions and 4 deletions

View File

@ -1103,16 +1103,39 @@ nsCSSRuleProcessor::nsCSSRuleProcessor(const sheet_array_type& aSheets,
} }
nsCSSRuleProcessor::~nsCSSRuleProcessor() nsCSSRuleProcessor::~nsCSSRuleProcessor()
{
ClearSheets();
ClearRuleCascades();
}
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsCSSRuleProcessor)
NS_INTERFACE_MAP_ENTRY(nsIStyleRuleProcessor)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsCSSRuleProcessor)
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsCSSRuleProcessor)
NS_IMPL_CYCLE_COLLECTION_CLASS(nsCSSRuleProcessor)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsCSSRuleProcessor)
tmp->ClearSheets();
NS_IMPL_CYCLE_COLLECTION_UNLINK(mScopeElement)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsCSSRuleProcessor)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSheets)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mScopeElement)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
void
nsCSSRuleProcessor::ClearSheets()
{ {
for (sheet_array_type::size_type i = mSheets.Length(); i-- != 0; ) { for (sheet_array_type::size_type i = mSheets.Length(); i-- != 0; ) {
mSheets[i]->DropRuleProcessor(this); mSheets[i]->DropRuleProcessor(this);
} }
mSheets.Clear(); mSheets.Clear();
ClearRuleCascades();
} }
NS_IMPL_ISUPPORTS(nsCSSRuleProcessor, nsIStyleRuleProcessor)
/* static */ nsresult /* static */ nsresult
nsCSSRuleProcessor::Startup() nsCSSRuleProcessor::Startup()
{ {

View File

@ -53,7 +53,8 @@ public:
mozilla::dom::Element* aScopeElement); mozilla::dom::Element* aScopeElement);
virtual ~nsCSSRuleProcessor(); virtual ~nsCSSRuleProcessor();
NS_DECL_ISUPPORTS NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS(nsCSSRuleProcessor)
public: public:
nsresult ClearRuleCascades(); nsresult ClearRuleCascades();
@ -182,6 +183,8 @@ private:
nsCSSPseudoElements::Type aPseudoType, nsCSSPseudoElements::Type aPseudoType,
mozilla::EventStates aStateMask); mozilla::EventStates aStateMask);
void ClearSheets();
// The sheet order here is the same as in nsStyleSet::mSheets // The sheet order here is the same as in nsStyleSet::mSheets
sheet_array_type mSheets; sheet_array_type mSheets;