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

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

Issue 192473003: Move CSSRuleList to the garbage collected heap (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: ager feedback Created 6 years, 9 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
« no previous file with comments | « Source/core/dom/StyleEngine.h ('k') | Source/core/dom/StyleSheetCollection.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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, 2011, 2012 Apple Inc. All r ights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 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) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved.
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 , m_ignorePendingStylesheets(false) 94 , m_ignorePendingStylesheets(false)
95 , m_didCalculateResolver(false) 95 , m_didCalculateResolver(false)
96 // We don't need to create CSSFontSelector for imported document or 96 // We don't need to create CSSFontSelector for imported document or
97 // HTMLTemplateElement's document, because those documents have no frame. 97 // HTMLTemplateElement's document, because those documents have no frame.
98 , m_fontSelector(document.frame() ? CSSFontSelector::create(&document) : nul lptr) 98 , m_fontSelector(document.frame() ? CSSFontSelector::create(&document) : nul lptr)
99 { 99 {
100 } 100 }
101 101
102 StyleEngine::~StyleEngine() 102 StyleEngine::~StyleEngine()
103 { 103 {
104 }
105
106 void StyleEngine::detachFromDocument()
107 {
108 // Cleanup is performed eagerly when the StyleEngine is removed from the
109 // document. The StyleEngine is unreachable after this, since only the
110 // document has a reference to it.
104 for (unsigned i = 0; i < m_injectedAuthorStyleSheets.size(); ++i) 111 for (unsigned i = 0; i < m_injectedAuthorStyleSheets.size(); ++i)
105 m_injectedAuthorStyleSheets[i]->clearOwnerNode(); 112 m_injectedAuthorStyleSheets[i]->clearOwnerNode();
106 for (unsigned i = 0; i < m_authorStyleSheets.size(); ++i) 113 for (unsigned i = 0; i < m_authorStyleSheets.size(); ++i)
107 m_authorStyleSheets[i]->clearOwnerNode(); 114 m_authorStyleSheets[i]->clearOwnerNode();
108 115
109 if (m_fontSelector) { 116 if (m_fontSelector) {
110 m_fontSelector->clearDocument(); 117 m_fontSelector->clearDocument();
111 if (m_resolver) 118 if (m_resolver)
112 m_fontSelector->unregisterForInvalidationCallbacks(m_resolver.get()) ; 119 m_fontSelector->unregisterForInvalidationCallbacks(m_resolver.get()) ;
113 } 120 }
121
122 // Decrement reference counts for things we could be keeping alive.
123 m_fontSelector.clear();
124 m_resolver.clear();
125 m_styleSheetCollectionMap.clear();
114 } 126 }
115 127
116 inline Document* StyleEngine::master() 128 inline Document* StyleEngine::master()
117 { 129 {
118 if (isMaster()) 130 if (isMaster())
119 return &m_document; 131 return &m_document;
120 HTMLImport* import = m_document.import(); 132 HTMLImport* import = m_document.import();
121 if (!import) // Document::import() can return null while executing its destr uctor. 133 if (!import) // Document::import() can return null while executing its destr uctor.
122 return 0; 134 return 0;
123 return import->master(); 135 return import->master();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 { 177 {
166 if (treeScope == m_document) 178 if (treeScope == m_document)
167 return &m_documentStyleSheetCollection; 179 return &m_documentStyleSheetCollection;
168 180
169 HashMap<TreeScope*, OwnPtr<TreeScopeStyleSheetCollection> >::iterator it = m _styleSheetCollectionMap.find(&treeScope); 181 HashMap<TreeScope*, OwnPtr<TreeScopeStyleSheetCollection> >::iterator it = m _styleSheetCollectionMap.find(&treeScope);
170 if (it == m_styleSheetCollectionMap.end()) 182 if (it == m_styleSheetCollectionMap.end())
171 return 0; 183 return 0;
172 return it->value.get(); 184 return it->value.get();
173 } 185 }
174 186
175 const Vector<RefPtr<StyleSheet> >& StyleEngine::styleSheetsForStyleSheetList(Tre eScope& treeScope) 187 const WillBeHeapVector<RefPtrWillBeMember<StyleSheet> >& StyleEngine::styleSheet sForStyleSheetList(TreeScope& treeScope)
176 { 188 {
177 if (treeScope == m_document) 189 if (treeScope == m_document)
178 return m_documentStyleSheetCollection.styleSheetsForStyleSheetList(); 190 return m_documentStyleSheetCollection.styleSheetsForStyleSheetList();
179 191
180 return ensureStyleSheetCollectionFor(treeScope)->styleSheetsForStyleSheetLis t(); 192 return ensureStyleSheetCollectionFor(treeScope)->styleSheetsForStyleSheetLis t();
181 } 193 }
182 194
183 const Vector<RefPtr<CSSStyleSheet> >& StyleEngine::activeAuthorStyleSheets() con st 195 const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet> >& StyleEngine::activeA uthorStyleSheets() const
184 { 196 {
185 return m_documentStyleSheetCollection.activeAuthorStyleSheets(); 197 return m_documentStyleSheetCollection.activeAuthorStyleSheets();
186 } 198 }
187 199
188 void StyleEngine::combineCSSFeatureFlags(const RuleFeatureSet& features) 200 void StyleEngine::combineCSSFeatureFlags(const RuleFeatureSet& features)
189 { 201 {
190 // Delay resetting the flags until after next style recalc since unapplying the style may not work without these set (this is true at least with before/afte r). 202 // Delay resetting the flags until after next style recalc since unapplying the style may not work without these set (this is true at least with before/afte r).
191 m_usesSiblingRules = m_usesSiblingRules || features.usesSiblingRules(); 203 m_usesSiblingRules = m_usesSiblingRules || features.usesSiblingRules();
192 m_usesFirstLineRules = m_usesFirstLineRules || features.usesFirstLineRules() ; 204 m_usesFirstLineRules = m_usesFirstLineRules || features.usesFirstLineRules() ;
193 m_maxDirectAdjacentSelectors = max(m_maxDirectAdjacentSelectors, features.ma xDirectAdjacentSelectors()); 205 m_maxDirectAdjacentSelectors = max(m_maxDirectAdjacentSelectors, features.ma xDirectAdjacentSelectors());
194 } 206 }
195 207
196 void StyleEngine::resetCSSFeatureFlags(const RuleFeatureSet& features) 208 void StyleEngine::resetCSSFeatureFlags(const RuleFeatureSet& features)
197 { 209 {
198 m_usesSiblingRules = features.usesSiblingRules(); 210 m_usesSiblingRules = features.usesSiblingRules();
199 m_usesFirstLineRules = features.usesFirstLineRules(); 211 m_usesFirstLineRules = features.usesFirstLineRules();
200 m_maxDirectAdjacentSelectors = features.maxDirectAdjacentSelectors(); 212 m_maxDirectAdjacentSelectors = features.maxDirectAdjacentSelectors();
201 } 213 }
202 214
203 const Vector<RefPtr<CSSStyleSheet> >& StyleEngine::injectedAuthorStyleSheets() c onst 215 const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet> >& StyleEngine::injecte dAuthorStyleSheets() const
204 { 216 {
205 updateInjectedStyleSheetCache(); 217 updateInjectedStyleSheetCache();
206 return m_injectedAuthorStyleSheets; 218 return m_injectedAuthorStyleSheets;
207 } 219 }
208 220
209 void StyleEngine::updateInjectedStyleSheetCache() const 221 void StyleEngine::updateInjectedStyleSheetCache() const
210 { 222 {
211 if (m_injectedStyleSheetCacheValid) 223 if (m_injectedStyleSheetCacheValid)
212 return; 224 return;
213 m_injectedStyleSheetCacheValid = true; 225 m_injectedStyleSheetCacheValid = true;
214 m_injectedAuthorStyleSheets.clear(); 226 m_injectedAuthorStyleSheets.clear();
215 227
216 Page* owningPage = m_document.page(); 228 Page* owningPage = m_document.page();
217 if (!owningPage) 229 if (!owningPage)
218 return; 230 return;
219 231
220 const InjectedStyleSheetEntryVector& entries = InjectedStyleSheets::instance ().entries(); 232 const InjectedStyleSheetEntryVector& entries = InjectedStyleSheets::instance ().entries();
221 for (unsigned i = 0; i < entries.size(); ++i) { 233 for (unsigned i = 0; i < entries.size(); ++i) {
222 const InjectedStyleSheetEntry* entry = entries[i].get(); 234 const InjectedStyleSheetEntry* entry = entries[i].get();
223 if (entry->injectedFrames() == InjectStyleInTopFrameOnly && m_document.o wnerElement()) 235 if (entry->injectedFrames() == InjectStyleInTopFrameOnly && m_document.o wnerElement())
224 continue; 236 continue;
225 if (!URLPatternMatcher::matchesPatterns(m_document.url(), entry->whiteli st())) 237 if (!URLPatternMatcher::matchesPatterns(m_document.url(), entry->whiteli st()))
226 continue; 238 continue;
227 RefPtr<CSSStyleSheet> groupSheet = CSSStyleSheet::createInline(const_cas t<Document*>(&m_document), KURL()); 239 RefPtrWillBeRawPtr<CSSStyleSheet> groupSheet = CSSStyleSheet::createInli ne(const_cast<Document*>(&m_document), KURL());
228 m_injectedAuthorStyleSheets.append(groupSheet); 240 m_injectedAuthorStyleSheets.append(groupSheet);
229 groupSheet->contents()->parseString(entry->source()); 241 groupSheet->contents()->parseString(entry->source());
230 } 242 }
231 } 243 }
232 244
233 void StyleEngine::invalidateInjectedStyleSheetCache() 245 void StyleEngine::invalidateInjectedStyleSheetCache()
234 { 246 {
235 m_injectedStyleSheetCacheValid = false; 247 m_injectedStyleSheetCacheValid = false;
236 markDocumentDirty(); 248 markDocumentDirty();
237 // FIXME: updateInjectedStyleSheetCache is called inside StyleSheetCollectio n::updateActiveStyleSheets 249 // FIXME: updateInjectedStyleSheetCache is called inside StyleSheetCollectio n::updateActiveStyleSheets
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 void StyleEngine::clearMediaQueryRuleSetStyleSheets() 371 void StyleEngine::clearMediaQueryRuleSetStyleSheets()
360 { 372 {
361 m_documentStyleSheetCollection.clearMediaQueryRuleSetStyleSheets(); 373 m_documentStyleSheetCollection.clearMediaQueryRuleSetStyleSheets();
362 clearMediaQueryRuleSetOnTreeScopeStyleSheets(m_activeTreeScopes); 374 clearMediaQueryRuleSetOnTreeScopeStyleSheets(m_activeTreeScopes);
363 clearMediaQueryRuleSetOnTreeScopeStyleSheets(m_dirtyTreeScopes); 375 clearMediaQueryRuleSetOnTreeScopeStyleSheets(m_dirtyTreeScopes);
364 } 376 }
365 377
366 void StyleEngine::updateStyleSheetsInImport(DocumentStyleSheetCollector& parentC ollector) 378 void StyleEngine::updateStyleSheetsInImport(DocumentStyleSheetCollector& parentC ollector)
367 { 379 {
368 ASSERT(!isMaster()); 380 ASSERT(!isMaster());
369 Vector<RefPtr<StyleSheet> > sheetsForList; 381 WillBeHeapVector<RefPtrWillBeMember<StyleSheet> > sheetsForList;
370 ImportedDocumentStyleSheetCollector subcollector(parentCollector, sheetsForL ist); 382 ImportedDocumentStyleSheetCollector subcollector(parentCollector, sheetsForL ist);
371 m_documentStyleSheetCollection.collectStyleSheets(this, subcollector); 383 m_documentStyleSheetCollection.collectStyleSheets(this, subcollector);
372 m_documentStyleSheetCollection.swapSheetsForSheetList(sheetsForList); 384 m_documentStyleSheetCollection.swapSheetsForSheetList(sheetsForList);
373 } 385 }
374 386
375 bool StyleEngine::updateActiveStyleSheets(StyleResolverUpdateMode updateMode) 387 bool StyleEngine::updateActiveStyleSheets(StyleResolverUpdateMode updateMode)
376 { 388 {
377 ASSERT(isMaster()); 389 ASSERT(isMaster());
378 ASSERT(!m_document.inStyleRecalc()); 390 ASSERT(!m_document.inStyleRecalc());
379 391
(...skipping 24 matching lines...) Expand all
404 416
405 InspectorInstrumentation::activeStyleSheetsUpdated(&m_document); 417 InspectorInstrumentation::activeStyleSheetsUpdated(&m_document);
406 m_usesRemUnits = m_documentStyleSheetCollection.usesRemUnits(); 418 m_usesRemUnits = m_documentStyleSheetCollection.usesRemUnits();
407 419
408 m_dirtyTreeScopes.clear(); 420 m_dirtyTreeScopes.clear();
409 m_documentScopeDirty = false; 421 m_documentScopeDirty = false;
410 422
411 return requiresFullStyleRecalc; 423 return requiresFullStyleRecalc;
412 } 424 }
413 425
414 const Vector<RefPtr<StyleSheet> > StyleEngine::activeStyleSheetsForInspector() c onst 426 const WillBeHeapVector<RefPtrWillBeMember<StyleSheet> > StyleEngine::activeStyle SheetsForInspector() const
415 { 427 {
416 if (m_activeTreeScopes.isEmpty()) 428 if (m_activeTreeScopes.isEmpty())
417 return m_documentStyleSheetCollection.styleSheetsForStyleSheetList(); 429 return m_documentStyleSheetCollection.styleSheetsForStyleSheetList();
418 430
419 Vector<RefPtr<StyleSheet> > activeStyleSheets; 431 WillBeHeapVector<RefPtrWillBeMember<StyleSheet> > activeStyleSheets;
420 432
421 activeStyleSheets.appendVector(m_documentStyleSheetCollection.styleSheetsFor StyleSheetList()); 433 activeStyleSheets.appendVector(m_documentStyleSheetCollection.styleSheetsFor StyleSheetList());
422 434
423 TreeScopeSet::const_iterator begin = m_activeTreeScopes.begin(); 435 TreeScopeSet::const_iterator begin = m_activeTreeScopes.begin();
424 TreeScopeSet::const_iterator end = m_activeTreeScopes.end(); 436 TreeScopeSet::const_iterator end = m_activeTreeScopes.end();
425 for (TreeScopeSet::const_iterator it = begin; it != end; ++it) { 437 for (TreeScopeSet::const_iterator it = begin; it != end; ++it) {
426 if (TreeScopeStyleSheetCollection* collection = m_styleSheetCollectionMa p.get(*it)) 438 if (TreeScopeStyleSheetCollection* collection = m_styleSheetCollectionMa p.get(*it))
427 activeStyleSheets.appendVector(collection->styleSheetsForStyleSheetL ist()); 439 activeStyleSheets.appendVector(collection->styleSheetsForStyleSheetL ist());
428 } 440 }
429 441
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 void StyleEngine::removeSheet(StyleSheetContents* contents) 633 void StyleEngine::removeSheet(StyleSheetContents* contents)
622 { 634 {
623 WillBeHeapHashMap<RawPtrWillBeWeakMember<StyleSheetContents>, AtomicString>: :iterator it = sheetToTextCache().find(contents); 635 WillBeHeapHashMap<RawPtrWillBeWeakMember<StyleSheetContents>, AtomicString>: :iterator it = sheetToTextCache().find(contents);
624 if (it == sheetToTextCache().end()) 636 if (it == sheetToTextCache().end())
625 return; 637 return;
626 638
627 textToSheetCache().remove(it->value); 639 textToSheetCache().remove(it->value);
628 sheetToTextCache().remove(contents); 640 sheetToTextCache().remove(contents);
629 } 641 }
630 642
643 void StyleEngine::trace(Visitor* visitor)
644 {
645 visitor->trace(m_injectedAuthorStyleSheets);
646 visitor->trace(m_authorStyleSheets);
631 } 647 }
648
649 }
OLDNEW
« no previous file with comments | « Source/core/dom/StyleEngine.h ('k') | Source/core/dom/StyleSheetCollection.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698