Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(622)

Unified Diff: third_party/WebKit/Source/core/css/ActiveStyleSheets.cpp

Issue 2829873002: Collect media query results for non-matching stylesheets. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/ActiveStyleSheets.cpp
diff --git a/third_party/WebKit/Source/core/css/ActiveStyleSheets.cpp b/third_party/WebKit/Source/core/css/ActiveStyleSheets.cpp
index d4d863922269423d22761b48c73fff3941e5a245..9030786e684674cf760bf94fab0735ca570b924c 100644
--- a/third_party/WebKit/Source/core/css/ActiveStyleSheets.cpp
+++ b/third_party/WebKit/Source/core/css/ActiveStyleSheets.cpp
@@ -37,6 +37,13 @@ ActiveSheetsChange CompareActiveStyleSheets(
changed_rule_sets.insert(old_style_sheets[index].second);
}
+ // If we add a sheet for which the media attribute currently doesn't match, we
+ // have a null RuleSet and there's no need to do any style invalidation.
+ // However, we need to tell the StyleEngine to re-collect viewport and device
+ // dependent media query results so that we can correctly update active style
+ // sheets when such media query evaluations change.
+ bool adds_non_matching_mq = false;
+
if (index == old_style_sheet_count) {
// The old stylesheet vector is a prefix of the new vector in terms of
// StyleSheets. If none of the RuleSets changed, we only need to add the new
@@ -45,10 +52,12 @@ ActiveSheetsChange CompareActiveStyleSheets(
for (; index < new_style_sheet_count; index++) {
if (new_style_sheets[index].second)
changed_rule_sets.insert(new_style_sheets[index].second);
+ else if (new_style_sheets[index].first->HasMediaQueryResults())
+ adds_non_matching_mq = true;
}
if (rule_sets_changed_in_common_prefix)
return kActiveSheetsChanged;
- if (changed_rule_sets.IsEmpty())
+ if (changed_rule_sets.IsEmpty() && !adds_non_matching_mq)
return kNoActiveSheetsChanged;
return kActiveSheetsAppended;
}
@@ -58,9 +67,12 @@ ActiveSheetsChange CompareActiveStyleSheets(
for (; index < old_style_sheet_count; index++) {
if (old_style_sheets[index].second)
changed_rule_sets.insert(old_style_sheets[index].second);
+ else if (old_style_sheets[index].first->HasMediaQueryResults())
+ adds_non_matching_mq = true;
}
- return changed_rule_sets.IsEmpty() ? kNoActiveSheetsChanged
- : kActiveSheetsChanged;
+ return changed_rule_sets.IsEmpty() && !adds_non_matching_mq
+ ? kNoActiveSheetsChanged
+ : kActiveSheetsChanged;
}
DCHECK_LT(index, old_style_sheet_count);
@@ -88,6 +100,8 @@ ActiveSheetsChange CompareActiveStyleSheets(
// Sheet either removed or inserted.
if (sheet1.second)
changed_rule_sets.insert(sheet1.second);
+ else if (sheet1.first->HasMediaQueryResults())
+ adds_non_matching_mq = true;
continue;
}
@@ -104,8 +118,9 @@ ActiveSheetsChange CompareActiveStyleSheets(
if (sheet2.second)
changed_rule_sets.insert(sheet2.second);
}
- return changed_rule_sets.IsEmpty() ? kNoActiveSheetsChanged
- : kActiveSheetsChanged;
+ return changed_rule_sets.IsEmpty() && !adds_non_matching_mq
+ ? kNoActiveSheetsChanged
+ : kActiveSheetsChanged;
}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698