Bug 1382078 Part 1 - Add method to nsBindingManager to iterate all bound contents. r=emilio

MozReview-Commit-ID: H00b3pGNC8V

--HG--
extra : rebase_source : 8329b86b8690c13366a1421a977fb20165d5be5e
This commit is contained in:
Ting-Yu Lin 2017-08-28 17:47:55 +08:00
Родитель 54d4464f85
Коммит 1405de1443
2 изменённых файлов: 51 добавлений и 72 удалений

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

@ -709,77 +709,9 @@ nsBindingManager::WalkRules(nsIStyleRuleProcessor::EnumFunc aFunc,
return NS_OK;
}
typedef nsTHashtable<nsPtrHashKey<nsIStyleRuleProcessor> > RuleProcessorSet;
static RuleProcessorSet*
GetContentSetRuleProcessors(nsTHashtable<nsRefPtrHashKey<nsIContent>>* aContentSet)
{
RuleProcessorSet* set = nullptr;
for (auto iter = aContentSet->Iter(); !iter.Done(); iter.Next()) {
nsIContent* boundContent = iter.Get()->GetKey();
for (nsXBLBinding* binding = boundContent->GetXBLBinding(); binding;
binding = binding->GetBaseBinding()) {
nsIStyleRuleProcessor* ruleProc =
binding->PrototypeBinding()->GetRuleProcessor();
if (ruleProc) {
if (!set) {
set = new RuleProcessorSet;
}
set->PutEntry(ruleProc);
}
}
}
return set;
}
void
nsBindingManager::WalkAllRules(nsIStyleRuleProcessor::EnumFunc aFunc,
ElementDependentRuleProcessorData* aData)
{
if (!mBoundContentSet) {
return;
}
nsAutoPtr<RuleProcessorSet> set;
set = GetContentSetRuleProcessors(mBoundContentSet);
if (!set) {
return;
}
for (auto iter = set->Iter(); !iter.Done(); iter.Next()) {
nsIStyleRuleProcessor* ruleProcessor = iter.Get()->GetKey();
(*(aFunc))(ruleProcessor, aData);
}
}
nsresult
nsBindingManager::MediumFeaturesChanged(nsPresContext* aPresContext,
bool* aRulesChanged)
{
*aRulesChanged = false;
if (!mBoundContentSet) {
return NS_OK;
}
nsAutoPtr<RuleProcessorSet> set;
set = GetContentSetRuleProcessors(mBoundContentSet);
if (!set) {
return NS_OK;
}
for (auto iter = set->Iter(); !iter.Done(); iter.Next()) {
nsIStyleRuleProcessor* ruleProcessor = iter.Get()->GetKey();
bool thisChanged = ruleProcessor->MediumFeaturesChanged(aPresContext);
*aRulesChanged = *aRulesChanged || thisChanged;
}
return NS_OK;
}
void
nsBindingManager::AppendAllSheets(nsTArray<StyleSheet*>& aArray)
nsBindingManager::EnumerateBoundContentBindings(
const BoundContentBindingCallback& aCallback) const
{
if (!mBoundContentSet) {
return;
@ -787,13 +719,54 @@ nsBindingManager::AppendAllSheets(nsTArray<StyleSheet*>& aArray)
for (auto iter = mBoundContentSet->Iter(); !iter.Done(); iter.Next()) {
nsIContent* boundContent = iter.Get()->GetKey();
for (nsXBLBinding* binding = boundContent->GetXBLBinding(); binding;
for (nsXBLBinding* binding = boundContent->GetXBLBinding();
binding;
binding = binding->GetBaseBinding()) {
binding->PrototypeBinding()->AppendStyleSheetsTo(aArray);
aCallback(binding);
}
}
}
void
nsBindingManager::WalkAllRules(nsIStyleRuleProcessor::EnumFunc aFunc,
ElementDependentRuleProcessorData* aData)
{
EnumerateBoundContentBindings([=](nsXBLBinding* aBinding) {
nsIStyleRuleProcessor* ruleProcessor =
aBinding->PrototypeBinding()->GetRuleProcessor();
if (ruleProcessor) {
(*(aFunc))(ruleProcessor, aData);
}
});
}
nsresult
nsBindingManager::MediumFeaturesChanged(nsPresContext* aPresContext,
bool* aRulesChanged)
{
*aRulesChanged = false;
RefPtr<nsPresContext> presContext = aPresContext;
EnumerateBoundContentBindings([=](nsXBLBinding* aBinding) {
nsIStyleRuleProcessor* ruleProcessor =
aBinding->PrototypeBinding()->GetRuleProcessor();
if (ruleProcessor) {
bool thisChanged = ruleProcessor->MediumFeaturesChanged(presContext);
*aRulesChanged = *aRulesChanged || thisChanged;
}
});
return NS_OK;
}
void
nsBindingManager::AppendAllSheets(nsTArray<StyleSheet*>& aArray)
{
EnumerateBoundContentBindings([&aArray](nsXBLBinding* aBinding) {
aBinding->PrototypeBinding()->AppendStyleSheetsTo(aArray);
});
}
static void
InsertAppendedContent(XBLChildrenElement* aPoint,
nsIContent* aFirstNewContent)

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

@ -193,6 +193,12 @@ protected:
// Call PostProcessAttachedQueueEvent() on a timer.
static void PostPAQEventCallback(nsITimer* aTimer, void* aClosure);
// Enumerate each bound content's bindings (including its base bindings)
// in mBoundContentSet.
using BoundContentBindingCallback = std::function<void (nsXBLBinding*)>;
void EnumerateBoundContentBindings(
const BoundContentBindingCallback& aCallback) const;
// MEMBER VARIABLES
protected:
// A set of nsIContent that currently have a binding installed.