/*
 * Copyright (C) 2012 Google, Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "third_party/blink/renderer/core/frame/use_counter.h"

#include "third_party/blink/public/mojom/use_counter/css_property_id.mojom-blink.h"
#include "third_party/blink/renderer/core/css/css_style_sheet.h"
#include "third_party/blink/renderer/core/css/style_sheet_contents.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/frame/deprecation.h"
#include "third_party/blink/renderer/core/frame/frame.h"
#include "third_party/blink/renderer/core/frame/frame_console.h"
#include "third_party/blink/renderer/core/frame/local_frame.h"
#include "third_party/blink/renderer/core/frame/local_frame_client.h"
#include "third_party/blink/renderer/core/frame/settings.h"
#include "third_party/blink/renderer/core/inspector/console_message.h"
#include "third_party/blink/renderer/core/page/page.h"
#include "third_party/blink/renderer/core/workers/worker_or_worklet_global_scope.h"
#include "third_party/blink/renderer/platform/histogram.h"
#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
#include "third_party/blink/renderer/platform/weborigin/scheme_registry.h"

namespace blink {

// TODO(loonybear): Move CSSPropertyID to
// public/mojom/use_counter/css_property_id.mojom to plumb CSS metrics end to
// end to PageLoadMetrics.
int UseCounter::MapCSSPropertyIdToCSSSampleIdForHistogram(
    CSSPropertyID unresolved_property) {
  switch (unresolved_property) {
    // Begin at 2, because 1 is reserved for totalPagesMeasuredCSSSampleId.
    case CSSPropertyColor:
      return 2;
    case CSSPropertyDirection:
      return 3;
    case CSSPropertyDisplay:
      return 4;
    case CSSPropertyFont:
      return 5;
    case CSSPropertyFontFamily:
      return 6;
    case CSSPropertyFontSize:
      return 7;
    case CSSPropertyFontStyle:
      return 8;
    case CSSPropertyFontVariant:
      return 9;
    case CSSPropertyFontWeight:
      return 10;
    case CSSPropertyTextRendering:
      return 11;
    case CSSPropertyAliasWebkitFontFeatureSettings:
      return 12;
    case CSSPropertyFontKerning:
      return 13;
    case CSSPropertyWebkitFontSmoothing:
      return 14;
    case CSSPropertyFontVariantLigatures:
      return 15;
    case CSSPropertyWebkitLocale:
      return 16;
    case CSSPropertyWebkitTextOrientation:
      return 17;
    case CSSPropertyWebkitWritingMode:
      return 18;
    case CSSPropertyZoom:
      return 19;
    case CSSPropertyLineHeight:
      return 20;
    case CSSPropertyBackground:
      return 21;
    case CSSPropertyBackgroundAttachment:
      return 22;
    case CSSPropertyBackgroundClip:
      return 23;
    case CSSPropertyBackgroundColor:
      return 24;
    case CSSPropertyBackgroundImage:
      return 25;
    case CSSPropertyBackgroundOrigin:
      return 26;
    case CSSPropertyBackgroundPosition:
      return 27;
    case CSSPropertyBackgroundPositionX:
      return 28;
    case CSSPropertyBackgroundPositionY:
      return 29;
    case CSSPropertyBackgroundRepeat:
      return 30;
    case CSSPropertyBackgroundRepeatX:
      return 31;
    case CSSPropertyBackgroundRepeatY:
      return 32;
    case CSSPropertyBackgroundSize:
      return 33;
    case CSSPropertyBorder:
      return 34;
    case CSSPropertyBorderBottom:
      return 35;
    case CSSPropertyBorderBottomColor:
      return 36;
    case CSSPropertyBorderBottomLeftRadius:
      return 37;
    case CSSPropertyBorderBottomRightRadius:
      return 38;
    case CSSPropertyBorderBottomStyle:
      return 39;
    case CSSPropertyBorderBottomWidth:
      return 40;
    case CSSPropertyBorderCollapse:
      return 41;
    case CSSPropertyBorderColor:
      return 42;
    case CSSPropertyBorderImage:
      return 43;
    case CSSPropertyBorderImageOutset:
      return 44;
    case CSSPropertyBorderImageRepeat:
      return 45;
    case CSSPropertyBorderImageSlice:
      return 46;
    case CSSPropertyBorderImageSource:
      return 47;
    case CSSPropertyBorderImageWidth:
      return 48;
    case CSSPropertyBorderLeft:
      return 49;
    case CSSPropertyBorderLeftColor:
      return 50;
    case CSSPropertyBorderLeftStyle:
      return 51;
    case CSSPropertyBorderLeftWidth:
      return 52;
    case CSSPropertyBorderRadius:
      return 53;
    case CSSPropertyBorderRight:
      return 54;
    case CSSPropertyBorderRightColor:
      return 55;
    case CSSPropertyBorderRightStyle:
      return 56;
    case CSSPropertyBorderRightWidth:
      return 57;
    case CSSPropertyBorderSpacing:
      return 58;
    case CSSPropertyBorderStyle:
      return 59;
    case CSSPropertyBorderTop:
      return 60;
    case CSSPropertyBorderTopColor:
      return 61;
    case CSSPropertyBorderTopLeftRadius:
      return 62;
    case CSSPropertyBorderTopRightRadius:
      return 63;
    case CSSPropertyBorderTopStyle:
      return 64;
    case CSSPropertyBorderTopWidth:
      return 65;
    case CSSPropertyBorderWidth:
      return 66;
    case CSSPropertyBottom:
      return 67;
    case CSSPropertyBoxShadow:
      return 68;
    case CSSPropertyBoxSizing:
      return 69;
    case CSSPropertyCaptionSide:
      return 70;
    case CSSPropertyClear:
      return 71;
    case CSSPropertyClip:
      return 72;
    case CSSPropertyAliasWebkitClipPath:
      return 73;
    case CSSPropertyContent:
      return 74;
    case CSSPropertyCounterIncrement:
      return 75;
    case CSSPropertyCounterReset:
      return 76;
    case CSSPropertyCursor:
      return 77;
    case CSSPropertyEmptyCells:
      return 78;
    case CSSPropertyFloat:
      return 79;
    case CSSPropertyFontStretch:
      return 80;
    case CSSPropertyHeight:
      return 81;
    case CSSPropertyImageRendering:
      return 82;
    case CSSPropertyLeft:
      return 83;
    case CSSPropertyLetterSpacing:
      return 84;
    case CSSPropertyListStyle:
      return 85;
    case CSSPropertyListStyleImage:
      return 86;
    case CSSPropertyListStylePosition:
      return 87;
    case CSSPropertyListStyleType:
      return 88;
    case CSSPropertyMargin:
      return 89;
    case CSSPropertyMarginBottom:
      return 90;
    case CSSPropertyMarginLeft:
      return 91;
    case CSSPropertyMarginRight:
      return 92;
    case CSSPropertyMarginTop:
      return 93;
    case CSSPropertyMaxHeight:
      return 94;
    case CSSPropertyMaxWidth:
      return 95;
    case CSSPropertyMinHeight:
      return 96;
    case CSSPropertyMinWidth:
      return 97;
    case CSSPropertyOpacity:
      return 98;
    case CSSPropertyOrphans:
      return 99;
    case CSSPropertyOutline:
      return 100;
    case CSSPropertyOutlineColor:
      return 101;
    case CSSPropertyOutlineOffset:
      return 102;
    case CSSPropertyOutlineStyle:
      return 103;
    case CSSPropertyOutlineWidth:
      return 104;
    case CSSPropertyOverflow:
      return 105;
    case CSSPropertyOverflowWrap:
      return 106;
    case CSSPropertyOverflowX:
      return 107;
    case CSSPropertyOverflowY:
      return 108;
    case CSSPropertyPadding:
      return 109;
    case CSSPropertyPaddingBottom:
      return 110;
    case CSSPropertyPaddingLeft:
      return 111;
    case CSSPropertyPaddingRight:
      return 112;
    case CSSPropertyPaddingTop:
      return 113;
    case CSSPropertyPage:
      return 114;
    case CSSPropertyPageBreakAfter:
      return 115;
    case CSSPropertyPageBreakBefore:
      return 116;
    case CSSPropertyPageBreakInside:
      return 117;
    case CSSPropertyPointerEvents:
      return 118;
    case CSSPropertyPosition:
      return 119;
    case CSSPropertyQuotes:
      return 120;
    case CSSPropertyResize:
      return 121;
    case CSSPropertyRight:
      return 122;
    case CSSPropertySize:
      return 123;
    case CSSPropertySrc:
      return 124;
    case CSSPropertySpeak:
      return 125;
    case CSSPropertyTableLayout:
      return 126;
    case CSSPropertyTabSize:
      return 127;
    case CSSPropertyTextAlign:
      return 128;
    case CSSPropertyTextDecoration:
      return 129;
    case CSSPropertyTextIndent:
      return 130;
    /* Removed CSSPropertyTextLineThrough* - 131-135 */
    case CSSPropertyTextOverflow:
      return 136;
    /* Removed CSSPropertyTextOverline* - 137-141 */
    case CSSPropertyTextShadow:
      return 142;
    case CSSPropertyTextTransform:
      return 143;
    /* Removed CSSPropertyTextUnderline* - 144-148 */
    case CSSPropertyTop:
      return 149;
    case CSSPropertyTransition:
      return 150;
    case CSSPropertyTransitionDelay:
      return 151;
    case CSSPropertyTransitionDuration:
      return 152;
    case CSSPropertyTransitionProperty:
      return 153;
    case CSSPropertyTransitionTimingFunction:
      return 154;
    case CSSPropertyUnicodeBidi:
      return 155;
    case CSSPropertyUnicodeRange:
      return 156;
    case CSSPropertyVerticalAlign:
      return 157;
    case CSSPropertyVisibility:
      return 158;
    case CSSPropertyWhiteSpace:
      return 159;
    case CSSPropertyWidows:
      return 160;
    case CSSPropertyWidth:
      return 161;
    case CSSPropertyWordBreak:
      return 162;
    case CSSPropertyWordSpacing:
      return 163;
    case CSSPropertyAliasWordWrap:
      return 164;
    case CSSPropertyZIndex:
      return 165;
    case CSSPropertyAliasWebkitAnimation:
      return 166;
    case CSSPropertyAliasWebkitAnimationDelay:
      return 167;
    case CSSPropertyAliasWebkitAnimationDirection:
      return 168;
    case CSSPropertyAliasWebkitAnimationDuration:
      return 169;
    case CSSPropertyAliasWebkitAnimationFillMode:
      return 170;
    case CSSPropertyAliasWebkitAnimationIterationCount:
      return 171;
    case CSSPropertyAliasWebkitAnimationName:
      return 172;
    case CSSPropertyAliasWebkitAnimationPlayState:
      return 173;
    case CSSPropertyAliasWebkitAnimationTimingFunction:
      return 174;
    case CSSPropertyWebkitAppearance:
      return 175;
    // CSSPropertyWebkitAspectRatio was 176
    case CSSPropertyAliasWebkitBackfaceVisibility:
      return 177;
    case CSSPropertyAliasWebkitBackgroundClip:
      return 178;
    // case CSSPropertyWebkitBackgroundComposite: return 179;
    case CSSPropertyAliasWebkitBackgroundOrigin:
      return 180;
    case CSSPropertyAliasWebkitBackgroundSize:
      return 181;
    case CSSPropertyAliasWebkitBorderAfter:
      return 182;
    case CSSPropertyAliasWebkitBorderAfterColor:
      return 183;
    case CSSPropertyAliasWebkitBorderAfterStyle:
      return 184;
    case CSSPropertyAliasWebkitBorderAfterWidth:
      return 185;
    case CSSPropertyAliasWebkitBorderBefore:
      return 186;
    case CSSPropertyAliasWebkitBorderBeforeColor:
      return 187;
    case CSSPropertyAliasWebkitBorderBeforeStyle:
      return 188;
    case CSSPropertyAliasWebkitBorderBeforeWidth:
      return 189;
    case CSSPropertyAliasWebkitBorderEnd:
      return 190;
    case CSSPropertyAliasWebkitBorderEndColor:
      return 191;
    case CSSPropertyAliasWebkitBorderEndStyle:
      return 192;
    case CSSPropertyAliasWebkitBorderEndWidth:
      return 193;
    // CSSPropertyWebkitBorderFit was 194
    case CSSPropertyWebkitBorderHorizontalSpacing:
      return 195;
    case CSSPropertyWebkitBorderImage:
      return 196;
    case CSSPropertyAliasWebkitBorderRadius:
      return 197;
    case CSSPropertyAliasWebkitBorderStart:
      return 198;
    case CSSPropertyAliasWebkitBorderStartColor:
      return 199;
    case CSSPropertyAliasWebkitBorderStartStyle:
      return 200;
    case CSSPropertyAliasWebkitBorderStartWidth:
      return 201;
    case CSSPropertyWebkitBorderVerticalSpacing:
      return 202;
    case CSSPropertyWebkitBoxAlign:
      return 203;
    case CSSPropertyWebkitBoxDirection:
      return 204;
    case CSSPropertyWebkitBoxFlex:
      return 205;
    // CSSPropertyWebkitBoxFlexGroup was 206
    // CSSPropertyWebkitBoxLines was 207
    case CSSPropertyWebkitBoxOrdinalGroup:
      return 208;
    case CSSPropertyWebkitBoxOrient:
      return 209;
    case CSSPropertyWebkitBoxPack:
      return 210;
    case CSSPropertyWebkitBoxReflect:
      return 211;
    case CSSPropertyAliasWebkitBoxShadow:
      return 212;
    // CSSPropertyWebkitColumnAxis was 214
    case CSSPropertyWebkitColumnBreakAfter:
      return 215;
    case CSSPropertyWebkitColumnBreakBefore:
      return 216;
    case CSSPropertyWebkitColumnBreakInside:
      return 217;
    case CSSPropertyAliasWebkitColumnCount:
      return 218;
    case CSSPropertyAliasWebkitColumnGap:
      return 219;
    // CSSPropertyWebkitColumnProgression was 220
    case CSSPropertyAliasWebkitColumnRule:
      return 221;
    case CSSPropertyAliasWebkitColumnRuleColor:
      return 222;
    case CSSPropertyAliasWebkitColumnRuleStyle:
      return 223;
    case CSSPropertyAliasWebkitColumnRuleWidth:
      return 224;
    case CSSPropertyAliasWebkitColumnSpan:
      return 225;
    case CSSPropertyAliasWebkitColumnWidth:
      return 226;
    case CSSPropertyAliasWebkitColumns:
      return 227;
    // 228 was CSSPropertyWebkitBoxDecorationBreak (duplicated due to #ifdef).
    // 229 was CSSPropertyWebkitFilter (duplicated due to #ifdef).
    case CSSPropertyAlignContent:
      return 230;
    case CSSPropertyAlignItems:
      return 231;
    case CSSPropertyAlignSelf:
      return 232;
    case CSSPropertyFlex:
      return 233;
    case CSSPropertyFlexBasis:
      return 234;
    case CSSPropertyFlexDirection:
      return 235;
    case CSSPropertyFlexFlow:
      return 236;
    case CSSPropertyFlexGrow:
      return 237;
    case CSSPropertyFlexShrink:
      return 238;
    case CSSPropertyFlexWrap:
      return 239;
    case CSSPropertyJustifyContent:
      return 240;
    case CSSPropertyWebkitFontSizeDelta:
      return 241;
    case CSSPropertyGridTemplateColumns:
      return 242;
    case CSSPropertyGridTemplateRows:
      return 243;
    case CSSPropertyGridColumnStart:
      return 244;
    case CSSPropertyGridColumnEnd:
      return 245;
    case CSSPropertyGridRowStart:
      return 246;
    case CSSPropertyGridRowEnd:
      return 247;
    case CSSPropertyGridColumn:
      return 248;
    case CSSPropertyGridRow:
      return 249;
    case CSSPropertyGridAutoFlow:
      return 250;
    case CSSPropertyWebkitHighlight:
      return 251;
    case CSSPropertyWebkitHyphenateCharacter:
      return 252;
    // case CSSPropertyWebkitLineBoxContain: return 257;
    // case CSSPropertyWebkitLineAlign: return 258;
    case CSSPropertyWebkitLineBreak:
      return 259;
    case CSSPropertyWebkitLineClamp:
      return 260;
    // case CSSPropertyWebkitLineGrid: return 261;
    // case CSSPropertyWebkitLineSnap: return 262;
    case CSSPropertyWebkitLogicalWidth:
      return 263;
    case CSSPropertyWebkitLogicalHeight:
      return 264;
    case CSSPropertyWebkitMarginAfterCollapse:
      return 265;
    case CSSPropertyWebkitMarginBeforeCollapse:
      return 266;
    case CSSPropertyWebkitMarginBottomCollapse:
      return 267;
    case CSSPropertyWebkitMarginTopCollapse:
      return 268;
    case CSSPropertyWebkitMarginCollapse:
      return 269;
    case CSSPropertyAliasWebkitMarginAfter:
      return 270;
    case CSSPropertyAliasWebkitMarginBefore:
      return 271;
    case CSSPropertyAliasWebkitMarginEnd:
      return 272;
    case CSSPropertyAliasWebkitMarginStart:
      return 273;
    // CSSPropertyWebkitMarquee was 274.
    // CSSPropertyInternalMarquee* were 275-279.
    case CSSPropertyWebkitMask:
      return 280;
    case CSSPropertyWebkitMaskBoxImage:
      return 281;
    case CSSPropertyWebkitMaskBoxImageOutset:
      return 282;
    case CSSPropertyWebkitMaskBoxImageRepeat:
      return 283;
    case CSSPropertyWebkitMaskBoxImageSlice:
      return 284;
    case CSSPropertyWebkitMaskBoxImageSource:
      return 285;
    case CSSPropertyWebkitMaskBoxImageWidth:
      return 286;
    case CSSPropertyWebkitMaskClip:
      return 287;
    case CSSPropertyWebkitMaskComposite:
      return 288;
    case CSSPropertyWebkitMaskImage:
      return 289;
    case CSSPropertyWebkitMaskOrigin:
      return 290;
    case CSSPropertyWebkitMaskPosition:
      return 291;
    case CSSPropertyWebkitMaskPositionX:
      return 292;
    case CSSPropertyWebkitMaskPositionY:
      return 293;
    case CSSPropertyWebkitMaskRepeat:
      return 294;
    case CSSPropertyWebkitMaskRepeatX:
      return 295;
    case CSSPropertyWebkitMaskRepeatY:
      return 296;
    case CSSPropertyWebkitMaskSize:
      return 297;
    case CSSPropertyWebkitMaxLogicalWidth:
      return 298;
    case CSSPropertyWebkitMaxLogicalHeight:
      return 299;
    case CSSPropertyWebkitMinLogicalWidth:
      return 300;
    case CSSPropertyWebkitMinLogicalHeight:
      return 301;
    // WebkitNbspMode has been deleted, was return 302;
    case CSSPropertyOrder:
      return 303;
    case CSSPropertyAliasWebkitPaddingAfter:
      return 304;
    case CSSPropertyAliasWebkitPaddingBefore:
      return 305;
    case CSSPropertyAliasWebkitPaddingEnd:
      return 306;
    case CSSPropertyAliasWebkitPaddingStart:
      return 307;
    case CSSPropertyAliasWebkitPerspective:
      return 308;
    case CSSPropertyAliasWebkitPerspectiveOrigin:
      return 309;
    case CSSPropertyWebkitPerspectiveOriginX:
      return 310;
    case CSSPropertyWebkitPerspectiveOriginY:
      return 311;
    case CSSPropertyWebkitPrintColorAdjust:
      return 312;
    case CSSPropertyWebkitRtlOrdering:
      return 313;
    case CSSPropertyWebkitRubyPosition:
      return 314;
    case CSSPropertyWebkitTextCombine:
      return 315;
    case CSSPropertyWebkitTextDecorationsInEffect:
      return 316;
    case CSSPropertyWebkitTextEmphasis:
      return 317;
    case CSSPropertyWebkitTextEmphasisColor:
      return 318;
    case CSSPropertyWebkitTextEmphasisPosition:
      return 319;
    case CSSPropertyWebkitTextEmphasisStyle:
      return 320;
    case CSSPropertyWebkitTextFillColor:
      return 321;
    case CSSPropertyWebkitTextSecurity:
      return 322;
    case CSSPropertyWebkitTextStroke:
      return 323;
    case CSSPropertyWebkitTextStrokeColor:
      return 324;
    case CSSPropertyWebkitTextStrokeWidth:
      return 325;
    case CSSPropertyAliasWebkitTransform:
      return 326;
    case CSSPropertyAliasWebkitTransformOrigin:
      return 327;
    case CSSPropertyWebkitTransformOriginX:
      return 328;
    case CSSPropertyWebkitTransformOriginY:
      return 329;
    case CSSPropertyWebkitTransformOriginZ:
      return 330;
    case CSSPropertyAliasWebkitTransformStyle:
      return 331;
    case CSSPropertyAliasWebkitTransition:
      return 332;
    case CSSPropertyAliasWebkitTransitionDelay:
      return 333;
    case CSSPropertyAliasWebkitTransitionDuration:
      return 334;
    case CSSPropertyAliasWebkitTransitionProperty:
      return 335;
    case CSSPropertyAliasWebkitTransitionTimingFunction:
      return 336;
    case CSSPropertyWebkitUserDrag:
      return 337;
    case CSSPropertyWebkitUserModify:
      return 338;
    case CSSPropertyAliasWebkitUserSelect:
      return 339;
    // case CSSPropertyWebkitFlowInto: return 340;
    // case CSSPropertyWebkitFlowFrom: return 341;
    // case CSSPropertyWebkitRegionFragment: return 342;
    // case CSSPropertyWebkitRegionBreakAfter: return 343;
    // case CSSPropertyWebkitRegionBreakBefore: return 344;
    // case CSSPropertyWebkitRegionBreakInside: return 345;
    // case CSSPropertyShapeInside: return 346;
    case CSSPropertyShapeOutside:
      return 347;
    case CSSPropertyShapeMargin:
      return 348;
    // case CSSPropertyShapePadding: return 349;
    // case CSSPropertyWebkitWrapFlow: return 350;
    // case CSSPropertyWebkitWrapThrough: return 351;
    // CSSPropertyWebkitWrap was 352.
    // 353 was CSSPropertyWebkitTapHighlightColor (duplicated due to #ifdef).
    // 354 was CSSPropertyWebkitAppRegion (duplicated due to #ifdef).
    case CSSPropertyClipPath:
      return 355;
    case CSSPropertyClipRule:
      return 356;
    case CSSPropertyMask:
      return 357;
    // CSSPropertyEnableBackground has been removed, was return 358;
    case CSSPropertyFilter:
      return 359;
    case CSSPropertyFloodColor:
      return 360;
    case CSSPropertyFloodOpacity:
      return 361;
    case CSSPropertyLightingColor:
      return 362;
    case CSSPropertyStopColor:
      return 363;
    case CSSPropertyStopOpacity:
      return 364;
    case CSSPropertyColorInterpolation:
      return 365;
    case CSSPropertyColorInterpolationFilters:
      return 366;
    // case CSSPropertyColorProfile: return 367;
    case CSSPropertyColorRendering:
      return 368;
    case CSSPropertyFill:
      return 369;
    case CSSPropertyFillOpacity:
      return 370;
    case CSSPropertyFillRule:
      return 371;
    case CSSPropertyMarker:
      return 372;
    case CSSPropertyMarkerEnd:
      return 373;
    case CSSPropertyMarkerMid:
      return 374;
    case CSSPropertyMarkerStart:
      return 375;
    case CSSPropertyMaskType:
      return 376;
    case CSSPropertyShapeRendering:
      return 377;
    case CSSPropertyStroke:
      return 378;
    case CSSPropertyStrokeDasharray:
      return 379;
    case CSSPropertyStrokeDashoffset:
      return 380;
    case CSSPropertyStrokeLinecap:
      return 381;
    case CSSPropertyStrokeLinejoin:
      return 382;
    case CSSPropertyStrokeMiterlimit:
      return 383;
    case CSSPropertyStrokeOpacity:
      return 384;
    case CSSPropertyStrokeWidth:
      return 385;
    case CSSPropertyAlignmentBaseline:
      return 386;
    case CSSPropertyBaselineShift:
      return 387;
    case CSSPropertyDominantBaseline:
      return 388;
    // CSSPropertyGlyphOrientationHorizontal has been removed, was return 389;
    // CSSPropertyGlyphOrientationVertical has been removed, was return 390;
    // CSSPropertyKerning has been removed, was return 391;
    case CSSPropertyTextAnchor:
      return 392;
    case CSSPropertyVectorEffect:
      return 393;
    case CSSPropertyWritingMode:
      return 394;
// CSSPropertyWebkitSvgShadow has been removed, was return 395;
// CSSPropertyWebkitCursorVisibility has been removed, was return 396;
// CSSPropertyImageOrientation has been removed, was return 397;
// CSSPropertyImageResolution has been removed, was return 398;
#if defined(ENABLE_CSS_COMPOSITING) && ENABLE_CSS_COMPOSITING
    case CSSPropertyWebkitBlendMode:
      return 399;
    case CSSPropertyWebkitBackgroundBlendMode:
      return 400;
#endif
    case CSSPropertyTextDecorationLine:
      return 401;
    case CSSPropertyTextDecorationStyle:
      return 402;
    case CSSPropertyTextDecorationColor:
      return 403;
    case CSSPropertyTextAlignLast:
      return 404;
    case CSSPropertyTextUnderlinePosition:
      return 405;
    case CSSPropertyMaxZoom:
      return 406;
    case CSSPropertyMinZoom:
      return 407;
    case CSSPropertyOrientation:
      return 408;
    case CSSPropertyUserZoom:
      return 409;
    // CSSPropertyWebkitDashboardRegion was 410.
    // CSSPropertyWebkitOverflowScrolling was 411.
    case CSSPropertyWebkitAppRegion:
      return 412;
    case CSSPropertyAliasWebkitFilter:
      return 413;
    case CSSPropertyWebkitBoxDecorationBreak:
      return 414;
    case CSSPropertyWebkitTapHighlightColor:
      return 415;
    case CSSPropertyBufferedRendering:
      return 416;
    case CSSPropertyGridAutoRows:
      return 417;
    case CSSPropertyGridAutoColumns:
      return 418;
    case CSSPropertyBackgroundBlendMode:
      return 419;
    case CSSPropertyMixBlendMode:
      return 420;
    case CSSPropertyTouchAction:
      return 421;
    case CSSPropertyGridArea:
      return 422;
    case CSSPropertyGridTemplateAreas:
      return 423;
    case CSSPropertyAnimation:
      return 424;
    case CSSPropertyAnimationDelay:
      return 425;
    case CSSPropertyAnimationDirection:
      return 426;
    case CSSPropertyAnimationDuration:
      return 427;
    case CSSPropertyAnimationFillMode:
      return 428;
    case CSSPropertyAnimationIterationCount:
      return 429;
    case CSSPropertyAnimationName:
      return 430;
    case CSSPropertyAnimationPlayState:
      return 431;
    case CSSPropertyAnimationTimingFunction:
      return 432;
    case CSSPropertyObjectFit:
      return 433;
    case CSSPropertyPaintOrder:
      return 434;
    case CSSPropertyMaskSourceType:
      return 435;
    case CSSPropertyIsolation:
      return 436;
    case CSSPropertyObjectPosition:
      return 437;
    // case CSSPropertyInternalCallback: return 438;
    case CSSPropertyShapeImageThreshold:
      return 439;
    case CSSPropertyColumnFill:
      return 440;
    case CSSPropertyTextJustify:
      return 441;
    // CSSPropertyTouchActionDelay was 442
    case CSSPropertyJustifySelf:
      return 443;
    case CSSPropertyScrollBehavior:
      return 444;
    case CSSPropertyWillChange:
      return 445;
    case CSSPropertyTransform:
      return 446;
    case CSSPropertyTransformOrigin:
      return 447;
    case CSSPropertyTransformStyle:
      return 448;
    case CSSPropertyPerspective:
      return 449;
    case CSSPropertyPerspectiveOrigin:
      return 450;
    case CSSPropertyBackfaceVisibility:
      return 451;
    case CSSPropertyGridTemplate:
      return 452;
    case CSSPropertyGrid:
      return 453;
    case CSSPropertyAll:
      return 454;
    case CSSPropertyJustifyItems:
      return 455;
    // CSSPropertyMotionPath was 457.
    // CSSPropertyAliasMotionOffset was 458.
    // CSSPropertyAliasMotionRotation was 459.
    // CSSPropertyMotion was 460.
    case CSSPropertyX:
      return 461;
    case CSSPropertyY:
      return 462;
    case CSSPropertyRx:
      return 463;
    case CSSPropertyRy:
      return 464;
    case CSSPropertyFontSizeAdjust:
      return 465;
    case CSSPropertyCx:
      return 466;
    case CSSPropertyCy:
      return 467;
    case CSSPropertyR:
      return 468;
    case CSSPropertyAliasEpubCaptionSide:
      return 469;
    case CSSPropertyAliasEpubTextCombine:
      return 470;
    case CSSPropertyAliasEpubTextEmphasis:
      return 471;
    case CSSPropertyAliasEpubTextEmphasisColor:
      return 472;
    case CSSPropertyAliasEpubTextEmphasisStyle:
      return 473;
    case CSSPropertyAliasEpubTextOrientation:
      return 474;
    case CSSPropertyAliasEpubTextTransform:
      return 475;
    case CSSPropertyAliasEpubWordBreak:
      return 476;
    case CSSPropertyAliasEpubWritingMode:
      return 477;
    case CSSPropertyAliasWebkitAlignContent:
      return 478;
    case CSSPropertyAliasWebkitAlignItems:
      return 479;
    case CSSPropertyAliasWebkitAlignSelf:
      return 480;
    case CSSPropertyAliasWebkitBorderBottomLeftRadius:
      return 481;
    case CSSPropertyAliasWebkitBorderBottomRightRadius:
      return 482;
    case CSSPropertyAliasWebkitBorderTopLeftRadius:
      return 483;
    case CSSPropertyAliasWebkitBorderTopRightRadius:
      return 484;
    case CSSPropertyAliasWebkitBoxSizing:
      return 485;
    case CSSPropertyAliasWebkitFlex:
      return 486;
    case CSSPropertyAliasWebkitFlexBasis:
      return 487;
    case CSSPropertyAliasWebkitFlexDirection:
      return 488;
    case CSSPropertyAliasWebkitFlexFlow:
      return 489;
    case CSSPropertyAliasWebkitFlexGrow:
      return 490;
    case CSSPropertyAliasWebkitFlexShrink:
      return 491;
    case CSSPropertyAliasWebkitFlexWrap:
      return 492;
    case CSSPropertyAliasWebkitJustifyContent:
      return 493;
    case CSSPropertyAliasWebkitOpacity:
      return 494;
    case CSSPropertyAliasWebkitOrder:
      return 495;
    case CSSPropertyAliasWebkitShapeImageThreshold:
      return 496;
    case CSSPropertyAliasWebkitShapeMargin:
      return 497;
    case CSSPropertyAliasWebkitShapeOutside:
      return 498;
    case CSSPropertyScrollSnapType:
      return 499;
    // CSSPropertyScrollSnapPointsX was 500.
    // CSSPropertyScrollSnapPointsY was 501.
    // CSSPropertyScrollSnapCoordinate was 502.
    // CSSPropertyScrollSnapDestination was 503.
    case CSSPropertyTranslate:
      return 504;
    case CSSPropertyRotate:
      return 505;
    case CSSPropertyScale:
      return 506;
    case CSSPropertyImageOrientation:
      return 507;
    case CSSPropertyBackdropFilter:
      return 508;
    case CSSPropertyTextCombineUpright:
      return 509;
    case CSSPropertyTextOrientation:
      return 510;
    case CSSPropertyGridColumnGap:
      return 511;
    case CSSPropertyGridRowGap:
      return 512;
    case CSSPropertyGridGap:
      return 513;
    case CSSPropertyFontFeatureSettings:
      return 514;
    case CSSPropertyVariable:
      return 515;
    case CSSPropertyFontDisplay:
      return 516;
    case CSSPropertyContain:
      return 517;
    case CSSPropertyD:
      return 518;
    case CSSPropertyLineHeightStep:
      return 519;
    case CSSPropertyBreakAfter:
      return 520;
    case CSSPropertyBreakBefore:
      return 521;
    case CSSPropertyBreakInside:
      return 522;
    case CSSPropertyColumnCount:
      return 523;
    case CSSPropertyColumnGap:
      return 524;
    case CSSPropertyColumnRule:
      return 525;
    case CSSPropertyColumnRuleColor:
      return 526;
    case CSSPropertyColumnRuleStyle:
      return 527;
    case CSSPropertyColumnRuleWidth:
      return 528;
    case CSSPropertyColumnSpan:
      return 529;
    case CSSPropertyColumnWidth:
      return 530;
    case CSSPropertyColumns:
      return 531;
    // CSSPropertyApplyAtRule was 532.
    case CSSPropertyFontVariantCaps:
      return 533;
    case CSSPropertyHyphens:
      return 534;
    case CSSPropertyFontVariantNumeric:
      return 535;
    case CSSPropertyTextSizeAdjust:
      return 536;
    case CSSPropertyAliasWebkitTextSizeAdjust:
      return 537;
    case CSSPropertyOverflowAnchor:
      return 538;
    case CSSPropertyUserSelect:
      return 539;
    case CSSPropertyOffsetDistance:
      return 540;
    case CSSPropertyOffsetPath:
      return 541;
    // CSSPropertyOffsetRotation was 542.
    case CSSPropertyOffset:
      return 543;
    case CSSPropertyOffsetAnchor:
      return 544;
    case CSSPropertyOffsetPosition:
      return 545;
    // CSSPropertyTextDecorationSkip was 546.
    case CSSPropertyCaretColor:
      return 547;
    case CSSPropertyOffsetRotate:
      return 548;
    case CSSPropertyFontVariationSettings:
      return 549;
    case CSSPropertyInlineSize:
      return 550;
    case CSSPropertyBlockSize:
      return 551;
    case CSSPropertyMinInlineSize:
      return 552;
    case CSSPropertyMinBlockSize:
      return 553;
    case CSSPropertyMaxInlineSize:
      return 554;
    case CSSPropertyMaxBlockSize:
      return 555;
    case CSSPropertyLineBreak:
      return 556;
    case CSSPropertyPlaceContent:
      return 557;
    case CSSPropertyPlaceItems:
      return 558;
    case CSSPropertyTransformBox:
      return 559;
    case CSSPropertyPlaceSelf:
      return 560;
    case CSSPropertyScrollSnapAlign:
      return 561;
    case CSSPropertyScrollPadding:
      return 562;
    case CSSPropertyScrollPaddingTop:
      return 563;
    case CSSPropertyScrollPaddingRight:
      return 564;
    case CSSPropertyScrollPaddingBottom:
      return 565;
    case CSSPropertyScrollPaddingLeft:
      return 566;
    case CSSPropertyScrollPaddingBlock:
      return 567;
    case CSSPropertyScrollPaddingBlockStart:
      return 568;
    case CSSPropertyScrollPaddingBlockEnd:
      return 569;
    case CSSPropertyScrollPaddingInline:
      return 570;
    case CSSPropertyScrollPaddingInlineStart:
      return 571;
    case CSSPropertyScrollPaddingInlineEnd:
      return 572;
    case CSSPropertyScrollMargin:
      return 573;
    case CSSPropertyScrollMarginTop:
      return 574;
    case CSSPropertyScrollMarginRight:
      return 575;
    case CSSPropertyScrollMarginBottom:
      return 576;
    case CSSPropertyScrollMarginLeft:
      return 577;
    case CSSPropertyScrollMarginBlock:
      return 578;
    case CSSPropertyScrollMarginBlockStart:
      return 579;
    case CSSPropertyScrollMarginBlockEnd:
      return 580;
    case CSSPropertyScrollMarginInline:
      return 581;
    case CSSPropertyScrollMarginInlineStart:
      return 582;
    case CSSPropertyScrollMarginInlineEnd:
      return 583;
    case CSSPropertyScrollSnapStop:
      return 584;
    case CSSPropertyOverscrollBehavior:
      return 585;
    case CSSPropertyOverscrollBehaviorX:
      return 586;
    case CSSPropertyOverscrollBehaviorY:
      return 587;
    case CSSPropertyFontVariantEastAsian:
      return 588;
    case CSSPropertyTextDecorationSkipInk:
      return 589;
    case CSSPropertyScrollCustomization:
      return 590;
    case CSSPropertyRowGap:
      return 591;
    case CSSPropertyGap:
      return 592;
    case CSSPropertyViewportFit:
      return 593;
    case CSSPropertyMarginBlockStart:
      return 594;
    case CSSPropertyMarginBlockEnd:
      return 595;
    case CSSPropertyMarginInlineStart:
      return 596;
    case CSSPropertyMarginInlineEnd:
      return 597;
    case CSSPropertyPaddingBlockStart:
      return 598;
    case CSSPropertyPaddingBlockEnd:
      return 599;
    case CSSPropertyPaddingInlineStart:
      return 600;
    case CSSPropertyPaddingInlineEnd:
      return 601;
    case CSSPropertyBorderBlockEndColor:
      return 602;
    case CSSPropertyBorderBlockEndStyle:
      return 603;
    case CSSPropertyBorderBlockEndWidth:
      return 604;
    case CSSPropertyBorderBlockStartColor:
      return 605;
    case CSSPropertyBorderBlockStartStyle:
      return 606;
    case CSSPropertyBorderBlockStartWidth:
      return 607;
    case CSSPropertyBorderInlineEndColor:
      return 608;
    case CSSPropertyBorderInlineEndStyle:
      return 609;
    case CSSPropertyBorderInlineEndWidth:
      return 610;
    case CSSPropertyBorderInlineStartColor:
      return 611;
    case CSSPropertyBorderInlineStartStyle:
      return 612;
    case CSSPropertyBorderInlineStartWidth:
      return 613;
    case CSSPropertyBorderBlockStart:
      return 614;
    case CSSPropertyBorderBlockEnd:
      return 615;
    case CSSPropertyBorderInlineStart:
      return 616;
    case CSSPropertyBorderInlineEnd:
      return 617;
    case CSSPropertyMarginBlock:
      return 618;
    case CSSPropertyMarginInline:
      return 619;
    case CSSPropertyPaddingBlock:
      return 620;
    case CSSPropertyPaddingInline:
      return 621;
    case CSSPropertyBorderBlockColor:
      return 622;
    case CSSPropertyBorderBlockStyle:
      return 623;
    case CSSPropertyBorderBlockWidth:
      return 624;
    case CSSPropertyBorderInlineColor:
      return 625;
    case CSSPropertyBorderInlineStyle:
      return 626;
    case CSSPropertyBorderInlineWidth:
      return 627;
    case CSSPropertyBorderBlock:
      return 628;
    case CSSPropertyBorderInline:
      return 629;
    // 1. Add new features above this line (don't change the assigned numbers of
    // the existing items).
    // 2. Update kMaximumCSSSampleId (defined in
    // public/mojom/use_counter/css_property_id.mojom) with the new maximum
    // value.
    // 3. Run the update_use_counter_css.py script in
    // chromium/src/tools/metrics/histograms to update the UMA histogram names.
    case CSSPropertyInvalid:
      NOTREACHED();
      return 0;
  }

  NOTREACHED();
  return 0;
}

UseCounter::UseCounter(Context context)
    : mute_count_(0),
      context_(context),
      features_recorded_(static_cast<int>(WebFeature::kNumberOfFeatures)),
      css_recorded_(numCSSPropertyIDs),
      animated_css_recorded_(numCSSPropertyIDs) {}

void UseCounter::MuteForInspector() {
  mute_count_++;
}

void UseCounter::UnmuteForInspector() {
  mute_count_--;
}

void UseCounter::RecordMeasurement(WebFeature feature,
                                   const LocalFrame& source_frame) {
  if (mute_count_)
    return;

  // PageDestruction is reserved as a scaling factor.
  DCHECK_NE(WebFeature::kOBSOLETE_PageDestruction, feature);
  DCHECK_NE(WebFeature::kPageVisits, feature);
  DCHECK_GE(WebFeature::kNumberOfFeatures, feature);

  int feature_id = static_cast<int>(feature);
  if (!features_recorded_.QuickGet(feature_id)) {
    if (context_ != kDisabledContext) {
      // Note that HTTPArchive tooling looks specifically for this event - see
      // https://github.com/HTTPArchive/httparchive/issues/59
      TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"),
                   "FeatureFirstUsed", "feature", feature_id);
      if (context_ != kDefaultContext)
        FeaturesHistogram().Count(feature_id);
      if (LocalFrameClient* client = source_frame.Client())
        client->DidObserveNewFeatureUsage(feature);
      NotifyFeatureCounted(feature);
    }
    features_recorded_.QuickSet(feature_id);
  }
}

bool UseCounter::HasRecordedMeasurement(WebFeature feature) const {
  if (mute_count_)
    return false;

  // PageDestruction is reserved as a scaling factor.
  DCHECK_NE(WebFeature::kOBSOLETE_PageDestruction, feature);
  DCHECK_NE(WebFeature::kPageVisits, feature);
  DCHECK_GE(WebFeature::kNumberOfFeatures, feature);

  return features_recorded_.QuickGet(static_cast<int>(feature));
}

// Static
void UseCounter::CountIfFeatureWouldBeBlockedByFeaturePolicy(
    const LocalFrame& frame,
    WebFeature blocked_cross_origin,
    WebFeature blocked_same_origin) {
  // Get the origin of the top-level document
  const SecurityOrigin* topOrigin =
      frame.Tree().Top().GetSecurityContext()->GetSecurityOrigin();

  // Check if this frame is same-origin with the top-level
  if (!frame.GetSecurityContext()->GetSecurityOrigin()->CanAccess(topOrigin)) {
    // This frame is cross-origin with the top-level frame, and so would be
    // blocked without a feature policy.
    UseCounter::Count(&frame, blocked_cross_origin);
    return;
  }

  // Walk up the frame tree looking for any cross-origin embeds. Even if this
  // frame is same-origin with the top-level, if it is embedded by a cross-
  // origin frame (like A->B->A) it would be blocked without a feature policy.
  const Frame* f = &frame;
  while (!f->IsMainFrame()) {
    if (!f->GetSecurityContext()->GetSecurityOrigin()->CanAccess(topOrigin)) {
      UseCounter::Count(&frame, blocked_same_origin);
      return;
    }
    f = f->Tree().Parent();
  }
}

void UseCounter::Trace(blink::Visitor* visitor) {
  visitor->Trace(observers_);
}

void UseCounter::DidCommitLoad(const LocalFrame* frame) {
  // Reset state from previous load.
  // Use the protocol of the document being loaded into the main frame to
  // decide whether this page is interesting from a metrics perspective.
  // Drop usage tracking on view source and new-tab pages. This matches the
  // policy of page_load_metrics.
  // Note that SVGImage cases always have an about:blank URL
  if (context_ != kSVGImageContext) {
    // TODO(loonybear): remove all the filters when all histograms have been
    // moved to the browser side.
    // https://crbug.com/845986.
    if (!frame->GetDocument() ||
        !Page::OrdinaryPages().Contains(frame->GetPage())) {
      context_ = kDisabledContext;
      return;
    }
    const KURL url = frame->GetDocument()->Url();
    if (url.ProtocolIs("chrome-extension"))
      context_ = kExtensionContext;
    else if (frame->GetDocument()->IsViewSource())
      context_ = kDisabledContext;
    else if (!frame->Client() || !frame->Client()->ShouldTrackUseCounter(url))
      context_ = kDisabledContext;
    else if (frame->GetDocument()->IsPrefetchOnly())
      context_ = kDisabledContext;
    // TODO(loonybear): Service worker and shared worker count feature usage on
    // the blink side use counter. Once the blink side use counter is removed
    // (crbug.com/811948), the checker for shadow pages should be removed.
    else if (frame->GetSettings()->IsShadowPage())
      context_ = kDisabledContext;
    else if (SchemeRegistry::ShouldTrackUsageMetricsForScheme(url.Protocol()))
      context_ = kDefaultContext;
    else
      context_ = kDisabledContext;
  }

  features_recorded_.ClearAll();
  css_recorded_.ClearAll();
  animated_css_recorded_.ClearAll();

  // TODO(loonybear): Remove or move SVG features histogram and extension
  // features histogram to the browser side.
  if (!mute_count_ &&
      (context_ == kSVGImageContext || context_ == kExtensionContext))
    FeaturesHistogram().Count(static_cast<int>(WebFeature::kPageVisits));
}

void UseCounter::Count(const LocalFrame* frame, WebFeature feature) {
  if (!frame)
    return;
  Page* page = frame->GetPage();
  if (!page)
    return;

  page->GetUseCounter().Count(feature, frame);
}

void UseCounter::Count(const Document& document, WebFeature feature) {
  Count(document.GetFrame(), feature);
}

bool UseCounter::IsCounted(Document& document, WebFeature feature) {
  Page* page = document.GetPage();
  if (!page)
    return false;
  return page->GetUseCounter().HasRecordedMeasurement(feature);
}

bool UseCounter::IsCounted(CSSPropertyID unresolved_property) {
  return css_recorded_.QuickGet(unresolved_property);
}

void UseCounter::AddObserver(Observer* observer) {
  DCHECK(!observers_.Contains(observer));
  observers_.insert(observer);
}

bool UseCounter::IsCounted(Document& document, const String& string) {
  Page* page = document.GetPage();
  if (!page)
    return false;

  CSSPropertyID unresolved_property = unresolvedCSSPropertyID(string);
  if (unresolved_property == CSSPropertyInvalid)
    return false;
  return page->GetUseCounter().IsCounted(unresolved_property);
}

void UseCounter::Count(ExecutionContext* context, WebFeature feature) {
  if (!context)
    return;
  if (context->IsDocument()) {
    Count(*ToDocument(context), feature);
    return;
  }
  if (context->IsWorkerOrWorkletGlobalScope()) {
    ToWorkerOrWorkletGlobalScope(context)->CountFeature(feature);
  }
}

void UseCounter::CountCrossOriginIframe(const Document& document,
                                        WebFeature feature) {
  LocalFrame* frame = document.GetFrame();
  if (frame && frame->IsCrossOriginSubframe())
    Count(frame, feature);
}

void UseCounter::Count(CSSParserMode css_parser_mode,
                       CSSPropertyID property,
                       const LocalFrame* source_frame) {
  DCHECK(isCSSPropertyIDWithName(property) || property == CSSPropertyVariable);

  if (!IsUseCounterEnabledForMode(css_parser_mode) || mute_count_)
    return;

  if (!css_recorded_.QuickGet(property)) {
    // Note that HTTPArchive tooling looks specifically for this event - see
    // https://github.com/HTTPArchive/httparchive/issues/59
    int sample_id = MapCSSPropertyIdToCSSSampleIdForHistogram(property);
    if (context_ != kDisabledContext && context_ != kExtensionContext) {
      TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"),
                   "CSSFirstUsed", "feature", sample_id);
      if (source_frame && source_frame->Client())
        source_frame->Client()->DidObserveNewCssPropertyUsage(sample_id, false);
    }
    css_recorded_.QuickSet(property);
  }
}

void UseCounter::Count(WebFeature feature, const LocalFrame* source_frame) {
  RecordMeasurement(feature, *source_frame);
}

bool UseCounter::IsCountedAnimatedCSS(CSSPropertyID unresolved_property) {
  return animated_css_recorded_.QuickGet(unresolved_property);
}

bool UseCounter::IsCountedAnimatedCSS(Document& document,
                                      const String& string) {
  Page* page = document.GetPage();
  if (!page)
    return false;

  CSSPropertyID unresolved_property = unresolvedCSSPropertyID(string);
  if (unresolved_property == CSSPropertyInvalid)
    return false;
  return page->GetUseCounter().IsCountedAnimatedCSS(unresolved_property);
}

void UseCounter::CountAnimatedCSS(const Document& document,
                                  CSSPropertyID property) {
  Page* page = document.GetPage();
  if (!page)
    return;

  page->GetUseCounter().CountAnimatedCSS(property, document.GetFrame());
}

void UseCounter::CountAnimatedCSS(CSSPropertyID property,
                                  const LocalFrame* source_frame) {
  DCHECK(isCSSPropertyIDWithName(property) || property == CSSPropertyVariable);

  if (mute_count_)
    return;

  if (!animated_css_recorded_.QuickGet(property)) {
    int sample_id = MapCSSPropertyIdToCSSSampleIdForHistogram(property);
    if (context_ != kDisabledContext && context_ != kExtensionContext) {
      TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("blink.feature_usage"),
                   "AnimatedCSSFirstUsed", "feature", sample_id);
      if (source_frame && source_frame->Client())
        source_frame->Client()->DidObserveNewCssPropertyUsage(sample_id, true);
    }
    animated_css_recorded_.QuickSet(property);
  }
}

void UseCounter::NotifyFeatureCounted(WebFeature feature) {
  DCHECK(!mute_count_);
  DCHECK_NE(kDisabledContext, context_);
  HeapHashSet<Member<Observer>> to_be_removed;
  for (auto observer : observers_) {
    if (observer->OnCountFeature(feature))
      to_be_removed.insert(observer);
  }
  observers_.RemoveAll(to_be_removed);
}

EnumerationHistogram& UseCounter::FeaturesHistogram() const {
  DCHECK_NE(kDisabledContext, context_);
  // The default features histogram is being recorded on the browser side.
  DCHECK_NE(kDefaultContext, context_);
  // Every SVGImage has it's own Page instance, and multiple web pages can
  // share the usage of a single SVGImage.  Ideally perhaps we'd delegate
  // metrics from an SVGImage to one of the Page's it's displayed in, but
  // that's tricky (SVGImage is intentionally isolated, and the Page that
  // created it may not even exist anymore).
  // So instead we just use a dedicated histogram for the SVG case.
  DEFINE_STATIC_LOCAL(blink::EnumerationHistogram, svg_histogram,
                      ("Blink.UseCounter.SVGImage.Features",
                       static_cast<int32_t>(WebFeature::kNumberOfFeatures)));
  DEFINE_STATIC_LOCAL(blink::EnumerationHistogram, extension_histogram,
                      ("Blink.UseCounter.Extensions.Features",
                       static_cast<int32_t>(WebFeature::kNumberOfFeatures)));
  // Track what features/properties have been reported to the browser side
  // histogram.
  return context_ == kSVGImageContext ? svg_histogram : extension_histogram;
}

EnumerationHistogram& UseCounter::CssHistogram() const {
  DCHECK_EQ(kSVGImageContext, context_);
  DEFINE_STATIC_LOCAL(blink::EnumerationHistogram, svg_histogram,
                      ("Blink.UseCounter.SVGImage.CSSProperties",
                       mojom::blink::kMaximumCSSSampleId));

  return svg_histogram;
}

EnumerationHistogram& UseCounter::AnimatedCSSHistogram() const {
  DCHECK_EQ(kSVGImageContext, context_);
  DEFINE_STATIC_LOCAL(blink::EnumerationHistogram, svg_histogram,
                      ("Blink.UseCounter.SVGImage.AnimatedCSSProperties",
                       mojom::blink::kMaximumCSSSampleId));

  return svg_histogram;
}

}  // namespace blink
