Changeset 112727 in webkit


Ignore:
Timestamp:
Mar 30, 2012, 2:23:35 PM (13 years ago)
Author:
Antti Koivisto
Message:

Cache origin check result to RuleData
https://bugs.webkit.org/show_bug.cgi?id=82774

Reviewed by Andreas Kling.

You wan't be able to get back to the stylesheet from a css style rule soon.
We need to do the origin check when we know the sheet it came from.

  • css/CSSStyleSelector.cpp:

(RuleData):
(WebCore::RuleData::hasDocumentSecurityOrigin):
(RuleSet):
(WebCore::makeRuleSet):
(WebCore::CSSStyleSelector::collectMatchingRulesForList):

  • css/CSSStyleSelector.h:

(WebCore::CSSStyleSelector::RuleFeature::RuleFeature):
(RuleFeature):
(Features):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r112726 r112727  
     12012-03-30  Antti Koivisto  <antti@apple.com>
     2
     3        Cache origin check result to RuleData
     4        https://bugs.webkit.org/show_bug.cgi?id=82774
     5
     6        Reviewed by Andreas Kling.
     7
     8        You wan't be able to get back to the stylesheet from a css style rule soon.
     9        We need to do the origin check when we know the sheet it came from.
     10
     11        * css/CSSStyleSelector.cpp:
     12        (RuleData):
     13        (WebCore::RuleData::hasDocumentSecurityOrigin):
     14        (RuleSet):
     15        (WebCore::makeRuleSet):
     16        (WebCore::CSSStyleSelector::collectMatchingRulesForList):
     17        * css/CSSStyleSelector.h:
     18        (WebCore::CSSStyleSelector::RuleFeature::RuleFeature):
     19        (RuleFeature):
     20        (Features):
     21
    1222012-03-30  Mike Reed  <reed@google.com>
    223
  • trunk/Source/WebCore/css/CSSStyleSelector.cpp

    r112644 r112727  
    182182class RuleData {
    183183public:
    184     RuleData(StyleRule*, CSSSelector*, unsigned position, bool canUseFastCheckSelector, bool inRegionRule);
     184    RuleData(StyleRule*, CSSSelector*, unsigned position, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule);
    185185
    186186    unsigned position() const { return m_position; }
     
    194194    unsigned specificity() const { return m_specificity; }
    195195    unsigned linkMatchType() const { return m_linkMatchType; }
     196    bool hasDocumentSecurityOrigin() const { return m_hasDocumentSecurityOrigin; }
    196197    bool isInRegionRule() const { return m_isInRegionRule; }
    197198
     
    206207    // This number was picked fairly arbitrarily. We can probably lower it if we need to.
    207208    // Some simple testing showed <100,000 RuleData's on large sites.
    208     unsigned m_position : 25;
     209    unsigned m_position : 24;
    209210    unsigned m_hasFastCheckableSelector : 1;
    210211    unsigned m_hasMultipartSelector : 1;
     
    212213    unsigned m_containsUncommonAttributeSelector : 1;
    213214    unsigned m_linkMatchType : 2; //  SelectorChecker::LinkMatchMask
     215    unsigned m_hasDocumentSecurityOrigin : 1;
    214216    unsigned m_isInRegionRule : 1;
    215217    // Use plain array instead of a Vector to minimize memory overhead.
     
    236238    void addRulesFromSheet(CSSStyleSheet*, const MediaQueryEvaluator&, CSSStyleSelector* = 0, const ContainerNode* = 0);
    237239
    238     void addStyleRule(StyleRule*, bool canUseFastCheckSelector = true, bool isInRegionRule = false);
    239     void addRule(StyleRule*, CSSSelector*, bool canUseFastCheckSelector = true, bool isInRegionRule = false);
     240    void addStyleRule(StyleRule*, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool isInRegionRule = false);
     241    void addRule(StyleRule*, CSSSelector*, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool isInRegionRule = false);
    240242    void addPageRule(CSSPageRule*);
    241243    void addToRuleSet(AtomicStringImpl* key, AtomRuleMap&, const RuleData&);
    242     void addRegionRule(WebKitCSSRegionRule*);
     244    void addRegionRule(WebKitCSSRegionRule*, bool hasDocumentSecurityOrigin);
    243245    void shrinkToFit();
    244246    void disableAutoShrinkToFit() { m_autoShrinkToFitEnabled = false; }
     
    423425}
    424426   
    425 static PassOwnPtr<RuleSet> makeRuleSet(const Vector<CSSStyleSelector::RuleSelectorPair>& rules)
     427static PassOwnPtr<RuleSet> makeRuleSet(const Vector<CSSStyleSelector::RuleFeature>& rules)
    426428{
    427429    size_t size = rules.size();
     
    430432    OwnPtr<RuleSet> ruleSet = adoptPtr(new RuleSet);
    431433    for (size_t i = 0; i < size; ++i)
    432         ruleSet->addRule(rules[i].rule, rules[i].selector);
     434        ruleSet->addRule(rules[i].rule, rules[i].selector, rules[i].hasDocumentSecurityOrigin, false);
    433435    return ruleSet.release();
    434436}
     
    10251027                continue;
    10261028            }
    1027             // FIXME: Exposing getMatchedCSSRules as a web facing API is forcing us to have a way to get the base URL per-rule.
    1028             if (m_sameOriginOnly && !m_checker.document()->securityOrigin()->canRequest(rule->ensureCSSStyleRule()->baseURL())) {
     1029            // FIXME: Exposing the non-standard getMatchedCSSRules API to web is the only reason this is needed.
     1030            if (m_sameOriginOnly && !ruleData.hasDocumentSecurityOrigin()) {
    10291031                InspectorInstrumentation::didMatchRule(cookie, false);
    10301032                continue;
     
    23122314}
    23132315
    2314 RuleData::RuleData(StyleRule* rule, CSSSelector* selector, unsigned position, bool canUseFastCheckSelector, bool inRegionRule)
     2316RuleData::RuleData(StyleRule* rule, CSSSelector* selector, unsigned position, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule)
    23152317    : m_rule(rule)
    23162318    , m_selector(selector)
     
    23222324    , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSelector(selector))
    23232325    , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector))
     2326    , m_hasDocumentSecurityOrigin(hasDocumentSecurityOrigin)
    23242327    , m_isInRegionRule(inRegionRule)
    23252328{
     
    23722375    }
    23732376    if (foundSiblingSelector)
    2374         features.siblingRules.append(CSSStyleSelector::RuleSelectorPair(ruleData.rule(), ruleData.selector()));
     2377        features.siblingRules.append(CSSStyleSelector::RuleFeature(ruleData.rule(), ruleData.selector(), ruleData.hasDocumentSecurityOrigin()));
    23752378    if (ruleData.containsUncommonAttributeSelector())
    2376         features.uncommonAttributeRules.append(CSSStyleSelector::RuleSelectorPair(ruleData.rule(), ruleData.selector()));
     2379        features.uncommonAttributeRules.append(CSSStyleSelector::RuleFeature(ruleData.rule(), ruleData.selector(), ruleData.hasDocumentSecurityOrigin()));
    23772380}
    23782381   
     
    23872390}
    23882391
    2389 void RuleSet::addRule(StyleRule* rule, CSSSelector* selector, bool canUseFastCheckSelector, bool inRegionRule)
    2390 {
    2391     RuleData ruleData(rule, selector, m_ruleCount++, canUseFastCheckSelector, inRegionRule);
     2392void RuleSet::addRule(StyleRule* rule, CSSSelector* selector, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule)
     2393{
     2394    RuleData ruleData(rule, selector, m_ruleCount++, hasDocumentSecurityOrigin, canUseFastCheckSelector, inRegionRule);
    23922395    collectFeaturesFromRuleData(m_features, ruleData);
    23932396
     
    24322435}
    24332436
    2434 void RuleSet::addRegionRule(WebKitCSSRegionRule* regionRule)
     2437void RuleSet::addRegionRule(WebKitCSSRegionRule* regionRule, bool hasDocumentSecurityOrigin)
    24352438{
    24362439    RuleSet* regionRuleSet = new RuleSet;
     
    24452448        CSSRule* regionStylingRule = regionRule->ruleAt(i);
    24462449        if (regionStylingRule->isStyleRule())
    2447             regionRuleSet->addStyleRule(static_cast<CSSStyleRule*>(regionStylingRule)->styleRule(), true, true);
     2450            regionRuleSet->addStyleRule(static_cast<CSSStyleRule*>(regionStylingRule)->styleRule(), hasDocumentSecurityOrigin, true, true);
    24482451    }
    24492452    // Update the "global" rule count so that proper order is maintained
     
    24682471            addRulesFromSheet(importRule->styleSheet(), medium, styleSelector, scope);
    24692472    }
     2473    bool hasDocumentSecurityOrigin = styleSelector && styleSelector->document()->securityOrigin()->canRequest(sheet->baseURL());
    24702474
    24712475    const Vector<RefPtr<CSSRule> >& rules = sheet->childRules();
     
    24752479        ASSERT(!rule->isImportRule());
    24762480        if (rule->isStyleRule())
    2477             addStyleRule(static_cast<CSSStyleRule*>(rule)->styleRule(), !scope);
     2481            addStyleRule(static_cast<CSSStyleRule*>(rule)->styleRule(), hasDocumentSecurityOrigin, !scope);
    24782482        else if (rule->isPageRule())
    24792483            addPageRule(static_cast<CSSPageRule*>(rule));
     
    24862490                    CSSRule* childRule = mediaRule->ruleAt(j);
    24872491                    if (childRule->isStyleRule())
    2488                         addStyleRule(static_cast<CSSStyleRule*>(childRule)->styleRule(), !scope);
     2492                        addStyleRule(static_cast<CSSStyleRule*>(childRule)->styleRule(), hasDocumentSecurityOrigin, !scope);
    24892493                    else if (childRule->isPageRule())
    24902494                        addPageRule(static_cast<CSSPageRule*>(childRule));
     
    25232527            if (scope)
    25242528                continue;
    2525             addRegionRule(static_cast<WebKitCSSRegionRule*>(rule));
     2529            addRegionRule(static_cast<WebKitCSSRegionRule*>(rule), hasDocumentSecurityOrigin);
    25262530        }
    25272531    }
     
    25302534}
    25312535
    2532 void RuleSet::addStyleRule(StyleRule* rule, bool canUseFastCheckSelector, bool isInRegionRule)
     2536void RuleSet::addStyleRule(StyleRule* rule, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool isInRegionRule)
    25332537{
    25342538    for (CSSSelector* s = rule->selectorList().first(); s; s = CSSSelectorList::next(s))
    2535         addRule(rule, s, canUseFastCheckSelector, isInRegionRule);
     2539        addRule(rule, s, hasDocumentSecurityOrigin, canUseFastCheckSelector, isInRegionRule);
    25362540}
    25372541
  • trunk/Source/WebCore/css/CSSStyleSelector.h

    r112516 r112727  
    239239#endif // ENABLE(CSS_FILTERS)
    240240
    241     struct RuleSelectorPair {
    242         RuleSelectorPair(StyleRule* rule, CSSSelector* selector) : rule(rule), selector(selector) { }
     241    struct RuleFeature {
     242        RuleFeature(StyleRule* rule, CSSSelector* selector, bool hasDocumentSecurityOrigin)
     243            : rule(rule)
     244            , selector(selector)
     245            , hasDocumentSecurityOrigin(hasDocumentSecurityOrigin)
     246        {
     247        }
    243248        StyleRule* rule;
    244249        CSSSelector* selector;
     250        bool hasDocumentSecurityOrigin;
    245251    };
    246252    struct Features {
     
    251257        HashSet<AtomicStringImpl*> idsInRules;
    252258        HashSet<AtomicStringImpl*> attrsInRules;
    253         Vector<RuleSelectorPair> siblingRules;
    254         Vector<RuleSelectorPair> uncommonAttributeRules;
     259        Vector<RuleFeature> siblingRules;
     260        Vector<RuleFeature> uncommonAttributeRules;
    255261        bool usesFirstLineRules;
    256262        bool usesBeforeAfterRules;
Note: See TracChangeset for help on using the changeset viewer.