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