• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  * Copyright (C) 2012 Google, Inc. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 #include "config.h"
28 #include "core/frame/UseCounter.h"
29 
30 #include "core/css/CSSStyleSheet.h"
31 #include "core/css/StyleSheetContents.h"
32 #include "core/dom/Document.h"
33 #include "core/dom/ExecutionContext.h"
34 #include "core/frame/LocalDOMWindow.h"
35 #include "core/frame/FrameConsole.h"
36 #include "core/frame/FrameHost.h"
37 #include "core/frame/LocalFrame.h"
38 #include "core/inspector/ConsoleMessage.h"
39 #include "core/workers/WorkerGlobalScope.h"
40 #include "public/platform/Platform.h"
41 
42 namespace blink {
43 
totalPagesMeasuredCSSSampleId()44 static int totalPagesMeasuredCSSSampleId() { return 1; }
45 
46 int UseCounter::m_muteCount = 0;
47 
48 // FIXME : This mapping should be autogenerated. This function should
49 //         be moved to a separate file and a script run at build time
50 //         to detect new values in CSSPropertyID and add them to the
51 //         end of this function. This file would be checked in.
52 //         https://code.google.com/p/chromium/issues/detail?id=234940
mapCSSPropertyIdToCSSSampleIdForHistogram(int id)53 int UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(int id)
54 {
55     CSSPropertyID cssPropertyID = convertToCSSPropertyID(id);
56 
57     switch (cssPropertyID) {
58     // Begin at 2, because 1 is reserved for totalPagesMeasuredCSSSampleId.
59     case CSSPropertyColor: return 2;
60     case CSSPropertyDirection: return 3;
61     case CSSPropertyDisplay: return 4;
62     case CSSPropertyFont: return 5;
63     case CSSPropertyFontFamily: return 6;
64     case CSSPropertyFontSize: return 7;
65     case CSSPropertyFontStyle: return 8;
66     case CSSPropertyFontVariant: return 9;
67     case CSSPropertyFontWeight: return 10;
68     case CSSPropertyTextRendering: return 11;
69     case CSSPropertyWebkitFontFeatureSettings: return 12;
70     case CSSPropertyFontKerning: return 13;
71     case CSSPropertyWebkitFontSmoothing: return 14;
72     case CSSPropertyFontVariantLigatures: return 15;
73     case CSSPropertyWebkitLocale: return 16;
74     case CSSPropertyWebkitTextOrientation: return 17;
75     case CSSPropertyWebkitWritingMode: return 18;
76     case CSSPropertyZoom: return 19;
77     case CSSPropertyLineHeight: return 20;
78     case CSSPropertyBackground: return 21;
79     case CSSPropertyBackgroundAttachment: return 22;
80     case CSSPropertyBackgroundClip: return 23;
81     case CSSPropertyBackgroundColor: return 24;
82     case CSSPropertyBackgroundImage: return 25;
83     case CSSPropertyBackgroundOrigin: return 26;
84     case CSSPropertyBackgroundPosition: return 27;
85     case CSSPropertyBackgroundPositionX: return 28;
86     case CSSPropertyBackgroundPositionY: return 29;
87     case CSSPropertyBackgroundRepeat: return 30;
88     case CSSPropertyBackgroundRepeatX: return 31;
89     case CSSPropertyBackgroundRepeatY: return 32;
90     case CSSPropertyBackgroundSize: return 33;
91     case CSSPropertyBorder: return 34;
92     case CSSPropertyBorderBottom: return 35;
93     case CSSPropertyBorderBottomColor: return 36;
94     case CSSPropertyBorderBottomLeftRadius: return 37;
95     case CSSPropertyBorderBottomRightRadius: return 38;
96     case CSSPropertyBorderBottomStyle: return 39;
97     case CSSPropertyBorderBottomWidth: return 40;
98     case CSSPropertyBorderCollapse: return 41;
99     case CSSPropertyBorderColor: return 42;
100     case CSSPropertyBorderImage: return 43;
101     case CSSPropertyBorderImageOutset: return 44;
102     case CSSPropertyBorderImageRepeat: return 45;
103     case CSSPropertyBorderImageSlice: return 46;
104     case CSSPropertyBorderImageSource: return 47;
105     case CSSPropertyBorderImageWidth: return 48;
106     case CSSPropertyBorderLeft: return 49;
107     case CSSPropertyBorderLeftColor: return 50;
108     case CSSPropertyBorderLeftStyle: return 51;
109     case CSSPropertyBorderLeftWidth: return 52;
110     case CSSPropertyBorderRadius: return 53;
111     case CSSPropertyBorderRight: return 54;
112     case CSSPropertyBorderRightColor: return 55;
113     case CSSPropertyBorderRightStyle: return 56;
114     case CSSPropertyBorderRightWidth: return 57;
115     case CSSPropertyBorderSpacing: return 58;
116     case CSSPropertyBorderStyle: return 59;
117     case CSSPropertyBorderTop: return 60;
118     case CSSPropertyBorderTopColor: return 61;
119     case CSSPropertyBorderTopLeftRadius: return 62;
120     case CSSPropertyBorderTopRightRadius: return 63;
121     case CSSPropertyBorderTopStyle: return 64;
122     case CSSPropertyBorderTopWidth: return 65;
123     case CSSPropertyBorderWidth: return 66;
124     case CSSPropertyBottom: return 67;
125     case CSSPropertyBoxShadow: return 68;
126     case CSSPropertyBoxSizing: return 69;
127     case CSSPropertyCaptionSide: return 70;
128     case CSSPropertyClear: return 71;
129     case CSSPropertyClip: return 72;
130     case CSSPropertyWebkitClipPath: return 73;
131     case CSSPropertyContent: return 74;
132     case CSSPropertyCounterIncrement: return 75;
133     case CSSPropertyCounterReset: return 76;
134     case CSSPropertyCursor: return 77;
135     case CSSPropertyEmptyCells: return 78;
136     case CSSPropertyFloat: return 79;
137     case CSSPropertyFontStretch: return 80;
138     case CSSPropertyHeight: return 81;
139     case CSSPropertyImageRendering: return 82;
140     case CSSPropertyLeft: return 83;
141     case CSSPropertyLetterSpacing: return 84;
142     case CSSPropertyListStyle: return 85;
143     case CSSPropertyListStyleImage: return 86;
144     case CSSPropertyListStylePosition: return 87;
145     case CSSPropertyListStyleType: return 88;
146     case CSSPropertyMargin: return 89;
147     case CSSPropertyMarginBottom: return 90;
148     case CSSPropertyMarginLeft: return 91;
149     case CSSPropertyMarginRight: return 92;
150     case CSSPropertyMarginTop: return 93;
151     case CSSPropertyMaxHeight: return 94;
152     case CSSPropertyMaxWidth: return 95;
153     case CSSPropertyMinHeight: return 96;
154     case CSSPropertyMinWidth: return 97;
155     case CSSPropertyOpacity: return 98;
156     case CSSPropertyOrphans: return 99;
157     case CSSPropertyOutline: return 100;
158     case CSSPropertyOutlineColor: return 101;
159     case CSSPropertyOutlineOffset: return 102;
160     case CSSPropertyOutlineStyle: return 103;
161     case CSSPropertyOutlineWidth: return 104;
162     case CSSPropertyOverflow: return 105;
163     case CSSPropertyOverflowWrap: return 106;
164     case CSSPropertyOverflowX: return 107;
165     case CSSPropertyOverflowY: return 108;
166     case CSSPropertyPadding: return 109;
167     case CSSPropertyPaddingBottom: return 110;
168     case CSSPropertyPaddingLeft: return 111;
169     case CSSPropertyPaddingRight: return 112;
170     case CSSPropertyPaddingTop: return 113;
171     case CSSPropertyPage: return 114;
172     case CSSPropertyPageBreakAfter: return 115;
173     case CSSPropertyPageBreakBefore: return 116;
174     case CSSPropertyPageBreakInside: return 117;
175     case CSSPropertyPointerEvents: return 118;
176     case CSSPropertyPosition: return 119;
177     case CSSPropertyQuotes: return 120;
178     case CSSPropertyResize: return 121;
179     case CSSPropertyRight: return 122;
180     case CSSPropertySize: return 123;
181     case CSSPropertySrc: return 124;
182     case CSSPropertySpeak: return 125;
183     case CSSPropertyTableLayout: return 126;
184     case CSSPropertyTabSize: return 127;
185     case CSSPropertyTextAlign: return 128;
186     case CSSPropertyTextDecoration: return 129;
187     case CSSPropertyTextIndent: return 130;
188     /* Removed CSSPropertyTextLineThrough* - 131-135 */
189     case CSSPropertyTextOverflow: return 136;
190     /* Removed CSSPropertyTextOverline* - 137-141 */
191     case CSSPropertyTextShadow: return 142;
192     case CSSPropertyTextTransform: return 143;
193     /* Removed CSSPropertyTextUnderline* - 144-148 */
194     case CSSPropertyTop: return 149;
195     case CSSPropertyTransition: return 150;
196     case CSSPropertyTransitionDelay: return 151;
197     case CSSPropertyTransitionDuration: return 152;
198     case CSSPropertyTransitionProperty: return 153;
199     case CSSPropertyTransitionTimingFunction: return 154;
200     case CSSPropertyUnicodeBidi: return 155;
201     case CSSPropertyUnicodeRange: return 156;
202     case CSSPropertyVerticalAlign: return 157;
203     case CSSPropertyVisibility: return 158;
204     case CSSPropertyWhiteSpace: return 159;
205     case CSSPropertyWidows: return 160;
206     case CSSPropertyWidth: return 161;
207     case CSSPropertyWordBreak: return 162;
208     case CSSPropertyWordSpacing: return 163;
209     case CSSPropertyWordWrap: return 164;
210     case CSSPropertyZIndex: return 165;
211     case CSSPropertyWebkitAnimation: return 166;
212     case CSSPropertyWebkitAnimationDelay: return 167;
213     case CSSPropertyWebkitAnimationDirection: return 168;
214     case CSSPropertyWebkitAnimationDuration: return 169;
215     case CSSPropertyWebkitAnimationFillMode: return 170;
216     case CSSPropertyWebkitAnimationIterationCount: return 171;
217     case CSSPropertyWebkitAnimationName: return 172;
218     case CSSPropertyWebkitAnimationPlayState: return 173;
219     case CSSPropertyWebkitAnimationTimingFunction: return 174;
220     case CSSPropertyWebkitAppearance: return 175;
221     case CSSPropertyWebkitAspectRatio: return 176;
222     case CSSPropertyWebkitBackfaceVisibility: return 177;
223     case CSSPropertyWebkitBackgroundClip: return 178;
224     case CSSPropertyWebkitBackgroundComposite: return 179;
225     case CSSPropertyWebkitBackgroundOrigin: return 180;
226     case CSSPropertyWebkitBackgroundSize: return 181;
227     case CSSPropertyWebkitBorderAfter: return 182;
228     case CSSPropertyWebkitBorderAfterColor: return 183;
229     case CSSPropertyWebkitBorderAfterStyle: return 184;
230     case CSSPropertyWebkitBorderAfterWidth: return 185;
231     case CSSPropertyWebkitBorderBefore: return 186;
232     case CSSPropertyWebkitBorderBeforeColor: return 187;
233     case CSSPropertyWebkitBorderBeforeStyle: return 188;
234     case CSSPropertyWebkitBorderBeforeWidth: return 189;
235     case CSSPropertyWebkitBorderEnd: return 190;
236     case CSSPropertyWebkitBorderEndColor: return 191;
237     case CSSPropertyWebkitBorderEndStyle: return 192;
238     case CSSPropertyWebkitBorderEndWidth: return 193;
239     case CSSPropertyWebkitBorderFit: return 194;
240     case CSSPropertyWebkitBorderHorizontalSpacing: return 195;
241     case CSSPropertyWebkitBorderImage: return 196;
242     case CSSPropertyWebkitBorderRadius: return 197;
243     case CSSPropertyWebkitBorderStart: return 198;
244     case CSSPropertyWebkitBorderStartColor: return 199;
245     case CSSPropertyWebkitBorderStartStyle: return 200;
246     case CSSPropertyWebkitBorderStartWidth: return 201;
247     case CSSPropertyWebkitBorderVerticalSpacing: return 202;
248     case CSSPropertyWebkitBoxAlign: return 203;
249     case CSSPropertyWebkitBoxDirection: return 204;
250     case CSSPropertyWebkitBoxFlex: return 205;
251     case CSSPropertyWebkitBoxFlexGroup: return 206;
252     case CSSPropertyWebkitBoxLines: return 207;
253     case CSSPropertyWebkitBoxOrdinalGroup: return 208;
254     case CSSPropertyWebkitBoxOrient: return 209;
255     case CSSPropertyWebkitBoxPack: return 210;
256     case CSSPropertyWebkitBoxReflect: return 211;
257     case CSSPropertyWebkitBoxShadow: return 212;
258     // CSSPropertyWebkitColumnAxis was 214
259     case CSSPropertyWebkitColumnBreakAfter: return 215;
260     case CSSPropertyWebkitColumnBreakBefore: return 216;
261     case CSSPropertyWebkitColumnBreakInside: return 217;
262     case CSSPropertyWebkitColumnCount: return 218;
263     case CSSPropertyWebkitColumnGap: return 219;
264     // CSSPropertyWebkitColumnProgression was 220
265     case CSSPropertyWebkitColumnRule: return 221;
266     case CSSPropertyWebkitColumnRuleColor: return 222;
267     case CSSPropertyWebkitColumnRuleStyle: return 223;
268     case CSSPropertyWebkitColumnRuleWidth: return 224;
269     case CSSPropertyWebkitColumnSpan: return 225;
270     case CSSPropertyWebkitColumnWidth: return 226;
271     case CSSPropertyWebkitColumns: return 227;
272 #if defined(ENABLE_CSS_BOX_DECORATION_BREAK) && ENABLE_CSS_BOX_DECORATION_BREAK
273     case CSSPropertyWebkitBoxDecorationBreak: return 228;
274 #endif
275 #if defined(ENABLE_CSS_FILTERS) && ENABLE_CSS_FILTERS
276     case CSSPropertyWebkitFilter: return 229;
277 #endif
278     case CSSPropertyAlignContent: return 230;
279     case CSSPropertyAlignItems: return 231;
280     case CSSPropertyAlignSelf: return 232;
281     case CSSPropertyFlex: return 233;
282     case CSSPropertyFlexBasis: return 234;
283     case CSSPropertyFlexDirection: return 235;
284     case CSSPropertyFlexFlow: return 236;
285     case CSSPropertyFlexGrow: return 237;
286     case CSSPropertyFlexShrink: return 238;
287     case CSSPropertyFlexWrap: return 239;
288     case CSSPropertyJustifyContent: return 240;
289     case CSSPropertyWebkitFontSizeDelta: return 241;
290     case CSSPropertyGridTemplateColumns: return 242;
291     case CSSPropertyGridTemplateRows: return 243;
292     case CSSPropertyGridColumnStart: return 244;
293     case CSSPropertyGridColumnEnd: return 245;
294     case CSSPropertyGridRowStart: return 246;
295     case CSSPropertyGridRowEnd: return 247;
296     case CSSPropertyGridColumn: return 248;
297     case CSSPropertyGridRow: return 249;
298     case CSSPropertyGridAutoFlow: return 250;
299     case CSSPropertyWebkitHighlight: return 251;
300     case CSSPropertyWebkitHyphenateCharacter: return 252;
301     case CSSPropertyWebkitLineBoxContain: return 257;
302     // case CSSPropertyWebkitLineAlign: return 258;
303     case CSSPropertyWebkitLineBreak: return 259;
304     case CSSPropertyWebkitLineClamp: return 260;
305     // case CSSPropertyWebkitLineGrid: return 261;
306     // case CSSPropertyWebkitLineSnap: return 262;
307     case CSSPropertyWebkitLogicalWidth: return 263;
308     case CSSPropertyWebkitLogicalHeight: return 264;
309     case CSSPropertyWebkitMarginAfterCollapse: return 265;
310     case CSSPropertyWebkitMarginBeforeCollapse: return 266;
311     case CSSPropertyWebkitMarginBottomCollapse: return 267;
312     case CSSPropertyWebkitMarginTopCollapse: return 268;
313     case CSSPropertyWebkitMarginCollapse: return 269;
314     case CSSPropertyWebkitMarginAfter: return 270;
315     case CSSPropertyWebkitMarginBefore: return 271;
316     case CSSPropertyWebkitMarginEnd: return 272;
317     case CSSPropertyWebkitMarginStart: return 273;
318     // CSSPropertyWebkitMarquee was 274.
319     // CSSPropertyInternalMarquee* were 275-279.
320     case CSSPropertyWebkitMask: return 280;
321     case CSSPropertyWebkitMaskBoxImage: return 281;
322     case CSSPropertyWebkitMaskBoxImageOutset: return 282;
323     case CSSPropertyWebkitMaskBoxImageRepeat: return 283;
324     case CSSPropertyWebkitMaskBoxImageSlice: return 284;
325     case CSSPropertyWebkitMaskBoxImageSource: return 285;
326     case CSSPropertyWebkitMaskBoxImageWidth: return 286;
327     case CSSPropertyWebkitMaskClip: return 287;
328     case CSSPropertyWebkitMaskComposite: return 288;
329     case CSSPropertyWebkitMaskImage: return 289;
330     case CSSPropertyWebkitMaskOrigin: return 290;
331     case CSSPropertyWebkitMaskPosition: return 291;
332     case CSSPropertyWebkitMaskPositionX: return 292;
333     case CSSPropertyWebkitMaskPositionY: return 293;
334     case CSSPropertyWebkitMaskRepeat: return 294;
335     case CSSPropertyWebkitMaskRepeatX: return 295;
336     case CSSPropertyWebkitMaskRepeatY: return 296;
337     case CSSPropertyWebkitMaskSize: return 297;
338     case CSSPropertyWebkitMaxLogicalWidth: return 298;
339     case CSSPropertyWebkitMaxLogicalHeight: return 299;
340     case CSSPropertyWebkitMinLogicalWidth: return 300;
341     case CSSPropertyWebkitMinLogicalHeight: return 301;
342     // WebkitNbspMode has been deleted, was return 302;
343     case CSSPropertyOrder: return 303;
344     case CSSPropertyWebkitPaddingAfter: return 304;
345     case CSSPropertyWebkitPaddingBefore: return 305;
346     case CSSPropertyWebkitPaddingEnd: return 306;
347     case CSSPropertyWebkitPaddingStart: return 307;
348     case CSSPropertyWebkitPerspective: return 308;
349     case CSSPropertyWebkitPerspectiveOrigin: return 309;
350     case CSSPropertyWebkitPerspectiveOriginX: return 310;
351     case CSSPropertyWebkitPerspectiveOriginY: return 311;
352     case CSSPropertyWebkitPrintColorAdjust: return 312;
353     case CSSPropertyWebkitRtlOrdering: return 313;
354     case CSSPropertyWebkitRubyPosition: return 314;
355     case CSSPropertyWebkitTextCombine: return 315;
356     case CSSPropertyWebkitTextDecorationsInEffect: return 316;
357     case CSSPropertyWebkitTextEmphasis: return 317;
358     case CSSPropertyWebkitTextEmphasisColor: return 318;
359     case CSSPropertyWebkitTextEmphasisPosition: return 319;
360     case CSSPropertyWebkitTextEmphasisStyle: return 320;
361     case CSSPropertyWebkitTextFillColor: return 321;
362     case CSSPropertyWebkitTextSecurity: return 322;
363     case CSSPropertyWebkitTextStroke: return 323;
364     case CSSPropertyWebkitTextStrokeColor: return 324;
365     case CSSPropertyWebkitTextStrokeWidth: return 325;
366     case CSSPropertyWebkitTransform: return 326;
367     case CSSPropertyWebkitTransformOrigin: return 327;
368     case CSSPropertyWebkitTransformOriginX: return 328;
369     case CSSPropertyWebkitTransformOriginY: return 329;
370     case CSSPropertyWebkitTransformOriginZ: return 330;
371     case CSSPropertyWebkitTransformStyle: return 331;
372     case CSSPropertyWebkitTransition: return 332;
373     case CSSPropertyWebkitTransitionDelay: return 333;
374     case CSSPropertyWebkitTransitionDuration: return 334;
375     case CSSPropertyWebkitTransitionProperty: return 335;
376     case CSSPropertyWebkitTransitionTimingFunction: return 336;
377     case CSSPropertyWebkitUserDrag: return 337;
378     case CSSPropertyWebkitUserModify: return 338;
379     case CSSPropertyWebkitUserSelect: return 339;
380     // case CSSPropertyWebkitFlowInto: return 340;
381     // case CSSPropertyWebkitFlowFrom: return 341;
382     // case CSSPropertyWebkitRegionFragment: return 342;
383     // case CSSPropertyWebkitRegionBreakAfter: return 343;
384     // case CSSPropertyWebkitRegionBreakBefore: return 344;
385     // case CSSPropertyWebkitRegionBreakInside: return 345;
386     // case CSSPropertyShapeInside: return 346;
387     case CSSPropertyShapeOutside: return 347;
388     case CSSPropertyShapeMargin: return 348;
389     // case CSSPropertyShapePadding: return 349;
390     // case CSSPropertyWebkitWrapFlow: return 350;
391     // case CSSPropertyWebkitWrapThrough: return 351;
392     // CSSPropertyWebkitWrap was 352.
393 #if defined(ENABLE_TOUCH_EVENTS) && ENABLE_TOUCH_EVENTS
394     case CSSPropertyWebkitTapHighlightColor: return 353;
395 #endif
396 #if defined(ENABLE_DRAGGABLE_REGION) && ENABLE_DRAGGABLE_REGION
397     case CSSPropertyWebkitAppRegion: return 354;
398 #endif
399     case CSSPropertyClipPath: return 355;
400     case CSSPropertyClipRule: return 356;
401     case CSSPropertyMask: return 357;
402     case CSSPropertyEnableBackground: return 358;
403     case CSSPropertyFilter: return 359;
404     case CSSPropertyFloodColor: return 360;
405     case CSSPropertyFloodOpacity: return 361;
406     case CSSPropertyLightingColor: return 362;
407     case CSSPropertyStopColor: return 363;
408     case CSSPropertyStopOpacity: return 364;
409     case CSSPropertyColorInterpolation: return 365;
410     case CSSPropertyColorInterpolationFilters: return 366;
411     // case CSSPropertyColorProfile: return 367;
412     case CSSPropertyColorRendering: return 368;
413     case CSSPropertyFill: return 369;
414     case CSSPropertyFillOpacity: return 370;
415     case CSSPropertyFillRule: return 371;
416     case CSSPropertyMarker: return 372;
417     case CSSPropertyMarkerEnd: return 373;
418     case CSSPropertyMarkerMid: return 374;
419     case CSSPropertyMarkerStart: return 375;
420     case CSSPropertyMaskType: return 376;
421     case CSSPropertyShapeRendering: return 377;
422     case CSSPropertyStroke: return 378;
423     case CSSPropertyStrokeDasharray: return 379;
424     case CSSPropertyStrokeDashoffset: return 380;
425     case CSSPropertyStrokeLinecap: return 381;
426     case CSSPropertyStrokeLinejoin: return 382;
427     case CSSPropertyStrokeMiterlimit: return 383;
428     case CSSPropertyStrokeOpacity: return 384;
429     case CSSPropertyStrokeWidth: return 385;
430     case CSSPropertyAlignmentBaseline: return 386;
431     case CSSPropertyBaselineShift: return 387;
432     case CSSPropertyDominantBaseline: return 388;
433     case CSSPropertyGlyphOrientationHorizontal: return 389;
434     case CSSPropertyGlyphOrientationVertical: return 390;
435     // CSSPropertyKerning has been removed, was return 391;
436     case CSSPropertyTextAnchor: return 392;
437     case CSSPropertyVectorEffect: return 393;
438     case CSSPropertyWritingMode: return 394;
439     // CSSPropertyWebkitSvgShadow has been removed, was return 395;
440     // CSSPropertyWebkitCursorVisibility has been removed, was return 396;
441     // CSSPropertyImageOrientation has been removed, was return 397;
442     // CSSPropertyImageResolution has been removed, was return 398;
443 #if defined(ENABLE_CSS_COMPOSITING) && ENABLE_CSS_COMPOSITING
444     case CSSPropertyWebkitBlendMode: return 399;
445     case CSSPropertyWebkitBackgroundBlendMode: return 400;
446 #endif
447     case CSSPropertyTextDecorationLine: return 401;
448     case CSSPropertyTextDecorationStyle: return 402;
449     case CSSPropertyTextDecorationColor: return 403;
450     case CSSPropertyTextAlignLast: return 404;
451     case CSSPropertyTextUnderlinePosition: return 405;
452     case CSSPropertyMaxZoom: return 406;
453     case CSSPropertyMinZoom: return 407;
454     case CSSPropertyOrientation: return 408;
455     case CSSPropertyUserZoom: return 409;
456     // CSSPropertyWebkitDashboardRegion was 410.
457     // CSSPropertyWebkitOverflowScrolling was 411.
458     case CSSPropertyWebkitAppRegion: return 412;
459     case CSSPropertyWebkitFilter: return 413;
460     case CSSPropertyWebkitBoxDecorationBreak: return 414;
461     case CSSPropertyWebkitTapHighlightColor: return 415;
462     case CSSPropertyBufferedRendering: return 416;
463     case CSSPropertyGridAutoRows: return 417;
464     case CSSPropertyGridAutoColumns: return 418;
465     case CSSPropertyBackgroundBlendMode: return 419;
466     case CSSPropertyMixBlendMode: return 420;
467     case CSSPropertyTouchAction: return 421;
468     case CSSPropertyGridArea: return 422;
469     case CSSPropertyGridTemplateAreas: return 423;
470     case CSSPropertyAnimation: return 424;
471     case CSSPropertyAnimationDelay: return 425;
472     case CSSPropertyAnimationDirection: return 426;
473     case CSSPropertyAnimationDuration: return 427;
474     case CSSPropertyAnimationFillMode: return 428;
475     case CSSPropertyAnimationIterationCount: return 429;
476     case CSSPropertyAnimationName: return 430;
477     case CSSPropertyAnimationPlayState: return 431;
478     case CSSPropertyAnimationTimingFunction: return 432;
479     case CSSPropertyObjectFit: return 433;
480     case CSSPropertyPaintOrder: return 434;
481     case CSSPropertyMaskSourceType: return 435;
482     case CSSPropertyIsolation: return 436;
483     case CSSPropertyObjectPosition: return 437;
484     // case CSSPropertyInternalCallback: return 438;
485     case CSSPropertyShapeImageThreshold: return 439;
486     case CSSPropertyColumnFill: return 440;
487     case CSSPropertyTextJustify: return 441;
488     case CSSPropertyTouchActionDelay: return 442;
489     case CSSPropertyJustifySelf: return 443;
490     case CSSPropertyScrollBehavior: return 444;
491     case CSSPropertyWillChange: return 445;
492     case CSSPropertyTransform: return 446;
493     case CSSPropertyTransformOrigin: return 447;
494     case CSSPropertyTransformStyle: return 448;
495     case CSSPropertyPerspective: return 449;
496     case CSSPropertyPerspectiveOrigin: return 450;
497     case CSSPropertyBackfaceVisibility: return 451;
498     case CSSPropertyGridTemplate: return 452;
499     case CSSPropertyGrid: return 453;
500     case CSSPropertyAll: return 454;
501     case CSSPropertyJustifyItems: return 455;
502 
503     // 1. Add new features above this line (don't change the assigned numbers of the existing
504     // items).
505     // 2. Update maximumCSSSampleId() with the new maximum value.
506     // 3. Run the update_use_counter_css.py script in
507     // chromium/src/tools/metrics/histograms to update the UMA histogram names.
508 
509     // Internal properties should not be counted.
510     case CSSPropertyInternalMarqueeDirection:
511     case CSSPropertyInternalMarqueeIncrement:
512     case CSSPropertyInternalMarqueeRepetition:
513     case CSSPropertyInternalMarqueeSpeed:
514     case CSSPropertyInternalMarqueeStyle:
515     case CSSPropertyInvalid:
516         ASSERT_NOT_REACHED();
517         return 0;
518     }
519 
520     ASSERT_NOT_REACHED();
521     return 0;
522 }
523 
maximumCSSSampleId()524 static int maximumCSSSampleId() { return 455; }
525 
muteForInspector()526 void UseCounter::muteForInspector()
527 {
528     UseCounter::m_muteCount++;
529 }
530 
unmuteForInspector()531 void UseCounter::unmuteForInspector()
532 {
533     UseCounter::m_muteCount--;
534 }
535 
UseCounter()536 UseCounter::UseCounter()
537 {
538     m_CSSFeatureBits.ensureSize(lastCSSProperty + 1);
539     m_CSSFeatureBits.clearAll();
540 }
541 
~UseCounter()542 UseCounter::~UseCounter()
543 {
544     // We always log PageDestruction so that we have a scale for the rest of the features.
545     blink::Platform::current()->histogramEnumeration("WebCore.FeatureObserver", PageDestruction, NumberOfFeatures);
546 
547     updateMeasurements();
548 }
549 
updateMeasurements()550 void UseCounter::updateMeasurements()
551 {
552     blink::Platform::current()->histogramEnumeration("WebCore.FeatureObserver", PageVisits, NumberOfFeatures);
553 
554     if (m_countBits) {
555         for (unsigned i = 0; i < NumberOfFeatures; ++i) {
556             if (m_countBits->quickGet(i))
557                 blink::Platform::current()->histogramEnumeration("WebCore.FeatureObserver", i, NumberOfFeatures);
558         }
559         // Clearing count bits is timing sensitive.
560         m_countBits->clearAll();
561     }
562 
563     // FIXME: Sometimes this function is called more than once per page. The following
564     //        bool guards against incrementing the page count when there are no CSS
565     //        bits set. http://crbug.com/236262.
566     bool needsPagesMeasuredUpdate = false;
567     for (int i = firstCSSProperty; i <= lastCSSProperty; ++i) {
568         if (m_CSSFeatureBits.quickGet(i)) {
569             int cssSampleId = mapCSSPropertyIdToCSSSampleIdForHistogram(i);
570             blink::Platform::current()->histogramEnumeration("WebCore.FeatureObserver.CSSProperties", cssSampleId, maximumCSSSampleId());
571             needsPagesMeasuredUpdate = true;
572         }
573     }
574 
575     if (needsPagesMeasuredUpdate)
576         blink::Platform::current()->histogramEnumeration("WebCore.FeatureObserver.CSSProperties", totalPagesMeasuredCSSSampleId(), maximumCSSSampleId());
577 
578     m_CSSFeatureBits.clearAll();
579 }
580 
didCommitLoad()581 void UseCounter::didCommitLoad()
582 {
583     updateMeasurements();
584 }
585 
count(const Document & document,Feature feature)586 void UseCounter::count(const Document& document, Feature feature)
587 {
588     FrameHost* host = document.frameHost();
589     if (!host)
590         return;
591 
592     ASSERT(host->useCounter().deprecationMessage(feature).isEmpty());
593     host->useCounter().recordMeasurement(feature);
594 }
595 
count(const ExecutionContext * context,Feature feature)596 void UseCounter::count(const ExecutionContext* context, Feature feature)
597 {
598     if (!context)
599         return;
600     if (context->isDocument()) {
601         count(*toDocument(context), feature);
602         return;
603     }
604     if (context->isWorkerGlobalScope())
605         toWorkerGlobalScope(context)->countFeature(feature);
606 }
607 
countDeprecation(ExecutionContext * context,Feature feature)608 void UseCounter::countDeprecation(ExecutionContext* context, Feature feature)
609 {
610     if (!context)
611         return;
612     if (context->isDocument()) {
613         UseCounter::countDeprecation(*toDocument(context), feature);
614         return;
615     }
616     if (context->isWorkerGlobalScope())
617         toWorkerGlobalScope(context)->countDeprecation(feature);
618 }
619 
countDeprecation(const LocalDOMWindow * window,Feature feature)620 void UseCounter::countDeprecation(const LocalDOMWindow* window, Feature feature)
621 {
622     if (!window || !window->document())
623         return;
624     UseCounter::countDeprecation(*window->document(), feature);
625 }
626 
countDeprecation(const Document & document,Feature feature)627 void UseCounter::countDeprecation(const Document& document, Feature feature)
628 {
629     FrameHost* host = document.frameHost();
630     LocalFrame* frame = document.frame();
631     if (!host || !frame)
632         return;
633 
634     if (host->useCounter().recordMeasurement(feature)) {
635         ASSERT(!host->useCounter().deprecationMessage(feature).isEmpty());
636         frame->console().addMessage(ConsoleMessage::create(DeprecationMessageSource, WarningMessageLevel, host->useCounter().deprecationMessage(feature)));
637     }
638 }
639 
640 // FIXME: Update other UseCounter::deprecationMessage() cases to use this.
replacedBy(const char * oldString,const char * newString)641 static String replacedBy(const char* oldString, const char* newString)
642 {
643     return String::format("'%s' is deprecated. Please use '%s' instead.", oldString, newString);
644 }
645 
deprecationMessage(Feature feature)646 String UseCounter::deprecationMessage(Feature feature)
647 {
648     switch (feature) {
649     // Quota
650     case PrefixedStorageInfo:
651         return "'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.";
652 
653     // Keyboard Event (DOM Level 3)
654     case KeyboardEventKeyLocation:
655         return replacedBy("KeyboardEvent.keyLocation", "KeyboardEvent.location");
656 
657     case ConsoleMarkTimeline:
658         return "console.markTimeline is deprecated. Please use the console.timeStamp instead.";
659 
660     case FileError:
661         return "FileError is deprecated. Please use the 'name' or 'message' attributes of DOMError rather than 'code'.";
662 
663     case ShowModalDialog:
664         return "showModalDialog is deprecated. Please use window.open and postMessage instead.";
665 
666     case CSSStyleSheetInsertRuleOptionalArg:
667         return "Calling CSSStyleSheet.insertRule() with one argument is deprecated. Please pass the index argument as well: insertRule(x, 0).";
668 
669     case PrefixedVideoSupportsFullscreen:
670         return "'HTMLVideoElement.webkitSupportsFullscreen' is deprecated. Its value is true if the video is loaded.";
671 
672     case PrefixedVideoDisplayingFullscreen:
673         return "'HTMLVideoElement.webkitDisplayingFullscreen' is deprecated. Please use the 'fullscreenchange' and 'webkitfullscreenchange' events instead.";
674 
675     case PrefixedVideoEnterFullscreen:
676         return "'HTMLVideoElement.webkitEnterFullscreen()' is deprecated. Please use 'Element.requestFullscreen()' and 'Element.webkitRequestFullscreen()' instead.";
677 
678     case PrefixedVideoExitFullscreen:
679         return "'HTMLVideoElement.webkitExitFullscreen()' is deprecated. Please use 'Document.exitFullscreen()' and 'Document.webkitExitFullscreen()' instead.";
680 
681     case PrefixedVideoEnterFullScreen:
682         return "'HTMLVideoElement.webkitEnterFullScreen()' is deprecated. Please use 'Element.requestFullscreen()' and 'Element.webkitRequestFullscreen()' instead.";
683 
684     case PrefixedVideoExitFullScreen:
685         return "'HTMLVideoElement.webkitExitFullScreen()' is deprecated. Please use 'Document.exitFullscreen()' and 'Document.webkitExitFullscreen()' instead.";
686 
687     case MediaErrorEncrypted:
688         return "'MediaError.MEDIA_ERR_ENCRYPTED' is deprecated. This error code is never used.";
689 
690     case PrefixedGamepad:
691         return replacedBy("navigator.webkitGetGamepads", "navigator.getGamepads");
692 
693     case PrefixedIndexedDB:
694         return replacedBy("webkitIndexedDB", "indexedDB");
695 
696     case PrefixedIDBCursorConstructor:
697         return replacedBy("webkitIDBCursor", "IDBCursor");
698 
699     case PrefixedIDBDatabaseConstructor:
700         return replacedBy("webkitIDBDatabase", "IDBDatabase");
701 
702     case PrefixedIDBFactoryConstructor:
703         return replacedBy("webkitIDBFactory", "IDBFactory");
704 
705     case PrefixedIDBIndexConstructor:
706         return replacedBy("webkitIDBIndex", "IDBIndex");
707 
708     case PrefixedIDBKeyRangeConstructor:
709         return replacedBy("webkitIDBKeyRange", "IDBKeyRange");
710 
711     case PrefixedIDBObjectStoreConstructor:
712         return replacedBy("webkitIDBObjectStore", "IDBObjectStore");
713 
714     case PrefixedIDBRequestConstructor:
715         return replacedBy("webkitIDBRequest", "IDBRequest");
716 
717     case PrefixedIDBTransactionConstructor:
718         return replacedBy("webkitIDBTransaction", "IDBTransaction");
719 
720     case PrefixedRequestAnimationFrame:
721         return "'webkitRequestAnimationFrame' is vendor-specific. Please use the standard 'requestAnimationFrame' instead.";
722 
723     case PrefixedCancelAnimationFrame:
724         return "'webkitCancelAnimationFrame' is vendor-specific. Please use the standard 'cancelAnimationFrame' instead.";
725 
726     case PrefixedCancelRequestAnimationFrame:
727         return "'webkitCancelRequestAnimationFrame' is vendor-specific. Please use the standard 'cancelAnimationFrame' instead.";
728 
729     case DocumentCreateAttributeNS:
730         return "'Document.createAttributeNS' is deprecated and has been removed from DOM4 (http://w3.org/tr/dom).";
731 
732     case AttributeOwnerElement:
733         return "'Attr.ownerElement' is deprecated and has been removed from DOM4 (http://w3.org/tr/dom).";
734 
735     case ElementSetAttributeNodeNS:
736         return "'Element.setAttributeNodeNS' is deprecated and has been removed from DOM4 (http://w3.org/tr/dom).";
737 
738     case NodeIteratorDetach:
739         return "'NodeIterator.detach' is now a no-op, as per DOM (http://dom.spec.whatwg.org/#dom-nodeiterator-detach).";
740 
741     case AttrNodeValue:
742         return replacedBy("Attr.nodeValue", "value");
743 
744     case AttrTextContent:
745         return replacedBy("Attr.textContent", "value");
746 
747     case NodeIteratorExpandEntityReferences:
748         return "'NodeIterator.expandEntityReferences' is deprecated and has been removed from DOM. It always returns false.";
749 
750     case TreeWalkerExpandEntityReferences:
751         return "'TreeWalker.expandEntityReferences' is deprecated and has been removed from DOM. It always returns false.";
752 
753     case RangeDetach:
754         return "'Range.detach' is now a no-op, as per DOM (http://dom.spec.whatwg.org/#dom-range-detach).";
755 
756     case OverflowChangedEvent:
757         return "The 'overflowchanged' event is deprecated and may be removed. Please do not use it.";
758 
759     case HTMLHeadElementProfile:
760         return "'HTMLHeadElement.profile' is deprecated. The reflected attribute has no effect.";
761 
762     case ElementSetPrefix:
763         return "Setting 'Element.prefix' is deprecated, as it is read-only per DOM (http://dom.spec.whatwg.org/#element).";
764 
765     case SyncXHRWithCredentials:
766         return "Setting 'XMLHttpRequest.withCredentials' for synchronous requests is deprecated.";
767 
768     case EventSourceURL:
769         return "'EventSource.URL' is deprecated. Please use 'EventSource.url' instead.";
770 
771     case WebSocketURL:
772         return "'WebSocket.URL' is deprecated. Please use 'WebSocket.url' instead.";
773 
774     case HTMLTableElementVspace:
775         return "The 'vspace' attribute on table is deprecated. Please use CSS instead.";
776 
777     case HTMLTableElementHspace:
778         return "The 'hspace' attribute on table is deprecated. Please use CSS instead.";
779 
780     case PictureSourceSrc:
781         return "<source src> with a <picture> parent is invalid and therefore ignored. Please use <source srcset> instead.";
782 
783     case XHRProgressEventPosition:
784         return "The XMLHttpRequest progress event property 'position' is deprecated. Please use 'loaded' instead.";
785 
786     case XHRProgressEventTotalSize:
787         return "The XMLHttpRequest progress event property 'totalSize' is deprecated. Please use 'total' instead.";
788 
789     case ConsoleTimeline:
790         return "console.timeline is deprecated. Please use the console.time instead.";
791 
792     case ConsoleTimelineEnd:
793         return "console.timelineEnd is deprecated. Please use the console.timeEnd instead.";
794 
795     // Features that aren't deprecated don't have a deprecation message.
796     default:
797         return String();
798     }
799 }
800 
count(CSSParserContext context,CSSPropertyID feature)801 void UseCounter::count(CSSParserContext context, CSSPropertyID feature)
802 {
803     ASSERT(feature >= firstCSSProperty);
804     ASSERT(feature <= lastCSSProperty);
805     ASSERT(!isInternalProperty(feature));
806 
807     if (!isUseCounterEnabledForMode(context.mode()))
808         return;
809 
810     m_CSSFeatureBits.quickSet(feature);
811 }
812 
count(Feature feature)813 void UseCounter::count(Feature feature)
814 {
815     ASSERT(deprecationMessage(feature).isEmpty());
816     recordMeasurement(feature);
817 }
818 
getFrom(const Document * document)819 UseCounter* UseCounter::getFrom(const Document* document)
820 {
821     if (document && document->frameHost())
822         return &document->frameHost()->useCounter();
823     return 0;
824 }
825 
getFrom(const CSSStyleSheet * sheet)826 UseCounter* UseCounter::getFrom(const CSSStyleSheet* sheet)
827 {
828     if (sheet)
829         return getFrom(sheet->contents());
830     return 0;
831 }
832 
getFrom(const StyleSheetContents * sheetContents)833 UseCounter* UseCounter::getFrom(const StyleSheetContents* sheetContents)
834 {
835     // FIXME: We may want to handle stylesheets that have multiple owners
836     //        http://crbug.com/242125
837     if (sheetContents && sheetContents->hasSingleOwnerNode())
838         return getFrom(sheetContents->singleOwnerDocument());
839     return 0;
840 }
841 
842 } // namespace blink
843