Title: [141373] trunk/Source/WebCore
Revision
141373
Author
[email protected]
Date
2013-01-30 21:03:58 -0800 (Wed, 30 Jan 2013)

Log Message

Split CSSOMWrapper data and functions out from StyleResolver into its own class.
https://bugs.webkit.org/show_bug.cgi?id=107779

Reviewed by Dimitri Glazkov.

Factored CSSOMWrapper logic and data out from StyleResolver into a
InspectorCSSOMWrappers class.  Since InspectorCSSOMWrappers
depends on static variables defined in StyleResolver.cpp, this
patch does not extract a new class into a new file, which makes a
review easier since it produces readable diffs.

After we factor static variables related to default style sheets
in a following patch (bug 107780), I'll move
InspectorCSSOMWrappers into a its own file.

No new tests, refactoring only.

* css/StyleResolver.cpp:
(WebCore):
(WebCore::StyleResolver::appendAuthorStyleSheets):
(WebCore::InspectorCSSOMWrappers::collectFromStyleSheetIfNeeded):
(WebCore::InspectorCSSOMWrappers::collect):
(WebCore::InspectorCSSOMWrappers::collectFromStyleSheetContents): Name it explicitly rather than overloading.
(WebCore::InspectorCSSOMWrappers::collectFromStyleSheets): Name it explicitly rather than overloading.
(WebCore::InspectorCSSOMWrappers::collectFromDocumentStyleSheetCollection): Name it explicitly rather than overloading.
(WebCore::InspectorCSSOMWrappers::getWrapperForRuleInSheets): Renamed from ensureFullCSSOMWrapperForInspector().
(WebCore::InspectorCSSOMWrappers::reportMemoryUsage):
(WebCore::StyleResolver::reportMemoryUsage):
* css/StyleResolver.h:
(InspectorCSSOMWrappers):
(WebCore):
(StyleResolver):
(WebCore::StyleResolver::inspectorCSSOMWrappers):
* inspector/InspectorCSSAgent.cpp:
(WebCore::InspectorCSSAgent::willMatchRule):
(WebCore::InspectorCSSAgent::willProcessRule):
(WebCore::InspectorCSSAgent::buildObjectForRule):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (141372 => 141373)


--- trunk/Source/WebCore/ChangeLog	2013-01-31 05:02:03 UTC (rev 141372)
+++ trunk/Source/WebCore/ChangeLog	2013-01-31 05:03:58 UTC (rev 141373)
@@ -1,3 +1,43 @@
+2013-01-30  Hayato Ito  <[email protected]>
+
+        Split CSSOMWrapper data and functions out from StyleResolver into its own class.
+        https://bugs.webkit.org/show_bug.cgi?id=107779
+
+        Reviewed by Dimitri Glazkov.
+
+        Factored CSSOMWrapper logic and data out from StyleResolver into a
+        InspectorCSSOMWrappers class.  Since InspectorCSSOMWrappers
+        depends on static variables defined in StyleResolver.cpp, this
+        patch does not extract a new class into a new file, which makes a
+        review easier since it produces readable diffs.
+
+        After we factor static variables related to default style sheets
+        in a following patch (bug 107780), I'll move
+        InspectorCSSOMWrappers into a its own file.
+
+        No new tests, refactoring only.
+
+        * css/StyleResolver.cpp:
+        (WebCore):
+        (WebCore::StyleResolver::appendAuthorStyleSheets):
+        (WebCore::InspectorCSSOMWrappers::collectFromStyleSheetIfNeeded):
+        (WebCore::InspectorCSSOMWrappers::collect):
+        (WebCore::InspectorCSSOMWrappers::collectFromStyleSheetContents): Name it explicitly rather than overloading.
+        (WebCore::InspectorCSSOMWrappers::collectFromStyleSheets): Name it explicitly rather than overloading.
+        (WebCore::InspectorCSSOMWrappers::collectFromDocumentStyleSheetCollection): Name it explicitly rather than overloading.
+        (WebCore::InspectorCSSOMWrappers::getWrapperForRuleInSheets): Renamed from ensureFullCSSOMWrapperForInspector().
+        (WebCore::InspectorCSSOMWrappers::reportMemoryUsage):
+        (WebCore::StyleResolver::reportMemoryUsage):
+        * css/StyleResolver.h:
+        (InspectorCSSOMWrappers):
+        (WebCore):
+        (StyleResolver):
+        (WebCore::StyleResolver::inspectorCSSOMWrappers):
+        * inspector/InspectorCSSAgent.cpp:
+        (WebCore::InspectorCSSAgent::willMatchRule):
+        (WebCore::InspectorCSSAgent::willProcessRule):
+        (WebCore::InspectorCSSAgent::buildObjectForRule):
+
 2013-01-30  Sheriff Bot  <[email protected]>
 
         Unreviewed, rolling out r141358.

Modified: trunk/Source/WebCore/css/StyleResolver.cpp (141372 => 141373)


--- trunk/Source/WebCore/css/StyleResolver.cpp	2013-01-31 05:02:03 UTC (rev 141372)
+++ trunk/Source/WebCore/css/StyleResolver.cpp	2013-01-31 05:03:58 UTC (rev 141373)
@@ -228,8 +228,6 @@
 
 static void loadFullDefaultStyle();
 static void loadSimpleDefaultStyle();
-template <class ListType>
-static void collectCSSOMWrappers(HashMap<StyleRule*, RefPtr<CSSStyleRule> >&, ListType*);
 
 // FIXME: It would be nice to use some mechanism that guarantees this is in sync with the real UA stylesheet.
 static const char* simpleUserAgentStyleSheet = "html,body,div{display:block}head{display:none}body{margin:8px}div:focus,span:focus{outline:auto 5px -webkit-focus-ring-color}a:-webkit-any-link{color:-webkit-link;text-decoration:underline}a:-webkit-any-link:active{color:-webkit-activelink}";
@@ -394,8 +392,7 @@
 #endif
 
         m_authorStyle->addRulesFromSheet(sheet, *m_medium, this);
-        if (!m_styleRuleToCSSOMWrapperMap.isEmpty())
-            collectCSSOMWrappers(m_styleRuleToCSSOMWrapperMap, cssSheet);
+        m_inspectorCSSOMWrappers.collectFromStyleSheetIfNeeded(cssSheet);
     }
     m_authorStyle->shrinkToFit();
     collectFeatures();
@@ -2675,8 +2672,14 @@
     return "";
 }
 
+void InspectorCSSOMWrappers::collectFromStyleSheetIfNeeded(CSSStyleSheet* styleSheet)
+{
+    if (!m_styleRuleToCSSOMWrapperMap.isEmpty())
+        collect(styleSheet);
+}
+
 template <class ListType>
-static void collectCSSOMWrappers(HashMap<StyleRule*, RefPtr<CSSStyleRule> >& wrapperMap, ListType* listType)
+void InspectorCSSOMWrappers::collect(ListType* listType)
 {
     if (!listType)
         return;
@@ -2685,28 +2688,28 @@
         CSSRule* cssRule = listType->item(i);
         switch (cssRule->type()) {
         case CSSRule::IMPORT_RULE:
-            collectCSSOMWrappers(wrapperMap, static_cast<CSSImportRule*>(cssRule)->styleSheet());
+            collect(static_cast<CSSImportRule*>(cssRule)->styleSheet());
             break;
         case CSSRule::MEDIA_RULE:
-            collectCSSOMWrappers(wrapperMap, static_cast<CSSMediaRule*>(cssRule));
+            collect(static_cast<CSSMediaRule*>(cssRule));
             break;
 #if ENABLE(CSS3_CONDITIONAL_RULES)
         case CSSRule::SUPPORTS_RULE:
-            collectCSSOMWrappers(wrapperMap, static_cast<CSSSupportsRule*>(cssRule));
+            collectCSSOMWrappers(static_cast<CSSSupportsRule*>(cssRule));
             break;
 #endif
 #if ENABLE(CSS_REGIONS)
         case CSSRule::WEBKIT_REGION_RULE:
-            collectCSSOMWrappers(wrapperMap, static_cast<WebKitCSSRegionRule*>(cssRule));
+            collect(static_cast<WebKitCSSRegionRule*>(cssRule));
             break;
 #endif
 #if ENABLE(SHADOW_DOM)
         case CSSRule::HOST_RULE:
-            collectCSSOMWrappers(wrapperMap, static_cast<CSSHostRule*>(cssRule));
+            collect(static_cast<CSSHostRule*>(cssRule));
             break;
 #endif
         case CSSRule::STYLE_RULE:
-            wrapperMap.add(static_cast<CSSStyleRule*>(cssRule)->styleRule(), static_cast<CSSStyleRule*>(cssRule));
+            m_styleRuleToCSSOMWrapperMap.add(static_cast<CSSStyleRule*>(cssRule)->styleRule(), static_cast<CSSStyleRule*>(cssRule));
             break;
         default:
             break;
@@ -2714,45 +2717,52 @@
     }
 }
 
-static void collectCSSOMWrappers(HashMap<StyleRule*, RefPtr<CSSStyleRule> >& wrapperMap, HashSet<RefPtr<CSSStyleSheet> >& sheetWrapperSet, StyleSheetContents* styleSheet)
+void InspectorCSSOMWrappers::collectFromStyleSheetContents(HashSet<RefPtr<CSSStyleSheet> >& sheetWrapperSet, StyleSheetContents* styleSheet)
 {
     if (!styleSheet)
         return;
     RefPtr<CSSStyleSheet> styleSheetWrapper = CSSStyleSheet::create(styleSheet);
     sheetWrapperSet.add(styleSheetWrapper);
-    collectCSSOMWrappers(wrapperMap, styleSheetWrapper.get());
+    collect(styleSheetWrapper.get());
 }
 
-static void collectCSSOMWrappers(HashMap<StyleRule*, RefPtr<CSSStyleRule> >& wrapperMap, const Vector<RefPtr<CSSStyleSheet> >& sheets)
+void InspectorCSSOMWrappers::collectFromStyleSheets(const Vector<RefPtr<CSSStyleSheet> >& sheets)
 {
     for (unsigned i = 0; i < sheets.size(); ++i)
-        collectCSSOMWrappers(wrapperMap, sheets[i].get());
+        collect(sheets[i].get());
 }
 
-static void collectCSSOMWrappers(HashMap<StyleRule*, RefPtr<CSSStyleRule> >& wrapperMap, DocumentStyleSheetCollection* styleSheetCollection)
+void InspectorCSSOMWrappers::collectFromDocumentStyleSheetCollection(DocumentStyleSheetCollection* styleSheetCollection)
 {
-    collectCSSOMWrappers(wrapperMap, styleSheetCollection->activeAuthorStyleSheets());
-    collectCSSOMWrappers(wrapperMap, styleSheetCollection->pageUserSheet());
-    collectCSSOMWrappers(wrapperMap, styleSheetCollection->injectedUserStyleSheets());
-    collectCSSOMWrappers(wrapperMap, styleSheetCollection->documentUserStyleSheets());
+    collectFromStyleSheets(styleSheetCollection->activeAuthorStyleSheets());
+    collect(styleSheetCollection->pageUserSheet());
+    collectFromStyleSheets(styleSheetCollection->injectedUserStyleSheets());
+    collectFromStyleSheets(styleSheetCollection->documentUserStyleSheets());
 }
 
-CSSStyleRule* StyleResolver::ensureFullCSSOMWrapperForInspector(StyleRule* rule)
+CSSStyleRule* InspectorCSSOMWrappers::getWrapperForRuleInSheets(StyleRule* rule, DocumentStyleSheetCollection* styleSheetCollection)
 {
     if (m_styleRuleToCSSOMWrapperMap.isEmpty()) {
-        collectCSSOMWrappers(m_styleRuleToCSSOMWrapperMap, m_styleSheetCSSOMWrapperSet, simpleDefaultStyleSheet);
-        collectCSSOMWrappers(m_styleRuleToCSSOMWrapperMap, m_styleSheetCSSOMWrapperSet, defaultStyleSheet);
-        collectCSSOMWrappers(m_styleRuleToCSSOMWrapperMap, m_styleSheetCSSOMWrapperSet, quirksStyleSheet);
-        collectCSSOMWrappers(m_styleRuleToCSSOMWrapperMap, m_styleSheetCSSOMWrapperSet, svgStyleSheet);
-        collectCSSOMWrappers(m_styleRuleToCSSOMWrapperMap, m_styleSheetCSSOMWrapperSet, mathMLStyleSheet);
-        collectCSSOMWrappers(m_styleRuleToCSSOMWrapperMap, m_styleSheetCSSOMWrapperSet, mediaControlsStyleSheet);
-        collectCSSOMWrappers(m_styleRuleToCSSOMWrapperMap, m_styleSheetCSSOMWrapperSet, fullscreenStyleSheet);
+        collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, simpleDefaultStyleSheet);
+        collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, defaultStyleSheet);
+        collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, quirksStyleSheet);
+        collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, svgStyleSheet);
+        collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, mathMLStyleSheet);
+        collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, mediaControlsStyleSheet);
+        collectFromStyleSheetContents(m_styleSheetCSSOMWrapperSet, fullscreenStyleSheet);
 
-        collectCSSOMWrappers(m_styleRuleToCSSOMWrapperMap, document()->styleSheetCollection());
+        collectFromDocumentStyleSheetCollection(styleSheetCollection);
     }
     return m_styleRuleToCSSOMWrapperMap.get(rule).get();
 }
 
+void InspectorCSSOMWrappers::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const
+{
+    MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS);
+    info.addMember(m_styleRuleToCSSOMWrapperMap);
+    info.addMember(m_styleSheetCSSOMWrapperSet);
+}
+
 void StyleResolver::applyPropertyToStyle(CSSPropertyID id, CSSValue* value, RenderStyle* style)
 {
     initElement(0);
@@ -5462,8 +5472,7 @@
     info.addMember(m_fontSelector);
     info.addMember(m_viewportDependentMediaQueryResults);
     info.ignoreMember(m_styleBuilder);
-    info.addMember(m_styleRuleToCSSOMWrapperMap);
-    info.addMember(m_styleSheetCSSOMWrapperSet);
+    info.addMember(m_inspectorCSSOMWrappers);
 #if ENABLE(CSS_FILTERS) && ENABLE(SVG)
     info.addMember(m_pendingSVGDocuments);
 #endif

Modified: trunk/Source/WebCore/css/StyleResolver.h (141372 => 141373)


--- trunk/Source/WebCore/css/StyleResolver.h	2013-01-31 05:02:03 UTC (rev 141372)
+++ trunk/Source/WebCore/css/StyleResolver.h	2013-01-31 05:03:58 UTC (rev 141373)
@@ -132,6 +132,27 @@
     MatchOnlyUserAgentRules,
 };
 
+class InspectorCSSOMWrappers {
+public:
+    // WARNING. This will construct CSSOM wrappers for all style rules and cache them in a map for significant memory cost.
+    // It is here to support inspector. Don't use for any regular engine functions.
+    CSSStyleRule* getWrapperForRuleInSheets(StyleRule*, DocumentStyleSheetCollection*);
+    void collectFromStyleSheetIfNeeded(CSSStyleSheet*);
+
+    void reportMemoryUsage(MemoryObjectInfo*) const;
+
+private:
+    template <class ListType>
+    void collect(ListType*);
+
+    void collectFromStyleSheetContents(HashSet<RefPtr<CSSStyleSheet> >& sheetWrapperSet, StyleSheetContents*);
+    void collectFromStyleSheets(const Vector<RefPtr<CSSStyleSheet> >&);
+    void collectFromDocumentStyleSheetCollection(DocumentStyleSheetCollection*);
+
+    HashMap<StyleRule*, RefPtr<CSSStyleRule> > m_styleRuleToCSSOMWrapperMap;
+    HashSet<RefPtr<CSSStyleSheet> > m_styleSheetCSSOMWrapperSet;
+};
+
 // This class selects a RenderStyle for a given element based on a collection of stylesheets.
 class StyleResolver {
     WTF_MAKE_NONCOPYABLE(StyleResolver); WTF_MAKE_FAST_ALLOCATED;
@@ -275,10 +296,6 @@
     static bool createTransformOperations(CSSValue* inValue, RenderStyle* inStyle, RenderStyle* rootStyle, TransformOperations& outOperations);
     
     void invalidateMatchedPropertiesCache();
-    
-    // WARNING. This will construct CSSOM wrappers for all style rules and cache then in a map for significant memory cost.
-    // It is here to support inspector. Don't use for any regular engine functions.
-    CSSStyleRule* ensureFullCSSOMWrapperForInspector(StyleRule*);
 
 #if ENABLE(CSS_FILTERS)
     bool createFilterOperations(CSSValue* inValue, RenderStyle* inStyle, RenderStyle* rootStyle, FilterOperations& outOperations);
@@ -444,6 +461,7 @@
     static Length convertToFloatLength(CSSPrimitiveValue*, RenderStyle*, RenderStyle* rootStyle, double multiplier = 1);
 
     CSSToStyleMap* styleMap() { return &m_styleMap; }
+    InspectorCSSOMWrappers& inspectorCSSOMWrappers() { return m_inspectorCSSOMWrappers; }
 
     void reportMemoryUsage(MemoryObjectInfo*) const;
     
@@ -535,9 +553,6 @@
     bool m_applyPropertyToRegularStyle;
     bool m_applyPropertyToVisitedLinkStyle;
     const StyleBuilder& m_styleBuilder;
-    
-    HashMap<StyleRule*, RefPtr<CSSStyleRule> > m_styleRuleToCSSOMWrapperMap;
-    HashSet<RefPtr<CSSStyleSheet> > m_styleSheetCSSOMWrapperSet;
 
 #if ENABLE(CSS_SHADERS)
     bool m_hasPendingShaders;
@@ -549,6 +564,7 @@
 
     OwnPtr<StyleScopeResolver> m_scopeResolver;
     CSSToStyleMap m_styleMap;
+    InspectorCSSOMWrappers m_inspectorCSSOMWrappers;
 
     friend class StyleBuilder;
     friend bool operator==(const MatchedProperties&, const MatchedProperties&);

Modified: trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp (141372 => 141373)


--- trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp	2013-01-31 05:02:03 UTC (rev 141372)
+++ trunk/Source/WebCore/inspector/InspectorCSSAgent.cpp	2013-01-31 05:03:58 UTC (rev 141373)
@@ -959,7 +959,7 @@
 void InspectorCSSAgent::willMatchRule(StyleRule* rule, StyleResolver* styleResolver)
 {
     if (m_currentSelectorProfile)
-        m_currentSelectorProfile->startSelector(styleResolver->ensureFullCSSOMWrapperForInspector(rule));
+        m_currentSelectorProfile->startSelector(styleResolver->inspectorCSSOMWrappers().getWrapperForRuleInSheets(rule, styleResolver->document()->styleSheetCollection()));
 }
 
 void InspectorCSSAgent::didMatchRule(bool matched)
@@ -971,7 +971,7 @@
 void InspectorCSSAgent::willProcessRule(StyleRule* rule, StyleResolver* styleResolver)
 {
     if (m_currentSelectorProfile)
-        m_currentSelectorProfile->startSelector(styleResolver->ensureFullCSSOMWrapperForInspector(rule));
+        m_currentSelectorProfile->startSelector(styleResolver->inspectorCSSOMWrappers().getWrapperForRuleInSheets(rule, styleResolver->document()->styleSheetCollection()));
 }
 
 void InspectorCSSAgent::didProcessRule()
@@ -1125,7 +1125,7 @@
     // Since the inspector wants to walk the parent chain, we construct the full wrappers here.
     // FIXME: This could be factored better. StyleResolver::styleRulesForElement should return a StyleRule vector, not a CSSRuleList.
     if (!rule->parentStyleSheet()) {
-        rule = styleResolver->ensureFullCSSOMWrapperForInspector(rule->styleRule());
+        rule = styleResolver->inspectorCSSOMWrappers().getWrapperForRuleInSheets(rule->styleRule(), styleResolver->document()->styleSheetCollection());
         if (!rule)
             return 0;
     }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to