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