Summary: | <style scoped>: Implement scoped selector matching in the slow path | ||||||
---|---|---|---|---|---|---|---|
Product: | WebKit | Reporter: | Roland Steiner <rolandsteiner> | ||||
Component: | CSS | Assignee: | Roland Steiner <rolandsteiner> | ||||
Status: | RESOLVED FIXED | ||||||
Severity: | Normal | CC: | dglazkov, koivisto, macpherson, menard | ||||
Priority: | P2 | ||||||
Version: | 528+ (Nightly build) | ||||||
Hardware: | Unspecified | ||||||
OS: | Unspecified | ||||||
Bug Depends on: | 77525 | ||||||
Bug Blocks: | 73192, 77527 | ||||||
Attachments: |
|
Description
Roland Steiner
2012-02-01 01:37:37 PST
Created attachment 126478 [details] Patch Patch, doing the slow path only, incorporating the changes to SelectorChecker compared to the old patches in bug 73192, also somewhat simplifed logic. Comment on attachment 126478 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=126478&action=review r=me, but consider the comments > Source/WebCore/css/CSSStyleSelector.cpp:176 > + RuleData(CSSStyleRule*, CSSSelector*, unsigned position, bool canUseFastChecking = true); Something like canUseFastCheckSelector would be a better name here and elsewhere (so it is clear what is being checked) > Source/WebCore/css/CSSStyleSelector.h:283 > +#if ENABLE(STYLE_SCOPED) > + MatchOptions(bool includeEmptyRules, const Element* scope = 0) : scope(scope), includeEmptyRules(includeEmptyRules) { } > + const Element* scope; > + bool includeEmptyRules; > +#else > + MatchOptions(bool includeEmptyRules) : includeEmptyRules(includeEmptyRules) { } > + bool includeEmptyRules; > +#endif I think you can remove #if ENABLE(STYLE_SCOPED) here and just default the scope to null. > Source/WebCore/css/SelectorChecker.cpp:490 > - for (; nextContext.element; nextContext.element = nextContext.element->parentElement()) { > + for (;;) { > + if (nextContext.element == nextContext.scope) > + return SelectorFailsCompletely; > + nextContext.element = nextContext.element->parentElement(); > + if (!nextContext.element) > + return SelectorFailsCompletely; You can keep the for loop as is if you do the following... > Source/WebCore/css/SelectorChecker.cpp:498 > case CSSSelector::Child: > + if (nextContext.element == nextContext.scope) > + return SelectorFailsCompletely; This test (current element is the scope) is repeated for all cases except SubSelector. I think it could be moved before the nextContext initialization with a relation != SubSelector test. Committed r107911: <http://trac.webkit.org/changeset/107911> |