Bug 1356103 - Part 3: Make it easy to access the ServoStyleSet currently in traversal. r=bholley

In a later patch, we'll want to queue up some tasks to run when the
Servo traversal is one, and the ServoStyleSet seems like the natural
place to store those tasks.  We could probably find the ServoStyleSet
by chasing a bunch of pointers from the task-adding call sites, but
it seems simpler just to make it available directly.

MozReview-Commit-ID: AJoFZEoNaGm

--HG--
extra : rebase_source : d8afe0c2cdf1ea4b1681c6e57aea48c9efddea00
This commit is contained in:
Cameron McCormack 2017-04-30 14:41:11 +08:00
Родитель f6dd5eb7bb
Коммит 64ee30fc47
2 изменённых файлов: 27 добавлений и 9 удалений

Просмотреть файл

@ -295,8 +295,7 @@ ServoStyleSet::PrepareAndTraverseSubtree(RawGeckoElementBorrowed aRoot,
// is necessary to avoid a data race when updating the cache.
mozilla::Unused << aRoot->OwnerDoc()->GetRootElement();
MOZ_ASSERT(!sInServoTraversal);
sInServoTraversal = true;
AutoSetInServoTraversal guard(this);
bool isInitial = !aRoot->HasServoData();
bool forReconstruct =
@ -338,7 +337,6 @@ ServoStyleSet::PrepareAndTraverseSubtree(RawGeckoElementBorrowed aRoot,
}
}
sInServoTraversal = false;
return postTraversalRequired;
}
@ -983,8 +981,8 @@ already_AddRefed<ServoComputedValues>
ServoStyleSet::ResolveStyleLazily(Element* aElement, nsIAtom* aPseudoTag)
{
mPresContext->EffectCompositor()->PreTraverse(aElement, aPseudoTag);
MOZ_ASSERT(!sInServoTraversal);
sInServoTraversal = true;
AutoSetInServoTraversal guard(this);
/**
* NB: This is needed because we process animations and transitions on the
@ -1023,8 +1021,6 @@ ServoStyleSet::ResolveStyleLazily(Element* aElement, nsIAtom* aPseudoTag)
mRawSet.get()).Consume();
}
sInServoTraversal = false;
return computedValues.forget();
}
@ -1110,4 +1106,4 @@ ServoStyleSet::RemoveSheetOfType(SheetType aType,
return 0;
}
bool ServoStyleSet::sInServoTraversal = false;
ServoStyleSet* ServoStyleSet::sInServoTraversal = nullptr;

Просмотреть файл

@ -85,6 +85,11 @@ public:
return sInServoTraversal;
}
static ServoStyleSet* Current()
{
return sInServoTraversal;
}
ServoStyleSet();
~ServoStyleSet();
@ -309,6 +314,23 @@ public:
const ServoComputedValuesWithParent& aComputedValues);
private:
class MOZ_STACK_CLASS AutoSetInServoTraversal
{
public:
AutoSetInServoTraversal(ServoStyleSet* aSet)
{
MOZ_ASSERT(!sInServoTraversal);
MOZ_ASSERT(aSet);
sInServoTraversal = aSet;
}
~AutoSetInServoTraversal()
{
MOZ_ASSERT(sInServoTraversal);
sInServoTraversal = nullptr;
}
};
already_AddRefed<nsStyleContext> GetContext(already_AddRefed<ServoComputedValues>,
nsStyleContext* aParentContext,
nsIAtom* aPseudoTag,
@ -399,7 +421,7 @@ private:
nsCSSAnonBoxes::NonInheriting::_Count,
RefPtr<nsStyleContext>> mNonInheritingStyleContexts;
static bool sInServoTraversal;
static ServoStyleSet* sInServoTraversal;
};
} // namespace mozilla