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

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

Issue 1322753006: Add inline style in the element's scope. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 3 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
« 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 361 matching lines...) Expand 10 before | Expand all | Expand 10 after
372 continue; 372 continue;
373 if (ScopedStyleResolver* resolver = shadowRoot->scopedStyleResolver()) { 373 if (ScopedStyleResolver* resolver = shadowRoot->scopedStyleResolver()) {
374 collector.clearMatchedRules(); 374 collector.clearMatchedRules();
375 resolver->collectMatchingShadowHostRules(collector, includeEmptyRule s); 375 resolver->collectMatchingShadowHostRules(collector, includeEmptyRule s);
376 collector.sortAndTransferMatchedRules(); 376 collector.sortAndTransferMatchedRules();
377 collector.finishAddingAuthorRulesForTreeScope(); 377 collector.finishAddingAuthorRulesForTreeScope();
378 } 378 }
379 } 379 }
380 } 380 }
381 381
382 void StyleResolver::matchElementScopeRules(ScopedStyleResolver& elementScopeReso lver, ElementRuleCollector& collector, bool includeEmptyRules) 382 void StyleResolver::matchElementScopeRules(const Element& element, ScopedStyleRe solver* elementScopeResolver, ElementRuleCollector& collector, bool includeEmpty Rules)
383 { 383 {
384 collector.clearMatchedRules(); 384 if (elementScopeResolver) {
385 elementScopeResolver.collectMatchingAuthorRules(collector, includeEmptyRules ); 385 collector.clearMatchedRules();
386 elementScopeResolver.collectMatchingTreeBoundaryCrossingRules(collector, inc ludeEmptyRules); 386 elementScopeResolver->collectMatchingAuthorRules(collector, includeEmpty Rules);
387 collector.sortAndTransferMatchedRules(); 387 elementScopeResolver->collectMatchingTreeBoundaryCrossingRules(collector , includeEmptyRules);
388 collector.sortAndTransferMatchedRules();
389 }
390
391 if (element.isStyledElement() && element.inlineStyle() && !collector.isColle ctingForPseudoElement()) {
392 // Inline style is immutable as long as there is no CSSOM wrapper.
393 bool isInlineStyleCacheable = !element.inlineStyle()->isMutable();
394 collector.addElementStyleProperties(element.inlineStyle(), isInlineStyle Cacheable);
395 }
396
388 collector.finishAddingAuthorRulesForTreeScope(); 397 collector.finishAddingAuthorRulesForTreeScope();
389 } 398 }
390 399
391 void StyleResolver::matchScopedRules(const Element& element, ElementRuleCollecto r& collector, bool includeEmptyRules) 400 void StyleResolver::matchScopedRules(const Element& element, ElementRuleCollecto r& collector, bool includeEmptyRules)
392 { 401 {
393 // Match rules from treeScopes in the reverse tree-of-trees order, since the 402 // Match rules from treeScopes in the reverse tree-of-trees order, since the
394 // cascading order for normal rules is such that when comparing rules from 403 // cascading order for normal rules is such that when comparing rules from
395 // different shadow trees, the rule from the tree which comes first in the 404 // different shadow trees, the rule from the tree which comes first in the
396 // tree-of-trees order wins. From other treeScopes than the element's own 405 // tree-of-trees order wins. From other treeScopes than the element's own
397 // scope, only tree-boundary-crossing rules may match. 406 // scope, only tree-boundary-crossing rules may match.
398 407
399 ScopedStyleResolver* elementScopeResolver = scopedResolverFor(element); 408 ScopedStyleResolver* elementScopeResolver = scopedResolverFor(element);
400 bool matchElementScopeDone = !elementScopeResolver; 409 bool matchElementScopeDone = !elementScopeResolver && !element.inlineStyle() ;
401 410
402 for (auto it = m_treeBoundaryCrossingScopes.rbegin(); it != m_treeBoundaryCr ossingScopes.rend(); ++it) { 411 for (auto it = m_treeBoundaryCrossingScopes.rbegin(); it != m_treeBoundaryCr ossingScopes.rend(); ++it) {
403 const TreeScope& scope = (*it)->treeScope(); 412 const TreeScope& scope = (*it)->treeScope();
404 ScopedStyleResolver* resolver = scope.scopedStyleResolver(); 413 ScopedStyleResolver* resolver = scope.scopedStyleResolver();
405 ASSERT(resolver); 414 ASSERT(resolver);
406 415
407 if (!matchElementScopeDone && scope.isInclusiveAncestorOf(element.treeSc ope())) { 416 if (!matchElementScopeDone && scope.isInclusiveAncestorOf(element.treeSc ope())) {
408 417
409 matchElementScopeDone = true; 418 matchElementScopeDone = true;
410 419
411 // At this point, the iterator has either encountered the scope for the element 420 // At this point, the iterator has either encountered the scope for the element
412 // itself (if that scope has boundary-crossing rules), or the iterat or has moved 421 // itself (if that scope has boundary-crossing rules), or the iterat or has moved
413 // to a scope which appears before the element's scope in the tree-o f-trees order. 422 // to a scope which appears before the element's scope in the tree-o f-trees order.
414 // Try to match all rules from the element's scope. 423 // Try to match all rules from the element's scope.
415 424
416 matchElementScopeRules(*elementScopeResolver, collector, includeEmpt yRules); 425 matchElementScopeRules(element, elementScopeResolver, collector, inc ludeEmptyRules);
417 if (resolver == elementScopeResolver) { 426 if (resolver == elementScopeResolver) {
418 // Boundary-crossing rules already collected in matchElementScop eRules. 427 // Boundary-crossing rules already collected in matchElementScop eRules.
419 continue; 428 continue;
420 } 429 }
421 } 430 }
422 431
423 collector.clearMatchedRules(); 432 collector.clearMatchedRules();
424 resolver->collectMatchingTreeBoundaryCrossingRules(collector, includeEmp tyRules); 433 resolver->collectMatchingTreeBoundaryCrossingRules(collector, includeEmp tyRules);
425 collector.sortAndTransferMatchedRules(); 434 collector.sortAndTransferMatchedRules();
426 collector.finishAddingAuthorRulesForTreeScope(); 435 collector.finishAddingAuthorRulesForTreeScope();
427 } 436 }
428 437
429 if (!matchElementScopeDone) 438 if (!matchElementScopeDone)
430 matchElementScopeRules(*elementScopeResolver, collector, includeEmptyRul es); 439 matchElementScopeRules(element, elementScopeResolver, collector, include EmptyRules);
431 } 440 }
432 441
433 void StyleResolver::matchAuthorRules(const Element& element, ElementRuleCollecto r& collector, bool includeEmptyRules) 442 void StyleResolver::matchAuthorRules(const Element& element, ElementRuleCollecto r& collector, bool includeEmptyRules)
434 { 443 {
435 matchHostRules(element, collector, includeEmptyRules); 444 matchHostRules(element, collector, includeEmptyRules);
436 matchScopedRules(element, collector, includeEmptyRules); 445 matchScopedRules(element, collector, includeEmptyRules);
437 } 446 }
438 447
439 void StyleResolver::matchUARules(ElementRuleCollector& collector) 448 void StyleResolver::matchUARules(ElementRuleCollector& collector)
440 { 449 {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
482 if (isAuto) { 491 if (isAuto) {
483 state.setHasDirAutoAttribute(true); 492 state.setHasDirAutoAttribute(true);
484 collector.addElementStyleProperties(textDirection == LTR ? leftT oRightDeclaration() : rightToLeftDeclaration()); 493 collector.addElementStyleProperties(textDirection == LTR ? leftT oRightDeclaration() : rightToLeftDeclaration());
485 } 494 }
486 } 495 }
487 } 496 }
488 497
489 matchAuthorRules(*state.element(), collector, false); 498 matchAuthorRules(*state.element(), collector, false);
490 499
491 if (state.element()->isStyledElement()) { 500 if (state.element()->isStyledElement()) {
492 // TODO(rune@opera.com): Adding style attribute rules here is probably t oo late
493 // when you have shadow piercing combinators. When we don't have piercin g combinators,
494 // the style attribute always belong to the outermost scope whose rules apply to
495 // the element. Thus, applying inline style here is correct. Fixing this for piercing
496 // combinators means moving the code below into matchElementScopeRules a nd _not_
497 // invoking it for pseudo style requests.
498 if (state.element()->inlineStyle()) {
499 // Inline style is immutable as long as there is no CSSOM wrapper.
500 bool isInlineStyleCacheable = !state.element()->inlineStyle()->isMut able();
501 collector.addElementStyleProperties(state.element()->inlineStyle(), isInlineStyleCacheable);
502 }
503
504 // Now check SMIL animation override style. 501 // Now check SMIL animation override style.
505 if (includeSMILProperties && state.element()->isSVGElement()) 502 if (includeSMILProperties && state.element()->isSVGElement())
506 collector.addElementStyleProperties(toSVGElement(state.element())->a nimatedSMILStyleProperties(), false /* isCacheable */); 503 collector.addElementStyleProperties(toSVGElement(state.element())->a nimatedSMILStyleProperties(), false /* isCacheable */);
507 } 504 }
508 505
509 collector.finishAddingAuthorRulesForTreeScope(); 506 collector.finishAddingAuthorRulesForTreeScope();
510 } 507 }
511 508
512 PassRefPtr<ComputedStyle> StyleResolver::styleForDocument(Document& document) 509 PassRefPtr<ComputedStyle> StyleResolver::styleForDocument(Document& document)
513 { 510 {
(...skipping 1026 matching lines...) Expand 10 before | Expand all | Expand 10 after
1540 visitor->trace(m_watchedSelectorsRules); 1537 visitor->trace(m_watchedSelectorsRules);
1541 visitor->trace(m_treeBoundaryCrossingScopes); 1538 visitor->trace(m_treeBoundaryCrossingScopes);
1542 visitor->trace(m_styleResourceLoader); 1539 visitor->trace(m_styleResourceLoader);
1543 visitor->trace(m_styleSharingLists); 1540 visitor->trace(m_styleSharingLists);
1544 visitor->trace(m_pendingStyleSheets); 1541 visitor->trace(m_pendingStyleSheets);
1545 visitor->trace(m_document); 1542 visitor->trace(m_document);
1546 #endif 1543 #endif
1547 } 1544 }
1548 1545
1549 } // namespace blink 1546 } // namespace blink
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