blob: 8e65609f65e41de83e72a10607d5b498947a6ca7 [file] [log] [blame]
* 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.
#include "core/frame/UseCounter.h"
#include "core/css/CSSStyleSheet.h"
#include "core/css/StyleSheetContents.h"
#include "core/dom/Document.h"
#include "core/dom/ExecutionContext.h"
#include "core/frame/FrameConsole.h"
#include "core/frame/FrameHost.h"
#include "core/frame/LocalFrame.h"
#include "core/inspector/ConsoleMessage.h"
#include "core/workers/WorkerGlobalScope.h"
#include "public/platform/Platform.h"
namespace blink {
static int totalPagesMeasuredCSSSampleId() { return 1; }
int UseCounter::m_muteCount = 0;
// FIXME : This mapping should be autogenerated. This function should
// be moved to a separate file and a script run at build time
// to detect new values in CSSPropertyID and add them to the
// end of this function. This file would be checked in.
int UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(int id)
CSSPropertyID cssPropertyID = static_cast<CSSPropertyID>(id);
switch (cssPropertyID) {
// 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 CSSPropertyWebkitClipPath: 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 CSSPropertyWordWrap: 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 CSSPropertyWebkitBackgroundClip: return 178;
case CSSPropertyWebkitBackgroundComposite: return 179;
case CSSPropertyWebkitBackgroundOrigin: return 180;
case CSSPropertyAliasWebkitBackgroundSize: return 181;
case CSSPropertyWebkitBorderAfter: return 182;
case CSSPropertyWebkitBorderAfterColor: return 183;
case CSSPropertyWebkitBorderAfterStyle: return 184;
case CSSPropertyWebkitBorderAfterWidth: return 185;
case CSSPropertyWebkitBorderBefore: return 186;
case CSSPropertyWebkitBorderBeforeColor: return 187;
case CSSPropertyWebkitBorderBeforeStyle: return 188;
case CSSPropertyWebkitBorderBeforeWidth: return 189;
case CSSPropertyWebkitBorderEnd: return 190;
case CSSPropertyWebkitBorderEndColor: return 191;
case CSSPropertyWebkitBorderEndStyle: return 192;
case CSSPropertyWebkitBorderEndWidth: return 193;
// CSSPropertyWebkitBorderFit was 194
case CSSPropertyWebkitBorderHorizontalSpacing: return 195;
case CSSPropertyWebkitBorderImage: return 196;
case CSSPropertyAliasWebkitBorderRadius: return 197;
case CSSPropertyWebkitBorderStart: return 198;
case CSSPropertyWebkitBorderStartColor: return 199;
case CSSPropertyWebkitBorderStartStyle: return 200;
case CSSPropertyWebkitBorderStartWidth: return 201;
case CSSPropertyWebkitBorderVerticalSpacing: return 202;
case CSSPropertyWebkitBoxAlign: return 203;
case CSSPropertyWebkitBoxDirection: return 204;
case CSSPropertyWebkitBoxFlex: return 205;
case CSSPropertyWebkitBoxFlexGroup: return 206;
case CSSPropertyWebkitBoxLines: return 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 CSSPropertyWebkitColumnCount: return 218;
case CSSPropertyWebkitColumnGap: return 219;
// CSSPropertyWebkitColumnProgression was 220
case CSSPropertyWebkitColumnRule: return 221;
case CSSPropertyWebkitColumnRuleColor: return 222;
case CSSPropertyWebkitColumnRuleStyle: return 223;
case CSSPropertyWebkitColumnRuleWidth: return 224;
case CSSPropertyWebkitColumnSpan: return 225;
case CSSPropertyWebkitColumnWidth: return 226;
case CSSPropertyWebkitColumns: 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 CSSPropertyWebkitMarginAfter: return 270;
case CSSPropertyWebkitMarginBefore: return 271;
case CSSPropertyWebkitMarginEnd: return 272;
case CSSPropertyWebkitMarginStart: 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 CSSPropertyWebkitPaddingAfter: return 304;
case CSSPropertyWebkitPaddingBefore: return 305;
case CSSPropertyWebkitPaddingEnd: return 306;
case CSSPropertyWebkitPaddingStart: 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 CSSPropertyWebkitUserSelect: 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;
case CSSPropertyWebkitBlendMode: return 399;
case CSSPropertyWebkitBackgroundBlendMode: return 400;
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 CSSPropertyWebkitFilter: 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;
case CSSPropertyMotionPath: return 457;
case CSSPropertyMotionOffset: return 458;
case CSSPropertyMotionRotation: return 459;
case CSSPropertyMotion: return 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;
case CSSPropertyScrollSnapPointsX: return 500;
case CSSPropertyScrollSnapPointsY: return 501;
case CSSPropertyScrollSnapCoordinate: return 502;
case CSSPropertyScrollSnapDestination: return 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;
// 1. Add new features above this line (don't change the assigned numbers of the existing
// items).
// 2. Update maximumCSSSampleId() with the new maximum value.
// 3. Run the script in
// chromium/src/tools/metrics/histograms to update the UMA histogram names.
case CSSPropertyInvalid:
return 0;
return 0;
static int maximumCSSSampleId() { return 518; }
void UseCounter::muteForInspector()
void UseCounter::unmuteForInspector()
m_CSSFeatureBits.ensureSize(lastUnresolvedCSSProperty + 1);
// We always log PageDestruction so that we have a scale for the rest of the features.
Platform::current()->histogramEnumeration("WebCore.FeatureObserver", PageDestruction, NumberOfFeatures);
void UseCounter::CountBits::updateMeasurements()
for (unsigned i = 0; i < NumberOfFeatures; ++i) {
if (m_bits.quickGet(i))
Platform::current()->histogramEnumeration("WebCore.FeatureObserver", i, NumberOfFeatures);
// Clearing count bits is timing sensitive.
void UseCounter::updateMeasurements()
Platform::current()->histogramEnumeration("WebCore.FeatureObserver", PageVisits, NumberOfFeatures);
// FIXME: Sometimes this function is called more than once per page. The following
// bool guards against incrementing the page count when there are no CSS
// bits set.
bool needsPagesMeasuredUpdate = false;
for (int i = firstCSSProperty; i <= lastUnresolvedCSSProperty; ++i) {
if (m_CSSFeatureBits.quickGet(i)) {
int cssSampleId = mapCSSPropertyIdToCSSSampleIdForHistogram(i);
Platform::current()->histogramEnumeration("WebCore.FeatureObserver.CSSProperties", cssSampleId, maximumCSSSampleId());
needsPagesMeasuredUpdate = true;
if (needsPagesMeasuredUpdate)
Platform::current()->histogramEnumeration("WebCore.FeatureObserver.CSSProperties", totalPagesMeasuredCSSSampleId(), maximumCSSSampleId());
void UseCounter::didCommitLoad()
void UseCounter::count(const Frame* frame, Feature feature)
if (!frame)
FrameHost* host = frame->host();
if (!host)
void UseCounter::count(const Document& document, Feature feature)
count(document.frame(), feature);
bool UseCounter::isCounted(Document& document, Feature feature)
Frame* frame = document.frame();
if (!frame)
return false;
FrameHost* host = frame->host();
if (!host)
return false;
return host->useCounter().hasRecordedMeasurement(feature);
void UseCounter::count(const ExecutionContext* context, Feature feature)
if (!context)
if (context->isDocument()) {
count(*toDocument(context), feature);
if (context->isWorkerGlobalScope())
void UseCounter::countIfNotPrivateScript(v8::Isolate* isolate, const Frame* frame, Feature feature)
if (DOMWrapperWorld::current(isolate).isPrivateScriptIsolatedWorld())
UseCounter::count(frame, feature);
void UseCounter::countIfNotPrivateScript(v8::Isolate* isolate, const Document& document, Feature feature)
if (DOMWrapperWorld::current(isolate).isPrivateScriptIsolatedWorld())
UseCounter::count(document, feature);
void UseCounter::countIfNotPrivateScript(v8::Isolate* isolate, const ExecutionContext* context, Feature feature)
if (DOMWrapperWorld::current(isolate).isPrivateScriptIsolatedWorld())
UseCounter::count(context, feature);
void UseCounter::countDeprecation(const LocalFrame* frame, Feature feature)
if (!frame)
FrameHost* host = frame->host();
if (!host)
if (!host->useCounter().hasRecordedMeasurement(feature)) {
frame->console().addMessage(ConsoleMessage::create(DeprecationMessageSource, WarningMessageLevel, deprecationMessage(feature)));
void UseCounter::countDeprecation(ExecutionContext* context, Feature feature)
if (!context)
if (context->isDocument()) {
UseCounter::countDeprecation(*toDocument(context), feature);
if (context->isWorkerGlobalScope())
void UseCounter::countDeprecation(const Document& document, Feature feature)
UseCounter::countDeprecation(document.frame(), feature);
void UseCounter::countDeprecationIfNotPrivateScript(v8::Isolate* isolate, ExecutionContext* context, Feature feature)
if (DOMWrapperWorld::current(isolate).isPrivateScriptIsolatedWorld())
UseCounter::countDeprecation(context, feature);
static const char* milestoneString(int milestone)
switch (milestone) {
case 50:
return "M50, around April 2016";
case 53:
return "M53, around September 2016";
return nullptr;
static String replacedBy(const char* feature, const char* replacement)
return String::format("%s is deprecated. Please use %s instead.", feature, replacement);
static String willBeRemoved(const char* feature, int milestone, const char* details)
return String::format("%s is deprecated and will be removed in %s. See for more details.", feature, milestoneString(milestone), details);
static String replacedWillBeRemoved(const char* feature, const char* replacement, int milestone, const char* details)
return String::format("%s is deprecated and will be removed in %s. Please use %s instead. See for more details.", feature, milestoneString(milestone), replacement, details);
String UseCounter::deprecationMessage(Feature feature)
switch (feature) {
// Quota
case PrefixedStorageInfo:
return replacedBy("'window.webkitStorageInfo'", "'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage'");
// Keyboard Event (DOM Level 3)
case KeyboardEventKeyLocation:
return replacedWillBeRemoved("'KeyboardEvent.keyLocation'", "'KeyboardEvent.location'", 50, "4997403308457984");
case ConsoleMarkTimeline:
return replacedBy("'console.markTimeline'", "'console.timeStamp'");
case FileError:
return "FileError is deprecated. Please use the 'name' or 'message' attributes of DOMError rather than 'code'.";
case CSSStyleSheetInsertRuleOptionalArg:
return "Calling CSSStyleSheet.insertRule() with one argument is deprecated. Please pass the index argument as well: insertRule(x, 0).";
case PrefixedVideoSupportsFullscreen:
return replacedBy("'HTMLVideoElement.webkitSupportsFullscreen'", "'Document.fullscreenEnabled'");
case PrefixedVideoDisplayingFullscreen:
return replacedBy("'HTMLVideoElement.webkitDisplayingFullscreen'", "'Document.fullscreenElement'");
case PrefixedVideoEnterFullscreen:
return replacedBy("'HTMLVideoElement.webkitEnterFullscreen()'", "'Element.requestFullscreen()'");
case PrefixedVideoExitFullscreen:
return replacedBy("'HTMLVideoElement.webkitExitFullscreen()'", "'Document.exitFullscreen()'");
case PrefixedVideoEnterFullScreen:
return replacedBy("'HTMLVideoElement.webkitEnterFullScreen()'", "'Element.requestFullscreen()'");
case PrefixedVideoExitFullScreen:
return replacedBy("'HTMLVideoElement.webkitExitFullScreen()'", "'Document.exitFullscreen()'");
case PrefixedIndexedDB:
return replacedBy("'webkitIndexedDB'", "'indexedDB'");
case PrefixedIDBCursorConstructor:
return replacedBy("'webkitIDBCursor'", "'IDBCursor'");
case PrefixedIDBDatabaseConstructor:
return replacedBy("'webkitIDBDatabase'", "'IDBDatabase'");
case PrefixedIDBFactoryConstructor:
return replacedBy("'webkitIDBFactory'", "'IDBFactory'");
case PrefixedIDBIndexConstructor:
return replacedBy("'webkitIDBIndex'", "'IDBIndex'");
case PrefixedIDBKeyRangeConstructor:
return replacedBy("'webkitIDBKeyRange'", "'IDBKeyRange'");
case PrefixedIDBObjectStoreConstructor:
return replacedBy("'webkitIDBObjectStore'", "'IDBObjectStore'");
case PrefixedIDBRequestConstructor:
return replacedBy("'webkitIDBRequest'", "'IDBRequest'");
case PrefixedIDBTransactionConstructor:
return replacedBy("'webkitIDBTransaction'", "'IDBTransaction'");
case PrefixedRequestAnimationFrame:
return "'webkitRequestAnimationFrame' is vendor-specific. Please use the standard 'requestAnimationFrame' instead.";
case PrefixedCancelAnimationFrame:
return "'webkitCancelAnimationFrame' is vendor-specific. Please use the standard 'cancelAnimationFrame' instead.";
case PrefixedCancelRequestAnimationFrame:
return "'webkitCancelRequestAnimationFrame' is vendor-specific. Please use the standard 'cancelAnimationFrame' instead.";
case SyncXHRWithCredentials:
return "Setting 'XMLHttpRequest.withCredentials' for synchronous requests is deprecated.";
case PictureSourceSrc:
return "<source src> with a <picture> parent is invalid and therefore ignored. Please use <source srcset> instead.";
case XHRProgressEventPosition:
return replacedWillBeRemoved("The XMLHttpRequest progress event property 'position'", "'loaded'", 50, "5044837464145920");
case XHRProgressEventTotalSize:
return replacedWillBeRemoved("The XMLHttpRequest progress event property 'totalSize'", "'total'", 50, "5044837464145920");
case ConsoleTimeline:
return replacedBy("'console.timeline'", "'console.time'");
case ConsoleTimelineEnd:
return replacedBy("'console.timelineEnd'", "'console.timeEnd'");
case XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload:
return "Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience. For more help, check";
case GetMatchedCSSRules:
return "'getMatchedCSSRules()' is deprecated. For more help, check";
case PrefixedImageSmoothingEnabled:
return replacedBy("'CanvasRenderingContext2D.webkitImageSmoothingEnabled'", "'CanvasRenderingContext2D.imageSmoothingEnabled'");
case AudioListenerDopplerFactor:
return "dopplerFactor is deprecated and will be removed in M45 when all doppler effects are removed";
case AudioListenerSpeedOfSound:
return "speedOfSound is deprecated and will be removed in M45 when all doppler effects are removed";
case AudioListenerSetVelocity:
return "setVelocity() is deprecated and will be removed in M45 when all doppler effects are removed";
case PrefixedWindowURL:
return replacedBy("'webkitURL'", "'URL'");
case PrefixedAudioContext:
return replacedBy("'webkitAudioContext'", "'AudioContext'");
case PrefixedOfflineAudioContext:
return replacedBy("'webkitOfflineAudioContext'", "'OfflineAudioContext'");
case RangeExpand:
return replacedBy("'Range.expand()'", "'Selection.modify()'");
case PrefixedMediaAddKey:
case PrefixedMediaGenerateKeyRequest:
case PrefixedMediaCancelKeyRequest:
return "The prefixed Encrypted Media Extensions APIs are deprecated. Please use 'navigator.requestMediaKeySystemAccess()' instead.";
case CanPlayTypeKeySystem:
return replacedBy("canPlayType()'s 'keySystem' parameter", "'navigator.requestMediaKeySystemAccess()'");
// Powerful features on insecure origins (
case DeviceMotionInsecureOrigin:
return "The devicemotion event is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See for more details.";
case DeviceOrientationInsecureOrigin:
return "The deviceorientation event is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See for more details.";
case DeviceOrientationAbsoluteInsecureOrigin:
return "The deviceorientationabsolute event is deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See for more details.";
case GeolocationInsecureOrigin:
return "getCurrentPosition() and watchPosition() are deprecated on insecure origins, and support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See for more details.";
case GetUserMediaInsecureOrigin:
return "getUserMedia() no longer works on insecure origins. To use this feature, you should consider switching your application to a secure origin, such as HTTPS. See for more details.";
case EncryptedMediaInsecureOrigin:
return "requestMediaKeySystemAccess() is deprecated on insecure origins in the specification. Support will be removed in the future. You should consider switching your application to a secure origin, such as HTTPS. See for more details.";
case ElementCreateShadowRootMultiple:
return "Calling Element.createShadowRoot() for an element which already hosts a shadow root is deprecated. See for more details.";
case ElementCreateShadowRootMultipleWithUserAgentShadowRoot:
return "Calling Element.createShadowRoot() for an element which already hosts a user-agent shadow root is deprecated. See for more details.";
case CSSDeepCombinator:
return "/deep/ combinator is deprecated. See for more details.";
case CSSSelectorPseudoShadow:
return "::shadow pseudo-element is deprecated. See for more details.";
case PrefixedMouseEventMovementX:
return replacedBy("'webkitMovementX'", "'movementX'");
case PrefixedMouseEventMovementY:
return replacedBy("'webkitMovementY'", "'movementY'");
case SVGSMILElementInDocument:
case SVGSMILAnimationInImageRegardlessOfCache:
return "SVG's SMIL animations (<animate>, <set>, etc.) are deprecated and will be removed. Please use CSS animations or Web animations instead.";
case PrefixedPerformanceClearResourceTimings:
return replacedBy("'Performance.webkitClearResourceTimings'", "'Performance.clearResourceTimings'");
case PrefixedPerformanceSetResourceTimingBufferSize:
return replacedBy("'Performance.webkitSetResourceTimingBufferSize'", "'Performance.setResourceTimingBufferSize'");
case PrefixedPerformanceResourceTimingBufferFull:
return replacedBy("'Performance.onwebkitresourcetimingbufferfull'", "'Performance.onresourcetimingbufferfull'");
case BluetoothDeviceInstanceId:
return replacedBy("'BluetoothDevice.instanceID'", "''");
case V8SVGElement_OffsetParent_AttributeGetter:
return willBeRemoved("'SVGElement.offsetParent'", 50, "5724912467574784");
case V8SVGElement_OffsetTop_AttributeGetter:
return willBeRemoved("'SVGElement.offsetTop'", 50, "5724912467574784");
case V8SVGElement_OffsetLeft_AttributeGetter:
return willBeRemoved("'SVGElement.offsetLeft'", 50, "5724912467574784");
case V8SVGElement_OffsetWidth_AttributeGetter:
return willBeRemoved("'SVGElement.offsetWidth'", 50, "5724912467574784");
case V8SVGElement_OffsetHeight_AttributeGetter:
return willBeRemoved("'SVGElement.offsetHeight'", 50, "5724912467574784");
case MediaStreamTrackGetSources:
return "MediaStreamTrack.getSources is deprecated. See for more details.";
case CSSXGetComputedStyleQueries:
return replacedWillBeRemoved("'getComputedStyle(e).cssXx' (except .cssFloat)", "'getComputedStyle(e).xx'", 50, "5006796888473600");
case DocumentDefaultCharset:
return willBeRemoved("'Document.defaultCharset'", 50, "6217124578066432");
case V8TouchEvent_InitTouchEvent_Method:
return replacedWillBeRemoved("'TouchEvent.initTouchEvent'", "the TouchEvent constructor", 53, "5730982598541312");
case RTCPeerConnectionCreateAnswerLegacyNoFailureCallback:
return "RTCPeerConnection.CreateAnswer without a failure callback is deprecated. The failure callback will be a required parameter in M50. See for more details";
case RTCPeerConnectionCreateOfferLegacyNoFailureCallback:
return "RTCPeerConnection.CreateOffer without a failure callback is deprecated. The failure callback will be a required parameter in M50. See for more details";
case ObjectObserve:
return willBeRemoved("'Object.observe'", 50, "6147094632988672");
// Features that aren't deprecated don't have a deprecation message.
return String();
void UseCounter::count(CSSParserMode cssParserMode, CSSPropertyID feature)
ASSERT(feature >= firstCSSProperty);
ASSERT(feature <= lastUnresolvedCSSProperty);
if (!isUseCounterEnabledForMode(cssParserMode))
void UseCounter::count(Feature feature)
UseCounter* UseCounter::getFrom(const Document* document)
if (document && document->frameHost())
return &document->frameHost()->useCounter();
return 0;
UseCounter* UseCounter::getFrom(const CSSStyleSheet* sheet)
if (sheet)
return getFrom(sheet->contents());
return 0;
UseCounter* UseCounter::getFrom(const StyleSheetContents* sheetContents)
// FIXME: We may want to handle stylesheets that have multiple owners
if (sheetContents && sheetContents->hasSingleOwnerNode())
return getFrom(sheetContents->singleOwnerDocument());
return 0;
} // namespace blink