Commit 82f666a5 authored by Rune Lillesveen's avatar Rune Lillesveen Committed by Commit Bot

Remove rulesets used for style sharing.

After style sharing code is removed, we no longer need the sibling and
uncommon attribute rulesets to reject style sharing. This also means
RuleFeatureSet no longer needs to be traced, so some oilpan cruft could
be removed.

The StyleEngine API UsesSiblingRules() relied on the size of the sibling
ruleset, but it was only used as what looked like an optimization for
:empty selector updates where :empty is found in non-rightmost compound
selectors. However, the presence of :empty itself would add a sibling
selector in the previous code, and :empty in non-rightmost compound not
followed by an adjacent selector would only have de-generate cases like
":empty span" which could never match anything, or ":not(:empty) span"
which would always be true if the whole selector matches. Therefore, it
makes sense to just drop the API/check.

Bug: 721517
Change-Id: I85100850cb8cec56b17947916d7755ebcf3f15ec
Reviewed-on: https://chromium-review.googlesource.com/597689Reviewed-by: default avatarnainar <nainar@chromium.org>
Reviewed-by: default avatarMorten Stenshorne <mstensho@opera.com>
Commit-Queue: Rune Lillesveen <rune@opera.com>
Cr-Commit-Position: refs/heads/master@{#491344}
parent c0c27800
...@@ -172,7 +172,6 @@ bool CSSDefaultStyleSheets::EnsureDefaultStyleSheetsForElement( ...@@ -172,7 +172,6 @@ bool CSSDefaultStyleSheets::EnsureDefaultStyleSheetsForElement(
} }
DCHECK(!default_style_->Features().HasIdsInSelectors()); DCHECK(!default_style_->Features().HasIdsInSelectors());
DCHECK(!default_style_->Features().UsesSiblingRules());
return changed_default_style; return changed_default_style;
} }
......
...@@ -29,20 +29,6 @@ void CSSGlobalRuleSet::InitWatchedSelectorsRuleSet(Document& document) { ...@@ -29,20 +29,6 @@ void CSSGlobalRuleSet::InitWatchedSelectorsRuleSet(Document& document) {
} }
} }
static RuleSet* MakeRuleSet(const HeapVector<RuleFeature>& rules) {
size_t size = rules.size();
if (!size)
return nullptr;
RuleSet* rule_set = RuleSet::Create();
for (size_t i = 0; i < size; ++i) {
rule_set->AddRule(rules[i].rule, rules[i].selector_index,
rules[i].has_document_security_origin
? kRuleHasDocumentSecurityOrigin
: kRuleHasNoSpecialState);
}
return rule_set;
}
void CSSGlobalRuleSet::Update(Document& document) { void CSSGlobalRuleSet::Update(Document& document) {
if (!is_dirty_) if (!is_dirty_)
return; return;
...@@ -65,25 +51,16 @@ void CSSGlobalRuleSet::Update(Document& document) { ...@@ -65,25 +51,16 @@ void CSSGlobalRuleSet::Update(Document& document) {
features_.Add(watched_selectors_rule_set_->Features()); features_.Add(watched_selectors_rule_set_->Features());
document.GetStyleEngine().CollectScopedStyleFeaturesTo(features_); document.GetStyleEngine().CollectScopedStyleFeaturesTo(features_);
sibling_rule_set_ = MakeRuleSet(features_.SiblingRules());
uncommon_attribute_rule_set_ =
MakeRuleSet(features_.UncommonAttributeRules());
} }
void CSSGlobalRuleSet::Dispose() { void CSSGlobalRuleSet::Dispose() {
features_.Clear(); features_.Clear();
sibling_rule_set_ = nullptr;
uncommon_attribute_rule_set_ = nullptr;
watched_selectors_rule_set_ = nullptr; watched_selectors_rule_set_ = nullptr;
has_fullscreen_ua_style_ = false; has_fullscreen_ua_style_ = false;
is_dirty_ = true; is_dirty_ = true;
} }
DEFINE_TRACE(CSSGlobalRuleSet) { DEFINE_TRACE(CSSGlobalRuleSet) {
visitor->Trace(features_);
visitor->Trace(sibling_rule_set_);
visitor->Trace(uncommon_attribute_rule_set_);
visitor->Trace(watched_selectors_rule_set_); visitor->Trace(watched_selectors_rule_set_);
} }
......
...@@ -37,10 +37,6 @@ class CSSGlobalRuleSet : public GarbageCollectedFinalized<CSSGlobalRuleSet> { ...@@ -37,10 +37,6 @@ class CSSGlobalRuleSet : public GarbageCollectedFinalized<CSSGlobalRuleSet> {
CHECK(features_.IsAlive()); CHECK(features_.IsAlive());
return features_; return features_;
} }
RuleSet* SiblingRuleSet() const { return sibling_rule_set_; }
RuleSet* UncommonAttributeRuleSet() const {
return uncommon_attribute_rule_set_;
}
RuleSet* WatchedSelectorsRuleSet() const { RuleSet* WatchedSelectorsRuleSet() const {
return watched_selectors_rule_set_; return watched_selectors_rule_set_;
} }
...@@ -53,8 +49,6 @@ class CSSGlobalRuleSet : public GarbageCollectedFinalized<CSSGlobalRuleSet> { ...@@ -53,8 +49,6 @@ class CSSGlobalRuleSet : public GarbageCollectedFinalized<CSSGlobalRuleSet> {
// Constructed from rules in all TreeScopes including UA style and style // Constructed from rules in all TreeScopes including UA style and style
// injected from extensions. // injected from extensions.
RuleFeatureSet features_; RuleFeatureSet features_;
Member<RuleSet> sibling_rule_set_;
Member<RuleSet> uncommon_attribute_rule_set_;
// Rules injected from extensions. // Rules injected from extensions.
Member<RuleSet> watched_selectors_rule_set_; Member<RuleSet> watched_selectors_rule_set_;
......
...@@ -342,9 +342,6 @@ void ElementRuleCollector::DidMatchRule( ...@@ -342,9 +342,6 @@ void ElementRuleCollector::DidMatchRule(
return; return;
style_->SetHasPseudoStyle(dynamic_pseudo); style_->SetHasPseudoStyle(dynamic_pseudo);
} else { } else {
if (style_ && rule_data.ContainsUncommonAttributeSelector())
style_->SetUnique();
matched_rules_.push_back(MatchedRule( matched_rules_.push_back(MatchedRule(
&rule_data, result.specificity, cascade_order, &rule_data, result.specificity, cascade_order,
match_request.style_sheet_index, match_request.style_sheet)); match_request.style_sheet_index, match_request.style_sheet));
......
...@@ -266,17 +266,6 @@ void ExtractInvalidationSets(InvalidationSet* invalidation_set, ...@@ -266,17 +266,6 @@ void ExtractInvalidationSets(InvalidationSet* invalidation_set,
} // anonymous namespace } // anonymous namespace
RuleFeature::RuleFeature(StyleRule* rule,
unsigned selector_index,
bool has_document_security_origin)
: rule(rule),
selector_index(selector_index),
has_document_security_origin(has_document_security_origin) {}
DEFINE_TRACE(RuleFeature) {
visitor->Trace(rule);
}
RuleFeatureSet::RuleFeatureSet() : is_alive_(true) {} RuleFeatureSet::RuleFeatureSet() : is_alive_(true) {}
RuleFeatureSet::~RuleFeatureSet() { RuleFeatureSet::~RuleFeatureSet() {
...@@ -820,17 +809,6 @@ RuleFeatureSet::SelectorPreMatch RuleFeatureSet::CollectFeaturesFromRuleData( ...@@ -820,17 +809,6 @@ RuleFeatureSet::SelectorPreMatch RuleFeatureSet::CollectFeaturesFromRuleData(
metadata_.Add(metadata); metadata_.Add(metadata);
if (metadata.found_sibling_selector) {
sibling_rules_.push_back(
RuleFeature(rule_data.Rule(), rule_data.SelectorIndex(),
rule_data.HasDocumentSecurityOrigin()));
}
if (rule_data.ContainsUncommonAttributeSelector()) {
uncommon_attribute_rules_.push_back(
RuleFeature(rule_data.Rule(), rule_data.SelectorIndex(),
rule_data.HasDocumentSecurityOrigin()));
}
UpdateInvalidationSets(rule_data); UpdateInvalidationSets(rule_data);
return kSelectorMayMatch; return kSelectorMayMatch;
} }
...@@ -851,20 +829,6 @@ RuleFeatureSet::SelectorPreMatch RuleFeatureSet::CollectFeaturesFromSelector( ...@@ -851,20 +829,6 @@ RuleFeatureSet::SelectorPreMatch RuleFeatureSet::CollectFeaturesFromSelector(
case CSSSelector::kPseudoWindowInactive: case CSSSelector::kPseudoWindowInactive:
metadata.uses_window_inactive_selector = true; metadata.uses_window_inactive_selector = true;
break; break;
case CSSSelector::kPseudoEmpty:
case CSSSelector::kPseudoFirstChild:
case CSSSelector::kPseudoFirstOfType:
case CSSSelector::kPseudoLastChild:
case CSSSelector::kPseudoLastOfType:
case CSSSelector::kPseudoOnlyChild:
case CSSSelector::kPseudoOnlyOfType:
case CSSSelector::kPseudoNthChild:
case CSSSelector::kPseudoNthOfType:
case CSSSelector::kPseudoNthLastChild:
case CSSSelector::kPseudoNthLastOfType:
if (!metadata.found_insertion_point_crossing)
metadata.found_sibling_selector = true;
break;
case CSSSelector::kPseudoHost: case CSSSelector::kPseudoHost:
case CSSSelector::kPseudoHostContext: case CSSSelector::kPseudoHostContext:
if (!found_host_pseudo && relation == CSSSelector::kSubSelector) if (!found_host_pseudo && relation == CSSSelector::kSubSelector)
...@@ -905,10 +869,6 @@ RuleFeatureSet::SelectorPreMatch RuleFeatureSet::CollectFeaturesFromSelector( ...@@ -905,10 +869,6 @@ RuleFeatureSet::SelectorPreMatch RuleFeatureSet::CollectFeaturesFromSelector(
metadata.max_direct_adjacent_selectors = max_direct_adjacent_selectors; metadata.max_direct_adjacent_selectors = max_direct_adjacent_selectors;
max_direct_adjacent_selectors = 0; max_direct_adjacent_selectors = 0;
} }
if (!metadata.found_insertion_point_crossing &&
current->IsAdjacentSelector())
metadata.found_sibling_selector = true;
} }
DCHECK(!max_direct_adjacent_selectors); DCHECK(!max_direct_adjacent_selectors);
...@@ -925,7 +885,6 @@ void RuleFeatureSet::FeatureMetadata::Add(const FeatureMetadata& other) { ...@@ -925,7 +885,6 @@ void RuleFeatureSet::FeatureMetadata::Add(const FeatureMetadata& other) {
void RuleFeatureSet::FeatureMetadata::Clear() { void RuleFeatureSet::FeatureMetadata::Clear() {
uses_first_line_rules = false; uses_first_line_rules = false;
uses_window_inactive_selector = false; uses_window_inactive_selector = false;
found_sibling_selector = false;
found_insertion_point_crossing = false; found_insertion_point_crossing = false;
needs_full_recalc_for_rule_set_invalidation = false; needs_full_recalc_for_rule_set_invalidation = false;
max_direct_adjacent_selectors = 0; max_direct_adjacent_selectors = 0;
...@@ -960,8 +919,6 @@ void RuleFeatureSet::Add(const RuleFeatureSet& other) { ...@@ -960,8 +919,6 @@ void RuleFeatureSet::Add(const RuleFeatureSet& other) {
metadata_.Add(other.metadata_); metadata_.Add(other.metadata_);
sibling_rules_.AppendVector(other.sibling_rules_);
uncommon_attribute_rules_.AppendVector(other.uncommon_attribute_rules_);
viewport_dependent_media_query_results_.AppendVector( viewport_dependent_media_query_results_.AppendVector(
other.viewport_dependent_media_query_results_); other.viewport_dependent_media_query_results_);
device_dependent_media_query_results_.AppendVector( device_dependent_media_query_results_.AppendVector(
...@@ -970,8 +927,6 @@ void RuleFeatureSet::Add(const RuleFeatureSet& other) { ...@@ -970,8 +927,6 @@ void RuleFeatureSet::Add(const RuleFeatureSet& other) {
void RuleFeatureSet::Clear() { void RuleFeatureSet::Clear() {
CHECK(is_alive_); CHECK(is_alive_);
sibling_rules_.clear();
uncommon_attribute_rules_.clear();
metadata_.Clear(); metadata_.Clear();
class_invalidation_sets_.clear(); class_invalidation_sets_.clear();
attribute_invalidation_sets_.clear(); attribute_invalidation_sets_.clear();
...@@ -1214,11 +1169,6 @@ void RuleFeatureSet::AddFeaturesToUniversalSiblingInvalidationSet( ...@@ -1214,11 +1169,6 @@ void RuleFeatureSet::AddFeaturesToUniversalSiblingInvalidationSet(
descendant_features); descendant_features);
} }
DEFINE_TRACE(RuleFeatureSet) {
visitor->Trace(sibling_rules_);
visitor->Trace(uncommon_attribute_rules_);
}
void RuleFeatureSet::InvalidationSetFeatures::Add( void RuleFeatureSet::InvalidationSetFeatures::Add(
const InvalidationSetFeatures& other) { const InvalidationSetFeatures& other) {
classes.AppendVector(other.classes); classes.AppendVector(other.classes);
......
...@@ -38,30 +38,6 @@ class ContainerNode; ...@@ -38,30 +38,6 @@ class ContainerNode;
struct InvalidationLists; struct InvalidationLists;
class QualifiedName; class QualifiedName;
class RuleData; class RuleData;
class StyleRule;
struct RuleFeature {
DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
public:
RuleFeature(StyleRule*,
unsigned selector_index,
bool has_document_security_origin);
DECLARE_TRACE();
Member<StyleRule> rule;
unsigned selector_index;
bool has_document_security_origin;
};
} // namespace blink
// Declare the VectorTraits specialization before RuleFeatureSet
// declares its vector members below.
WTF_ALLOW_MOVE_AND_INIT_WITH_MEM_FUNCTIONS(blink::RuleFeature);
namespace blink {
class CORE_EXPORT RuleFeatureSet { class CORE_EXPORT RuleFeatureSet {
DISALLOW_NEW(); DISALLOW_NEW();
...@@ -78,7 +54,6 @@ class CORE_EXPORT RuleFeatureSet { ...@@ -78,7 +54,6 @@ class CORE_EXPORT RuleFeatureSet {
SelectorPreMatch CollectFeaturesFromRuleData(const RuleData&); SelectorPreMatch CollectFeaturesFromRuleData(const RuleData&);
bool UsesSiblingRules() const { return !sibling_rules_.IsEmpty(); }
bool UsesFirstLineRules() const { return metadata_.uses_first_line_rules; } bool UsesFirstLineRules() const { return metadata_.uses_first_line_rules; }
bool UsesWindowInactiveSelector() const { bool UsesWindowInactiveSelector() const {
return metadata_.uses_window_inactive_selector; return metadata_.uses_window_inactive_selector;
...@@ -105,11 +80,6 @@ class CORE_EXPORT RuleFeatureSet { ...@@ -105,11 +80,6 @@ class CORE_EXPORT RuleFeatureSet {
return id_invalidation_sets_.Contains(id_value); return id_invalidation_sets_.Contains(id_value);
} }
const HeapVector<RuleFeature>& SiblingRules() const { return sibling_rules_; }
const HeapVector<RuleFeature>& UncommonAttributeRules() const {
return uncommon_attribute_rules_;
}
const MediaQueryResultList& ViewportDependentMediaQueryResults() const { const MediaQueryResultList& ViewportDependentMediaQueryResults() const {
return viewport_dependent_media_query_results_; return viewport_dependent_media_query_results_;
} }
...@@ -160,8 +130,6 @@ class CORE_EXPORT RuleFeatureSet { ...@@ -160,8 +130,6 @@ class CORE_EXPORT RuleFeatureSet {
bool HasIdsInSelectors() const { return id_invalidation_sets_.size() > 0; } bool HasIdsInSelectors() const { return id_invalidation_sets_.size() > 0; }
DECLARE_TRACE();
bool IsAlive() const { return is_alive_; } bool IsAlive() const { return is_alive_; }
protected: protected:
...@@ -187,7 +155,6 @@ class CORE_EXPORT RuleFeatureSet { ...@@ -187,7 +155,6 @@ class CORE_EXPORT RuleFeatureSet {
bool uses_first_line_rules = false; bool uses_first_line_rules = false;
bool uses_window_inactive_selector = false; bool uses_window_inactive_selector = false;
bool found_sibling_selector = false;
bool found_insertion_point_crossing = false; bool found_insertion_point_crossing = false;
bool needs_full_recalc_for_rule_set_invalidation = false; bool needs_full_recalc_for_rule_set_invalidation = false;
unsigned max_direct_adjacent_selectors = 0; unsigned max_direct_adjacent_selectors = 0;
...@@ -295,8 +262,6 @@ class CORE_EXPORT RuleFeatureSet { ...@@ -295,8 +262,6 @@ class CORE_EXPORT RuleFeatureSet {
RefPtr<SiblingInvalidationSet> universal_sibling_invalidation_set_; RefPtr<SiblingInvalidationSet> universal_sibling_invalidation_set_;
RefPtr<DescendantInvalidationSet> nth_invalidation_set_; RefPtr<DescendantInvalidationSet> nth_invalidation_set_;
RefPtr<DescendantInvalidationSet> type_rule_invalidation_set_; RefPtr<DescendantInvalidationSet> type_rule_invalidation_set_;
HeapVector<RuleFeature> sibling_rules_;
HeapVector<RuleFeature> uncommon_attribute_rules_;
MediaQueryResultList viewport_dependent_media_query_results_; MediaQueryResultList viewport_dependent_media_query_results_;
MediaQueryResultList device_dependent_media_query_results_; MediaQueryResultList device_dependent_media_query_results_;
......
...@@ -19,38 +19,6 @@ ...@@ -19,38 +19,6 @@
namespace blink { namespace blink {
// TODO(sof): consider making these part object helper abstractions
// available from platform/heap/.
template <typename T>
class HeapPartObject final
: public GarbageCollectedFinalized<HeapPartObject<T>> {
public:
static HeapPartObject* Create() { return new HeapPartObject; }
T* Get() { return &part_; }
DEFINE_INLINE_TRACE() { visitor->Trace(part_); }
private:
HeapPartObject() {}
T part_;
};
template <typename T>
class PersistentPartObject final {
DISALLOW_NEW();
public:
PersistentPartObject() : part_(HeapPartObject<T>::Create()) {}
T* operator->() const { return (*part_).Get(); }
private:
Persistent<HeapPartObject<T>> part_;
};
class RuleFeatureSetTest : public ::testing::Test { class RuleFeatureSetTest : public ::testing::Test {
public: public:
RuleFeatureSetTest() {} RuleFeatureSetTest() {}
...@@ -73,25 +41,25 @@ class RuleFeatureSetTest : public ::testing::Test { ...@@ -73,25 +41,25 @@ class RuleFeatureSetTest : public ::testing::Test {
StyleRule::Create(std::move(selector_list), StyleRule::Create(std::move(selector_list),
MutableStylePropertySet::Create(kHTMLStandardMode)); MutableStylePropertySet::Create(kHTMLStandardMode));
RuleData rule_data(style_rule, 0, 0, kRuleHasNoSpecialState); RuleData rule_data(style_rule, 0, 0, kRuleHasNoSpecialState);
return rule_feature_set_->CollectFeaturesFromRuleData(rule_data); return rule_feature_set_.CollectFeaturesFromRuleData(rule_data);
} }
void ClearFeatures() { rule_feature_set_->Clear(); } void ClearFeatures() { rule_feature_set_.Clear(); }
void CollectInvalidationSetsForClass(InvalidationLists& invalidation_lists, void CollectInvalidationSetsForClass(InvalidationLists& invalidation_lists,
const AtomicString& class_name) const { const AtomicString& class_name) const {
Element* element = Traversal<HTMLElement>::FirstChild( Element* element = Traversal<HTMLElement>::FirstChild(
*Traversal<HTMLElement>::FirstChild(*document_->body())); *Traversal<HTMLElement>::FirstChild(*document_->body()));
rule_feature_set_->CollectInvalidationSetsForClass(invalidation_lists, rule_feature_set_.CollectInvalidationSetsForClass(invalidation_lists,
*element, class_name); *element, class_name);
} }
void CollectInvalidationSetsForId(InvalidationLists& invalidation_lists, void CollectInvalidationSetsForId(InvalidationLists& invalidation_lists,
const AtomicString& id) const { const AtomicString& id) const {
Element* element = Traversal<HTMLElement>::FirstChild( Element* element = Traversal<HTMLElement>::FirstChild(
*Traversal<HTMLElement>::FirstChild(*document_->body())); *Traversal<HTMLElement>::FirstChild(*document_->body()));
rule_feature_set_->CollectInvalidationSetsForId(invalidation_lists, rule_feature_set_.CollectInvalidationSetsForId(invalidation_lists, *element,
*element, id); id);
} }
void CollectInvalidationSetsForAttribute( void CollectInvalidationSetsForAttribute(
...@@ -99,7 +67,7 @@ class RuleFeatureSetTest : public ::testing::Test { ...@@ -99,7 +67,7 @@ class RuleFeatureSetTest : public ::testing::Test {
const QualifiedName& attribute_name) const { const QualifiedName& attribute_name) const {
Element* element = Traversal<HTMLElement>::FirstChild( Element* element = Traversal<HTMLElement>::FirstChild(
*Traversal<HTMLElement>::FirstChild(*document_->body())); *Traversal<HTMLElement>::FirstChild(*document_->body()));
rule_feature_set_->CollectInvalidationSetsForAttribute( rule_feature_set_.CollectInvalidationSetsForAttribute(
invalidation_lists, *element, attribute_name); invalidation_lists, *element, attribute_name);
} }
...@@ -108,18 +76,18 @@ class RuleFeatureSetTest : public ::testing::Test { ...@@ -108,18 +76,18 @@ class RuleFeatureSetTest : public ::testing::Test {
CSSSelector::PseudoType pseudo) const { CSSSelector::PseudoType pseudo) const {
Element* element = Traversal<HTMLElement>::FirstChild( Element* element = Traversal<HTMLElement>::FirstChild(
*Traversal<HTMLElement>::FirstChild(*document_->body())); *Traversal<HTMLElement>::FirstChild(*document_->body()));
rule_feature_set_->CollectInvalidationSetsForPseudoClass(invalidation_lists, rule_feature_set_.CollectInvalidationSetsForPseudoClass(invalidation_lists,
*element, pseudo); *element, pseudo);
} }
void CollectUniversalSiblingInvalidationSet( void CollectUniversalSiblingInvalidationSet(
InvalidationLists& invalidation_lists) { InvalidationLists& invalidation_lists) {
rule_feature_set_->CollectUniversalSiblingInvalidationSet( rule_feature_set_.CollectUniversalSiblingInvalidationSet(invalidation_lists,
invalidation_lists, 1); 1);
} }
void CollectNthInvalidationSet(InvalidationLists& invalidation_lists) { void CollectNthInvalidationSet(InvalidationLists& invalidation_lists) {
rule_feature_set_->CollectNthInvalidationSet(invalidation_lists); rule_feature_set_.CollectNthInvalidationSet(invalidation_lists);
} }
const HashSet<AtomicString>& ClassSet( const HashSet<AtomicString>& ClassSet(
...@@ -256,21 +224,13 @@ class RuleFeatureSetTest : public ::testing::Test { ...@@ -256,21 +224,13 @@ class RuleFeatureSetTest : public ::testing::Test {
EXPECT_TRUE(attributes.Contains(attribute)); EXPECT_TRUE(attributes.Contains(attribute));
} }
void ExpectSiblingRuleCount(unsigned count) {
EXPECT_EQ(count, rule_feature_set_->SiblingRules().size());
}
void ExpectUncommonAttributeRuleCount(unsigned count) {
EXPECT_EQ(count, rule_feature_set_->UncommonAttributeRules().size());
}
void ExpectFullRecalcForRuleSetInvalidation(bool expected) { void ExpectFullRecalcForRuleSetInvalidation(bool expected) {
EXPECT_EQ(expected, EXPECT_EQ(expected,
rule_feature_set_->NeedsFullRecalcForRuleSetInvalidation()); rule_feature_set_.NeedsFullRecalcForRuleSetInvalidation());
} }
private: private:
PersistentPartObject<RuleFeatureSet> rule_feature_set_; RuleFeatureSet rule_feature_set_;
Persistent<Document> document_; Persistent<Document> document_;
}; };
...@@ -477,143 +437,6 @@ TEST_F(RuleFeatureSetTest, nonMatchingHostContext) { ...@@ -477,143 +437,6 @@ TEST_F(RuleFeatureSetTest, nonMatchingHostContext) {
ExpectNoInvalidation(invalidation_lists.descendants); ExpectNoInvalidation(invalidation_lists.descendants);
} }
TEST_F(RuleFeatureSetTest, siblingRulesBeforeContentPseudo) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures("a + b ::content .c"));
ExpectSiblingRuleCount(0);
}
TEST_F(RuleFeatureSetTest, siblingRulesBeforeContentPseudo2) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures("a + ::content .b"));
ExpectSiblingRuleCount(0);
}
TEST_F(RuleFeatureSetTest, siblingRulesAfterContentPseudo) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures(".a ::content .b + .c"));
ExpectSiblingRuleCount(1);
}
TEST_F(RuleFeatureSetTest, siblingRulesNthBeforeContentPseudo) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures(":nth-child(2) ::content .a"));
ExpectSiblingRuleCount(0);
}
TEST_F(RuleFeatureSetTest, siblingRulesNthAfterContentPseudo) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures(".a ::content :nth-child(2)"));
ExpectSiblingRuleCount(1);
}
TEST_F(RuleFeatureSetTest, siblingRulesBeforeSlotted) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures(".a + ::slotted(.b)"));
ExpectSiblingRuleCount(0);
}
TEST_F(RuleFeatureSetTest, siblingRulesBeforeHost) {
EXPECT_EQ(RuleFeatureSet::kSelectorNeverMatches,
CollectFeatures(".a + :host(.b)"));
ExpectSiblingRuleCount(0);
}
TEST_F(RuleFeatureSetTest, siblingRulesBeforeHostContext) {
EXPECT_EQ(RuleFeatureSet::kSelectorNeverMatches,
CollectFeatures(".a + :host-context(.b)"));
ExpectSiblingRuleCount(0);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesAfterContentPseudo) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures("div ::content [attr]"));
ExpectUncommonAttributeRuleCount(1);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesBeforeContentPseudo) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures("[attr] ::content div"));
ExpectUncommonAttributeRuleCount(0);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesSlotted) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures("::slotted([attr])"));
ExpectUncommonAttributeRuleCount(1);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesBeforeSlotted) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures("[attr]::slotted(*)"));
ExpectUncommonAttributeRuleCount(0);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesHost) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures(":host([attr])"));
ExpectUncommonAttributeRuleCount(1);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesBeforeHost) {
EXPECT_EQ(RuleFeatureSet::kSelectorNeverMatches,
CollectFeatures("[attr] :host"));
ExpectUncommonAttributeRuleCount(0);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesAfterHost) {
EXPECT_EQ(RuleFeatureSet::kSelectorNeverMatches,
CollectFeatures(":host[attr]"));
ExpectUncommonAttributeRuleCount(0);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesAfterHost2) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch, CollectFeatures(":host [attr]"));
ExpectUncommonAttributeRuleCount(1);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesHostBeforePseudo) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures(":host([attr])::before"));
ExpectUncommonAttributeRuleCount(1);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesHostContext) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures(":host-context([attr])"));
ExpectUncommonAttributeRuleCount(1);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesBeforeHostContext) {
EXPECT_EQ(RuleFeatureSet::kSelectorNeverMatches,
CollectFeatures("[attr] :host-context(div)"));
ExpectUncommonAttributeRuleCount(0);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesBeforeHostContext2) {
EXPECT_EQ(RuleFeatureSet::kSelectorNeverMatches,
CollectFeatures("[attr]:host-context(div)"));
ExpectUncommonAttributeRuleCount(0);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesAfterHostContext) {
EXPECT_EQ(RuleFeatureSet::kSelectorNeverMatches,
CollectFeatures(":host-context(*)[attr]"));
ExpectUncommonAttributeRuleCount(0);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesAfterHostContext2) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures(":host-context(*) [attr]"));
ExpectUncommonAttributeRuleCount(1);
}
TEST_F(RuleFeatureSetTest, uncommonAttributeRulesAfterHostContextBeforePseudo) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch,
CollectFeatures(":host-context([attr])::before"));
ExpectUncommonAttributeRuleCount(1);
}
TEST_F(RuleFeatureSetTest, universalSiblingInvalidationDirectAdjacent) { TEST_F(RuleFeatureSetTest, universalSiblingInvalidationDirectAdjacent) {
EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch, CollectFeatures("* + .a")); EXPECT_EQ(RuleFeatureSet::kSelectorMayMatch, CollectFeatures("* + .a"));
......
...@@ -49,57 +49,6 @@ namespace blink { ...@@ -49,57 +49,6 @@ namespace blink {
using namespace HTMLNames; using namespace HTMLNames;
// -----------------------------------------------------------------
static bool ContainsUncommonAttributeSelector(const CSSSelector&);
static inline bool SelectorListContainsUncommonAttributeSelector(
const CSSSelector* selector) {
const CSSSelectorList* selector_list = selector->SelectorList();
if (!selector_list)
return false;
for (const CSSSelector* selector = selector_list->First(); selector;
selector = CSSSelectorList::Next(*selector)) {
if (ContainsUncommonAttributeSelector(*selector))
return true;
}
return false;
}
static inline bool IsCommonAttributeSelectorAttribute(
const QualifiedName& attribute) {
// These are explicitly tested for equality in canShareStyleWithElement.
return attribute == typeAttr || attribute == readonlyAttr;
}
static bool ContainsUncommonAttributeSelector(const CSSSelector& selector) {
const CSSSelector* current = &selector;
for (; current; current = current->TagHistory()) {
// Allow certain common attributes (used in the default style) in the
// selectors that match the current element.
if (current->IsAttributeSelector() &&
!IsCommonAttributeSelectorAttribute(current->Attribute()))
return true;
if (SelectorListContainsUncommonAttributeSelector(current))
return true;
if (current->RelationIsAffectedByPseudoContent() ||
current->GetPseudoType() == CSSSelector::kPseudoSlotted)
return false;
if (current->Relation() != CSSSelector::kSubSelector) {
current = current->TagHistory();
break;
}
}
for (; current; current = current->TagHistory()) {
if (current->IsAttributeSelector())
return true;
if (SelectorListContainsUncommonAttributeSelector(current))
return true;
}
return false;
}
static inline PropertyWhitelistType DeterminePropertyWhitelistType( static inline PropertyWhitelistType DeterminePropertyWhitelistType(
const AddRuleFlags add_rule_flags, const AddRuleFlags add_rule_flags,
const CSSSelector& selector) { const CSSSelector& selector) {
...@@ -124,8 +73,6 @@ RuleData::RuleData(StyleRule* rule, ...@@ -124,8 +73,6 @@ RuleData::RuleData(StyleRule* rule,
is_last_in_array_(false), is_last_in_array_(false),
position_(position), position_(position),
specificity_(Selector().Specificity()), specificity_(Selector().Specificity()),
contains_uncommon_attribute_selector_(
blink::ContainsUncommonAttributeSelector(Selector())),
link_match_type_(Selector().ComputeLinkMatchType()), link_match_type_(Selector().ComputeLinkMatchType()),
has_document_security_origin_(add_rule_flags & has_document_security_origin_(add_rule_flags &
kRuleHasDocumentSecurityOrigin), kRuleHasDocumentSecurityOrigin),
...@@ -441,7 +388,6 @@ DEFINE_TRACE(RuleSet) { ...@@ -441,7 +388,6 @@ DEFINE_TRACE(RuleSet) {
visitor->Trace(placeholder_pseudo_rules_); visitor->Trace(placeholder_pseudo_rules_);
visitor->Trace(universal_rules_); visitor->Trace(universal_rules_);
visitor->Trace(shadow_host_rules_); visitor->Trace(shadow_host_rules_);
visitor->Trace(features_);
visitor->Trace(page_rules_); visitor->Trace(page_rules_);
visitor->Trace(font_face_rules_); visitor->Trace(font_face_rules_);
visitor->Trace(keyframes_rules_); visitor->Trace(keyframes_rules_);
......
...@@ -761,9 +761,7 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context, ...@@ -761,9 +761,7 @@ bool SelectorChecker::CheckPseudoClass(const SelectorCheckingContext& context,
element.SetStyleAffectedByEmpty(); element.SetStyleAffectedByEmpty();
if (context.in_rightmost_compound) if (context.in_rightmost_compound)
element_style_->SetEmptyState(result); element_style_->SetEmptyState(result);
else if (element.GetComputedStyle() && else if (element.GetComputedStyle())
(element.GetDocument().GetStyleEngine().UsesSiblingRules() ||
element.GetComputedStyle()->Unique()))
element.MutableComputedStyle()->SetEmptyState(result); element.MutableComputedStyle()->SetEmptyState(result);
} }
return result; return result;
......
...@@ -260,7 +260,6 @@ void ElementShadowV0::ClearDistribution() { ...@@ -260,7 +260,6 @@ void ElementShadowV0::ClearDistribution() {
DEFINE_TRACE(ElementShadowV0) { DEFINE_TRACE(ElementShadowV0) {
visitor->Trace(element_shadow_); visitor->Trace(element_shadow_);
visitor->Trace(node_to_insertion_points_); visitor->Trace(node_to_insertion_points_);
visitor->Trace(select_features_);
} }
DEFINE_TRACE_WRAPPERS(ElementShadowV0) {} DEFINE_TRACE_WRAPPERS(ElementShadowV0) {}
......
...@@ -168,9 +168,6 @@ class CORE_EXPORT StyleEngine final ...@@ -168,9 +168,6 @@ class CORE_EXPORT StyleEngine final
unsigned MaxDirectAdjacentSelectors() const { unsigned MaxDirectAdjacentSelectors() const {
return GetRuleFeatureSet().MaxDirectAdjacentSelectors(); return GetRuleFeatureSet().MaxDirectAdjacentSelectors();
} }
bool UsesSiblingRules() const {
return GetRuleFeatureSet().UsesSiblingRules();
}
bool UsesFirstLineRules() const { bool UsesFirstLineRules() const {
return GetRuleFeatureSet().UsesFirstLineRules(); return GetRuleFeatureSet().UsesFirstLineRules();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment