Index: Source/core/dom/StyleEngine.cpp |
diff --git a/Source/core/dom/StyleEngine.cpp b/Source/core/dom/StyleEngine.cpp |
index 2de67f7ad04984c5061f54ba1091979247803928..ecfca69f3f40463fc03afb98bd5dbaef30a77d40 100644 |
--- a/Source/core/dom/StyleEngine.cpp |
+++ b/Source/core/dom/StyleEngine.cpp |
@@ -101,6 +101,13 @@ StyleEngine::StyleEngine(Document& document) |
StyleEngine::~StyleEngine() |
{ |
+} |
+ |
+void StyleEngine::detachFromDocument() |
+{ |
+ // Cleanup is performed eagerly when the StyleEngine is removed from the |
+ // document. The StyleEngine is unreachable after this, since only the |
+ // document has a reference to it. |
for (unsigned i = 0; i < m_injectedAuthorStyleSheets.size(); ++i) |
m_injectedAuthorStyleSheets[i]->clearOwnerNode(); |
for (unsigned i = 0; i < m_authorStyleSheets.size(); ++i) |
@@ -111,6 +118,11 @@ StyleEngine::~StyleEngine() |
if (m_resolver) |
m_fontSelector->unregisterForInvalidationCallbacks(m_resolver.get()); |
} |
+ |
+ // Decrement reference counts for things we could be keeping alive. |
+ m_fontSelector.clear(); |
+ m_resolver.clear(); |
+ m_styleSheetCollectionMap.clear(); |
} |
inline Document* StyleEngine::master() |
@@ -172,7 +184,7 @@ TreeScopeStyleSheetCollection* StyleEngine::styleSheetCollectionFor(TreeScope& t |
return it->value.get(); |
} |
-const Vector<RefPtr<StyleSheet> >& StyleEngine::styleSheetsForStyleSheetList(TreeScope& treeScope) |
+const WillBeHeapVector<RefPtrWillBeMember<StyleSheet> >& StyleEngine::styleSheetsForStyleSheetList(TreeScope& treeScope) |
{ |
if (treeScope == m_document) |
return m_documentStyleSheetCollection.styleSheetsForStyleSheetList(); |
@@ -180,7 +192,7 @@ const Vector<RefPtr<StyleSheet> >& StyleEngine::styleSheetsForStyleSheetList(Tre |
return ensureStyleSheetCollectionFor(treeScope)->styleSheetsForStyleSheetList(); |
} |
-const Vector<RefPtr<CSSStyleSheet> >& StyleEngine::activeAuthorStyleSheets() const |
+const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet> >& StyleEngine::activeAuthorStyleSheets() const |
{ |
return m_documentStyleSheetCollection.activeAuthorStyleSheets(); |
} |
@@ -200,7 +212,7 @@ void StyleEngine::resetCSSFeatureFlags(const RuleFeatureSet& features) |
m_maxDirectAdjacentSelectors = features.maxDirectAdjacentSelectors(); |
} |
-const Vector<RefPtr<CSSStyleSheet> >& StyleEngine::injectedAuthorStyleSheets() const |
+const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet> >& StyleEngine::injectedAuthorStyleSheets() const |
{ |
updateInjectedStyleSheetCache(); |
return m_injectedAuthorStyleSheets; |
@@ -224,7 +236,7 @@ void StyleEngine::updateInjectedStyleSheetCache() const |
continue; |
if (!URLPatternMatcher::matchesPatterns(m_document.url(), entry->whitelist())) |
continue; |
- RefPtr<CSSStyleSheet> groupSheet = CSSStyleSheet::createInline(const_cast<Document*>(&m_document), KURL()); |
+ RefPtrWillBeRawPtr<CSSStyleSheet> groupSheet = CSSStyleSheet::createInline(const_cast<Document*>(&m_document), KURL()); |
m_injectedAuthorStyleSheets.append(groupSheet); |
groupSheet->contents()->parseString(entry->source()); |
} |
@@ -366,7 +378,7 @@ void StyleEngine::clearMediaQueryRuleSetStyleSheets() |
void StyleEngine::updateStyleSheetsInImport(DocumentStyleSheetCollector& parentCollector) |
{ |
ASSERT(!isMaster()); |
- Vector<RefPtr<StyleSheet> > sheetsForList; |
+ WillBeHeapVector<RefPtrWillBeMember<StyleSheet> > sheetsForList; |
ImportedDocumentStyleSheetCollector subcollector(parentCollector, sheetsForList); |
m_documentStyleSheetCollection.collectStyleSheets(this, subcollector); |
m_documentStyleSheetCollection.swapSheetsForSheetList(sheetsForList); |
@@ -411,12 +423,12 @@ bool StyleEngine::updateActiveStyleSheets(StyleResolverUpdateMode updateMode) |
return requiresFullStyleRecalc; |
} |
-const Vector<RefPtr<StyleSheet> > StyleEngine::activeStyleSheetsForInspector() const |
+const WillBeHeapVector<RefPtrWillBeMember<StyleSheet> > StyleEngine::activeStyleSheetsForInspector() const |
{ |
if (m_activeTreeScopes.isEmpty()) |
return m_documentStyleSheetCollection.styleSheetsForStyleSheetList(); |
- Vector<RefPtr<StyleSheet> > activeStyleSheets; |
+ WillBeHeapVector<RefPtrWillBeMember<StyleSheet> > activeStyleSheets; |
activeStyleSheets.appendVector(m_documentStyleSheetCollection.styleSheetsForStyleSheetList()); |
@@ -628,4 +640,10 @@ void StyleEngine::removeSheet(StyleSheetContents* contents) |
sheetToTextCache().remove(contents); |
} |
+void StyleEngine::trace(Visitor* visitor) |
+{ |
+ visitor->trace(m_injectedAuthorStyleSheets); |
+ visitor->trace(m_authorStyleSheets); |
+} |
+ |
} |