зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1380133 - Part 4: Make CalcStyleDifferenceInternal not cache any new structs on ServoStyleContexts when in a traversal. r=emilio
MozReview-Commit-ID: Eu4MvdQUBor --HG-- extra : rebase_source : c98706cec1788662a09cb1d99bcd3893658261a9
This commit is contained in:
Родитель
4b22db7890
Коммит
a5c91255ab
|
@ -10272,6 +10272,14 @@ nsIFrame::UpdateStyleOfOwnedChildFrame(
|
||||||
aNewStyleContext,
|
aNewStyleContext,
|
||||||
&equalStructs,
|
&equalStructs,
|
||||||
&samePointerStructs);
|
&samePointerStructs);
|
||||||
|
|
||||||
|
// CalcStyleDifference will handle caching structs on the new style context,
|
||||||
|
// but only if we're not on a style worker thread.
|
||||||
|
MOZ_ASSERT(!ServoStyleSet::IsInServoTraversal(),
|
||||||
|
"if we can get in here from style worker threads, then we need "
|
||||||
|
"a ResolveSameStructsAs call to ensure structs are cached on "
|
||||||
|
"aNewStyleContext");
|
||||||
|
|
||||||
// If aChildFrame is out of flow, then aRestyleState's "changes handled by the
|
// If aChildFrame is out of flow, then aRestyleState's "changes handled by the
|
||||||
// parent" doesn't apply to it, because it may have some other parent in the
|
// parent" doesn't apply to it, because it may have some other parent in the
|
||||||
// frame tree.
|
// frame tree.
|
||||||
|
|
|
@ -258,7 +258,8 @@ nsStyleContext::CalcStyleDifferenceInternal(StyleContextLike* aNewContext,
|
||||||
unrequestedStruct = false; \
|
unrequestedStruct = false; \
|
||||||
} \
|
} \
|
||||||
if (this##struct_) { \
|
if (this##struct_) { \
|
||||||
const nsStyle##struct_* other##struct_ = aNewContext->Style##struct_(); \
|
const nsStyle##struct_* other##struct_ = \
|
||||||
|
aNewContext->ThreadsafeStyle##struct_(); \
|
||||||
if (this##struct_ == other##struct_) { \
|
if (this##struct_ == other##struct_) { \
|
||||||
/* The very same struct, so we know that there will be no */ \
|
/* The very same struct, so we know that there will be no */ \
|
||||||
/* differences. */ \
|
/* differences. */ \
|
||||||
|
@ -338,7 +339,7 @@ nsStyleContext::CalcStyleDifferenceInternal(StyleContextLike* aNewContext,
|
||||||
#define STYLE_STRUCT(name_, callback_) \
|
#define STYLE_STRUCT(name_, callback_) \
|
||||||
{ \
|
{ \
|
||||||
const nsStyle##name_* data = PeekStyle##name_(); \
|
const nsStyle##name_* data = PeekStyle##name_(); \
|
||||||
if (!data || data == aNewContext->Style##name_()) { \
|
if (!data || data == aNewContext->ThreadsafeStyle##name_()) { \
|
||||||
*aSamePointerStructs |= NS_STYLE_INHERIT_BIT(name_); \
|
*aSamePointerStructs |= NS_STYLE_INHERIT_BIT(name_); \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
@ -387,8 +388,10 @@ nsStyleContext::CalcStyleDifferenceInternal(StyleContextLike* aNewContext,
|
||||||
#define STYLE_FIELD(name_) thisVisStruct->name_ != otherVisStruct->name_
|
#define STYLE_FIELD(name_) thisVisStruct->name_ != otherVisStruct->name_
|
||||||
#define STYLE_STRUCT(name_, fields_) \
|
#define STYLE_STRUCT(name_, fields_) \
|
||||||
if (!change && PeekStyle##name_()) { \
|
if (!change && PeekStyle##name_()) { \
|
||||||
const nsStyle##name_* thisVisStruct = thisVis->Style##name_(); \
|
const nsStyle##name_* thisVisStruct = \
|
||||||
const nsStyle##name_* otherVisStruct = otherVis->Style##name_(); \
|
thisVis->ThreadsafeStyle##name_(); \
|
||||||
|
const nsStyle##name_* otherVisStruct = \
|
||||||
|
otherVis->ThreadsafeStyle##name_(); \
|
||||||
if (MOZ_FOR_EACH_SEPARATED(STYLE_FIELD, (||), (), fields_)) { \
|
if (MOZ_FOR_EACH_SEPARATED(STYLE_FIELD, (||), (), fields_)) { \
|
||||||
change = true; \
|
change = true; \
|
||||||
} \
|
} \
|
||||||
|
|
|
@ -8067,6 +8067,14 @@ nsTableFrame::UpdateStyleOfOwnedAnonBoxesForTableWrapper(
|
||||||
newContext,
|
newContext,
|
||||||
&equalStructs,
|
&equalStructs,
|
||||||
&samePointerStructs);
|
&samePointerStructs);
|
||||||
|
|
||||||
|
// CalcStyleDifference will handle caching structs on the new style context,
|
||||||
|
// but only if we're not on a style worker thread.
|
||||||
|
MOZ_ASSERT(!ServoStyleSet::IsInServoTraversal(),
|
||||||
|
"if we can get in here from style worker threads, then we need "
|
||||||
|
"a ResolveSameStructsAs call to ensure structs are cached on "
|
||||||
|
"aNewStyleContext");
|
||||||
|
|
||||||
if (wrapperHint) {
|
if (wrapperHint) {
|
||||||
aRestyleState.ChangeList().AppendChange(
|
aRestyleState.ChangeList().AppendChange(
|
||||||
aWrapperFrame, aWrapperFrame->GetContent(), wrapperHint);
|
aWrapperFrame, aWrapperFrame->GetContent(), wrapperHint);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче