Index: third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
diff --git a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
index 37b6f8f3de33d5a2695c83a2bab09fbf2a5380f8..221797dff6d4a53bbf842a89442dedd7eca8807f 100644 |
--- a/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
+++ b/third_party/WebKit/Source/core/css/parser/CSSSelectorParser.cpp |
@@ -7,6 +7,7 @@ |
#include "core/css/CSSSelectorList.h" |
#include "core/css/StyleSheetContents.h" |
#include "core/css/parser/CSSParserContext.h" |
+#include "core/frame/Deprecation.h" |
#include "core/frame/UseCounter.h" |
#include "platform/RuntimeEnabledFeatures.h" |
#include "wtf/PtrUtil.h" |
@@ -14,84 +15,7 @@ |
namespace blink { |
-static void recordSelectorStats(const CSSParserContext* context, |
- const CSSSelectorList& selectorList) { |
- if (!context->isUseCounterRecordingEnabled()) |
- return; |
- |
- for (const CSSSelector* selector = selectorList.first(); selector; |
- selector = CSSSelectorList::next(*selector)) { |
- for (const CSSSelector* current = selector; current; |
- current = current->tagHistory()) { |
- UseCounter::Feature feature = UseCounter::NumberOfFeatures; |
- switch (current->getPseudoType()) { |
- case CSSSelector::PseudoAny: |
- feature = UseCounter::CSSSelectorPseudoAny; |
- break; |
- case CSSSelector::PseudoUnresolved: |
- feature = UseCounter::CSSSelectorPseudoUnresolved; |
- break; |
- case CSSSelector::PseudoDefined: |
- feature = UseCounter::CSSSelectorPseudoDefined; |
- break; |
- case CSSSelector::PseudoSlotted: |
- feature = UseCounter::CSSSelectorPseudoSlotted; |
- break; |
- case CSSSelector::PseudoContent: |
- feature = UseCounter::CSSSelectorPseudoContent; |
- break; |
- case CSSSelector::PseudoHost: |
- feature = UseCounter::CSSSelectorPseudoHost; |
- break; |
- case CSSSelector::PseudoHostContext: |
- feature = UseCounter::CSSSelectorPseudoHostContext; |
- break; |
- case CSSSelector::PseudoFullScreenAncestor: |
- feature = UseCounter::CSSSelectorPseudoFullScreenAncestor; |
- break; |
- case CSSSelector::PseudoFullScreen: |
- feature = UseCounter::CSSSelectorPseudoFullScreen; |
- break; |
- case CSSSelector::PseudoListBox: |
- if (context->mode() != UASheetMode) |
- feature = UseCounter::CSSSelectorInternalPseudoListBox; |
- break; |
- case CSSSelector::PseudoWebKitCustomElement: |
- if (context->mode() != UASheetMode) { |
- if (current->value() == "-internal-media-controls-cast-button") |
- feature = UseCounter::CSSSelectorInternalMediaControlsCastButton; |
- else if (current->value() == |
- "-internal-media-controls-overlay-cast-button") |
- feature = |
- UseCounter::CSSSelectorInternalMediaControlsOverlayCastButton; |
- } |
- break; |
- case CSSSelector::PseudoSpatialNavigationFocus: |
- if (context->mode() != UASheetMode) |
- feature = |
- UseCounter::CSSSelectorInternalPseudoSpatialNavigationFocus; |
- break; |
- case CSSSelector::PseudoReadOnly: |
- if (context->mode() != UASheetMode) |
- feature = UseCounter::CSSSelectorPseudoReadOnly; |
- break; |
- case CSSSelector::PseudoReadWrite: |
- if (context->mode() != UASheetMode) |
- feature = UseCounter::CSSSelectorPseudoReadWrite; |
- break; |
- default: |
- break; |
- } |
- if (feature != UseCounter::NumberOfFeatures) |
- context->useCounter()->count(feature); |
- if (current->relation() == CSSSelector::IndirectAdjacent) |
- context->useCounter()->count(UseCounter::CSSSelectorIndirectAdjacent); |
- if (current->selectorList()) |
- recordSelectorStats(context, *current->selectorList()); |
- } |
- } |
-} |
- |
+// static |
CSSSelectorList CSSSelectorParser::parseSelector( |
CSSParserTokenRange range, |
const CSSParserContext* context, |
@@ -102,7 +26,7 @@ CSSSelectorList CSSSelectorParser::parseSelector( |
if (!range.atEnd()) |
return CSSSelectorList(); |
- recordSelectorStats(context, result); |
+ parser.recordUsageAndDeprecations(result); |
return result; |
} |
@@ -880,4 +804,113 @@ CSSSelectorParser::splitCompoundAtImplicitShadowCrossingCombinator( |
return secondCompound; |
} |
+void CSSSelectorParser::recordUsageAndDeprecations( |
+ const CSSSelectorList& selectorList) { |
+ if (!m_context->useCounter()) |
+ return; |
+ |
+ for (const CSSSelector* selector = selectorList.first(); selector; |
+ selector = CSSSelectorList::next(*selector)) { |
+ for (const CSSSelector* current = selector; current; |
+ current = current->tagHistory()) { |
+ UseCounter::Feature feature = UseCounter::NumberOfFeatures; |
+ switch (current->getPseudoType()) { |
+ case CSSSelector::PseudoAny: |
+ feature = UseCounter::CSSSelectorPseudoAny; |
+ break; |
+ case CSSSelector::PseudoUnresolved: |
+ feature = UseCounter::CSSSelectorPseudoUnresolved; |
+ break; |
+ case CSSSelector::PseudoDefined: |
+ feature = UseCounter::CSSSelectorPseudoDefined; |
+ break; |
+ case CSSSelector::PseudoSlotted: |
+ feature = UseCounter::CSSSelectorPseudoSlotted; |
+ break; |
+ case CSSSelector::PseudoContent: |
+ feature = UseCounter::CSSSelectorPseudoContent; |
+ break; |
+ case CSSSelector::PseudoHost: |
+ feature = UseCounter::CSSSelectorPseudoHost; |
+ break; |
+ case CSSSelector::PseudoHostContext: |
+ feature = UseCounter::CSSSelectorPseudoHostContext; |
+ break; |
+ case CSSSelector::PseudoFullScreenAncestor: |
+ feature = UseCounter::CSSSelectorPseudoFullScreenAncestor; |
+ break; |
+ case CSSSelector::PseudoFullScreen: |
+ feature = UseCounter::CSSSelectorPseudoFullScreen; |
+ break; |
+ case CSSSelector::PseudoListBox: |
+ if (m_context->mode() != UASheetMode) |
+ feature = UseCounter::CSSSelectorInternalPseudoListBox; |
+ break; |
+ case CSSSelector::PseudoWebKitCustomElement: |
+ if (m_context->mode() != UASheetMode) { |
+ if (current->value() == "-internal-media-controls-cast-button") { |
+ feature = UseCounter::CSSSelectorInternalMediaControlsCastButton; |
+ } else if (current->value() == |
+ "-internal-media-controls-overlay-cast-button") { |
+ feature = |
+ UseCounter::CSSSelectorInternalMediaControlsOverlayCastButton; |
+ } else if (current->value() == |
+ "-internal-media-controls-text-track-list") { |
+ feature = |
+ UseCounter::CSSSelectorInternalMediaControlsTextTrackList; |
+ } else if (current->value() == |
+ "-internal-media-controls-text-track-list-item") { |
+ feature = |
+ UseCounter::CSSSelectorInternalMediaControlsTextTrackListItem; |
+ } else if (current->value() == |
+ "-internal-media-controls-text-track-list-item-input") { |
+ feature = UseCounter:: |
+ CSSSelectorInternalMediaControlsTextTrackListItemInput; |
+ } else if (current->value() == |
+ "-internal-media-controls-text-track-list-kind-" |
+ "captions") { |
+ feature = UseCounter:: |
+ CSSSelectorInternalMediaControlsTextTrackListKindCaptions; |
+ } else if (current->value() == |
+ "-internal-media-controls-text-track-list-kind-" |
+ "subtitles") { |
+ feature = UseCounter:: |
+ CSSSelectorInternalMediaControlsTextTrackListKindSubtitles; |
+ } |
+ } |
+ break; |
+ case CSSSelector::PseudoSpatialNavigationFocus: |
+ if (m_context->mode() != UASheetMode) { |
+ feature = |
+ UseCounter::CSSSelectorInternalPseudoSpatialNavigationFocus; |
+ } |
+ break; |
+ case CSSSelector::PseudoReadOnly: |
+ if (m_context->mode() != UASheetMode) |
+ feature = UseCounter::CSSSelectorPseudoReadOnly; |
+ break; |
+ case CSSSelector::PseudoReadWrite: |
+ if (m_context->mode() != UASheetMode) |
+ feature = UseCounter::CSSSelectorPseudoReadWrite; |
+ break; |
+ default: |
+ break; |
+ } |
+ if (feature != UseCounter::NumberOfFeatures) { |
+ if (!Deprecation::deprecationMessage(feature).isEmpty() && |
+ m_styleSheet->anyOwnerDocument()) { |
+ Deprecation::countDeprecation(*m_styleSheet->anyOwnerDocument(), |
+ feature); |
+ } else { |
+ m_context->useCounter()->count(feature); |
+ } |
+ } |
+ if (current->relation() == CSSSelector::IndirectAdjacent) |
+ m_context->useCounter()->count(UseCounter::CSSSelectorIndirectAdjacent); |
+ if (current->selectorList()) |
+ recordUsageAndDeprecations(*current->selectorList()); |
+ } |
+ } |
+} |
+ |
} // namespace blink |