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

Side by Side Diff: Source/core/dom/StyleSheetCollection.cpp

Issue 27537009: Avoid always style recalc when removing stylesheets. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
70 void StyleSheetCollection::removeStyleSheetCandidateNode(Node* node, ContainerNo de* scopingNode) 70 void StyleSheetCollection::removeStyleSheetCandidateNode(Node* node, ContainerNo de* scopingNode)
71 { 71 {
72 m_styleSheetCandidateNodes.remove(node); 72 m_styleSheetCandidateNodes.remove(node);
73 73
74 if (!isTreeScopeRoot(scopingNode)) 74 if (!isTreeScopeRoot(scopingNode))
75 m_scopingNodesForStyleScoped.remove(scopingNode); 75 m_scopingNodesForStyleScoped.remove(scopingNode);
76 } 76 }
77 77
78 StyleSheetCollection::StyleResolverUpdateType StyleSheetCollection::compareStyle Sheets(const Vector<RefPtr<CSSStyleSheet> >& oldStyleSheets, const Vector<RefPtr <CSSStyleSheet> >& newStylesheets, Vector<StyleSheetContents*>& addedSheets) 78 StyleSheetCollection::StyleResolverUpdateType StyleSheetCollection::compareStyle Sheets(const Vector<RefPtr<CSSStyleSheet> >& oldStyleSheets, const Vector<RefPtr <CSSStyleSheet> >& newStylesheets, Vector<StyleSheetContents*>& addedSheets)
79 { 79 {
80 // Find out which stylesheets are new.
81 unsigned newStylesheetCount = newStylesheets.size(); 80 unsigned newStylesheetCount = newStylesheets.size();
82 unsigned oldStylesheetCount = oldStyleSheets.size(); 81 unsigned oldStylesheetCount = oldStyleSheets.size();
83 if (newStylesheetCount < oldStylesheetCount) 82 ASSERT(newStylesheetCount >= oldStylesheetCount);
84 return Reconstruct;
85 83
86 unsigned newIndex = 0; 84 unsigned newIndex = 0;
87 for (unsigned oldIndex = 0; oldIndex < oldStylesheetCount; ++oldIndex) { 85 for (unsigned oldIndex = 0; oldIndex < oldStylesheetCount; ++oldIndex) {
88 if (newIndex >= newStylesheetCount) 86 if (newIndex >= newStylesheetCount)
89 return Reconstruct; 87 return Reconstruct;
90 while (oldStyleSheets[oldIndex] != newStylesheets[newIndex]) { 88 while (oldStyleSheets[oldIndex] != newStylesheets[newIndex]) {
91 addedSheets.append(newStylesheets[newIndex]->contents()); 89 addedSheets.append(newStylesheets[newIndex]->contents());
92 ++newIndex; 90 ++newIndex;
93 if (newIndex == newStylesheetCount) 91 if (newIndex == newStylesheetCount)
94 return Reconstruct; 92 return Reconstruct;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 if (activeLoadingStyleSheetLoaded(newStyleSheets)) 128 if (activeLoadingStyleSheetLoaded(newStyleSheets))
131 return; 129 return;
132 130
133 if (updateMode != AnalyzedStyleUpdate) 131 if (updateMode != AnalyzedStyleUpdate)
134 return; 132 return;
135 if (!document()->styleResolverIfExists()) 133 if (!document()->styleResolverIfExists())
136 return; 134 return;
137 135
138 // Find out which stylesheets are new. 136 // Find out which stylesheets are new.
139 Vector<StyleSheetContents*> addedSheets; 137 Vector<StyleSheetContents*> addedSheets;
140 styleResolverUpdateType = compareStyleSheets(oldStyleSheets, newStyleSheets, addedSheets); 138 if (oldStyleSheets.size() <= newStyleSheets.size()) {
139 styleResolverUpdateType = compareStyleSheets(oldStyleSheets, newStyleShe ets, addedSheets);
140 } else {
141 StyleResolverUpdateType updateType = compareStyleSheets(newStyleSheets, oldStyleSheets, addedSheets);
142 styleResolverUpdateType = updateType != Additive ? updateType : Reset;
143 }
141 144
142 // FIXME: If styleResolverUpdateType is still Reconstruct, we could return e arly here 145 // FIXME: If styleResolverUpdateType is still Reconstruct, we could return e arly here
143 // as destroying the StyleResolver will recalc the whole document anyway? 146 // as destroying the StyleResolver will recalc the whole document anyway?
144 147
145 // If we are already parsing the body and so may have significant amount of elements, put some effort into trying to avoid style recalcs. 148 // If we are already parsing the body and so may have significant amount of elements, put some effort into trying to avoid style recalcs.
146 if (!document()->body() || document()->hasNodesWithPlaceholderStyle()) 149 if (!document()->body() || document()->hasNodesWithPlaceholderStyle())
147 return; 150 return;
148 StyleInvalidationAnalysis invalidationAnalysis(addedSheets); 151 StyleInvalidationAnalysis invalidationAnalysis(addedSheets);
149 if (invalidationAnalysis.dirtiesAllStyle()) 152 if (invalidationAnalysis.dirtiesAllStyle())
150 return; 153 return;
(...skipping 23 matching lines...) Expand all
174 } 177 }
175 return false; 178 return false;
176 } 179 }
177 180
178 void StyleSheetCollection::updateUsesRemUnits() 181 void StyleSheetCollection::updateUsesRemUnits()
179 { 182 {
180 m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets); 183 m_usesRemUnits = styleSheetsUseRemUnits(m_activeAuthorStyleSheets);
181 } 184 }
182 185
183 } 186 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698