Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(420)

Side by Side Diff: Source/core/css/resolver/StyleResolver.cpp

Issue 206043009: Setup parent stylesheet for tree boundary crossing rules. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: compiles on oilpan Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/css/resolver/StyleResolver.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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, 2013 Apple Inc. All rights reserved. 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights 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 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 240
241 void StyleResolver::resetRuleFeatures() 241 void StyleResolver::resetRuleFeatures()
242 { 242 {
243 // Need to recreate RuleFeatureSet. 243 // Need to recreate RuleFeatureSet.
244 m_features.clear(); 244 m_features.clear();
245 m_siblingRuleSet.clear(); 245 m_siblingRuleSet.clear();
246 m_uncommonAttributeRuleSet.clear(); 246 m_uncommonAttributeRuleSet.clear();
247 m_needCollectFeatures = true; 247 m_needCollectFeatures = true;
248 } 248 }
249 249
250 void StyleResolver::addTreeBoundaryCrossingRules(const WillBeHeapVector<MinimalR uleData>& rules, ContainerNode* scope) 250 void StyleResolver::processScopedRules(const RuleSet& authorRules, CSSStyleSheet * parentStyleSheet, ContainerNode& scope)
251 {
252 for (unsigned i = 0; i < rules.size(); ++i) {
253 const MinimalRuleData& info = rules[i];
254 m_treeBoundaryCrossingRules.addRule(info.m_rule, info.m_selectorIndex, s cope, info.m_flags);
255 }
256 }
257
258 void StyleResolver::processScopedRules(const RuleSet& authorRules, const KURL& s heetBaseURL, ContainerNode* scope)
259 { 251 {
260 const WillBeHeapVector<RawPtrWillBeMember<StyleRuleKeyframes> > keyframesRul es = authorRules.keyframesRules(); 252 const WillBeHeapVector<RawPtrWillBeMember<StyleRuleKeyframes> > keyframesRul es = authorRules.keyframesRules();
261 for (unsigned i = 0; i < keyframesRules.size(); ++i) 253 for (unsigned i = 0; i < keyframesRules.size(); ++i)
262 ensureScopedStyleResolver(scope)->addKeyframeStyle(keyframesRules[i]); 254 ensureScopedStyleResolver(&scope)->addKeyframeStyle(keyframesRules[i]);
263 255
264 addTreeBoundaryCrossingRules(authorRules.treeBoundaryCrossingRules(), scope) ; 256 m_treeBoundaryCrossingRules.addTreeBoundaryCrossingRules(authorRules, scope, parentStyleSheet);
265 257
266 // FIXME(BUG 72461): We don't add @font-face rules of scoped style sheets fo r the moment. 258 // FIXME(BUG 72461): We don't add @font-face rules of scoped style sheets fo r the moment.
267 if (!scope || scope->isDocumentNode()) { 259 if (scope.isDocumentNode()) {
268 const WillBeHeapVector<RawPtrWillBeMember<StyleRuleFontFace> > fontFaceR ules = authorRules.fontFaceRules(); 260 const WillBeHeapVector<RawPtrWillBeMember<StyleRuleFontFace> > fontFaceR ules = authorRules.fontFaceRules();
269 for (unsigned i = 0; i < fontFaceRules.size(); ++i) 261 for (unsigned i = 0; i < fontFaceRules.size(); ++i)
270 addFontFaceRule(&m_document, document().styleEngine()->fontSelector( ), fontFaceRules[i]); 262 addFontFaceRule(&m_document, document().styleEngine()->fontSelector( ), fontFaceRules[i]);
271 if (fontFaceRules.size()) 263 if (fontFaceRules.size())
272 invalidateMatchedPropertiesCache(); 264 invalidateMatchedPropertiesCache();
273 } else {
274 addTreeBoundaryCrossingRules(authorRules.shadowDistributedRules(), scope );
275 } 265 }
276 } 266 }
277 267
278 void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode) 268 void StyleResolver::resetAuthorStyle(const ContainerNode* scopingNode)
279 { 269 {
280 // FIXME: When chanking scoped attribute, scopingNode's hasScopedHTMLStyleCh ild has been already modified. 270 // FIXME: When chanking scoped attribute, scopingNode's hasScopedHTMLStyleCh ild has been already modified.
281 // So we cannot use hasScopedHTMLStyleChild flag here. 271 // So we cannot use hasScopedHTMLStyleChild flag here.
282 ScopedStyleResolver* resolver = scopingNode ? m_styleTree.lookupScopedStyleR esolverFor(scopingNode) : m_styleTree.scopedStyleResolverForDocument(); 272 ScopedStyleResolver* resolver = scopingNode ? m_styleTree.lookupScopedStyleR esolverFor(scopingNode) : m_styleTree.scopedStyleResolverForDocument();
283 if (!resolver) 273 if (!resolver)
284 return; 274 return;
285 275
286 treeBoundaryCrossingRules().reset(scopingNode); 276 m_treeBoundaryCrossingRules.reset(scopingNode);
287 277
288 resolver->resetAuthorStyle(); 278 resolver->resetAuthorStyle();
289 resetRuleFeatures(); 279 resetRuleFeatures();
290 if (!scopingNode) 280 if (!scopingNode)
291 return; 281 return;
292 282
293 m_styleTree.remove(scopingNode); 283 m_styleTree.remove(scopingNode);
294 } 284 }
295 285
296 static PassOwnPtrWillBeRawPtr<RuleSet> makeRuleSet(const Vector<RuleFeature>& ru les) 286 static PassOwnPtrWillBeRawPtr<RuleSet> makeRuleSet(const Vector<RuleFeature>& ru les)
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
393 void StyleResolver::popParentShadowRoot(const ShadowRoot& shadowRoot) 383 void StyleResolver::popParentShadowRoot(const ShadowRoot& shadowRoot)
394 { 384 {
395 ASSERT(shadowRoot.host()); 385 ASSERT(shadowRoot.host());
396 m_styleTree.popStyleCache(shadowRoot); 386 m_styleTree.popStyleCache(shadowRoot);
397 } 387 }
398 388
399 StyleResolver::~StyleResolver() 389 StyleResolver::~StyleResolver()
400 { 390 {
401 } 391 }
402 392
403 inline void StyleResolver::collectTreeBoundaryCrossingRules(Element* element, El ementRuleCollector& collector, bool includeEmptyRules)
404 {
405 if (m_treeBoundaryCrossingRules.isEmpty())
406 return;
407
408 // When comparing rules declared in outer treescopes, outer's rules win.
409 CascadeOrder outerCascadeOrder = m_treeBoundaryCrossingRules.size() + m_tree BoundaryCrossingRules.size();
410 // When comparing rules declared in inner treescopes, inner's rules win.
411 CascadeOrder innerCascadeOrder = m_treeBoundaryCrossingRules.size();
412
413 for (DocumentOrderedList::iterator it = m_treeBoundaryCrossingRules.begin(); it != m_treeBoundaryCrossingRules.end(); ++it) {
414 const ContainerNode* scopingNode = toContainerNode(*it);
415 RuleSet* ruleSet = m_treeBoundaryCrossingRules.ruleSetScopedBy(scopingNo de);
416 unsigned boundaryBehavior = SelectorChecker::ScopeContainsLastMatchedEle ment;
417 bool isInnerTreeScope = element->treeScope().isInclusiveAncestorOf(scopi ngNode->treeScope());
418
419 // If a given scoping node is a shadow root and a given element is in a descendant tree of tree hosted by
420 // the scoping node's shadow host, we should use ScopeIsShadowHost.
421 if (scopingNode && scopingNode->isShadowRoot()) {
422 if (element->isInDescendantTreeOf(toShadowRoot(scopingNode)->host()) )
423 boundaryBehavior |= SelectorChecker::ScopeIsShadowHost;
424 scopingNode = toShadowRoot(scopingNode)->host();
425 }
426
427 CascadeOrder cascadeOrder = isInnerTreeScope ? innerCascadeOrder : outer CascadeOrder;
428 collector.collectMatchingRules(MatchRequest(ruleSet, includeEmptyRules, scopingNode), collector.matchedResult().ranges.authorRuleRange(), static_cast<Se lectorChecker::BehaviorAtBoundary>(boundaryBehavior), ignoreCascadeScope, cascad eOrder);
429 ++innerCascadeOrder;
430 --outerCascadeOrder;
431 }
432 }
433
434 static inline bool applyAuthorStylesOf(const Element* element) 393 static inline bool applyAuthorStylesOf(const Element* element)
435 { 394 {
436 return element->treeScope().applyAuthorStyles() || (element->shadow() && ele ment->shadow()->applyAuthorStyles()); 395 return element->treeScope().applyAuthorStyles() || (element->shadow() && ele ment->shadow()->applyAuthorStyles());
437 } 396 }
438 397
439 void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleC ollector& collector, bool includeEmptyRules, Vector<ScopedStyleResolver*, 8>& re solvers, Vector<ScopedStyleResolver*, 8>& resolversInShadowTree) 398 void StyleResolver::matchAuthorRulesForShadowHost(Element* element, ElementRuleC ollector& collector, bool includeEmptyRules, Vector<ScopedStyleResolver*, 8>& re solvers, Vector<ScopedStyleResolver*, 8>& resolversInShadowTree)
440 { 399 {
441 collector.clearMatchedRules(); 400 collector.clearMatchedRules();
442 collector.matchedResult().ranges.authorRuleRange().setLast(collector.matched Result().matchedProperties.size() - 1); 401 collector.matchedResult().ranges.authorRuleRange().setLast(collector.matched Result().matchedProperties.size() - 1);
443 402
444 CascadeScope cascadeScope = 0; 403 CascadeScope cascadeScope = 0;
445 CascadeOrder cascadeOrder = 0; 404 CascadeOrder cascadeOrder = 0;
446 bool applyAuthorStyles = applyAuthorStylesOf(element); 405 bool applyAuthorStyles = applyAuthorStylesOf(element);
447 406
448 for (int j = resolversInShadowTree.size() - 1; j >= 0; --j) 407 for (int j = resolversInShadowTree.size() - 1; j >= 0; --j)
449 resolversInShadowTree.at(j)->collectMatchingAuthorRules(collector, inclu deEmptyRules, applyAuthorStyles, cascadeScope, cascadeOrder++); 408 resolversInShadowTree.at(j)->collectMatchingAuthorRules(collector, inclu deEmptyRules, applyAuthorStyles, cascadeScope, cascadeOrder++);
450 409
451 if (resolvers.isEmpty() || resolvers.first()->treeScope() != element->treeSc ope()) 410 if (resolvers.isEmpty() || resolvers.first()->treeScope() != element->treeSc ope())
452 ++cascadeScope; 411 ++cascadeScope;
453 cascadeOrder += resolvers.size(); 412 cascadeOrder += resolvers.size();
454 for (unsigned i = 0; i < resolvers.size(); ++i) 413 for (unsigned i = 0; i < resolvers.size(); ++i)
455 resolvers.at(i)->collectMatchingAuthorRules(collector, includeEmptyRules , applyAuthorStyles, cascadeScope++, --cascadeOrder); 414 resolvers.at(i)->collectMatchingAuthorRules(collector, includeEmptyRules , applyAuthorStyles, cascadeScope++, --cascadeOrder);
456 415
457 collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules); 416 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collec tor, includeEmptyRules);
458 collector.sortAndTransferMatchedRules(); 417 collector.sortAndTransferMatchedRules();
459 } 418 }
460 419
461 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col lector, bool includeEmptyRules) 420 void StyleResolver::matchAuthorRules(Element* element, ElementRuleCollector& col lector, bool includeEmptyRules)
462 { 421 {
463 collector.clearMatchedRules(); 422 collector.clearMatchedRules();
464 collector.matchedResult().ranges.authorRuleRange().setLast(collector.matched Result().matchedProperties.size() - 1); 423 collector.matchedResult().ranges.authorRuleRange().setLast(collector.matched Result().matchedProperties.size() - 1);
465 424
466 bool applyAuthorStyles = applyAuthorStylesOf(element); 425 bool applyAuthorStyles = applyAuthorStylesOf(element);
467 if (m_styleTree.hasOnlyScopedResolverForDocument()) { 426 if (m_styleTree.hasOnlyScopedResolverForDocument()) {
468 m_styleTree.scopedStyleResolverForDocument()->collectMatchingAuthorRules (collector, includeEmptyRules, applyAuthorStyles, ignoreCascadeScope); 427 m_styleTree.scopedStyleResolverForDocument()->collectMatchingAuthorRules (collector, includeEmptyRules, applyAuthorStyles, ignoreCascadeScope);
469 collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules); 428 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, co llector, includeEmptyRules);
470 collector.sortAndTransferMatchedRules(); 429 collector.sortAndTransferMatchedRules();
471 return; 430 return;
472 } 431 }
473 432
474 Vector<ScopedStyleResolver*, 8> resolvers; 433 Vector<ScopedStyleResolver*, 8> resolvers;
475 m_styleTree.resolveScopedStyles(element, resolvers); 434 m_styleTree.resolveScopedStyles(element, resolvers);
476 435
477 Vector<ScopedStyleResolver*, 8> resolversInShadowTree; 436 Vector<ScopedStyleResolver*, 8> resolversInShadowTree;
478 m_styleTree.collectScopedResolversForHostedShadowTrees(element, resolversInS hadowTree); 437 m_styleTree.collectScopedResolversForHostedShadowTrees(element, resolversInS hadowTree);
479 if (!resolversInShadowTree.isEmpty()) { 438 if (!resolversInShadowTree.isEmpty()) {
480 matchAuthorRulesForShadowHost(element, collector, includeEmptyRules, res olvers, resolversInShadowTree); 439 matchAuthorRulesForShadowHost(element, collector, includeEmptyRules, res olvers, resolversInShadowTree);
481 return; 440 return;
482 } 441 }
483 442
484 if (resolvers.isEmpty()) 443 if (resolvers.isEmpty())
485 return; 444 return;
486 445
487 CascadeScope cascadeScope = 0; 446 CascadeScope cascadeScope = 0;
488 CascadeOrder cascadeOrder = resolvers.size(); 447 CascadeOrder cascadeOrder = resolvers.size();
489 for (unsigned i = 0; i < resolvers.size(); ++i, --cascadeOrder) { 448 for (unsigned i = 0; i < resolvers.size(); ++i, --cascadeOrder) {
490 ScopedStyleResolver* resolver = resolvers.at(i); 449 ScopedStyleResolver* resolver = resolvers.at(i);
491 // FIXME: Need to clarify how to treat style scoped. 450 // FIXME: Need to clarify how to treat style scoped.
492 resolver->collectMatchingAuthorRules(collector, includeEmptyRules, apply AuthorStyles, cascadeScope++, resolver->treeScope() == element->treeScope() && r esolver->scopingNode().isShadowRoot() ? 0 : cascadeOrder); 451 resolver->collectMatchingAuthorRules(collector, includeEmptyRules, apply AuthorStyles, cascadeScope++, resolver->treeScope() == element->treeScope() && r esolver->scopingNode().isShadowRoot() ? 0 : cascadeOrder);
493 } 452 }
494 453
495 collectTreeBoundaryCrossingRules(element, collector, includeEmptyRules); 454 m_treeBoundaryCrossingRules.collectTreeBoundaryCrossingRules(element, collec tor, includeEmptyRules);
496 collector.sortAndTransferMatchedRules(); 455 collector.sortAndTransferMatchedRules();
497 } 456 }
498 457
499 void StyleResolver::matchWatchSelectorRules(ElementRuleCollector& collector) 458 void StyleResolver::matchWatchSelectorRules(ElementRuleCollector& collector)
500 { 459 {
501 if (!m_watchedSelectorsRules) 460 if (!m_watchedSelectorsRules)
502 return; 461 return;
503 462
504 collector.clearMatchedRules(); 463 collector.clearMatchedRules();
505 collector.matchedResult().ranges.userRuleRange().setLast(collector.matchedRe sult().matchedProperties.size() - 1); 464 collector.matchedResult().ranges.userRuleRange().setLast(collector.matchedRe sult().matchedProperties.size() - 1);
(...skipping 913 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 visitor->trace(m_keyframesRuleMap); 1378 visitor->trace(m_keyframesRuleMap);
1420 visitor->trace(m_viewportDependentMediaQueryResults); 1379 visitor->trace(m_viewportDependentMediaQueryResults);
1421 visitor->trace(m_viewportStyleResolver); 1380 visitor->trace(m_viewportStyleResolver);
1422 visitor->trace(m_siblingRuleSet); 1381 visitor->trace(m_siblingRuleSet);
1423 visitor->trace(m_uncommonAttributeRuleSet); 1382 visitor->trace(m_uncommonAttributeRuleSet);
1424 visitor->trace(m_watchedSelectorsRules); 1383 visitor->trace(m_watchedSelectorsRules);
1425 visitor->trace(m_treeBoundaryCrossingRules); 1384 visitor->trace(m_treeBoundaryCrossingRules);
1426 } 1385 }
1427 1386
1428 } // namespace WebCore 1387 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/css/resolver/StyleResolver.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698