Changeset 89132 in webkit
- Timestamp:
- Jun 17, 2011 3:13:52 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r89131 r89132 1 2011-06-17 Alexander Pavlov <apavlov@chromium.org> 2 3 Reviewed by David Hyatt. 4 5 Web Inspector: support for emulating element's pseudo class state in styleRulesForElement() 6 https://bugs.webkit.org/show_bug.cgi?id=61070 7 8 This patch is a slight rework of a solution by Alexander Udalov. 9 It is supposed to help implement a feature in Web Inspector to examine 10 style rules matched for different states of a given element. 11 Web Inspector is supposed to pass a mask of ForcePseudoClassFlags to 12 styleRulesForElement(), so that it will filter only the rules whose state 13 (a set of pseudo classes in their selectors) matches a given 14 mask, ignoring the state of the element itself. 15 DoNotForcePseudoClassMask is the default behaviour; it always examines 16 the state of a given element to make a match. 17 18 Tests will be provided in a subsequent Web Inspector change employing this functionality. 19 20 * css/CSSStyleSelector.cpp: 21 (WebCore::CSSStyleSelector::initForStyleResolve): 22 (WebCore::CSSStyleSelector::styleRulesForElement): 23 (WebCore::CSSStyleSelector::pseudoStyleRulesForElement): 24 (WebCore::CSSStyleSelector::checkSelector): 25 (WebCore::CSSStyleSelector::SelectorChecker::checkSelector): 26 (WebCore::CSSStyleSelector::SelectorChecker::checkOneSelector): 27 * css/CSSStyleSelector.h: 28 1 29 2011-06-17 Yury Semikhatsky <yurys@chromium.org> 2 30 -
trunk/Source/WebCore/css/CSSStyleSelector.cpp
r88804 r89132 885 885 886 886 m_fontDirty = false; 887 888 m_forcePseudoClassMask = DoNotForcePseudoClassMask; 887 889 } 888 890 … … 2019 2021 } 2020 2022 2021 PassRefPtr<CSSRuleList> CSSStyleSelector::styleRulesForElement(Element* e, unsigned rulesToInclude )2022 { 2023 return pseudoStyleRulesForElement(e, NOPSEUDO, rulesToInclude );2024 } 2025 2026 PassRefPtr<CSSRuleList> CSSStyleSelector::pseudoStyleRulesForElement(Element* e, PseudoId pseudoId, unsigned rulesToInclude )2023 PassRefPtr<CSSRuleList> CSSStyleSelector::styleRulesForElement(Element* e, unsigned rulesToInclude, unsigned forcePseudoClassMask) 2024 { 2025 return pseudoStyleRulesForElement(e, NOPSEUDO, rulesToInclude, forcePseudoClassMask); 2026 } 2027 2028 PassRefPtr<CSSRuleList> CSSStyleSelector::pseudoStyleRulesForElement(Element* e, PseudoId pseudoId, unsigned rulesToInclude, unsigned forcePseudoClassMask) 2027 2029 { 2028 2030 if (!e || !e->document()->haveStylesheetsLoaded()) … … 2033 2035 initElement(e); 2034 2036 initForStyleResolve(e, 0, pseudoId); 2037 m_forcePseudoClassMask = forcePseudoClassMask; 2035 2038 2036 2039 if (rulesToInclude & UAAndUserCSSRules) { … … 2057 2060 2058 2061 m_checker.m_collectRulesOnly = false; 2062 m_forcePseudoClassMask = DoNotForcePseudoClassMask; 2059 2063 2060 2064 return m_ruleList.release(); … … 2079 2083 2080 2084 // Slow path. 2081 SelectorMatch match = m_checker.checkSelector(ruleData.selector(), m_element, m_dynamicPseudo, false, false, style(), m_parentNode ? m_parentNode->renderStyle() : 0);2085 SelectorMatch match = m_checker.checkSelector(ruleData.selector(), m_element, m_dynamicPseudo, false, false, m_forcePseudoClassMask, style(), m_parentNode ? m_parentNode->renderStyle() : 0); 2082 2086 if (match != SelectorMatches) 2083 2087 return false; … … 2208 2212 // * SelectorFailsLocally - the selector fails for the element e 2209 2213 // * SelectorFailsCompletely - the selector fails for e and any sibling or ancestor of e 2210 CSSStyleSelector::SelectorMatch CSSStyleSelector::SelectorChecker::checkSelector(CSSSelector* sel, Element* e, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const2214 CSSStyleSelector::SelectorMatch CSSStyleSelector::SelectorChecker::checkSelector(CSSSelector* sel, Element* e, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, unsigned forcePseudoClassMask, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const 2211 2215 { 2212 2216 #if ENABLE(SVG) … … 2218 2222 2219 2223 // first selector has to match 2220 if (!checkOneSelector(sel, e, dynamicPseudo, isSubSelector, encounteredLink, elementStyle, elementParentStyle))2224 if (!checkOneSelector(sel, e, dynamicPseudo, isSubSelector, encounteredLink, forcePseudoClassMask, elementStyle, elementParentStyle)) 2221 2225 return SelectorFailsLocally; 2222 2226 … … 2252 2256 return SelectorFailsCompletely; 2253 2257 e = static_cast<Element*>(n); 2254 SelectorMatch match = checkSelector(sel, e, dynamicPseudo, false, encounteredLink );2258 SelectorMatch match = checkSelector(sel, e, dynamicPseudo, false, encounteredLink, forcePseudoClassMask); 2255 2259 if (match != SelectorFailsLocally) 2256 2260 return match; … … 2263 2267 return SelectorFailsCompletely; 2264 2268 e = static_cast<Element*>(n); 2265 return checkSelector(sel, e, dynamicPseudo, false, encounteredLink );2269 return checkSelector(sel, e, dynamicPseudo, false, encounteredLink, forcePseudoClassMask); 2266 2270 } 2267 2271 case CSSSelector::DirectAdjacent: … … 2279 2283 e = static_cast<Element*>(n); 2280 2284 m_matchVisitedPseudoClass = false; 2281 return checkSelector(sel, e, dynamicPseudo, false, encounteredLink );2285 return checkSelector(sel, e, dynamicPseudo, false, encounteredLink, forcePseudoClassMask); 2282 2286 } 2283 2287 case CSSSelector::IndirectAdjacent: … … 2295 2299 e = static_cast<Element*>(n); 2296 2300 m_matchVisitedPseudoClass = false; 2297 SelectorMatch match = checkSelector(sel, e, dynamicPseudo, false, encounteredLink );2301 SelectorMatch match = checkSelector(sel, e, dynamicPseudo, false, encounteredLink, forcePseudoClassMask); 2298 2302 if (match != SelectorFailsLocally) 2299 2303 return match; … … 2307 2311 !((RenderScrollbar::scrollbarForStyleResolve() || dynamicPseudo == SCROLLBAR_CORNER || dynamicPseudo == RESIZER) && sel->m_match == CSSSelector::PseudoClass)) 2308 2312 return SelectorFailsCompletely; 2309 return checkSelector(sel, e, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle);2313 return checkSelector(sel, e, dynamicPseudo, true, encounteredLink, forcePseudoClassMask, elementStyle, elementParentStyle); 2310 2314 case CSSSelector::ShadowDescendant: 2311 2315 { … … 2314 2318 return SelectorFailsCompletely; 2315 2319 e = static_cast<Element*>(shadowHostNode); 2316 return checkSelector(sel, e, dynamicPseudo, false, encounteredLink );2320 return checkSelector(sel, e, dynamicPseudo, false, encounteredLink, forcePseudoClassMask); 2317 2321 } 2318 2322 } … … 2388 2392 } 2389 2393 2390 bool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Element* e, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const2394 bool CSSStyleSelector::SelectorChecker::checkOneSelector(CSSSelector* sel, Element* e, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, unsigned forcePseudoClassMask, RenderStyle* elementStyle, RenderStyle* elementParentStyle) const 2391 2395 { 2392 2396 ASSERT(e); … … 2482 2486 ASSERT(subSel->pseudoType() != CSSSelector::PseudoNot); 2483 2487 2484 if (!checkOneSelector(subSel, e, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle))2488 if (!checkOneSelector(subSel, e, dynamicPseudo, true, encounteredLink, forcePseudoClassMask, elementStyle, elementParentStyle)) 2485 2489 return true; 2486 2490 } … … 2493 2497 return !m_document->page()->focusController()->isActive(); 2494 2498 } 2495 2499 2500 CSSSelector::PseudoType pseudoType = sel->pseudoType(); 2501 2502 // Check forced pseudo class mask first. 2503 if (forcePseudoClassMask != DoNotForcePseudoClassMask) { 2504 switch (pseudoType) { 2505 case CSSSelector::PseudoLink: 2506 return forcePseudoClassMask & ForceLink; 2507 case CSSSelector::PseudoVisited: 2508 return forcePseudoClassMask & ForceVisited; 2509 case CSSSelector::PseudoFocus: 2510 return forcePseudoClassMask & ForceFocus; 2511 case CSSSelector::PseudoHover: 2512 return forcePseudoClassMask & ForceHover; 2513 case CSSSelector::PseudoActive: 2514 return forcePseudoClassMask & ForceActive; 2515 default: 2516 break; 2517 } 2518 } 2519 2496 2520 // Normal element pseudo class checking. 2497 switch ( sel->pseudoType()) {2521 switch (pseudoType) { 2498 2522 // Pseudo classes: 2499 2523 case CSSSelector::PseudoNot: … … 2791 2815 case CSSSelector::PseudoAny: 2792 2816 for (CSSSelector* selector = sel->selectorList()->first(); selector; selector = CSSSelectorList::next(selector)) { 2793 if (checkSelector(selector, e, dynamicPseudo, true, encounteredLink, elementStyle, elementParentStyle) == SelectorMatches)2817 if (checkSelector(selector, e, dynamicPseudo, true, encounteredLink, forcePseudoClassMask, elementStyle, elementParentStyle) == SelectorMatches) 2794 2818 return true; 2795 2819 } -
trunk/Source/WebCore/css/CSSStyleSelector.h
r88793 r89132 131 131 132 132 public: 133 enum ForcePseudoClassFlags { 134 ForceNone = 0, 135 DoNotForcePseudoClassMask = 1 << 0, 136 ForceHover = 1 << 1, 137 ForceFocus = 1 << 2, 138 ForceActive = 1 << 3, 139 ForceLink = 1 << 4, 140 ForceVisited = 1 << 5 141 }; 142 133 143 // These methods will give back the set of rules that matched for a given element (or a pseudo-element). 134 144 enum CSSRuleFilter { … … 140 150 AllCSSRules = AllButEmptyCSSRules | EmptyCSSRules, 141 151 }; 142 PassRefPtr<CSSRuleList> styleRulesForElement(Element*, unsigned rulesToInclude = AllButEmptyCSSRules );143 PassRefPtr<CSSRuleList> pseudoStyleRulesForElement(Element*, PseudoId, unsigned rulesToInclude = AllButEmptyCSSRules );152 PassRefPtr<CSSRuleList> styleRulesForElement(Element*, unsigned rulesToInclude = AllButEmptyCSSRules, unsigned forcePseudoClassMask = DoNotForcePseudoClassMask); 153 PassRefPtr<CSSRuleList> pseudoStyleRulesForElement(Element*, PseudoId, unsigned rulesToInclude = AllButEmptyCSSRules, unsigned forcePseudoClassMask = DoNotForcePseudoClassMask); 144 154 145 155 // Given a CSS keyword in the range (xx-small to -webkit-xxx-large), this function will return … … 266 276 267 277 bool checkSelector(CSSSelector*, Element*) const; 268 SelectorMatch checkSelector(CSSSelector*, Element*, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle* = 0, RenderStyle* elementParentStyle = 0) const;269 bool checkOneSelector(CSSSelector*, Element*, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, RenderStyle*, RenderStyle* elementParentStyle) const;278 SelectorMatch checkSelector(CSSSelector*, Element*, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, unsigned forcePseudoClassMask = DoNotForcePseudoClassMask, RenderStyle* = 0, RenderStyle* elementParentStyle = 0) const; 279 bool checkOneSelector(CSSSelector*, Element*, PseudoId& dynamicPseudo, bool isSubSelector, bool encounteredLink, unsigned forcePseudoClassMask, RenderStyle*, RenderStyle* elementParentStyle) const; 270 280 bool checkScrollbarPseudoClass(CSSSelector*, PseudoId& dynamicPseudo) const; 271 281 static bool fastCheckSelector(const CSSSelector*, const Element*); … … 364 374 bool m_fontDirty; 365 375 bool m_matchAuthorAndUserStyles; 376 unsigned m_forcePseudoClassMask; // enum ForcePseudoClassFlags 366 377 367 378 RefPtr<CSSFontSelector> m_fontSelector;
Note: See TracChangeset
for help on using the changeset viewer.