Changeset 216069 in webkit


Ignore:
Timestamp:
May 2, 2017 7:30:30 AM (7 years ago)
Author:
Antti Koivisto
Message:

Document style resolvers should share user rulesets
https://bugs.webkit.org/show_bug.cgi?id=171549

Reviewed by Andreas Kling.

Large user stylesheets (like those used by ad blockers) can end up using lots of memory if
a document uses large number of shadow trees. User style is inherently per-document and
the resulting rulesets can be shared between the document and the shadow trees.

  • css/DocumentRuleSets.cpp:

(WebCore::DocumentRuleSets::DocumentRuleSets):
(WebCore::DocumentRuleSets::userStyle):

Return per-document user style for shadow trees.

(WebCore::DocumentRuleSets::collectFeatures):

  • css/DocumentRuleSets.h:

(WebCore::DocumentRuleSets::setUsesSharedUserStyle):
(WebCore::DocumentRuleSets::userStyle): Deleted.

  • css/StyleResolver.cpp:

(WebCore::StyleResolver::StyleResolver):
(WebCore::StyleResolver::initializeUserStyle):

Separate user style initialization from construction.

  • css/StyleResolver.h:
  • style/StyleScope.cpp:

(WebCore::Style::Scope::resolver):

Don't initialize user style for user agents shadow trees.

Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r216068 r216069  
     12017-05-02  Antti Koivisto  <antti@apple.com>
     2
     3        Document style resolvers should share user rulesets
     4        https://bugs.webkit.org/show_bug.cgi?id=171549
     5
     6        Reviewed by Andreas Kling.
     7
     8        Large user stylesheets (like those used by ad blockers) can end up using lots of memory if
     9        a document uses large number of shadow trees. User style is inherently per-document and
     10        the resulting rulesets can be shared between the document and the shadow trees.
     11
     12        * css/DocumentRuleSets.cpp:
     13        (WebCore::DocumentRuleSets::DocumentRuleSets):
     14        (WebCore::DocumentRuleSets::userStyle):
     15
     16            Return per-document user style for shadow trees.
     17
     18        (WebCore::DocumentRuleSets::collectFeatures):
     19        * css/DocumentRuleSets.h:
     20        (WebCore::DocumentRuleSets::setUsesSharedUserStyle):
     21        (WebCore::DocumentRuleSets::userStyle): Deleted.
     22        * css/StyleResolver.cpp:
     23        (WebCore::StyleResolver::StyleResolver):
     24        (WebCore::StyleResolver::initializeUserStyle):
     25
     26            Separate user style initialization from construction.
     27
     28        * css/StyleResolver.h:
     29        * style/StyleScope.cpp:
     30        (WebCore::Style::Scope::resolver):
     31
     32            Don't initialize user style for user agents shadow trees.
     33
    1342017-05-02  Gwang Yoon Hwang  <yoon@igalia.com>
    235
  • trunk/Source/WebCore/css/DocumentRuleSets.cpp

    r214255 r216069  
    3838namespace WebCore {
    3939
    40 DocumentRuleSets::DocumentRuleSets()
     40DocumentRuleSets::DocumentRuleSets(StyleResolver& styleResolver)
     41    : m_styleResolver(styleResolver)
    4142{
    4243    m_authorStyle = std::make_unique<RuleSet>();
     
    4647DocumentRuleSets::~DocumentRuleSets()
    4748{
     49}
     50
     51RuleSet* DocumentRuleSets::userStyle() const
     52{
     53    if (m_usesSharedUserStyle)
     54        return m_styleResolver.document().styleScope().resolver().ruleSets().userStyle();
     55    return m_userStyle.get();
    4856}
    4957
     
    113121    if (m_authorStyle)
    114122        m_features.add(m_authorStyle->features());
    115     if (m_userStyle)
    116         m_features.add(m_userStyle->features());
     123    if (auto* userStyle = this->userStyle())
     124        m_features.add(userStyle->features());
    117125
    118126    m_siblingRuleSet = makeRuleSet(m_features.siblingRules);
  • trunk/Source/WebCore/css/DocumentRuleSets.h

    r214255 r216069  
    4141class DocumentRuleSets {
    4242public:
    43     DocumentRuleSets();
     43    DocumentRuleSets(StyleResolver&);
    4444    ~DocumentRuleSets();
    45    
     45
    4646    bool isAuthorStyleDefined() const { return m_isAuthorStyleDefined; }
    4747    RuleSet& authorStyle() const { return *m_authorStyle.get(); }
    48     RuleSet* userStyle() const { return m_userStyle.get(); }
     48    RuleSet* userStyle() const;
    4949    const RuleFeatureSet& features() const;
    5050    RuleSet* sibling() const { return m_siblingRuleSet.get(); }
     
    6060    const AttributeRules* ancestorAttributeRulesForHTML(const AtomicString&) const;
    6161
     62    void setUsesSharedUserStyle(bool b) { m_usesSharedUserStyle = true; }
    6263    void initUserStyle(ExtensionStyleSheets&, const MediaQueryEvaluator&, StyleResolver&);
     64
    6365    void resetAuthorStyle();
    6466    void appendAuthorStyleSheets(const Vector<RefPtr<CSSStyleSheet>>&, MediaQueryEvaluator*, InspectorCSSOMWrappers&, StyleResolver*);
     
    7375    std::unique_ptr<RuleSet> m_authorStyle;
    7476    std::unique_ptr<RuleSet> m_userStyle;
     77    bool m_usesSharedUserStyle { false };
    7578
     79    StyleResolver& m_styleResolver;
    7680    mutable RuleFeatureSet m_features;
    7781    mutable unsigned m_defaultStyleVersionOnFeatureCollection { 0 };
  • trunk/Source/WebCore/css/StyleResolver.cpp

    r215375 r216069  
    229229
    230230StyleResolver::StyleResolver(Document& document)
    231     : m_matchedPropertiesCacheAdditionsSinceLastSweep(0)
     231    : m_ruleSets(*this)
     232    , m_matchedPropertiesCacheAdditionsSinceLastSweep(0)
    232233    , m_matchedPropertiesCacheSweepTimer(*this, &StyleResolver::sweepMatchedPropertiesCache)
    233234    , m_document(document)
     
    268269    m_ruleSets.resetAuthorStyle();
    269270
    270     m_ruleSets.initUserStyle(m_document.extensionStyleSheets(), m_mediaQueryEvaluator, *this);
    271 
    272271#if ENABLE(SVG_FONTS)
    273272    if (m_document.svgExtensions()) {
     
    277276    }
    278277#endif
     278}
     279
     280void StyleResolver::initializeUserStyle()
     281{
     282    m_ruleSets.initUserStyle(m_document.extensionStyleSheets(), m_mediaQueryEvaluator, *this);
    279283}
    280284
  • trunk/Source/WebCore/css/StyleResolver.h

    r214255 r216069  
    153153    const Settings& settings() const { return m_document.settings(); }
    154154
     155    void initializeUserStyle();
    155156    void appendAuthorStyleSheets(const Vector<RefPtr<CSSStyleSheet>>&);
    156157
  • trunk/Source/WebCore/style/StyleScope.cpp

    r215160 r216069  
    9797        SetForScope<bool> isUpdatingStyleResolver { m_isUpdatingStyleResolver, true };
    9898        m_resolver = std::make_unique<StyleResolver>(m_document);
     99
     100        if (!m_shadowRoot)
     101            m_resolver->initializeUserStyle();
     102        else if (m_shadowRoot->mode() != ShadowRootMode::UserAgent)
     103            m_resolver->ruleSets().setUsesSharedUserStyle();
     104
    99105        m_resolver->appendAuthorStyleSheets(m_activeStyleSheets);
    100106    }
Note: See TracChangeset for help on using the changeset viewer.