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

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

Issue 18139007: Remove StyleResolverState::styledElement() since we can just check isHTMLElement() or isSVGElement() (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add a comment Created 7 years, 5 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/ElementRuleCollector.cpp ('k') | Source/core/css/resolver/StyleResolverState.h » ('j') | 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 438 matching lines...) Expand 10 before | Expand all | Expand 10 after
449 449
450 void StyleResolver::matchAllRules(ElementRuleCollector& collector, bool matchAut horAndUserStyles, bool includeSMILProperties) 450 void StyleResolver::matchAllRules(ElementRuleCollector& collector, bool matchAut horAndUserStyles, bool includeSMILProperties)
451 { 451 {
452 matchUARules(collector); 452 matchUARules(collector);
453 453
454 // Now we check user sheet rules. 454 // Now we check user sheet rules.
455 if (matchAuthorAndUserStyles) 455 if (matchAuthorAndUserStyles)
456 matchUserRules(collector, false); 456 matchUserRules(collector, false);
457 457
458 // Now check author rules, beginning first with presentational attributes ma pped from HTML. 458 // Now check author rules, beginning first with presentational attributes ma pped from HTML.
459 if (m_state.styledElement()) { 459 if (m_state.element()->isStyledElement()) {
460 collector.addElementStyleProperties(m_state.styledElement()->presentatio nAttributeStyle()); 460 collector.addElementStyleProperties(m_state.element()->presentationAttri buteStyle());
461 461
462 // Now we check additional mapped declarations. 462 // Now we check additional mapped declarations.
463 // Tables and table cells share an additional mapped rule that must be a pplied 463 // Tables and table cells share an additional mapped rule that must be a pplied
464 // after all attributes, since their mapped style depends on the values of multiple attributes. 464 // after all attributes, since their mapped style depends on the values of multiple attributes.
465 collector.addElementStyleProperties(m_state.styledElement()->additionalP resentationAttributeStyle()); 465 collector.addElementStyleProperties(m_state.element()->additionalPresent ationAttributeStyle());
466 466
467 if (m_state.styledElement()->isHTMLElement()) { 467 if (m_state.element()->isHTMLElement()) {
468 bool isAuto; 468 bool isAuto;
469 TextDirection textDirection = toHTMLElement(m_state.styledElement()) ->directionalityIfhasDirAutoAttribute(isAuto); 469 TextDirection textDirection = toHTMLElement(m_state.element())->dire ctionalityIfhasDirAutoAttribute(isAuto);
470 if (isAuto) 470 if (isAuto)
471 collector.matchedResult().addMatchedProperties(textDirection == LTR ? leftToRightDeclaration() : rightToLeftDeclaration()); 471 collector.matchedResult().addMatchedProperties(textDirection == LTR ? leftToRightDeclaration() : rightToLeftDeclaration());
472 } 472 }
473 } 473 }
474 474
475 // Check the rules in author sheets next. 475 // Check the rules in author sheets next.
476 if (matchAuthorAndUserStyles) 476 if (matchAuthorAndUserStyles)
477 matchAuthorRules(collector, false); 477 matchAuthorRules(collector, false);
478 478
479 // Now check our inline style attribute. 479 if (m_state.element()->isStyledElement()) {
480 if (matchAuthorAndUserStyles && m_state.styledElement() && m_state.styledEle ment()->inlineStyle()) { 480 // Now check our inline style attribute.
481 // Inline style is immutable as long as there is no CSSOM wrapper. 481 if (matchAuthorAndUserStyles && m_state.element()->inlineStyle()) {
482 // FIXME: Media control shadow trees seem to have problems with caching. 482 // Inline style is immutable as long as there is no CSSOM wrapper.
483 bool isInlineStyleCacheable = !m_state.styledElement()->inlineStyle()->i sMutable() && !m_state.styledElement()->isInShadowTree(); 483 // FIXME: Media control shadow trees seem to have problems with cach ing.
484 // FIXME: Constify. 484 bool isInlineStyleCacheable = !m_state.element()->inlineStyle()->isM utable() && !m_state.element()->isInShadowTree();
485 collector.addElementStyleProperties(m_state.styledElement()->inlineStyle (), isInlineStyleCacheable); 485 // FIXME: Constify.
486 collector.addElementStyleProperties(m_state.element()->inlineStyle() , isInlineStyleCacheable);
487 }
488
489 // Now check SMIL animation override style.
490 if (includeSMILProperties && matchAuthorAndUserStyles && m_state.element ()->isSVGElement())
491 collector.addElementStyleProperties(toSVGElement(m_state.element())- >animatedSMILStyleProperties(), false /* isCacheable */);
492
493 if (m_state.element()->hasActiveAnimations())
494 collector.matchedResult().isCacheable = false;
486 } 495 }
487
488 // Now check SMIL animation override style.
489 if (includeSMILProperties && matchAuthorAndUserStyles && m_state.styledEleme nt() && m_state.styledElement()->isSVGElement())
490 collector.addElementStyleProperties(toSVGElement(m_state.styledElement() )->animatedSMILStyleProperties(), false /* isCacheable */);
491
492 if (m_state.styledElement() && m_state.styledElement()->hasActiveAnimations( ))
493 collector.matchedResult().isCacheable = false;
494 } 496 }
495 497
496 static const unsigned cStyleSearchThreshold = 10; 498 static const unsigned cStyleSearchThreshold = 10;
497 static const unsigned cStyleSearchLevelThreshold = 10; 499 static const unsigned cStyleSearchLevelThreshold = 10;
498 500
499 static inline bool parentElementPreventsSharing(const Element* parentElement) 501 static inline bool parentElementPreventsSharing(const Element* parentElement)
500 { 502 {
501 if (!parentElement) 503 if (!parentElement)
502 return false; 504 return false;
503 return parentElement->hasFlagsSetDuringStylingOfChildren(); 505 return parentElement->hasFlagsSetDuringStylingOfChildren();
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
628 if (context.element()->isSVGElement()) { 630 if (context.element()->isSVGElement()) {
629 if (context.element()->getAttribute(classAttr) != sharingCandidate-> getAttribute(classAttr)) 631 if (context.element()->getAttribute(classAttr) != sharingCandidate-> getAttribute(classAttr))
630 return false; 632 return false;
631 } else if (context.element()->classNames() != sharingCandidate->classNam es()) { 633 } else if (context.element()->classNames() != sharingCandidate->classNam es()) {
632 return false; 634 return false;
633 } 635 }
634 } else { 636 } else {
635 return false; 637 return false;
636 } 638 }
637 639
638 if (context.styledElement()->presentationAttributeStyle() != sharingCandidat e->presentationAttributeStyle()) 640 if (context.element()->presentationAttributeStyle() != sharingCandidate->pre sentationAttributeStyle())
639 return false; 641 return false;
640 642
641 if (context.element()->hasTagName(progressTag)) { 643 if (context.element()->hasTagName(progressTag)) {
642 if (context.element()->shouldAppearIndeterminate() != sharingCandidate-> shouldAppearIndeterminate()) 644 if (context.element()->shouldAppearIndeterminate() != sharingCandidate-> shouldAppearIndeterminate())
643 return false; 645 return false;
644 } 646 }
645 647
646 return true; 648 return true;
647 } 649 }
648 650
(...skipping 21 matching lines...) Expand all
670 if (element->active() != context.element()->active()) 672 if (element->active() != context.element()->active())
671 return false; 673 return false;
672 if (element->focused() != context.element()->focused()) 674 if (element->focused() != context.element()->focused())
673 return false; 675 return false;
674 if (element->shadowPseudoId() != context.element()->shadowPseudoId()) 676 if (element->shadowPseudoId() != context.element()->shadowPseudoId())
675 return false; 677 return false;
676 if (element == element->document()->cssTarget()) 678 if (element == element->document()->cssTarget())
677 return false; 679 return false;
678 if (!sharingCandidateHasIdenticalStyleAffectingAttributes(context, element)) 680 if (!sharingCandidateHasIdenticalStyleAffectingAttributes(context, element))
679 return false; 681 return false;
680 if (element->additionalPresentationAttributeStyle() != context.styledElement ()->additionalPresentationAttributeStyle()) 682 if (element->additionalPresentationAttributeStyle() != context.element()->ad ditionalPresentationAttributeStyle())
681 return false; 683 return false;
682 684
683 if (element->hasID() && m_features.idsInRules.contains(element->idForStyleRe solution().impl())) 685 if (element->hasID() && m_features.idsInRules.contains(element->idForStyleRe solution().impl()))
684 return false; 686 return false;
685 if (element->hasScopedHTMLStyleChild()) 687 if (element->hasScopedHTMLStyleChild())
686 return false; 688 return false;
687 689
688 // FIXME: We should share style for option and optgroup whenever possible. 690 // FIXME: We should share style for option and optgroup whenever possible.
689 // Before doing so, we need to resolve issues in HTMLSelectElement::recalcLi stItems 691 // Before doing so, we need to resolve issues in HTMLSelectElement::recalcLi stItems
690 // and RenderMenuList::setText. See also https://bugs.webkit.org/show_bug.cg i?id=88405 692 // and RenderMenuList::setText. See also https://bugs.webkit.org/show_bug.cg i?id=88405
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
739 if (canShareStyleWithElement(context, toElement(node))) 741 if (canShareStyleWithElement(context, toElement(node)))
740 break; 742 break;
741 if (count++ == cStyleSearchThreshold) 743 if (count++ == cStyleSearchThreshold)
742 return 0; 744 return 0;
743 } 745 }
744 return toElement(node); 746 return toElement(node);
745 } 747 }
746 748
747 RenderStyle* StyleResolver::locateSharedStyle(const ElementResolveContext& conte xt) 749 RenderStyle* StyleResolver::locateSharedStyle(const ElementResolveContext& conte xt)
748 { 750 {
749 if (!context.styledElement()) 751 if (!context.element() || !context.element()->isStyledElement())
750 return 0; 752 return 0;
751 753
752 // If the element has inline style it is probably unique. 754 // If the element has inline style it is probably unique.
753 if (context.styledElement()->inlineStyle()) 755 if (context.element()->inlineStyle())
754 return 0; 756 return 0;
755 if (context.styledElement()->isSVGElement() && toSVGElement(context.styledEl ement())->animatedSMILStyleProperties()) 757 if (context.element()->isSVGElement() && toSVGElement(context.element())->an imatedSMILStyleProperties())
756 return 0; 758 return 0;
757 // Ids stop style sharing if they show up in the stylesheets. 759 // Ids stop style sharing if they show up in the stylesheets.
758 if (context.styledElement()->hasID() && m_features.idsInRules.contains(conte xt.styledElement()->idForStyleResolution().impl())) 760 if (context.element()->hasID() && m_features.idsInRules.contains(context.ele ment()->idForStyleResolution().impl()))
759 return 0; 761 return 0;
760 // Active and hovered elements always make a chain towards the document node 762 // Active and hovered elements always make a chain towards the document node
761 // and no siblings or cousins will have the same state. 763 // and no siblings or cousins will have the same state.
762 if (context.styledElement()->hovered()) 764 if (context.element()->hovered())
763 return 0; 765 return 0;
764 if (context.styledElement()->active()) 766 if (context.element()->active())
765 return 0; 767 return 0;
766 // There is always only one focused element. 768 // There is always only one focused element.
767 if (context.styledElement()->focused()) 769 if (context.element()->focused())
768 return 0; 770 return 0;
769 if (parentElementPreventsSharing(context.element()->parentElement())) 771 if (parentElementPreventsSharing(context.element()->parentElement()))
770 return 0; 772 return 0;
771 if (context.styledElement()->hasScopedHTMLStyleChild()) 773 if (context.element()->hasScopedHTMLStyleChild())
772 return 0; 774 return 0;
773 if (context.element() == context.document()->cssTarget()) 775 if (context.element() == context.document()->cssTarget())
774 return 0; 776 return 0;
775 if (elementHasDirectionAuto(context.element())) 777 if (elementHasDirectionAuto(context.element()))
776 return 0; 778 return 0;
777 if (context.element()->hasActiveAnimations()) 779 if (context.element()->hasActiveAnimations())
778 return 0; 780 return 0;
779 // When a dialog is first shown, its style is mutated to center it in the 781 // When a dialog is first shown, its style is mutated to center it in the
780 // viewport. So the styles can't be shared since the viewport position and 782 // viewport. So the styles can't be shared since the viewport position and
781 // size may be different each time a dialog is opened. 783 // size may be different each time a dialog is opened.
782 if (context.element()->hasTagName(dialogTag)) 784 if (context.element()->hasTagName(dialogTag))
783 return 0; 785 return 0;
784 786
785 // Cache whether context.element() is affected by any known class selectors. 787 // Cache whether context.element() is affected by any known class selectors.
786 // FIXME: This should be an explicit out parameter, instead of a member vari able. 788 // FIXME: This should be an explicit out parameter, instead of a member vari able.
787 m_elementAffectedByClassRules = context.element() && context.element()->hasC lass() && classNamesAffectedByRules(context.element()->classNames()); 789 m_elementAffectedByClassRules = context.element() && context.element()->hasC lass() && classNamesAffectedByRules(context.element()->classNames());
788 790
789 // Check next siblings and their cousins. 791 // Check next siblings and their cousins.
790 unsigned count = 0; 792 unsigned count = 0;
791 unsigned visitedNodeCount = 0; 793 unsigned visitedNodeCount = 0;
792 Element* shareElement = 0; 794 Element* shareElement = 0;
793 Node* cousinList = context.styledElement()->nextSibling(); 795 Node* cousinList = context.element()->nextSibling();
794 while (cousinList) { 796 while (cousinList) {
795 shareElement = findSiblingForStyleSharing(context, cousinList, count); 797 shareElement = findSiblingForStyleSharing(context, cousinList, count);
796 if (shareElement) 798 if (shareElement)
797 break; 799 break;
798 cousinList = locateCousinList(cousinList->parentElement(), visitedNodeCo unt); 800 cousinList = locateCousinList(cousinList->parentElement(), visitedNodeCo unt);
799 } 801 }
800 802
801 // If we have exhausted all our budget or our cousins. 803 // If we have exhausted all our budget or our cousins.
802 if (!shareElement) 804 if (!shareElement)
803 return 0; 805 return 0;
(...skipping 1595 matching lines...) Expand 10 before | Expand all | Expand 10 after
2399 void CachedMatchedProperties::reportMemoryUsage(MemoryObjectInfo* memoryObjectIn fo) const 2401 void CachedMatchedProperties::reportMemoryUsage(MemoryObjectInfo* memoryObjectIn fo) const
2400 { 2402 {
2401 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS); 2403 MemoryClassInfo info(memoryObjectInfo, this, WebCoreMemoryTypes::CSS);
2402 info.addMember(matchedProperties, "matchedProperties"); 2404 info.addMember(matchedProperties, "matchedProperties");
2403 info.addMember(ranges, "ranges"); 2405 info.addMember(ranges, "ranges");
2404 info.addMember(renderStyle, "renderStyle"); 2406 info.addMember(renderStyle, "renderStyle");
2405 info.addMember(parentRenderStyle, "parentRenderStyle"); 2407 info.addMember(parentRenderStyle, "parentRenderStyle");
2406 } 2408 }
2407 2409
2408 } // namespace WebCore 2410 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/css/ElementRuleCollector.cpp ('k') | Source/core/css/resolver/StyleResolverState.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698