Home | History | Annotate | Download | only in css
      1 /*
      2  * Copyright (C) 1999 Lars Knoll (knoll (at) kde.org)
      3  *           (C) 2004-2005 Allan Sandfeld Jensen (kde (at) carewolf.com)
      4  * Copyright (C) 2006, 2007 Nicholas Shanks (webkit (at) nickshanks.com)
      5  * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
      6  * Copyright (C) 2007 Alexey Proskuryakov <ap (at) webkit.org>
      7  * Copyright (C) 2007, 2008 Eric Seidel <eric (at) webkit.org>
      8  * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
      9  * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
     10  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
     11  * Copyright (C) 2013 Google Inc. All rights reserved.
     12  *
     13  * This library is free software; you can redistribute it and/or
     14  * modify it under the terms of the GNU Library General Public
     15  * License as published by the Free Software Foundation; either
     16  * version 2 of the License, or (at your option) any later version.
     17  *
     18  * This library is distributed in the hope that it will be useful,
     19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     21  * Library General Public License for more details.
     22  *
     23  * You should have received a copy of the GNU Library General Public License
     24  * along with this library; see the file COPYING.LIB.  If not, write to
     25  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     26  * Boston, MA 02110-1301, USA.
     27  */
     28 
     29 #include "config.h"
     30 #include "core/css/DocumentRuleSets.h"
     31 
     32 #include "core/css/CSSDefaultStyleSheets.h"
     33 #include "core/css/CSSStyleSheet.h"
     34 #include "core/css/StyleSheetContents.h"
     35 #include "core/css/resolver/MatchRequest.h"
     36 #include "core/css/resolver/StyleResolver.h"
     37 #include "core/dom/DocumentStyleSheetCollection.h"
     38 
     39 namespace WebCore {
     40 
     41 void ShadowDistributedRules::addRule(StyleRule* rule, size_t selectorIndex, ContainerNode* scopingNode, AddRuleFlags addRuleFlags)
     42 {
     43     if (m_shadowDistributedRuleSetMap.contains(scopingNode))
     44         m_shadowDistributedRuleSetMap.get(scopingNode)->addRule(rule, selectorIndex, addRuleFlags);
     45     else {
     46         OwnPtr<RuleSet> ruleSetForScope = RuleSet::create();
     47         ruleSetForScope->addRule(rule, selectorIndex, addRuleFlags);
     48         m_shadowDistributedRuleSetMap.add(scopingNode, ruleSetForScope.release());
     49     }
     50 }
     51 
     52 void ShadowDistributedRules::collectMatchRequests(bool includeEmptyRules, Vector<MatchRequest>& matchRequests)
     53 {
     54     for (ShadowDistributedRuleSetMap::iterator it = m_shadowDistributedRuleSetMap.begin(); it != m_shadowDistributedRuleSetMap.end(); ++it)
     55         matchRequests.append(MatchRequest(it->value.get(), includeEmptyRules, it->key));
     56 }
     57 
     58 void ShadowDistributedRules::reset(const ContainerNode* scopingNode)
     59 {
     60     m_shadowDistributedRuleSetMap.remove(scopingNode);
     61 }
     62 
     63 void ShadowDistributedRules::collectFeaturesTo(RuleFeatureSet& features)
     64 {
     65     for (ShadowDistributedRuleSetMap::iterator it = m_shadowDistributedRuleSetMap.begin(); it != m_shadowDistributedRuleSetMap.end(); ++it)
     66         features.add(it->value->features());
     67 }
     68 
     69 DocumentRuleSets::DocumentRuleSets()
     70 {
     71 }
     72 
     73 DocumentRuleSets::~DocumentRuleSets()
     74 {
     75 }
     76 
     77 void DocumentRuleSets::initUserStyle(DocumentStyleSheetCollection* styleSheetCollection, const MediaQueryEvaluator& medium, StyleResolver& resolver)
     78 {
     79     OwnPtr<RuleSet> tempUserStyle = RuleSet::create();
     80     if (CSSStyleSheet* pageUserSheet = styleSheetCollection->pageUserSheet())
     81         tempUserStyle->addRulesFromSheet(pageUserSheet->contents(), medium, &resolver);
     82     collectRulesFromUserStyleSheets(styleSheetCollection->injectedUserStyleSheets(), *tempUserStyle, medium, resolver);
     83     collectRulesFromUserStyleSheets(styleSheetCollection->documentUserStyleSheets(), *tempUserStyle, medium, resolver);
     84     if (tempUserStyle->ruleCount() > 0 || tempUserStyle->pageRules().size() > 0)
     85         m_userStyle = tempUserStyle.release();
     86 }
     87 
     88 void DocumentRuleSets::collectRulesFromUserStyleSheets(const Vector<RefPtr<CSSStyleSheet> >& userSheets, RuleSet& userStyle, const MediaQueryEvaluator& medium, StyleResolver& resolver)
     89 {
     90     for (unsigned i = 0; i < userSheets.size(); ++i) {
     91         ASSERT(userSheets[i]->contents()->isUserStyleSheet());
     92         userStyle.addRulesFromSheet(userSheets[i]->contents(), medium, &resolver);
     93     }
     94 }
     95 
     96 void DocumentRuleSets::resetAuthorStyle()
     97 {
     98     m_shadowDistributedRules.clear();
     99 }
    100 
    101 void DocumentRuleSets::collectFeaturesTo(RuleFeatureSet& features, bool isViewSource)
    102 {
    103     // Collect all ids and rules using sibling selectors (:first-child and similar)
    104     // in the current set of stylesheets. Style sharing code uses this information to reject
    105     // sharing candidates.
    106     if (CSSDefaultStyleSheets::defaultStyle)
    107         features.add(CSSDefaultStyleSheets::defaultStyle->features());
    108 
    109     if (isViewSource)
    110         features.add(CSSDefaultStyleSheets::viewSourceStyle()->features());
    111 
    112     if (m_userStyle)
    113         features.add(m_userStyle->features());
    114 
    115     m_shadowDistributedRules.collectFeaturesTo(features);
    116 }
    117 
    118 } // namespace WebCore
    119