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

Side by Side Diff: Source/core/dom/StyleEngine.cpp

Issue 1317533002: Sibling invalidation sets (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: sibling-inserted 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
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r ights reserved.
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved.
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
(...skipping 18 matching lines...) Expand all
29 #include "core/dom/StyleEngine.h" 29 #include "core/dom/StyleEngine.h"
30 30
31 #include "core/HTMLNames.h" 31 #include "core/HTMLNames.h"
32 #include "core/css/CSSFontSelector.h" 32 #include "core/css/CSSFontSelector.h"
33 #include "core/css/CSSStyleSheet.h" 33 #include "core/css/CSSStyleSheet.h"
34 #include "core/css/FontFaceCache.h" 34 #include "core/css/FontFaceCache.h"
35 #include "core/css/StyleSheetContents.h" 35 #include "core/css/StyleSheetContents.h"
36 #include "core/css/resolver/ScopedStyleResolver.h" 36 #include "core/css/resolver/ScopedStyleResolver.h"
37 #include "core/dom/DocumentStyleSheetCollector.h" 37 #include "core/dom/DocumentStyleSheetCollector.h"
38 #include "core/dom/Element.h" 38 #include "core/dom/Element.h"
39 #include "core/dom/ElementTraversal.h"
39 #include "core/dom/ProcessingInstruction.h" 40 #include "core/dom/ProcessingInstruction.h"
40 #include "core/dom/ShadowTreeStyleSheetCollection.h" 41 #include "core/dom/ShadowTreeStyleSheetCollection.h"
41 #include "core/dom/shadow/ShadowRoot.h" 42 #include "core/dom/shadow/ShadowRoot.h"
42 #include "core/frame/Settings.h" 43 #include "core/frame/Settings.h"
43 #include "core/html/HTMLIFrameElement.h" 44 #include "core/html/HTMLIFrameElement.h"
44 #include "core/html/HTMLLinkElement.h" 45 #include "core/html/HTMLLinkElement.h"
45 #include "core/html/imports/HTMLImportsController.h" 46 #include "core/html/imports/HTMLImportsController.h"
46 #include "core/inspector/InspectorInstrumentation.h" 47 #include "core/inspector/InspectorInstrumentation.h"
47 #include "core/page/Page.h" 48 #include "core/page/Page.h"
48 #include "core/svg/SVGStyleElement.h" 49 #include "core/svg/SVGStyleElement.h"
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 void StyleEngine::platformColorsChanged() 622 void StyleEngine::platformColorsChanged()
622 { 623 {
623 if (m_resolver) 624 if (m_resolver)
624 m_resolver->invalidateMatchedPropertiesCache(); 625 m_resolver->invalidateMatchedPropertiesCache();
625 document().setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTraci ng::create(StyleChangeReason::PlatformColorChange)); 626 document().setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTraci ng::create(StyleChangeReason::PlatformColorChange));
626 } 627 }
627 628
628 void StyleEngine::classChangedForElement(const SpaceSplitString& changedClasses, Element& element) 629 void StyleEngine::classChangedForElement(const SpaceSplitString& changedClasses, Element& element)
629 { 630 {
630 ASSERT(isMaster()); 631 ASSERT(isMaster());
631 InvalidationSetVector invalidationSets; 632 InvalidationSetVector descendant, sibling;
632 unsigned changedSize = changedClasses.size(); 633 unsigned changedSize = changedClasses.size();
633 RuleFeatureSet& ruleFeatureSet = ensureResolver().ensureUpdatedRuleFeatureSe t(); 634 RuleFeatureSet& ruleFeatureSet = ensureResolver().ensureUpdatedRuleFeatureSe t();
634 for (unsigned i = 0; i < changedSize; ++i) 635 for (unsigned i = 0; i < changedSize; ++i)
635 ruleFeatureSet.collectInvalidationSetsForClass(invalidationSets, element , changedClasses[i]); 636 ruleFeatureSet.collectInvalidationSetsForClass(descendant, sibling, elem ent, changedClasses[i]);
636 scheduleInvalidationSetsForElement(invalidationSets, element); 637 m_styleInvalidator.scheduleInvalidationSetsForElement(descendant, sibling, e lement);
637 } 638 }
638 639
639 void StyleEngine::classChangedForElement(const SpaceSplitString& oldClasses, con st SpaceSplitString& newClasses, Element& element) 640 void StyleEngine::classChangedForElement(const SpaceSplitString& oldClasses, con st SpaceSplitString& newClasses, Element& element)
640 { 641 {
641 ASSERT(isMaster()); 642 ASSERT(isMaster());
642 InvalidationSetVector invalidationSets;
643 if (!oldClasses.size()) { 643 if (!oldClasses.size()) {
644 classChangedForElement(newClasses, element); 644 classChangedForElement(newClasses, element);
645 return; 645 return;
646 } 646 }
647 647
648 // Class vectors tend to be very short. This is faster than using a hash tab le. 648 // Class vectors tend to be very short. This is faster than using a hash tab le.
649 BitVector remainingClassBits; 649 BitVector remainingClassBits;
650 remainingClassBits.ensureSize(oldClasses.size()); 650 remainingClassBits.ensureSize(oldClasses.size());
651 651
652 InvalidationSetVector descendant, sibling;
652 RuleFeatureSet& ruleFeatureSet = ensureResolver().ensureUpdatedRuleFeatureSe t(); 653 RuleFeatureSet& ruleFeatureSet = ensureResolver().ensureUpdatedRuleFeatureSe t();
653 654
654 for (unsigned i = 0; i < newClasses.size(); ++i) { 655 for (unsigned i = 0; i < newClasses.size(); ++i) {
655 bool found = false; 656 bool found = false;
656 for (unsigned j = 0; j < oldClasses.size(); ++j) { 657 for (unsigned j = 0; j < oldClasses.size(); ++j) {
657 if (newClasses[i] == oldClasses[j]) { 658 if (newClasses[i] == oldClasses[j]) {
658 // Mark each class that is still in the newClasses so we can ski p doing 659 // Mark each class that is still in the newClasses so we can ski p doing
659 // an n^2 search below when looking for removals. We can't break from 660 // an n^2 search below when looking for removals. We can't break from
660 // this loop early since a class can appear more than once. 661 // this loop early since a class can appear more than once.
661 remainingClassBits.quickSet(j); 662 remainingClassBits.quickSet(j);
662 found = true; 663 found = true;
663 } 664 }
664 } 665 }
665 // Class was added. 666 // Class was added.
666 if (!found) 667 if (!found)
667 ruleFeatureSet.collectInvalidationSetsForClass(invalidationSets, ele ment, newClasses[i]); 668 ruleFeatureSet.collectInvalidationSetsForClass(descendant, sibling, element, newClasses[i]);
668 } 669 }
669 670
670 for (unsigned i = 0; i < oldClasses.size(); ++i) { 671 for (unsigned i = 0; i < oldClasses.size(); ++i) {
671 if (remainingClassBits.quickGet(i)) 672 if (remainingClassBits.quickGet(i))
672 continue; 673 continue;
673 // Class was removed. 674 // Class was removed.
674 ruleFeatureSet.collectInvalidationSetsForClass(invalidationSets, element , oldClasses[i]); 675 ruleFeatureSet.collectInvalidationSetsForClass(descendant, sibling, elem ent, oldClasses[i]);
675 } 676 }
676 677
677 scheduleInvalidationSetsForElement(invalidationSets, element); 678 m_styleInvalidator.scheduleInvalidationSetsForElement(descendant, sibling, e lement);
678 } 679 }
679 680
680 void StyleEngine::attributeChangedForElement(const QualifiedName& attributeName, Element& element) 681 void StyleEngine::attributeChangedForElement(const QualifiedName& attributeName, Element& element)
681 { 682 {
682 ASSERT(isMaster()); 683 ASSERT(isMaster());
683 InvalidationSetVector invalidationSets; 684 InvalidationSetVector descendant, sibling;
684 ensureResolver().ensureUpdatedRuleFeatureSet().collectInvalidationSetsForAtt ribute(invalidationSets, element, attributeName); 685 ensureResolver().ensureUpdatedRuleFeatureSet().collectInvalidationSetsForAtt ribute(descendant, sibling, element, attributeName);
685 scheduleInvalidationSetsForElement(invalidationSets, element); 686 m_styleInvalidator.scheduleInvalidationSetsForElement(descendant, sibling, e lement);
686 } 687 }
687 688
688 void StyleEngine::idChangedForElement(const AtomicString& oldId, const AtomicStr ing& newId, Element& element) 689 void StyleEngine::idChangedForElement(const AtomicString& oldId, const AtomicStr ing& newId, Element& element)
689 { 690 {
690 ASSERT(isMaster()); 691 ASSERT(isMaster());
691 InvalidationSetVector invalidationSets; 692 InvalidationSetVector descendant, sibling;
692 RuleFeatureSet& ruleFeatureSet = ensureResolver().ensureUpdatedRuleFeatureSe t(); 693 RuleFeatureSet& ruleFeatureSet = ensureResolver().ensureUpdatedRuleFeatureSe t();
693 if (!oldId.isEmpty()) 694 if (!oldId.isEmpty())
694 ruleFeatureSet.collectInvalidationSetsForId(invalidationSets, element, o ldId); 695 ruleFeatureSet.collectInvalidationSetsForId(descendant, sibling, element , oldId);
695 if (!newId.isEmpty()) 696 if (!newId.isEmpty())
696 ruleFeatureSet.collectInvalidationSetsForId(invalidationSets, element, n ewId); 697 ruleFeatureSet.collectInvalidationSetsForId(descendant, sibling, element , newId);
697 scheduleInvalidationSetsForElement(invalidationSets, element); 698 m_styleInvalidator.scheduleInvalidationSetsForElement(descendant, sibling, e lement);
698 } 699 }
699 700
700 void StyleEngine::pseudoStateChangedForElement(CSSSelector::PseudoType pseudoTyp e, Element& element) 701 void StyleEngine::pseudoStateChangedForElement(CSSSelector::PseudoType pseudoTyp e, Element& element)
701 { 702 {
702 ASSERT(isMaster()); 703 ASSERT(isMaster());
703 InvalidationSetVector invalidationSets; 704 InvalidationSetVector descendant, sibling;
704 ensureResolver().ensureUpdatedRuleFeatureSet().collectInvalidationSetsForPse udoClass(invalidationSets, element, pseudoType); 705 ensureResolver().ensureUpdatedRuleFeatureSet().collectInvalidationSetsForPse udoClass(descendant, sibling, element, pseudoType);
705 scheduleInvalidationSetsForElement(invalidationSets, element); 706 m_styleInvalidator.scheduleInvalidationSetsForElement(descendant, sibling, e lement);
706 }
707
708 void StyleEngine::scheduleInvalidationSetsForElement(const InvalidationSetVector & invalidationSets, Element& element)
709 {
710 for (auto invalidationSet : invalidationSets)
711 m_styleInvalidator.scheduleInvalidation(invalidationSet, element);
712 } 707 }
713 708
714 DEFINE_TRACE(StyleEngine) 709 DEFINE_TRACE(StyleEngine)
715 { 710 {
716 #if ENABLE(OILPAN) 711 #if ENABLE(OILPAN)
717 visitor->trace(m_document); 712 visitor->trace(m_document);
718 visitor->trace(m_authorStyleSheets); 713 visitor->trace(m_authorStyleSheets);
719 visitor->trace(m_documentStyleSheetCollection); 714 visitor->trace(m_documentStyleSheetCollection);
720 visitor->trace(m_styleSheetCollectionMap); 715 visitor->trace(m_styleSheetCollectionMap);
721 visitor->trace(m_resolver); 716 visitor->trace(m_resolver);
722 visitor->trace(m_styleInvalidator); 717 visitor->trace(m_styleInvalidator);
723 visitor->trace(m_dirtyTreeScopes); 718 visitor->trace(m_dirtyTreeScopes);
724 visitor->trace(m_activeTreeScopes); 719 visitor->trace(m_activeTreeScopes);
725 visitor->trace(m_fontSelector); 720 visitor->trace(m_fontSelector);
726 visitor->trace(m_textToSheetCache); 721 visitor->trace(m_textToSheetCache);
727 visitor->trace(m_sheetToTextCache); 722 visitor->trace(m_sheetToTextCache);
728 #endif 723 #endif
729 CSSFontSelectorClient::trace(visitor); 724 CSSFontSelectorClient::trace(visitor);
730 } 725 }
731 726
732 } 727 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698