Issue #2490 - Part 4: Make css::Rule wrappercached.

This commit is contained in:
Moonchild 2024-03-30 12:39:15 +01:00 committed by roytam1
commit 1342838b3f
9 changed files with 208 additions and 18 deletions

View file

@ -38,6 +38,7 @@
#include "nsIURI.h"
#include "mozAutoDocUpdate.h"
#include "nsCCUncollectableMarker.h"
#include "nsWrapperCacheInlines.h"
using namespace mozilla;
using namespace mozilla::dom;
@ -58,20 +59,25 @@ NS_IMPL_CYCLE_COLLECTING_ADDREF(Rule)
NS_IMPL_CYCLE_COLLECTING_RELEASE(Rule)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Rule)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_0(Rule)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(Rule)
bool
Rule::IsCCLeaf() const
{
return true;
return !PreservingWrapper();
}
bool
Rule::IsKnownLive() const
{
if (IsBlack()) {
return true;
}
StyleSheet* sheet = GetStyleSheet();
if (!sheet) {
return false;
@ -90,10 +96,10 @@ NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(Rule)
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(Rule)
// Note that we can't make use of IsKnownLive() here directly, because we may
// be subclassed by something that needs tracing. Once we have a wrapper
// cache we should be able to do better here.
return tmp->IsCCLeaf();
// Please see documentation for nsCycleCollectionParticipant::CanSkip* for why
// we need to check HasNothingToTrace here but not in the other two CanSkip
// methods.
return tmp->IsCCLeaf() || (tmp->IsKnownLive() && tmp->HasNothingToTrace(tmp));
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(Rule)
@ -217,6 +223,7 @@ ImportRule::ImportRule(nsMediaList* aMedia, const nsString& aURLSpec,
, mURLSpec(aURLSpec)
, mMedia(aMedia)
{
SetIsNotDOMBinding();
// XXXbz This is really silly.... the mMedia here will be replaced
// with itself if we manage to load a sheet. Which should really
// never fail nowadays, in sane cases.
@ -226,6 +233,7 @@ ImportRule::ImportRule(const ImportRule& aCopy)
: Rule(aCopy),
mURLSpec(aCopy.mURLSpec)
{
SetIsNotDOMBinding();
// Whether or not an @import rule has a null sheet is a permanent
// property of that @import rule, since it is null only if the target
// sheet failed security checks.
@ -415,6 +423,14 @@ ImportRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
// - mChildSheet, because it is measured via CSSStyleSheetInner::mSheets
}
/* virtual */ JSObject*
ImportRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
GroupRule::GroupRule(uint32_t aLineNumber, uint32_t aColumnNumber)
: Rule(aLineNumber, aColumnNumber)
{
@ -656,11 +672,13 @@ GroupRule::SizeOfExcludingThis(MallocSizeOf aMallocSizeOf) const
MediaRule::MediaRule(uint32_t aLineNumber, uint32_t aColumnNumber)
: GroupRule(aLineNumber, aColumnNumber)
{
SetIsNotDOMBinding();
}
MediaRule::MediaRule(const MediaRule& aCopy)
: GroupRule(aCopy)
{
SetIsNotDOMBinding();
if (aCopy.mMedia) {
mMedia = aCopy.mMedia->Clone();
// XXXldb This doesn't really make sense.
@ -869,6 +887,13 @@ MediaRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
return n;
}
/* virtual */ JSObject*
MediaRule::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
void
MediaRule::AppendConditionText(nsAString& aOutput)
{
@ -882,12 +907,14 @@ MediaRule::AppendConditionText(nsAString& aOutput)
DocumentRule::DocumentRule(uint32_t aLineNumber, uint32_t aColumnNumber)
: GroupRule(aLineNumber, aColumnNumber)
{
SetIsNotDOMBinding();
}
DocumentRule::DocumentRule(const DocumentRule& aCopy)
: GroupRule(aCopy)
, mURLs(new URL(*aCopy.mURLs))
{
SetIsNotDOMBinding();
}
DocumentRule::~DocumentRule()
@ -1110,6 +1137,14 @@ DocumentRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
return n;
}
/* virtual */ JSObject*
DocumentRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
void
DocumentRule::AppendConditionText(nsAString& aCssText)
{
@ -1145,6 +1180,7 @@ NameSpaceRule::NameSpaceRule(nsIAtom* aPrefix, const nsString& aURLSpec,
mPrefix(aPrefix),
mURLSpec(aURLSpec)
{
SetIsNotDOMBinding();
}
NameSpaceRule::NameSpaceRule(const NameSpaceRule& aCopy)
@ -1152,6 +1188,7 @@ NameSpaceRule::NameSpaceRule(const NameSpaceRule& aCopy)
mPrefix(aCopy.mPrefix),
mURLSpec(aCopy.mURLSpec)
{
SetIsNotDOMBinding();
}
NameSpaceRule::~NameSpaceRule()
@ -1277,6 +1314,13 @@ NameSpaceRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
// - mURLSpec
}
/* virtual */ JSObject*
NameSpaceRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
} // namespace css
} // namespace mozilla
@ -1762,6 +1806,13 @@ nsCSSFontFaceRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
// - mDecl
}
/* virtual */ JSObject*
nsCSSFontFaceRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
// -----------------------------------
// nsCSSFontFeatureValuesRule
@ -2009,6 +2060,14 @@ nsCSSFontFeatureValuesRule::SizeOfIncludingThis(
return aMallocSizeOf(this);
}
/* virtual */ JSObject*
nsCSSFontFeatureValuesRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
// -------------------------------------------
// nsCSSKeyframeStyleDeclaration
//
@ -2098,6 +2157,7 @@ nsCSSKeyframeRule::nsCSSKeyframeRule(const nsCSSKeyframeRule& aCopy)
, mKeys(aCopy.mKeys)
, mDeclaration(new css::Declaration(*aCopy.mDeclaration))
{
SetIsNotDOMBinding();
mDeclaration->SetOwningRule(this);
}
@ -2317,6 +2377,13 @@ nsCSSKeyframeRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
// - mDOMDeclaration
}
/* virtual */ JSObject*
nsCSSKeyframeRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
// -------------------------------------------
// nsCSSKeyframesRule
@ -2329,6 +2396,7 @@ nsCSSKeyframesRule::nsCSSKeyframesRule(const nsCSSKeyframesRule& aCopy)
: GroupRule(aCopy),
mName(aCopy.mName)
{
SetIsNotDOMBinding();
}
nsCSSKeyframesRule::~nsCSSKeyframesRule()
@ -2573,6 +2641,14 @@ nsCSSKeyframesRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
return n;
}
/* virtual */ JSObject*
nsCSSKeyframesRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
// -------------------------------------------
// nsCSSPageStyleDeclaration
//
@ -2661,6 +2737,7 @@ nsCSSPageRule::nsCSSPageRule(const nsCSSPageRule& aCopy)
: Rule(aCopy)
, mDeclaration(new css::Declaration(*aCopy.mDeclaration))
{
SetIsNotDOMBinding();
mDeclaration->SetOwningRule(this);
}
@ -2809,6 +2886,14 @@ nsCSSPageRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
return aMallocSizeOf(this);
}
/* virtual */ JSObject*
nsCSSPageRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
namespace mozilla {
CSSSupportsRule::CSSSupportsRule(bool aConditionMet,
@ -2818,6 +2903,7 @@ CSSSupportsRule::CSSSupportsRule(bool aConditionMet,
, mUseGroup(aConditionMet)
, mCondition(aCondition)
{
SetIsNotDOMBinding();
}
CSSSupportsRule::~CSSSupportsRule()
@ -2829,6 +2915,7 @@ CSSSupportsRule::CSSSupportsRule(const CSSSupportsRule& aCopy)
mUseGroup(aCopy.mUseGroup),
mCondition(aCopy.mCondition)
{
SetIsNotDOMBinding();
}
#ifdef DEBUG
@ -2964,6 +3051,14 @@ CSSSupportsRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
return n;
}
/* virtual */ JSObject*
CSSSupportsRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}
} // namespace mozilla
// -------------------------------------------
@ -2975,6 +3070,7 @@ nsCSSCounterStyleRule::nsCSSCounterStyleRule(const nsCSSCounterStyleRule& aCopy)
, mName(aCopy.mName)
, mGeneration(aCopy.mGeneration)
{
SetIsNotDOMBinding();
for (size_t i = 0; i < ArrayLength(mValues); ++i) {
mValues[i] = aCopy.mValues[i];
}
@ -3434,3 +3530,11 @@ nsCSSCounterStyleRule::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) const
{
return aMallocSizeOf(this);
}
/* virtual */ JSObject*
nsCSSCounterStyleRule::WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto)
{
NS_NOTREACHED("We called SetIsNotDOMBinding() in our constructor");
return nullptr;
}