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, 2010, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r
ights reserved. |
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
8 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 8 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
9 * Copyright (C) 2013 Google Inc. All rights reserved. | 9 * Copyright (C) 2013 Google Inc. All rights reserved. |
10 * | 10 * |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 // Until the <body> exists, we have no choice but to compare document positi
ons, | 54 // Until the <body> exists, we have no choice but to compare document positi
ons, |
55 // since styles outside of the body and head continue to be shunted into the
head | 55 // since styles outside of the body and head continue to be shunted into the
head |
56 // (and thus can shift to end up before dynamically added DOM content that i
s also | 56 // (and thus can shift to end up before dynamically added DOM content that i
s also |
57 // outside the body). | 57 // outside the body). |
58 if (createdByParser && document().body() && !node->nextSibling()) | 58 if (createdByParser && document().body() && !node->nextSibling()) |
59 m_styleSheetCandidateNodes.parserAdd(node); | 59 m_styleSheetCandidateNodes.parserAdd(node); |
60 else | 60 else |
61 m_styleSheetCandidateNodes.add(node); | 61 m_styleSheetCandidateNodes.add(node); |
62 } | 62 } |
63 | 63 |
64 TreeScopeStyleSheetCollection::StyleResolverUpdateType TreeScopeStyleSheetCollec
tion::compareStyleSheets(const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet
> >& oldStyleSheets, const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet> >&
newStylesheets, WillBeHeapVector<RawPtrWillBeMember<StyleSheetContents> >& adde
dSheets) | 64 TreeScopeStyleSheetCollection::StyleResolverUpdateType TreeScopeStyleSheetCollec
tion::compareStyleSheets(const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet
>>& oldStyleSheets, const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>>& n
ewStylesheets, WillBeHeapVector<RawPtrWillBeMember<StyleSheetContents>>& addedSh
eets) |
65 { | 65 { |
66 unsigned newStyleSheetCount = newStylesheets.size(); | 66 unsigned newStyleSheetCount = newStylesheets.size(); |
67 unsigned oldStyleSheetCount = oldStyleSheets.size(); | 67 unsigned oldStyleSheetCount = oldStyleSheets.size(); |
68 ASSERT(newStyleSheetCount >= oldStyleSheetCount); | 68 ASSERT(newStyleSheetCount >= oldStyleSheetCount); |
69 | 69 |
70 if (!newStyleSheetCount) | 70 if (!newStyleSheetCount) |
71 return Reconstruct; | 71 return Reconstruct; |
72 | 72 |
73 unsigned newIndex = 0; | 73 unsigned newIndex = 0; |
74 for (unsigned oldIndex = 0; oldIndex < oldStyleSheetCount; ++oldIndex) { | 74 for (unsigned oldIndex = 0; oldIndex < oldStyleSheetCount; ++oldIndex) { |
75 while (oldStyleSheets[oldIndex] != newStylesheets[newIndex]) { | 75 while (oldStyleSheets[oldIndex] != newStylesheets[newIndex]) { |
76 addedSheets.append(newStylesheets[newIndex]->contents()); | 76 addedSheets.append(newStylesheets[newIndex]->contents()); |
77 if (++newIndex == newStyleSheetCount) | 77 if (++newIndex == newStyleSheetCount) |
78 return Reconstruct; | 78 return Reconstruct; |
79 } | 79 } |
80 if (++newIndex == newStyleSheetCount) | 80 if (++newIndex == newStyleSheetCount) |
81 return Reconstruct; | 81 return Reconstruct; |
82 } | 82 } |
83 bool hasInsertions = !addedSheets.isEmpty(); | 83 bool hasInsertions = !addedSheets.isEmpty(); |
84 while (newIndex < newStyleSheetCount) { | 84 while (newIndex < newStyleSheetCount) { |
85 addedSheets.append(newStylesheets[newIndex]->contents()); | 85 addedSheets.append(newStylesheets[newIndex]->contents()); |
86 ++newIndex; | 86 ++newIndex; |
87 } | 87 } |
88 // If all new sheets were added at the end of the list we can just add them
to existing StyleResolver. | 88 // If all new sheets were added at the end of the list we can just add them
to existing StyleResolver. |
89 // If there were insertions we need to re-add all the stylesheets so rules a
re ordered correctly. | 89 // If there were insertions we need to re-add all the stylesheets so rules a
re ordered correctly. |
90 return hasInsertions ? Reset : Additive; | 90 return hasInsertions ? Reset : Additive; |
91 } | 91 } |
92 | 92 |
93 bool TreeScopeStyleSheetCollection::activeLoadingStyleSheetLoaded(const WillBeHe
apVector<RefPtrWillBeMember<CSSStyleSheet> >& newStyleSheets) | 93 bool TreeScopeStyleSheetCollection::activeLoadingStyleSheetLoaded(const WillBeHe
apVector<RefPtrWillBeMember<CSSStyleSheet>>& newStyleSheets) |
94 { | 94 { |
95 // StyleSheets of <style> elements that @import stylesheets are active but l
oading. We need to trigger a full recalc when such loads are done. | 95 // StyleSheets of <style> elements that @import stylesheets are active but l
oading. We need to trigger a full recalc when such loads are done. |
96 bool hasActiveLoadingStylesheet = false; | 96 bool hasActiveLoadingStylesheet = false; |
97 unsigned newStylesheetCount = newStyleSheets.size(); | 97 unsigned newStylesheetCount = newStyleSheets.size(); |
98 for (unsigned i = 0; i < newStylesheetCount; ++i) { | 98 for (unsigned i = 0; i < newStylesheetCount; ++i) { |
99 if (newStyleSheets[i]->isLoading()) | 99 if (newStyleSheets[i]->isLoading()) |
100 hasActiveLoadingStylesheet = true; | 100 hasActiveLoadingStylesheet = true; |
101 } | 101 } |
102 if (m_hadActiveLoadingStylesheet && !hasActiveLoadingStylesheet) { | 102 if (m_hadActiveLoadingStylesheet && !hasActiveLoadingStylesheet) { |
103 m_hadActiveLoadingStylesheet = false; | 103 m_hadActiveLoadingStylesheet = false; |
104 return true; | 104 return true; |
105 } | 105 } |
106 m_hadActiveLoadingStylesheet = hasActiveLoadingStylesheet; | 106 m_hadActiveLoadingStylesheet = hasActiveLoadingStylesheet; |
107 return false; | 107 return false; |
108 } | 108 } |
109 | 109 |
110 static bool findFontFaceRulesFromStyleSheetContents(const WillBeHeapVector<RawPt
rWillBeMember<StyleSheetContents> >& sheets, WillBeHeapVector<RawPtrWillBeMember
<const StyleRuleFontFace> >& fontFaceRules) | 110 static bool findFontFaceRulesFromStyleSheetContents(const WillBeHeapVector<RawPt
rWillBeMember<StyleSheetContents>>& sheets, WillBeHeapVector<RawPtrWillBeMember<
const StyleRuleFontFace>>& fontFaceRules) |
111 { | 111 { |
112 bool hasFontFaceRule = false; | 112 bool hasFontFaceRule = false; |
113 | 113 |
114 for (unsigned i = 0; i < sheets.size(); ++i) { | 114 for (unsigned i = 0; i < sheets.size(); ++i) { |
115 ASSERT(sheets[i]); | 115 ASSERT(sheets[i]); |
116 if (sheets[i]->hasFontFaceRule()) { | 116 if (sheets[i]->hasFontFaceRule()) { |
117 // FIXME: We don't need this for styles in shadow tree. | 117 // FIXME: We don't need this for styles in shadow tree. |
118 sheets[i]->findFontFaceRules(fontFaceRules); | 118 sheets[i]->findFontFaceRules(fontFaceRules); |
119 hasFontFaceRule = true; | 119 hasFontFaceRule = true; |
120 } | 120 } |
121 } | 121 } |
122 return hasFontFaceRule; | 122 return hasFontFaceRule; |
123 } | 123 } |
124 | 124 |
125 void TreeScopeStyleSheetCollection::analyzeStyleSheetChange(StyleResolverUpdateM
ode updateMode, const StyleSheetCollection& newCollection, StyleSheetChange& cha
nge) | 125 void TreeScopeStyleSheetCollection::analyzeStyleSheetChange(StyleResolverUpdateM
ode updateMode, const StyleSheetCollection& newCollection, StyleSheetChange& cha
nge) |
126 { | 126 { |
127 if (activeLoadingStyleSheetLoaded(newCollection.activeAuthorStyleSheets())) | 127 if (activeLoadingStyleSheetLoaded(newCollection.activeAuthorStyleSheets())) |
128 return; | 128 return; |
129 | 129 |
130 if (updateMode != AnalyzedStyleUpdate) | 130 if (updateMode != AnalyzedStyleUpdate) |
131 return; | 131 return; |
132 | 132 |
133 // Find out which stylesheets are new. | 133 // Find out which stylesheets are new. |
134 WillBeHeapVector<RawPtrWillBeMember<StyleSheetContents> > addedSheets; | 134 WillBeHeapVector<RawPtrWillBeMember<StyleSheetContents>> addedSheets; |
135 if (m_activeAuthorStyleSheets.size() <= newCollection.activeAuthorStyleSheet
s().size()) { | 135 if (m_activeAuthorStyleSheets.size() <= newCollection.activeAuthorStyleSheet
s().size()) { |
136 change.styleResolverUpdateType = compareStyleSheets(m_activeAuthorStyleS
heets, newCollection.activeAuthorStyleSheets(), addedSheets); | 136 change.styleResolverUpdateType = compareStyleSheets(m_activeAuthorStyleS
heets, newCollection.activeAuthorStyleSheets(), addedSheets); |
137 } else { | 137 } else { |
138 StyleResolverUpdateType updateType = compareStyleSheets(newCollection.ac
tiveAuthorStyleSheets(), m_activeAuthorStyleSheets, addedSheets); | 138 StyleResolverUpdateType updateType = compareStyleSheets(newCollection.ac
tiveAuthorStyleSheets(), m_activeAuthorStyleSheets, addedSheets); |
139 if (updateType != Additive) { | 139 if (updateType != Additive) { |
140 change.styleResolverUpdateType = updateType; | 140 change.styleResolverUpdateType = updateType; |
141 } else { | 141 } else { |
142 change.styleResolverUpdateType = Reset; | 142 change.styleResolverUpdateType = Reset; |
143 // If @font-face is removed, needs full style recalc. | 143 // If @font-face is removed, needs full style recalc. |
144 if (findFontFaceRulesFromStyleSheetContents(addedSheets, change.font
FaceRulesToRemove)) | 144 if (findFontFaceRulesFromStyleSheetContents(addedSheets, change.font
FaceRulesToRemove)) |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 { | 180 { |
181 DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin(); | 181 DocumentOrderedList::iterator begin = m_styleSheetCandidateNodes.begin(); |
182 DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end(); | 182 DocumentOrderedList::iterator end = m_styleSheetCandidateNodes.end(); |
183 for (DocumentOrderedList::iterator it = begin; it != end; ++it) { | 183 for (DocumentOrderedList::iterator it = begin; it != end; ++it) { |
184 Node* node = *it; | 184 Node* node = *it; |
185 if (isHTMLLinkElement(*node)) | 185 if (isHTMLLinkElement(*node)) |
186 toHTMLLinkElement(node)->setEnabledIfExitTransitionStyle(enabled); | 186 toHTMLLinkElement(node)->setEnabledIfExitTransitionStyle(enabled); |
187 } | 187 } |
188 } | 188 } |
189 | 189 |
190 static bool styleSheetsUseRemUnits(const WillBeHeapVector<RefPtrWillBeMember<CSS
StyleSheet> >& sheets) | 190 static bool styleSheetsUseRemUnits(const WillBeHeapVector<RefPtrWillBeMember<CSS
StyleSheet>>& sheets) |
191 { | 191 { |
192 for (unsigned i = 0; i < sheets.size(); ++i) { | 192 for (unsigned i = 0; i < sheets.size(); ++i) { |
193 if (sheets[i]->contents()->usesRemUnits()) | 193 if (sheets[i]->contents()->usesRemUnits()) |
194 return true; | 194 return true; |
195 } | 195 } |
196 return false; | 196 return false; |
197 } | 197 } |
198 | 198 |
199 void TreeScopeStyleSheetCollection::updateUsesRemUnits() | 199 void TreeScopeStyleSheetCollection::updateUsesRemUnits() |
200 { | 200 { |
201 m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets); | 201 m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets); |
202 } | 202 } |
203 | 203 |
204 DEFINE_TRACE(TreeScopeStyleSheetCollection) | 204 DEFINE_TRACE(TreeScopeStyleSheetCollection) |
205 { | 205 { |
206 visitor->trace(m_treeScope); | 206 visitor->trace(m_treeScope); |
207 visitor->trace(m_styleSheetCandidateNodes); | 207 visitor->trace(m_styleSheetCandidateNodes); |
208 StyleSheetCollection::trace(visitor); | 208 StyleSheetCollection::trace(visitor); |
209 } | 209 } |
210 | 210 |
211 } | 211 } |
OLD | NEW |