From 368491119ee8ffa62c6f4c8d83bea74b1bb558af Mon Sep 17 00:00:00 2001 From: Andrew McCreight Date: Thu, 19 Jun 2014 14:36:53 -0700 Subject: [PATCH] Bug 990160 - Cycle collect nsCSSRuleProcessor. r=bz --- layout/style/nsCSSRuleProcessor.cpp | 29 ++++++++++++++++++++++++++--- layout/style/nsCSSRuleProcessor.h | 5 ++++- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/layout/style/nsCSSRuleProcessor.cpp b/layout/style/nsCSSRuleProcessor.cpp index 70f3c9534b85..fc89b34ac6ed 100644 --- a/layout/style/nsCSSRuleProcessor.cpp +++ b/layout/style/nsCSSRuleProcessor.cpp @@ -1103,16 +1103,39 @@ nsCSSRuleProcessor::nsCSSRuleProcessor(const sheet_array_type& aSheets, } 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; ) { mSheets[i]->DropRuleProcessor(this); } mSheets.Clear(); - ClearRuleCascades(); } -NS_IMPL_ISUPPORTS(nsCSSRuleProcessor, nsIStyleRuleProcessor) - /* static */ nsresult nsCSSRuleProcessor::Startup() { diff --git a/layout/style/nsCSSRuleProcessor.h b/layout/style/nsCSSRuleProcessor.h index 00146c3fc2fb..bae55aa9e28c 100644 --- a/layout/style/nsCSSRuleProcessor.h +++ b/layout/style/nsCSSRuleProcessor.h @@ -53,7 +53,8 @@ public: mozilla::dom::Element* aScopeElement); virtual ~nsCSSRuleProcessor(); - NS_DECL_ISUPPORTS + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_CLASS(nsCSSRuleProcessor) public: nsresult ClearRuleCascades(); @@ -182,6 +183,8 @@ private: nsCSSPseudoElements::Type aPseudoType, mozilla::EventStates aStateMask); + void ClearSheets(); + // The sheet order here is the same as in nsStyleSet::mSheets sheet_array_type mSheets;