Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All |
| 7 * rights reserved. | 7 * rights reserved. |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
| 9 * (http://www.torchmobile.com/) | 9 * (http://www.torchmobile.com/) |
| 10 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 10 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
| (...skipping 1011 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1022 | 1022 |
| 1023 PassRefPtr<ComputedStyle> StyleEngine::findSharedStyle( | 1023 PassRefPtr<ComputedStyle> StyleEngine::findSharedStyle( |
| 1024 const ElementResolveContext& elementResolveContext) { | 1024 const ElementResolveContext& elementResolveContext) { |
| 1025 DCHECK(m_resolver); | 1025 DCHECK(m_resolver); |
| 1026 return SharedStyleFinder( | 1026 return SharedStyleFinder( |
| 1027 elementResolveContext, m_globalRuleSet.ruleFeatureSet(), | 1027 elementResolveContext, m_globalRuleSet.ruleFeatureSet(), |
| 1028 m_globalRuleSet.siblingRuleSet(), | 1028 m_globalRuleSet.siblingRuleSet(), |
| 1029 m_globalRuleSet.uncommonAttributeRuleSet(), *m_resolver) | 1029 m_globalRuleSet.uncommonAttributeRuleSet(), *m_resolver) |
| 1030 .findSharedStyle(); | 1030 .findSharedStyle(); |
| 1031 } | 1031 } |
| 1032 namespace { | |
| 1033 | |
| 1034 enum RuleSetFlags { | |
| 1035 FontFaceRules = 1 << 0, | |
| 1036 KeyframesRules = 1 << 1, | |
| 1037 FullRecalcRules = 1 << 2 | |
| 1038 }; | |
| 1039 | |
| 1040 unsigned getRuleSetFlags(const HeapVector<Member<RuleSet>> ruleSets) { | |
| 1041 unsigned flags = 0; | |
| 1042 for (auto& ruleSet : ruleSets) { | |
| 1043 ruleSet->compactRulesIfNeeded(); | |
| 1044 if (!ruleSet->keyframesRules().isEmpty()) | |
| 1045 flags |= KeyframesRules; | |
| 1046 if (!ruleSet->fontFaceRules().isEmpty()) | |
| 1047 flags |= FontFaceRules; | |
| 1048 if (ruleSet->needsFullRecalcForRuleSetInvalidation()) | |
| 1049 flags |= FullRecalcRules; | |
| 1050 } | |
| 1051 return flags; | |
| 1052 } | |
| 1053 | |
| 1054 } // namespace | |
| 1055 | |
| 1056 void StyleEngine::applyRuleSetChanges( | |
| 1057 TreeScope& treeScope, | |
| 1058 const ActiveStyleSheetVector& oldStyleSheets, | |
| 1059 const ActiveStyleSheetVector& newStyleSheets) { | |
| 1060 HeapVector<Member<RuleSet>> changedRuleSets; | |
| 1061 | |
| 1062 ActiveSheetsChange change = | |
| 1063 compareActiveStyleSheets(oldStyleSheets, newStyleSheets, changedRuleSets); | |
| 1064 if (change == NoActiveSheetsChanged) | |
| 1065 return; | |
| 1066 | |
| 1067 m_globalRuleSet.markDirty(); | |
|
sashab
2016/11/09 23:45:29
Maybe add a comment explaining what this line is f
rune
2016/11/10 08:10:45
Done.
| |
| 1068 | |
| 1069 unsigned changedRuleFlags = getRuleSetFlags(changedRuleSets); | |
| 1070 bool fontsChanged = treeScope.rootNode().isDocumentNode() && | |
| 1071 (changedRuleFlags & FontFaceRules); | |
| 1072 unsigned appendStartIndex = 0; | |
| 1073 | |
| 1074 // We don't need to clear the font cache if new sheets are appended. | |
| 1075 if (fontsChanged && change == ActiveSheetsChanged) | |
| 1076 clearFontCache(); | |
| 1077 | |
| 1078 // - If all sheets were removed, we remove the ScopedStyleResolver. | |
| 1079 // - If new sheets were appended to existing ones, start appending after the | |
| 1080 // common prefix. | |
| 1081 // - For other diffs, reset author style and re-add all sheets for the | |
| 1082 // TreeScope. | |
| 1083 if (treeScope.scopedStyleResolver()) { | |
| 1084 if (newStyleSheets.isEmpty()) | |
| 1085 resetAuthorStyle(treeScope); | |
| 1086 else if (change == ActiveSheetsAppended) | |
| 1087 appendStartIndex = oldStyleSheets.size(); | |
| 1088 else | |
| 1089 treeScope.scopedStyleResolver()->resetAuthorStyle(); | |
| 1090 } | |
| 1091 | |
| 1092 if (!newStyleSheets.isEmpty()) { | |
| 1093 treeScope.ensureScopedStyleResolver().appendActiveStyleSheets( | |
| 1094 appendStartIndex, newStyleSheets); | |
| 1095 } | |
| 1096 | |
| 1097 if (treeScope.document().hasPendingForcedStyleRecalc()) | |
| 1098 return; | |
| 1099 | |
| 1100 if (!treeScope.document().body() || | |
| 1101 treeScope.document().hasNodesWithPlaceholderStyle()) { | |
| 1102 treeScope.document().setNeedsStyleRecalc( | |
| 1103 SubtreeStyleChange, StyleChangeReasonForTracing::create( | |
| 1104 StyleChangeReason::CleanupPlaceholderStyles)); | |
| 1105 return; | |
| 1106 } | |
| 1107 | |
| 1108 if (changedRuleFlags & KeyframesRules) | |
| 1109 ScopedStyleResolver::keyframesRulesAdded(treeScope); | |
| 1110 | |
| 1111 if (fontsChanged || (changedRuleFlags & FullRecalcRules)) { | |
| 1112 ScopedStyleResolver::invalidationRootForTreeScope(treeScope) | |
| 1113 .setNeedsStyleRecalc(SubtreeStyleChange, | |
| 1114 StyleChangeReasonForTracing::create( | |
| 1115 StyleChangeReason::ActiveStylesheetsUpdate)); | |
| 1116 return; | |
| 1117 } | |
| 1118 | |
| 1119 scheduleInvalidationsForRuleSets(treeScope, changedRuleSets); | |
| 1120 } | |
| 1032 | 1121 |
| 1033 DEFINE_TRACE(StyleEngine) { | 1122 DEFINE_TRACE(StyleEngine) { |
| 1034 visitor->trace(m_document); | 1123 visitor->trace(m_document); |
| 1035 visitor->trace(m_injectedAuthorStyleSheets); | 1124 visitor->trace(m_injectedAuthorStyleSheets); |
| 1036 visitor->trace(m_inspectorStyleSheet); | 1125 visitor->trace(m_inspectorStyleSheet); |
| 1037 visitor->trace(m_documentStyleSheetCollection); | 1126 visitor->trace(m_documentStyleSheetCollection); |
| 1038 visitor->trace(m_styleSheetCollectionMap); | 1127 visitor->trace(m_styleSheetCollectionMap); |
| 1039 visitor->trace(m_dirtyTreeScopes); | 1128 visitor->trace(m_dirtyTreeScopes); |
| 1040 visitor->trace(m_activeTreeScopes); | 1129 visitor->trace(m_activeTreeScopes); |
| 1041 visitor->trace(m_treeBoundaryCrossingScopes); | 1130 visitor->trace(m_treeBoundaryCrossingScopes); |
| 1042 visitor->trace(m_globalRuleSet); | 1131 visitor->trace(m_globalRuleSet); |
| 1043 visitor->trace(m_resolver); | 1132 visitor->trace(m_resolver); |
| 1044 visitor->trace(m_viewportResolver); | 1133 visitor->trace(m_viewportResolver); |
| 1045 visitor->trace(m_styleInvalidator); | 1134 visitor->trace(m_styleInvalidator); |
| 1046 visitor->trace(m_fontSelector); | 1135 visitor->trace(m_fontSelector); |
| 1047 visitor->trace(m_textToSheetCache); | 1136 visitor->trace(m_textToSheetCache); |
| 1048 visitor->trace(m_sheetToTextCache); | 1137 visitor->trace(m_sheetToTextCache); |
| 1049 visitor->trace(m_tracker); | 1138 visitor->trace(m_tracker); |
| 1050 CSSFontSelectorClient::trace(visitor); | 1139 CSSFontSelectorClient::trace(visitor); |
| 1051 } | 1140 } |
| 1052 | 1141 |
| 1053 DEFINE_TRACE_WRAPPERS(StyleEngine) { | 1142 DEFINE_TRACE_WRAPPERS(StyleEngine) { |
| 1054 for (auto sheet : m_injectedAuthorStyleSheets) { | 1143 for (auto sheet : m_injectedAuthorStyleSheets) { |
| 1055 visitor->traceWrappers(sheet); | 1144 visitor->traceWrappers(sheet); |
| 1056 } | 1145 } |
| 1057 visitor->traceWrappers(m_documentStyleSheetCollection); | 1146 visitor->traceWrappers(m_documentStyleSheetCollection); |
| 1058 } | 1147 } |
| 1059 | 1148 |
| 1060 } // namespace blink | 1149 } // namespace blink |
| OLD | NEW |