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

Side by Side Diff: third_party/WebKit/Source/core/css/CSSSelector.h

Issue 2970623002: [WIP] Compute the linkMatchType inside the CSSSelectorParser.
Patch Set: [WIP] Compute the linkMatchType inside the CSSSelectorParser. Created 3 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/css/CSSSelector.cpp » ('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-2003 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999-2003 Lars Knoll (knoll@kde.org)
3 * 1999 Waldo Bastian (bastian@kde.org) 3 * 1999 Waldo Bastian (bastian@kde.org)
4 * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights 4 * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2013 Apple Inc. All rights
5 * reserved. 5 * reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public 8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either 9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version. 10 * version 2 of the License, or (at your option) any later version.
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 void SetNotLastInTagHistory() { is_last_in_tag_history_ = false; } 325 void SetNotLastInTagHistory() { is_last_in_tag_history_ = false; }
326 326
327 // http://dev.w3.org/csswg/selectors4/#compound 327 // http://dev.w3.org/csswg/selectors4/#compound
328 bool IsCompound() const; 328 bool IsCompound() const;
329 329
330 enum LinkMatchMask { 330 enum LinkMatchMask {
331 kMatchLink = 1, 331 kMatchLink = 1,
332 kMatchVisited = 2, 332 kMatchVisited = 2,
333 kMatchAll = kMatchLink | kMatchVisited 333 kMatchAll = kMatchLink | kMatchVisited
334 }; 334 };
335 unsigned ComputeLinkMatchType() const; 335 void UpdateLinkMatchType();
336 unsigned linkMatchType() const { return link_match_type_; }
336 337
337 bool IsForPage() const { return is_for_page_; } 338 bool IsForPage() const { return is_for_page_; }
338 void SetForPage() { is_for_page_ = true; } 339 void SetForPage() { is_for_page_ = true; }
339 340
340 bool RelationIsAffectedByPseudoContent() const { 341 bool RelationIsAffectedByPseudoContent() const {
341 return relation_is_affected_by_pseudo_content_; 342 return relation_is_affected_by_pseudo_content_;
342 } 343 }
343 void SetRelationIsAffectedByPseudoContent() { 344 void SetRelationIsAffectedByPseudoContent() {
344 relation_is_affected_by_pseudo_content_ = true; 345 relation_is_affected_by_pseudo_content_ = true;
345 } 346 }
346 347
347 bool MatchesPseudoElement() const; 348 bool MatchesPseudoElement() const;
348 349
349 bool HasContentPseudo() const; 350 bool HasContentPseudo() const;
350 bool HasSlottedPseudo() const; 351 bool HasSlottedPseudo() const;
351 bool HasDeepCombinatorOrShadowPseudo() const; 352 bool HasDeepCombinatorOrShadowPseudo() const;
352 bool NeedsUpdatedDistribution() const; 353 bool NeedsUpdatedDistribution() const;
353 354
354 private: 355 private:
355 unsigned relation_ : 4; // enum RelationType 356 unsigned relation_ : 4; // enum RelationType
356 unsigned match_ : 4; // enum MatchType 357 unsigned match_ : 4; // enum MatchType
357 unsigned pseudo_type_ : 8; // enum PseudoType 358 unsigned pseudo_type_ : 8; // enum PseudoType
358 unsigned is_last_in_selector_list_ : 1; 359 unsigned is_last_in_selector_list_ : 1;
359 unsigned is_last_in_tag_history_ : 1; 360 unsigned is_last_in_tag_history_ : 1;
360 unsigned has_rare_data_ : 1; 361 unsigned has_rare_data_ : 1;
361 unsigned is_for_page_ : 1; 362 unsigned is_for_page_ : 1;
362 unsigned tag_is_implicit_ : 1; 363 unsigned tag_is_implicit_ : 1;
363 unsigned relation_is_affected_by_pseudo_content_ : 1; 364 unsigned relation_is_affected_by_pseudo_content_ : 1;
365 unsigned link_match_type_ : 2; // enum LinkMatchMask
364 366
365 void SetPseudoType(PseudoType pseudo_type) { 367 void SetPseudoType(PseudoType pseudo_type) {
366 pseudo_type_ = pseudo_type; 368 pseudo_type_ = pseudo_type;
367 DCHECK_EQ(static_cast<PseudoType>(pseudo_type_), 369 DCHECK_EQ(static_cast<PseudoType>(pseudo_type_),
368 pseudo_type); // using a bitfield. 370 pseudo_type); // using a bitfield.
369 } 371 }
370 372
371 unsigned SpecificityForOneSelector() const; 373 unsigned SpecificityForOneSelector() const;
372 unsigned SpecificityForPage() const; 374 unsigned SpecificityForPage() const;
373 const CSSSelector* SerializeCompound(StringBuilder&) const; 375 const CSSSelector* SerializeCompound(StringBuilder&) const;
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 456
455 inline CSSSelector::CSSSelector() 457 inline CSSSelector::CSSSelector()
456 : relation_(kSubSelector), 458 : relation_(kSubSelector),
457 match_(kUnknown), 459 match_(kUnknown),
458 pseudo_type_(kPseudoUnknown), 460 pseudo_type_(kPseudoUnknown),
459 is_last_in_selector_list_(false), 461 is_last_in_selector_list_(false),
460 is_last_in_tag_history_(true), 462 is_last_in_tag_history_(true),
461 has_rare_data_(false), 463 has_rare_data_(false),
462 is_for_page_(false), 464 is_for_page_(false),
463 tag_is_implicit_(false), 465 tag_is_implicit_(false),
464 relation_is_affected_by_pseudo_content_(false) {} 466 relation_is_affected_by_pseudo_content_(false),
467 link_match_type_(kMatchAll) {}
465 468
466 inline CSSSelector::CSSSelector(const QualifiedName& tag_q_name, 469 inline CSSSelector::CSSSelector(const QualifiedName& tag_q_name,
467 bool tag_is_implicit) 470 bool tag_is_implicit)
468 : relation_(kSubSelector), 471 : relation_(kSubSelector),
469 match_(kTag), 472 match_(kTag),
470 pseudo_type_(kPseudoUnknown), 473 pseudo_type_(kPseudoUnknown),
471 is_last_in_selector_list_(false), 474 is_last_in_selector_list_(false),
472 is_last_in_tag_history_(true), 475 is_last_in_tag_history_(true),
473 has_rare_data_(false), 476 has_rare_data_(false),
474 is_for_page_(false), 477 is_for_page_(false),
475 tag_is_implicit_(tag_is_implicit), 478 tag_is_implicit_(tag_is_implicit),
476 relation_is_affected_by_pseudo_content_(false) { 479 relation_is_affected_by_pseudo_content_(false),
480 link_match_type_(kMatchAll) {
477 data_.tag_q_name_ = tag_q_name.Impl(); 481 data_.tag_q_name_ = tag_q_name.Impl();
478 data_.tag_q_name_->Ref(); 482 data_.tag_q_name_->Ref();
479 } 483 }
480 484
481 inline CSSSelector::CSSSelector(const CSSSelector& o) 485 inline CSSSelector::CSSSelector(const CSSSelector& o)
482 : relation_(o.relation_), 486 : relation_(o.relation_),
483 match_(o.match_), 487 match_(o.match_),
484 pseudo_type_(o.pseudo_type_), 488 pseudo_type_(o.pseudo_type_),
485 is_last_in_selector_list_(o.is_last_in_selector_list_), 489 is_last_in_selector_list_(o.is_last_in_selector_list_),
486 is_last_in_tag_history_(o.is_last_in_tag_history_), 490 is_last_in_tag_history_(o.is_last_in_tag_history_),
487 has_rare_data_(o.has_rare_data_), 491 has_rare_data_(o.has_rare_data_),
488 is_for_page_(o.is_for_page_), 492 is_for_page_(o.is_for_page_),
489 tag_is_implicit_(o.tag_is_implicit_), 493 tag_is_implicit_(o.tag_is_implicit_),
490 relation_is_affected_by_pseudo_content_( 494 relation_is_affected_by_pseudo_content_(
491 o.relation_is_affected_by_pseudo_content_) { 495 o.relation_is_affected_by_pseudo_content_),
496 link_match_type_(kMatchAll) {
492 if (o.match_ == kTag) { 497 if (o.match_ == kTag) {
493 data_.tag_q_name_ = o.data_.tag_q_name_; 498 data_.tag_q_name_ = o.data_.tag_q_name_;
494 data_.tag_q_name_->Ref(); 499 data_.tag_q_name_->Ref();
495 } else if (o.has_rare_data_) { 500 } else if (o.has_rare_data_) {
496 data_.rare_data_ = o.data_.rare_data_; 501 data_.rare_data_ = o.data_.rare_data_;
497 data_.rare_data_->Ref(); 502 data_.rare_data_->Ref();
498 } else if (o.data_.value_) { 503 } else if (o.data_.value_) {
499 data_.value_ = o.data_.value_; 504 data_.value_ = o.data_.value_;
500 data_.value_->Ref(); 505 data_.value_->Ref();
501 } 506 }
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
540 } 545 }
541 546
542 inline bool CSSSelector::IsIdClassOrAttributeSelector() const { 547 inline bool CSSSelector::IsIdClassOrAttributeSelector() const {
543 return IsAttributeSelector() || Match() == CSSSelector::kId || 548 return IsAttributeSelector() || Match() == CSSSelector::kId ||
544 Match() == CSSSelector::kClass; 549 Match() == CSSSelector::kClass;
545 } 550 }
546 551
547 } // namespace blink 552 } // namespace blink
548 553
549 #endif // CSSSelector_h 554 #endif // CSSSelector_h
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/core/css/CSSSelector.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698