Bug 1339629 Part 10: Implement ServoStyleSet::EnsureUniqueInnerOnCSSSheets. r=heycam

MozReview-Commit-ID: GuUqKYrV60z

--HG--
extra : rebase_source : 6a433ab77e2295450cc68ad0dc9d2e55ba08976a
This commit is contained in:
Brad Werth 2017-05-15 17:11:08 -07:00
Родитель 450a0513e2
Коммит 50e3299bf1
6 изменённых файлов: 34 добавлений и 16 удалений

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

@ -568,16 +568,6 @@ CSSStyleSheet::GetStyleRuleAt(int32_t aIndex) const
return Inner()->mOrderedRules.SafeObjectAt(aIndex);
}
void
CSSStyleSheet::AppendAllChildSheets(nsTArray<CSSStyleSheet*>& aArray)
{
for (StyleSheet* child = GetFirstChild(); child;
child = child->mNext) {
aArray.AppendElement(child->AsGecko());
}
}
already_AddRefed<StyleSheet>
CSSStyleSheet::Clone(StyleSheet* aCloneParent,
css::ImportRule* aCloneOwnerRule,

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

@ -140,9 +140,6 @@ public:
NS_IMETHOD StyleSheetLoaded(StyleSheet* aSheet, bool aWasAlternate,
nsresult aStatus) override;
// Append all of this sheet's child sheets to aArray.
void AppendAllChildSheets(nsTArray<CSSStyleSheet*>& aArray);
bool UseForPresentation(nsPresContext* aPresContext,
nsMediaQueryResultCacheKey& aKey) const;

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

@ -987,9 +987,29 @@ ServoStyleSet::ComputeAnimationValue(
bool
ServoStyleSet::EnsureUniqueInnerOnCSSSheets()
{
AutoTArray<StyleSheet*, 32> queue;
for (auto& entryArray : mSheets) {
for (auto& sheet : entryArray) {
queue.AppendElement(sheet);
}
}
// This is a stub until more of the functionality of nsStyleSet is
// replicated for Servo here.
// Bug 1290276 will replicate the nsStyleSet work of checking
// a nsBindingManager
while (!queue.IsEmpty()) {
uint32_t idx = queue.Length() - 1;
StyleSheet* sheet = queue[idx];
queue.RemoveElementAt(idx);
sheet->EnsureUniqueInner();
// Enqueue all the sheet's children.
sheet->AppendAllChildSheets(queue);
}
bool res = mNeedsRestyleAfterEnsureUniqueInner;
mNeedsRestyleAfterEnsureUniqueInner = false;
return res;

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

@ -458,6 +458,14 @@ StyleSheet::EnsureUniqueInner()
}
}
void
StyleSheet::AppendAllChildSheets(nsTArray<StyleSheet*>& aArray)
{
for (StyleSheet* child = GetFirstChild(); child; child = child->mNext) {
aArray.AppendElement(child);
}
}
// WebIDL CSSStyleSheet API
#define FORWARD_INTERNAL(method_, args_) \

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

@ -124,6 +124,9 @@ public:
void EnsureUniqueInner();
// Append all of this sheet's child sheets to aArray.
void AppendAllChildSheets(nsTArray<StyleSheet*>& aArray);
// style sheet owner info
enum DocumentAssociationMode {
// OwnedByDocument means mDocument owns us (possibly via a chain of other

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

@ -2638,9 +2638,9 @@ nsStyleSet::MediumFeaturesChanged()
bool
nsStyleSet::EnsureUniqueInnerOnCSSSheets()
{
AutoTArray<CSSStyleSheet*, 32> queue;
AutoTArray<StyleSheet*, 32> queue;
for (SheetType type : gCSSSheetTypes) {
for (CSSStyleSheet* sheet : mSheets[type]) {
for (StyleSheet* sheet : mSheets[type]) {
queue.AppendElement(sheet);
}
}
@ -2660,7 +2660,7 @@ nsStyleSet::EnsureUniqueInnerOnCSSSheets()
while (!queue.IsEmpty()) {
uint32_t idx = queue.Length() - 1;
CSSStyleSheet* sheet = queue[idx];
StyleSheet* sheet = queue[idx];
queue.RemoveElementAt(idx);
sheet->EnsureUniqueInner();