Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) | 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) |
| 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) | 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) |
| 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All r ights reserved. | 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All r ights reserved. |
| 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> | 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> |
| 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> | 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) |
| 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. | 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. |
| 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 45 #include "core/css/resolver/StyleResolver.h" | 45 #include "core/css/resolver/StyleResolver.h" |
| 46 #include "core/html/track/TextTrackCue.h" | 46 #include "core/html/track/TextTrackCue.h" |
| 47 #include "weborigin/SecurityOrigin.h" | 47 #include "weborigin/SecurityOrigin.h" |
| 48 | 48 |
| 49 namespace WebCore { | 49 namespace WebCore { |
| 50 | 50 |
| 51 using namespace HTMLNames; | 51 using namespace HTMLNames; |
| 52 | 52 |
| 53 // ----------------------------------------------------------------- | 53 // ----------------------------------------------------------------- |
| 54 | 54 |
| 55 static inline bool isDocumentScope(const ContainerNode* scope) | |
| 56 { | |
| 57 return !scope || scope->isDocumentNode(); | |
| 58 } | |
| 59 | |
| 60 static inline bool isScopingNodeInShadowTree(const ContainerNode* scopingNode) | 55 static inline bool isScopingNodeInShadowTree(const ContainerNode* scopingNode) |
| 61 { | 56 { |
| 62 return scopingNode && scopingNode->isInShadowTree(); | 57 return scopingNode && scopingNode->isInShadowTree(); |
| 63 } | 58 } |
| 64 | 59 |
| 65 static inline bool isSelectorMatchingHTMLBasedOnRuleHash(const CSSSelector* sele ctor) | 60 static inline bool isSelectorMatchingHTMLBasedOnRuleHash(const CSSSelector* sele ctor) |
| 66 { | 61 { |
| 67 ASSERT(selector); | 62 ASSERT(selector); |
| 68 if (selector->m_match == CSSSelector::Tag) { | 63 if (selector->m_match == CSSSelector::Tag) { |
| 69 const AtomicString& selectorNamespace = selector->tagQName().namespaceUR I(); | 64 const AtomicString& selectorNamespace = selector->tagQName().namespaceUR I(); |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 377 resolver->ruleSets().treeBoundaryCrossingRules().addRule(sty leRule, selectorIndex, const_cast<ContainerNode*>(scope), addRuleFlags); | 372 resolver->ruleSets().treeBoundaryCrossingRules().addRule(sty leRule, selectorIndex, const_cast<ContainerNode*>(scope), addRuleFlags); |
| 378 } else | 373 } else |
| 379 addRule(styleRule, selectorIndex, addRuleFlags); | 374 addRule(styleRule, selectorIndex, addRuleFlags); |
| 380 } | 375 } |
| 381 } else if (rule->isPageRule()) | 376 } else if (rule->isPageRule()) |
| 382 addPageRule(static_cast<StyleRulePage*>(rule)); | 377 addPageRule(static_cast<StyleRulePage*>(rule)); |
| 383 else if (rule->isMediaRule()) { | 378 else if (rule->isMediaRule()) { |
| 384 StyleRuleMedia* mediaRule = static_cast<StyleRuleMedia*>(rule); | 379 StyleRuleMedia* mediaRule = static_cast<StyleRuleMedia*>(rule); |
| 385 if ((!mediaRule->mediaQueries() || medium.eval(mediaRule->mediaQueri es(), resolver->viewportDependentMediaQueryResults()))) | 380 if ((!mediaRule->mediaQueries() || medium.eval(mediaRule->mediaQueri es(), resolver->viewportDependentMediaQueryResults()))) |
| 386 addChildRules(mediaRule->childRules(), medium, resolver, scope, hasDocumentSecurityOrigin, addRuleFlags); | 381 addChildRules(mediaRule->childRules(), medium, resolver, scope, hasDocumentSecurityOrigin, addRuleFlags); |
| 387 } else if (rule->isFontFaceRule() && resolver) { | 382 } else if (rule->isFontFaceRule() && resolver && !(addRuleFlags & RuleSk ipsFontFaceAndViewportRule)) { |
| 388 // Add this font face to our set. | 383 // Add this font face to our set. |
| 389 // FIXME(BUG 72461): We don't add @font-face rules of scoped style s heets for the moment. | 384 // FIXME(BUG 72461): We don't add @font-face rules of scoped style s heets for the moment. |
| 390 if (!isDocumentScope(scope)) | 385 if (!isDocumentScope(scope)) |
| 391 continue; | 386 continue; |
| 392 const StyleRuleFontFace* fontFaceRule = static_cast<StyleRuleFontFac e*>(rule); | 387 const StyleRuleFontFace* fontFaceRule = static_cast<StyleRuleFontFac e*>(rule); |
| 393 resolver->fontSelector()->addFontFaceRule(fontFaceRule); | 388 resolver->fontSelector()->addFontFaceRule(fontFaceRule); |
| 394 resolver->invalidateMatchedPropertiesCache(); | 389 resolver->invalidateMatchedPropertiesCache(); |
| 395 } else if (rule->isKeyframesRule() && resolver) { | 390 } else if (rule->isKeyframesRule() && resolver) { |
| 396 resolver->ensureScopedStyleResolver(scope)->addKeyframeStyle(static_ cast<StyleRuleKeyframes*>(rule)); | 391 resolver->ensureScopedStyleResolver(scope)->addKeyframeStyle(static_ cast<StyleRuleKeyframes*>(rule)); |
| 397 } else if (rule->isRegionRule() && resolver) { | 392 } else if (rule->isRegionRule() && resolver) { |
| 398 // FIXME (BUG 72472): We don't add @-webkit-region rules of scoped s tyle sheets for the moment. | 393 // FIXME (BUG 72472): We don't add @-webkit-region rules of scoped s tyle sheets for the moment. |
| 399 addRegionRule(static_cast<StyleRuleRegion*>(rule), hasDocumentSecuri tyOrigin, scope); | 394 addRegionRule(static_cast<StyleRuleRegion*>(rule), hasDocumentSecuri tyOrigin, scope); |
| 400 } else if (rule->isHostRule() && resolver) { | 395 } else if (rule->isHostRule() && resolver) { |
| 401 if (!isScopingNodeInShadowTree(scope)) | 396 if (!isScopingNodeInShadowTree(scope)) |
| 402 continue; | 397 continue; |
| 403 bool enabled = resolver->buildScopedStyleTreeInDocumentOrder(); | 398 bool enabled = resolver->buildScopedStyleTreeInDocumentOrder(); |
| 404 resolver->setBuildScopedStyleTreeInDocumentOrder(false); | 399 resolver->setBuildScopedStyleTreeInDocumentOrder(false); |
| 405 resolver->ensureScopedStyleResolver(scope->shadowHost())->addHostRul e(static_cast<StyleRuleHost*>(rule), hasDocumentSecurityOrigin, scope); | 400 resolver->ensureScopedStyleResolver(scope->shadowHost())->addHostRul e(static_cast<StyleRuleHost*>(rule), hasDocumentSecurityOrigin, scope); |
| 406 resolver->setBuildScopedStyleTreeInDocumentOrder(enabled); | 401 resolver->setBuildScopedStyleTreeInDocumentOrder(enabled); |
| 407 } else if (rule->isViewportRule()) { | 402 } else if (rule->isViewportRule() && !(addRuleFlags & RuleSkipsFontFaceA ndViewportRule)) { |
|
eseidel
2013/11/06 01:39:10
The double negative reads a bit odd. But I guess
tasak
2013/11/06 05:42:26
Yes, 0 means "no special handling". The 0 is used
| |
| 408 // @viewport should not be scoped. | 403 // @viewport should not be scoped. |
| 409 if (!isDocumentScope(scope)) | 404 if (!isDocumentScope(scope)) |
| 410 continue; | 405 continue; |
| 411 addViewportRule(static_cast<StyleRuleViewport*>(rule)); | 406 addViewportRule(static_cast<StyleRuleViewport*>(rule)); |
| 412 } | 407 } |
| 413 else if (rule->isSupportsRule() && static_cast<StyleRuleSupports*>(rule) ->conditionIsSupported()) | 408 else if (rule->isSupportsRule() && static_cast<StyleRuleSupports*>(rule) ->conditionIsSupported()) |
| 414 addChildRules(static_cast<StyleRuleSupports*>(rule)->childRules(), m edium, resolver, scope, hasDocumentSecurityOrigin, addRuleFlags); | 409 addChildRules(static_cast<StyleRuleSupports*>(rule)->childRules(), m edium, resolver, scope, hasDocumentSecurityOrigin, addRuleFlags); |
| 415 } | 410 } |
| 416 } | 411 } |
| 417 | 412 |
| 418 void RuleSet::addRulesFromSheet(StyleSheetContents* sheet, const MediaQueryEvalu ator& medium, StyleResolver* resolver, const ContainerNode* scope) | 413 void RuleSet::addRulesFromSheet(StyleSheetContents* sheet, const MediaQueryEvalu ator& medium, StyleResolver* resolver, const ContainerNode* scope, bool processF ontFaceAndViewportRule) |
| 419 { | 414 { |
| 420 ASSERT(sheet); | 415 ASSERT(sheet); |
| 421 | 416 |
| 422 const Vector<RefPtr<StyleRuleImport> >& importRules = sheet->importRules(); | 417 const Vector<RefPtr<StyleRuleImport> >& importRules = sheet->importRules(); |
| 423 for (unsigned i = 0; i < importRules.size(); ++i) { | 418 for (unsigned i = 0; i < importRules.size(); ++i) { |
| 424 StyleRuleImport* importRule = importRules[i].get(); | 419 StyleRuleImport* importRule = importRules[i].get(); |
| 425 if (importRule->styleSheet() && (!importRule->mediaQueries() || medium.e val(importRule->mediaQueries(), resolver->viewportDependentMediaQueryResults())) ) | 420 if (importRule->styleSheet() && (!importRule->mediaQueries() || medium.e val(importRule->mediaQueries(), resolver->viewportDependentMediaQueryResults())) ) |
| 426 addRulesFromSheet(importRule->styleSheet(), medium, resolver, scope) ; | 421 addRulesFromSheet(importRule->styleSheet(), medium, resolver, scope, processFontFaceAndViewportRule); |
| 427 } | 422 } |
| 428 | 423 |
| 429 bool hasDocumentSecurityOrigin = resolver && resolver->document().securityOr igin()->canRequest(sheet->baseURL()); | 424 bool hasDocumentSecurityOrigin = resolver && resolver->document().securityOr igin()->canRequest(sheet->baseURL()); |
| 430 AddRuleFlags addRuleFlags = static_cast<AddRuleFlags>((hasDocumentSecurityOr igin ? RuleHasDocumentSecurityOrigin : 0) | (!scope ? RuleCanUseFastCheckSelecto r : 0)); | 425 AddRuleFlags addRuleFlags = static_cast<AddRuleFlags>((hasDocumentSecurityOr igin ? RuleHasDocumentSecurityOrigin : 0) | (!scope ? RuleCanUseFastCheckSelecto r : 0) | (processFontFaceAndViewportRule ? 0 : RuleSkipsFontFaceAndViewportRule) ); |
| 431 | 426 |
| 432 addChildRules(sheet->childRules(), medium, resolver, scope, hasDocumentSecur ityOrigin, addRuleFlags); | 427 addChildRules(sheet->childRules(), medium, resolver, scope, hasDocumentSecur ityOrigin, addRuleFlags); |
| 433 } | 428 } |
| 434 | 429 |
| 435 void RuleSet::addStyleRule(StyleRule* rule, AddRuleFlags addRuleFlags) | 430 void RuleSet::addStyleRule(StyleRule* rule, AddRuleFlags addRuleFlags) |
| 436 { | 431 { |
| 437 for (size_t selectorIndex = 0; selectorIndex != kNotFound; selectorIndex = r ule->selectorList().indexOfNextSelectorAfter(selectorIndex)) | 432 for (size_t selectorIndex = 0; selectorIndex != kNotFound; selectorIndex = r ule->selectorList().indexOfNextSelectorAfter(selectorIndex)) |
| 438 addRule(rule, selectorIndex, addRuleFlags); | 433 addRule(rule, selectorIndex, addRuleFlags); |
| 439 } | 434 } |
| 440 | 435 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 466 compactPendingRules(pendingRules->shadowPseudoElementRules, m_shadowPseudoEl ementRules); | 461 compactPendingRules(pendingRules->shadowPseudoElementRules, m_shadowPseudoEl ementRules); |
| 467 m_linkPseudoClassRules.shrinkToFit(); | 462 m_linkPseudoClassRules.shrinkToFit(); |
| 468 m_cuePseudoRules.shrinkToFit(); | 463 m_cuePseudoRules.shrinkToFit(); |
| 469 m_focusPseudoClassRules.shrinkToFit(); | 464 m_focusPseudoClassRules.shrinkToFit(); |
| 470 m_universalRules.shrinkToFit(); | 465 m_universalRules.shrinkToFit(); |
| 471 m_pageRules.shrinkToFit(); | 466 m_pageRules.shrinkToFit(); |
| 472 m_viewportRules.shrinkToFit(); | 467 m_viewportRules.shrinkToFit(); |
| 473 } | 468 } |
| 474 | 469 |
| 475 } // namespace WebCore | 470 } // namespace WebCore |
| OLD | NEW |