Remove excessive include directives from WebCore/css
[WebKit-https.git] / Source / WebCore / css / StyleResolver.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  */
21
22 #pragma once
23
24 #include "CSSSelector.h"
25 #include "CSSToLengthConversionData.h"
26 #include "CSSToStyleMap.h"
27 #include "DocumentRuleSets.h"
28 #include "InspectorCSSOMWrappers.h"
29 #include "MediaQueryEvaluator.h"
30 #include "RenderStyle.h"
31 #include "RuleSet.h"
32 #include "SelectorChecker.h"
33 #include <bitset>
34 #include <memory>
35 #include <wtf/HashMap.h>
36 #include <wtf/RefPtr.h>
37 #include <wtf/Vector.h>
38 #include <wtf/text/AtomicStringHash.h>
39 #include <wtf/text/StringHash.h>
40
41 namespace WebCore {
42
43 class CSSCursorImageValue;
44 class CSSFontFace;
45 class CSSFontFaceRule;
46 class CSSFontValue;
47 class CSSImageGeneratorValue;
48 class CSSImageSetValue;
49 class CSSImageValue;
50 class CSSPageRule;
51 class CSSPrimitiveValue;
52 class CSSProperty;
53 class CSSStyleSheet;
54 class CSSValue;
55 class ContainerNode;
56 class Document;
57 class Element;
58 class Frame;
59 class FrameView;
60 class URL;
61 class KeyframeList;
62 class KeyframeValue;
63 class MediaQueryEvaluator;
64 class Node;
65 class RenderRegion;
66 class RenderScrollbar;
67 class RuleData;
68 class RuleSet;
69 class SelectorFilter;
70 class Settings;
71 class StyleCachedImage;
72 class StyleGeneratedImage;
73 class StyleImage;
74 class StyleRuleKeyframe;
75 class StyleProperties;
76 class StyleRule;
77 class StyleRuleKeyframes;
78 class StyleRulePage;
79 class StyleRuleRegion;
80 class StyleSheet;
81 class StyleSheetList;
82 class StyledElement;
83 class SVGSVGElement;
84 class ViewportStyleResolver;
85 struct ResourceLoaderOptions;
86
87 // MatchOnlyUserAgentRules is used in media queries, where relative units
88 // are interpreted according to the document root element style, and styled only
89 // from the User Agent Stylesheet rules.
90
91 enum RuleMatchingBehavior {
92     MatchAllRules,
93     MatchAllRulesExcludingSMIL,
94     MatchOnlyUserAgentRules,
95 };
96
97 enum CascadeLevel {
98     UserAgentLevel,
99     AuthorLevel,
100     UserLevel
101 };
102
103 class PseudoStyleRequest {
104 public:
105     PseudoStyleRequest(PseudoId pseudoId, RenderScrollbar* scrollbar = nullptr, ScrollbarPart scrollbarPart = NoPart)
106         : pseudoId(pseudoId)
107         , scrollbarPart(scrollbarPart)
108         , scrollbar(scrollbar)
109     {
110     }
111
112     PseudoId pseudoId;
113     ScrollbarPart scrollbarPart;
114     RenderScrollbar* scrollbar;
115 };
116
117 struct ElementStyle {
118     ElementStyle(std::unique_ptr<RenderStyle> renderStyle, std::unique_ptr<Style::Relations> relations = { })
119         : renderStyle(WTFMove(renderStyle))
120         , relations(WTFMove(relations))
121     { }
122
123     std::unique_ptr<RenderStyle> renderStyle;
124     std::unique_ptr<Style::Relations> relations;
125 };
126
127 // This class selects a RenderStyle for a given element based on a collection of stylesheets.
128 class StyleResolver {
129     WTF_MAKE_NONCOPYABLE(StyleResolver); WTF_MAKE_FAST_ALLOCATED;
130 public:
131     StyleResolver(Document&);
132     ~StyleResolver();
133
134     ElementStyle styleForElement(const Element&, const RenderStyle* parentStyle, const RenderStyle* parentBoxStyle = nullptr, RuleMatchingBehavior = MatchAllRules, const RenderRegion* regionForStyling = nullptr, const SelectorFilter* = nullptr);
135
136     void keyframeStylesForAnimation(const Element&, const RenderStyle*, KeyframeList&);
137
138     std::unique_ptr<RenderStyle> pseudoStyleForElement(const Element&, const PseudoStyleRequest&, const RenderStyle& parentStyle);
139
140     std::unique_ptr<RenderStyle> styleForPage(int pageIndex);
141     std::unique_ptr<RenderStyle> defaultStyleForElement();
142
143     RenderStyle* style() const { return m_state.style(); }
144     const RenderStyle* parentStyle() const { return m_state.parentStyle(); }
145     const RenderStyle* rootElementStyle() const { return m_state.rootElementStyle(); }
146     const Element* element() { return m_state.element(); }
147     Document& document() { return m_document; }
148     const Document& document() const { return m_document; }
149     const Settings& settings() const { return m_document.settings(); }
150
151     void appendAuthorStyleSheets(const Vector<RefPtr<CSSStyleSheet>>&);
152
153     DocumentRuleSets& ruleSets() { return m_ruleSets; }
154     const DocumentRuleSets& ruleSets() const { return m_ruleSets; }
155
156     const MediaQueryEvaluator& mediaQueryEvaluator() const { return m_mediaQueryEvaluator; }
157
158     void setOverrideDocumentElementStyle(RenderStyle* style) { m_overrideDocumentElementStyle = style; }
159
160 private:
161     std::unique_ptr<RenderStyle> styleForKeyframe(const RenderStyle*, const StyleRuleKeyframe*, KeyframeValue&);
162
163 public:
164     // These methods will give back the set of rules that matched for a given element (or a pseudo-element).
165     enum CSSRuleFilter {
166         UAAndUserCSSRules   = 1 << 1,
167         AuthorCSSRules      = 1 << 2,
168         EmptyCSSRules       = 1 << 3,
169         CrossOriginCSSRules = 1 << 4,
170         AllButEmptyCSSRules = UAAndUserCSSRules | AuthorCSSRules | CrossOriginCSSRules,
171         AllCSSRules         = AllButEmptyCSSRules | EmptyCSSRules,
172     };
173     Vector<RefPtr<StyleRule>> styleRulesForElement(const Element*, unsigned rulesToInclude = AllButEmptyCSSRules);
174     Vector<RefPtr<StyleRule>> pseudoStyleRulesForElement(const Element*, PseudoId, unsigned rulesToInclude = AllButEmptyCSSRules);
175
176 public:
177     struct MatchResult;
178
179     void applyPropertyToStyle(CSSPropertyID, CSSValue*, std::unique_ptr<RenderStyle>);
180     void applyPropertyToCurrentStyle(CSSPropertyID, CSSValue*);
181
182     void updateFont();
183     void initializeFontStyle();
184
185     void setFontSize(FontCascadeDescription&, float size);
186
187 public:
188     bool useSVGZoomRules();
189     bool useSVGZoomRulesForLength();
190
191     static bool colorFromPrimitiveValueIsDerivedFromElement(const CSSPrimitiveValue&);
192     Color colorFromPrimitiveValue(const CSSPrimitiveValue&, bool forVisitedLink = false) const;
193
194     bool hasSelectorForId(const AtomicString&) const;
195     bool hasSelectorForClass(const AtomicString&) const;
196     bool hasSelectorForAttribute(const Element&, const AtomicString&) const;
197
198 #if ENABLE(CSS_DEVICE_ADAPTATION)
199     ViewportStyleResolver* viewportStyleResolver() { return m_viewportStyleResolver.get(); }
200 #endif
201
202     void addViewportDependentMediaQueryResult(const MediaQueryExpression&, bool result);
203     bool hasViewportDependentMediaQueries() const { return !m_viewportDependentMediaQueryResults.isEmpty(); }
204     bool hasMediaQueriesAffectedByViewportChange() const;
205
206     void addAccessibilitySettingsDependentMediaQueryResult(const MediaQueryExpression&, bool result);
207     bool hasAccessibilitySettingsDependentMediaQueries() const { return !m_accessibilitySettingsDependentMediaQueryResults.isEmpty(); }
208     bool hasMediaQueriesAffectedByAccessibilitySettingsChange() const;
209
210     void addKeyframeStyle(Ref<StyleRuleKeyframes>&&);
211
212     bool checkRegionStyle(const Element* regionElement);
213
214     bool usesFirstLineRules() const { return m_ruleSets.features().usesFirstLineRules; }
215     bool usesFirstLetterRules() const { return m_ruleSets.features().usesFirstLetterRules; }
216     
217     void invalidateMatchedPropertiesCache();
218
219     void clearCachedPropertiesAffectedByViewportUnits();
220
221     bool createFilterOperations(const CSSValue& inValue, FilterOperations& outOperations);
222
223     struct RuleRange {
224         RuleRange(int& firstRuleIndex, int& lastRuleIndex): firstRuleIndex(firstRuleIndex), lastRuleIndex(lastRuleIndex) { }
225         int& firstRuleIndex;
226         int& lastRuleIndex;
227     };
228
229     struct MatchRanges {
230         MatchRanges() : firstUARule(-1), lastUARule(-1), firstAuthorRule(-1), lastAuthorRule(-1), firstUserRule(-1), lastUserRule(-1) { }
231         int firstUARule;
232         int lastUARule;
233         int firstAuthorRule;
234         int lastAuthorRule;
235         int firstUserRule;
236         int lastUserRule;
237         RuleRange UARuleRange() { return RuleRange(firstUARule, lastUARule); }
238         RuleRange authorRuleRange() { return RuleRange(firstAuthorRule, lastAuthorRule); }
239         RuleRange userRuleRange() { return RuleRange(firstUserRule, lastUserRule); }
240     };
241
242     struct MatchedProperties {
243         MatchedProperties();
244         ~MatchedProperties();
245         
246         RefPtr<StyleProperties> properties;
247         uint16_t linkMatchType;
248         uint16_t whitelistType;
249         Style::ScopeOrdinal styleScopeOrdinal;
250     };
251
252     struct MatchResult {
253         MatchResult() : isCacheable(true) { }
254         Vector<StyleRule*, 64> matchedRules;
255         MatchRanges ranges;
256         bool isCacheable;
257
258         const Vector<MatchedProperties, 64>& matchedProperties() const { return m_matchedProperties; }
259
260         void addMatchedProperties(const StyleProperties&, StyleRule* = nullptr, unsigned linkMatchType = SelectorChecker::MatchAll, PropertyWhitelistType = PropertyWhitelistNone, Style::ScopeOrdinal = Style::ScopeOrdinal::Element);
261     private:
262         Vector<MatchedProperties, 64> m_matchedProperties;
263     };
264     
265     class CascadedProperties {
266         WTF_MAKE_FAST_ALLOCATED;
267     public:
268         CascadedProperties(TextDirection, WritingMode);
269
270         struct Property {
271             void apply(StyleResolver&, const MatchResult*);
272
273             CSSPropertyID id;
274             CascadeLevel level;
275             Style::ScopeOrdinal styleScopeOrdinal;
276             CSSValue* cssValue[3];
277         };
278
279         bool hasProperty(CSSPropertyID) const;
280         Property& property(CSSPropertyID);
281
282         void addNormalMatches(const MatchResult&, int startIndex, int endIndex, bool inheritedOnly = false);
283         void addImportantMatches(const MatchResult&, int startIndex, int endIndex, bool inheritedOnly = false);
284
285         void applyDeferredProperties(StyleResolver&, const MatchResult*);
286
287         HashMap<AtomicString, Property>& customProperties() { return m_customProperties; }
288         bool hasCustomProperty(const String&) const;
289         Property customProperty(const String&) const;
290         
291     private:
292         void addMatch(const MatchResult&, unsigned index, bool isImportant, bool inheritedOnly);
293         void set(CSSPropertyID, CSSValue&, unsigned linkMatchType, CascadeLevel, Style::ScopeOrdinal);
294         void setDeferred(CSSPropertyID, CSSValue&, unsigned linkMatchType, CascadeLevel, Style::ScopeOrdinal);
295         static void setPropertyInternal(Property&, CSSPropertyID, CSSValue&, unsigned linkMatchType, CascadeLevel, Style::ScopeOrdinal);
296
297         Property m_properties[numCSSProperties + 2];
298         std::bitset<numCSSProperties + 2> m_propertyIsPresent;
299
300         Vector<Property, 8> m_deferredProperties;
301         HashMap<AtomicString, Property> m_customProperties;
302
303         TextDirection m_direction;
304         WritingMode m_writingMode;
305     };
306
307     // FIXME: Should make a StyleAdjuster class (like Blink has) that handles all RenderStyle
308     // adjustments. For now put this function on StyleResolver, since adjustRenderStyle is here.
309     static void adjustStyleForAlignment(RenderStyle&, const RenderStyle& parentStyle);
310     
311 private:
312     // This function fixes up the default font size if it detects that the current generic font family has changed. -dwh
313     void checkForGenericFamilyChange(RenderStyle*, const RenderStyle* parentStyle);
314     void checkForZoomChange(RenderStyle*, const RenderStyle* parentStyle);
315 #if ENABLE(TEXT_AUTOSIZING)
316     void checkForTextSizeAdjust(RenderStyle*);
317 #endif
318
319     void adjustRenderStyle(RenderStyle&, const RenderStyle& parentStyle, const RenderStyle* parentBoxStyle, const Element*);
320     std::unique_ptr<GridPosition> adjustNamedGridItemPosition(const NamedGridAreaMap&, const NamedGridLinesMap&, const GridPosition&, GridPositionSide) const;
321     
322     void adjustStyleForInterCharacterRuby();
323     
324     bool fastRejectSelector(const RuleData&) const;
325
326     enum ShouldUseMatchedPropertiesCache { DoNotUseMatchedPropertiesCache = 0, UseMatchedPropertiesCache };
327     void applyMatchedProperties(const MatchResult&, const Element&, ShouldUseMatchedPropertiesCache = UseMatchedPropertiesCache);
328
329     void applyCascadedProperties(CascadedProperties&, int firstProperty, int lastProperty, const MatchResult*);
330     void cascadeMatches(CascadedProperties&, const MatchResult&, bool important, int startIndex, int endIndex, bool inheritedOnly);
331
332     static bool isValidRegionStyleProperty(CSSPropertyID);
333 #if ENABLE(VIDEO_TRACK)
334     static bool isValidCueStyleProperty(CSSPropertyID);
335 #endif
336     void matchPageRules(MatchResult&, RuleSet*, bool isLeftPage, bool isFirstPage, const String& pageName);
337     void matchPageRulesForList(Vector<StyleRulePage*>& matchedRules, const Vector<StyleRulePage*>&, bool isLeftPage, bool isFirstPage, const String& pageName);
338
339     bool isLeftPage(int pageIndex) const;
340     bool isRightPage(int pageIndex) const { return !isLeftPage(pageIndex); }
341     bool isFirstPage(int pageIndex) const;
342     String pageName(int pageIndex) const;
343
344     DocumentRuleSets m_ruleSets;
345
346     typedef HashMap<AtomicStringImpl*, RefPtr<StyleRuleKeyframes>> KeyframesRuleMap;
347     KeyframesRuleMap m_keyframesRuleMap;
348
349 public:
350     typedef HashMap<CSSPropertyID, RefPtr<CSSValue>> PendingImagePropertyMap;
351
352     class State {
353     public:
354         State() { }
355         State(const Element&, const RenderStyle* parentStyle, const RenderStyle* documentElementStyle = nullptr, const RenderRegion* regionForStyling = nullptr, const SelectorFilter* = nullptr);
356
357     public:
358         void clear();
359
360         Document& document() const { return m_element->document(); }
361         const Element* element() const { return m_element; }
362
363         void setStyle(std::unique_ptr<RenderStyle>);
364         RenderStyle* style() const { return m_style.get(); }
365         std::unique_ptr<RenderStyle> takeStyle() { return WTFMove(m_style); }
366
367         void setParentStyle(std::unique_ptr<RenderStyle>);
368         const RenderStyle* parentStyle() const { return m_parentStyle; }
369         const RenderStyle* rootElementStyle() const { return m_rootElementStyle; }
370
371         const RenderRegion* regionForStyling() const { return m_regionForStyling; }
372         EInsideLink elementLinkState() const { return m_elementLinkState; }
373
374         void setApplyPropertyToRegularStyle(bool isApply) { m_applyPropertyToRegularStyle = isApply; }
375         void setApplyPropertyToVisitedLinkStyle(bool isApply) { m_applyPropertyToVisitedLinkStyle = isApply; }
376         bool applyPropertyToRegularStyle() const { return m_applyPropertyToRegularStyle; }
377         bool applyPropertyToVisitedLinkStyle() const { return m_applyPropertyToVisitedLinkStyle; }
378
379         void setFontDirty(bool isDirty) { m_fontDirty = isDirty; }
380         bool fontDirty() const { return m_fontDirty; }
381         void setFontSizeHasViewportUnits(bool hasViewportUnits) { m_fontSizeHasViewportUnits = hasViewportUnits; }
382         bool fontSizeHasViewportUnits() const { return m_fontSizeHasViewportUnits; }
383
384         void cacheBorderAndBackground();
385         bool hasUAAppearance() const { return m_hasUAAppearance; }
386         BorderData borderData() const { return m_borderData; }
387         FillLayer backgroundData() const { return m_backgroundData; }
388         const Color& backgroundColor() const { return m_backgroundColor; }
389
390         const FontCascadeDescription& fontDescription() { return m_style->fontDescription(); }
391         const FontCascadeDescription& parentFontDescription() { return m_parentStyle->fontDescription(); }
392         void setFontDescription(const FontCascadeDescription& fontDescription) { m_fontDirty |= m_style->setFontDescription(fontDescription); }
393         void setZoom(float f) { m_fontDirty |= m_style->setZoom(f); }
394         void setEffectiveZoom(float f) { m_fontDirty |= m_style->setEffectiveZoom(f); }
395         void setWritingMode(WritingMode writingMode) { m_fontDirty |= m_style->setWritingMode(writingMode); }
396         void setTextOrientation(TextOrientation textOrientation) { m_fontDirty |= m_style->setTextOrientation(textOrientation); }
397
398         bool useSVGZoomRules() const { return m_element && m_element->isSVGElement(); }
399
400         const CSSToLengthConversionData& cssToLengthConversionData() const { return m_cssToLengthConversionData; }
401
402         CascadeLevel cascadeLevel() const { return m_cascadeLevel; }
403         void setCascadeLevel(CascadeLevel level) { m_cascadeLevel = level; }
404         Style::ScopeOrdinal styleScopeOrdinal() const { return m_styleScopeOrdinal; }
405         void setStyleScopeOrdinal(Style::ScopeOrdinal styleScopeOrdinal) { m_styleScopeOrdinal = styleScopeOrdinal; }
406
407         CascadedProperties* authorRollback() const { return m_authorRollback.get(); }
408         CascadedProperties* userRollback() const { return m_userRollback.get(); }
409         
410         void setAuthorRollback(std::unique_ptr<CascadedProperties>& rollback) { m_authorRollback = WTFMove(rollback); }
411         void setUserRollback(std::unique_ptr<CascadedProperties>& rollback) { m_userRollback = WTFMove(rollback); }
412
413         const SelectorFilter* selectorFilter() const { return m_selectorFilter; }
414         
415     private:
416         void updateConversionData();
417
418         const Element* m_element { nullptr };
419         std::unique_ptr<RenderStyle> m_style;
420         const RenderStyle* m_parentStyle { nullptr };
421         std::unique_ptr<RenderStyle> m_ownedParentStyle;
422         const RenderStyle* m_rootElementStyle { nullptr };
423
424         const RenderRegion* m_regionForStyling { nullptr };
425         
426         EInsideLink m_elementLinkState { NotInsideLink };
427
428         bool m_applyPropertyToRegularStyle { true };
429         bool m_applyPropertyToVisitedLinkStyle { false };
430         bool m_fontDirty { false };
431         bool m_fontSizeHasViewportUnits { false };
432         bool m_hasUAAppearance { false };
433
434         BorderData m_borderData;
435         FillLayer m_backgroundData { BackgroundFillLayer };
436         Color m_backgroundColor;
437
438         CSSToLengthConversionData m_cssToLengthConversionData;
439         
440         CascadeLevel m_cascadeLevel { UserAgentLevel };
441         Style::ScopeOrdinal m_styleScopeOrdinal { Style::ScopeOrdinal::Element };
442         std::unique_ptr<CascadedProperties> m_authorRollback;
443         std::unique_ptr<CascadedProperties> m_userRollback;
444
445         const SelectorFilter* m_selectorFilter { nullptr };
446     };
447
448     State& state() { return m_state; }
449     const State& state() const { return m_state; }
450
451     RefPtr<StyleImage> styleImage(CSSValue&);
452
453     bool applyPropertyToRegularStyle() const { return m_state.applyPropertyToRegularStyle(); }
454     bool applyPropertyToVisitedLinkStyle() const { return m_state.applyPropertyToVisitedLinkStyle(); }
455
456     CascadeLevel cascadeLevel() const { return m_state.cascadeLevel(); }
457     void setCascadeLevel(CascadeLevel level) { m_state.setCascadeLevel(level); }
458     
459     CascadedProperties* cascadedPropertiesForRollback(const MatchResult&);
460
461     CSSToStyleMap* styleMap() { return &m_styleMap; }
462     InspectorCSSOMWrappers& inspectorCSSOMWrappers() { return m_inspectorCSSOMWrappers; }
463     const FontCascadeDescription& fontDescription() { return m_state.fontDescription(); }
464     const FontCascadeDescription& parentFontDescription() { return m_state.parentFontDescription(); }
465     void setFontDescription(const FontCascadeDescription& fontDescription) { m_state.setFontDescription(fontDescription); }
466     void setZoom(float f) { m_state.setZoom(f); }
467     void setEffectiveZoom(float f) { m_state.setEffectiveZoom(f); }
468     void setWritingMode(WritingMode writingMode) { m_state.setWritingMode(writingMode); }
469     void setTextOrientation(TextOrientation textOrientation) { m_state.setTextOrientation(textOrientation); }
470
471 private:
472     void cacheBorderAndBackground();
473
474     void applyProperty(CSSPropertyID, CSSValue*, SelectorChecker::LinkMatchMask = SelectorChecker::MatchDefault, const MatchResult* = nullptr);
475     RefPtr<CSSValue> resolvedVariableValue(CSSPropertyID, const CSSValue&);
476
477     void applySVGProperty(CSSPropertyID, CSSValue*);
478
479     static unsigned computeMatchedPropertiesHash(const MatchedProperties*, unsigned size);
480     struct MatchedPropertiesCacheItem {
481         Vector<MatchedProperties> matchedProperties;
482         MatchRanges ranges;
483         std::unique_ptr<RenderStyle> renderStyle;
484         std::unique_ptr<RenderStyle> parentRenderStyle;
485     };
486     const MatchedPropertiesCacheItem* findFromMatchedPropertiesCache(unsigned hash, const MatchResult&);
487     void addToMatchedPropertiesCache(const RenderStyle*, const RenderStyle* parentStyle, unsigned hash, const MatchResult&);
488
489     // Every N additions to the matched declaration cache trigger a sweep where entries holding
490     // the last reference to a style declaration are garbage collected.
491     void sweepMatchedPropertiesCache();
492
493     unsigned m_matchedPropertiesCacheAdditionsSinceLastSweep;
494
495     typedef HashMap<unsigned, MatchedPropertiesCacheItem> MatchedPropertiesCache;
496     MatchedPropertiesCache m_matchedPropertiesCache;
497
498     Timer m_matchedPropertiesCacheSweepTimer;
499
500     MediaQueryEvaluator m_mediaQueryEvaluator;
501     std::unique_ptr<RenderStyle> m_rootDefaultStyle;
502
503     Document& m_document;
504
505     bool m_matchAuthorAndUserStyles;
506
507     RenderStyle* m_overrideDocumentElementStyle { nullptr };
508
509     Vector<MediaQueryResult> m_viewportDependentMediaQueryResults;
510     Vector<MediaQueryResult> m_accessibilitySettingsDependentMediaQueryResults;
511
512 #if ENABLE(CSS_DEVICE_ADAPTATION)
513     RefPtr<ViewportStyleResolver> m_viewportStyleResolver;
514 #endif
515
516     CSSToStyleMap m_styleMap;
517     InspectorCSSOMWrappers m_inspectorCSSOMWrappers;
518
519     State m_state;
520
521     // See if we still have crashes where StyleResolver gets deleted early.
522     bool m_isDeleted { false };
523
524     friend bool operator==(const MatchedProperties&, const MatchedProperties&);
525     friend bool operator!=(const MatchedProperties&, const MatchedProperties&);
526     friend bool operator==(const MatchRanges&, const MatchRanges&);
527     friend bool operator!=(const MatchRanges&, const MatchRanges&);
528 };
529
530 inline bool StyleResolver::hasSelectorForAttribute(const Element& element, const AtomicString &attributeName) const
531 {
532     ASSERT(!attributeName.isEmpty());
533     if (element.isHTMLElement())
534         return m_ruleSets.features().attributeCanonicalLocalNamesInRules.contains(attributeName);
535     return m_ruleSets.features().attributeLocalNamesInRules.contains(attributeName);
536 }
537
538 inline bool StyleResolver::hasSelectorForClass(const AtomicString& classValue) const
539 {
540     ASSERT(!classValue.isEmpty());
541     return m_ruleSets.features().classesInRules.contains(classValue);
542 }
543
544 inline bool StyleResolver::hasSelectorForId(const AtomicString& idValue) const
545 {
546     ASSERT(!idValue.isEmpty());
547     return m_ruleSets.features().idsInRules.contains(idValue);
548 }
549
550 inline bool checkRegionSelector(const CSSSelector* regionSelector, const Element* regionElement)
551 {
552     if (!regionSelector || !regionElement)
553         return false;
554
555     SelectorChecker selectorChecker(regionElement->document());
556     for (const CSSSelector* s = regionSelector; s; s = CSSSelectorList::next(s)) {
557         SelectorChecker::CheckingContext selectorCheckingContext(SelectorChecker::Mode::QueryingRules);
558         unsigned ignoredSpecificity;
559         if (selectorChecker.match(*s, *regionElement, selectorCheckingContext, ignoredSpecificity))
560             return true;
561     }
562     return false;
563 }
564
565 } // namespace WebCore