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 |