Changeset 112727 in webkit
- Timestamp:
- Mar 30, 2012, 2:23:35 PM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r112726 r112727 1 2012-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 1 22 2012-03-30 Mike Reed <reed@google.com> 2 23 -
trunk/Source/WebCore/css/CSSStyleSelector.cpp
r112644 r112727 182 182 class RuleData { 183 183 public: 184 RuleData(StyleRule*, CSSSelector*, unsigned position, bool canUseFastCheckSelector, bool inRegionRule);184 RuleData(StyleRule*, CSSSelector*, unsigned position, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule); 185 185 186 186 unsigned position() const { return m_position; } … … 194 194 unsigned specificity() const { return m_specificity; } 195 195 unsigned linkMatchType() const { return m_linkMatchType; } 196 bool hasDocumentSecurityOrigin() const { return m_hasDocumentSecurityOrigin; } 196 197 bool isInRegionRule() const { return m_isInRegionRule; } 197 198 … … 206 207 // This number was picked fairly arbitrarily. We can probably lower it if we need to. 207 208 // Some simple testing showed <100,000 RuleData's on large sites. 208 unsigned m_position : 2 5;209 unsigned m_position : 24; 209 210 unsigned m_hasFastCheckableSelector : 1; 210 211 unsigned m_hasMultipartSelector : 1; … … 212 213 unsigned m_containsUncommonAttributeSelector : 1; 213 214 unsigned m_linkMatchType : 2; // SelectorChecker::LinkMatchMask 215 unsigned m_hasDocumentSecurityOrigin : 1; 214 216 unsigned m_isInRegionRule : 1; 215 217 // Use plain array instead of a Vector to minimize memory overhead. … … 236 238 void addRulesFromSheet(CSSStyleSheet*, const MediaQueryEvaluator&, CSSStyleSelector* = 0, const ContainerNode* = 0); 237 239 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); 240 242 void addPageRule(CSSPageRule*); 241 243 void addToRuleSet(AtomicStringImpl* key, AtomRuleMap&, const RuleData&); 242 void addRegionRule(WebKitCSSRegionRule* );244 void addRegionRule(WebKitCSSRegionRule*, bool hasDocumentSecurityOrigin); 243 245 void shrinkToFit(); 244 246 void disableAutoShrinkToFit() { m_autoShrinkToFitEnabled = false; } … … 423 425 } 424 426 425 static PassOwnPtr<RuleSet> makeRuleSet(const Vector<CSSStyleSelector::Rule SelectorPair>& rules)427 static PassOwnPtr<RuleSet> makeRuleSet(const Vector<CSSStyleSelector::RuleFeature>& rules) 426 428 { 427 429 size_t size = rules.size(); … … 430 432 OwnPtr<RuleSet> ruleSet = adoptPtr(new RuleSet); 431 433 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); 433 435 return ruleSet.release(); 434 436 } … … 1025 1027 continue; 1026 1028 } 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()) { 1029 1031 InspectorInstrumentation::didMatchRule(cookie, false); 1030 1032 continue; … … 2312 2314 } 2313 2315 2314 RuleData::RuleData(StyleRule* rule, CSSSelector* selector, unsigned position, bool canUseFastCheckSelector, bool inRegionRule)2316 RuleData::RuleData(StyleRule* rule, CSSSelector* selector, unsigned position, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule) 2315 2317 : m_rule(rule) 2316 2318 , m_selector(selector) … … 2322 2324 , m_containsUncommonAttributeSelector(WebCore::containsUncommonAttributeSelector(selector)) 2323 2325 , m_linkMatchType(SelectorChecker::determineLinkMatchType(selector)) 2326 , m_hasDocumentSecurityOrigin(hasDocumentSecurityOrigin) 2324 2327 , m_isInRegionRule(inRegionRule) 2325 2328 { … … 2372 2375 } 2373 2376 if (foundSiblingSelector) 2374 features.siblingRules.append(CSSStyleSelector::Rule SelectorPair(ruleData.rule(), ruleData.selector()));2377 features.siblingRules.append(CSSStyleSelector::RuleFeature(ruleData.rule(), ruleData.selector(), ruleData.hasDocumentSecurityOrigin())); 2375 2378 if (ruleData.containsUncommonAttributeSelector()) 2376 features.uncommonAttributeRules.append(CSSStyleSelector::Rule SelectorPair(ruleData.rule(), ruleData.selector()));2379 features.uncommonAttributeRules.append(CSSStyleSelector::RuleFeature(ruleData.rule(), ruleData.selector(), ruleData.hasDocumentSecurityOrigin())); 2377 2380 } 2378 2381 … … 2387 2390 } 2388 2391 2389 void RuleSet::addRule(StyleRule* rule, CSSSelector* selector, bool canUseFastCheckSelector, bool inRegionRule)2390 { 2391 RuleData ruleData(rule, selector, m_ruleCount++, canUseFastCheckSelector, inRegionRule);2392 void RuleSet::addRule(StyleRule* rule, CSSSelector* selector, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool inRegionRule) 2393 { 2394 RuleData ruleData(rule, selector, m_ruleCount++, hasDocumentSecurityOrigin, canUseFastCheckSelector, inRegionRule); 2392 2395 collectFeaturesFromRuleData(m_features, ruleData); 2393 2396 … … 2432 2435 } 2433 2436 2434 void RuleSet::addRegionRule(WebKitCSSRegionRule* regionRule )2437 void RuleSet::addRegionRule(WebKitCSSRegionRule* regionRule, bool hasDocumentSecurityOrigin) 2435 2438 { 2436 2439 RuleSet* regionRuleSet = new RuleSet; … … 2445 2448 CSSRule* regionStylingRule = regionRule->ruleAt(i); 2446 2449 if (regionStylingRule->isStyleRule()) 2447 regionRuleSet->addStyleRule(static_cast<CSSStyleRule*>(regionStylingRule)->styleRule(), true, true);2450 regionRuleSet->addStyleRule(static_cast<CSSStyleRule*>(regionStylingRule)->styleRule(), hasDocumentSecurityOrigin, true, true); 2448 2451 } 2449 2452 // Update the "global" rule count so that proper order is maintained … … 2468 2471 addRulesFromSheet(importRule->styleSheet(), medium, styleSelector, scope); 2469 2472 } 2473 bool hasDocumentSecurityOrigin = styleSelector && styleSelector->document()->securityOrigin()->canRequest(sheet->baseURL()); 2470 2474 2471 2475 const Vector<RefPtr<CSSRule> >& rules = sheet->childRules(); … … 2475 2479 ASSERT(!rule->isImportRule()); 2476 2480 if (rule->isStyleRule()) 2477 addStyleRule(static_cast<CSSStyleRule*>(rule)->styleRule(), !scope);2481 addStyleRule(static_cast<CSSStyleRule*>(rule)->styleRule(), hasDocumentSecurityOrigin, !scope); 2478 2482 else if (rule->isPageRule()) 2479 2483 addPageRule(static_cast<CSSPageRule*>(rule)); … … 2486 2490 CSSRule* childRule = mediaRule->ruleAt(j); 2487 2491 if (childRule->isStyleRule()) 2488 addStyleRule(static_cast<CSSStyleRule*>(childRule)->styleRule(), !scope);2492 addStyleRule(static_cast<CSSStyleRule*>(childRule)->styleRule(), hasDocumentSecurityOrigin, !scope); 2489 2493 else if (childRule->isPageRule()) 2490 2494 addPageRule(static_cast<CSSPageRule*>(childRule)); … … 2523 2527 if (scope) 2524 2528 continue; 2525 addRegionRule(static_cast<WebKitCSSRegionRule*>(rule) );2529 addRegionRule(static_cast<WebKitCSSRegionRule*>(rule), hasDocumentSecurityOrigin); 2526 2530 } 2527 2531 } … … 2530 2534 } 2531 2535 2532 void RuleSet::addStyleRule(StyleRule* rule, bool canUseFastCheckSelector, bool isInRegionRule)2536 void RuleSet::addStyleRule(StyleRule* rule, bool hasDocumentSecurityOrigin, bool canUseFastCheckSelector, bool isInRegionRule) 2533 2537 { 2534 2538 for (CSSSelector* s = rule->selectorList().first(); s; s = CSSSelectorList::next(s)) 2535 addRule(rule, s, canUseFastCheckSelector, isInRegionRule);2539 addRule(rule, s, hasDocumentSecurityOrigin, canUseFastCheckSelector, isInRegionRule); 2536 2540 } 2537 2541 -
trunk/Source/WebCore/css/CSSStyleSelector.h
r112516 r112727 239 239 #endif // ENABLE(CSS_FILTERS) 240 240 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 } 243 248 StyleRule* rule; 244 249 CSSSelector* selector; 250 bool hasDocumentSecurityOrigin; 245 251 }; 246 252 struct Features { … … 251 257 HashSet<AtomicStringImpl*> idsInRules; 252 258 HashSet<AtomicStringImpl*> attrsInRules; 253 Vector<Rule SelectorPair> siblingRules;254 Vector<Rule SelectorPair> uncommonAttributeRules;259 Vector<RuleFeature> siblingRules; 260 Vector<RuleFeature> uncommonAttributeRules; 255 261 bool usesFirstLineRules; 256 262 bool usesBeforeAfterRules;
Note:
See TracChangeset
for help on using the changeset viewer.