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