• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 Google, Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #ifndef UseCounter_h
27 #define UseCounter_h
28 
29 #include "core/CSSPropertyNames.h"
30 #include "wtf/BitVector.h"
31 #include "wtf/Noncopyable.h"
32 #include "wtf/OwnPtr.h"
33 #include "wtf/PassOwnPtr.h"
34 #include "wtf/text/WTFString.h"
35 
36 namespace blink {
37 
38 class CSSStyleSheet;
39 class LocalDOMWindow;
40 class Document;
41 class ExecutionContext;
42 class StyleSheetContents;
43 
44 // UseCounter is used for counting the number of times features of
45 // Blink are used on real web pages and help us know commonly
46 // features are used and thus when it's safe to remove or change them.
47 //
48 // The Chromium Content layer controls what is done with this data.
49 // For instance, in Google Chrome, these counts are submitted
50 // anonymously through the Histogram recording system in Chrome
51 // for users who opt-in to "Usage Statistics" submission
52 // during their install of Google Chrome:
53 // http://www.google.com/chrome/intl/en/privacy.html
54 
55 class UseCounter {
56     WTF_MAKE_NONCOPYABLE(UseCounter);
57 public:
58     UseCounter();
59     ~UseCounter();
60 
61     enum Feature {
62         // Do not change assigned numbers of existing items: add new features
63         // to the end of the list.
64         PageDestruction = 0,
65         PrefixedIndexedDB = 3,
66         WorkerStart = 4,
67         SharedWorkerStart = 5,
68         UnprefixedIndexedDB = 9,
69         OpenWebDatabase = 10,
70         UnprefixedRequestAnimationFrame = 13,
71         PrefixedRequestAnimationFrame = 14,
72         ContentSecurityPolicy = 15,
73         ContentSecurityPolicyReportOnly = 16,
74         PrefixedTransitionEndEvent = 18,
75         UnprefixedTransitionEndEvent = 19,
76         PrefixedAndUnprefixedTransitionEndEvent = 20,
77         AutoFocusAttribute = 21,
78         DataListElement = 23,
79         FormAttribute = 24,
80         IncrementalAttribute = 25,
81         InputTypeColor = 26,
82         InputTypeDate = 27,
83         InputTypeDateTimeFallback = 29,
84         InputTypeDateTimeLocal = 30,
85         InputTypeEmail = 31,
86         InputTypeMonth = 32,
87         InputTypeNumber = 33,
88         InputTypeRange = 34,
89         InputTypeSearch = 35,
90         InputTypeTel = 36,
91         InputTypeTime = 37,
92         InputTypeURL = 38,
93         InputTypeWeek = 39,
94         InputTypeWeekFallback = 40,
95         ListAttribute = 41,
96         MaxAttribute = 42,
97         MinAttribute = 43,
98         PatternAttribute = 44,
99         PlaceholderAttribute = 45,
100         PrefixedDirectoryAttribute = 47,
101         RequiredAttribute = 49,
102         ResultsAttribute = 50,
103         StepAttribute = 51,
104         PageVisits = 52,
105         HTMLMarqueeElement = 53,
106         Reflection = 55,
107         PrefixedStorageInfo = 57,
108         XFrameOptions = 58,
109         XFrameOptionsSameOrigin = 59,
110         XFrameOptionsSameOriginWithBadAncestorChain = 60,
111         DeprecatedFlexboxWebContent = 61,
112         DeprecatedFlexboxChrome = 62,
113         DeprecatedFlexboxChromeExtension = 63,
114         UnprefixedPerformanceTimeline = 65,
115         UnprefixedUserTiming = 67,
116         WindowEvent = 69,
117         ContentSecurityPolicyWithBaseElement = 70,
118         PrefixedMediaAddKey = 71,
119         PrefixedMediaGenerateKeyRequest = 72,
120         DocumentClear = 74,
121         SVGFontElement = 76,
122         XMLDocument = 77,
123         XSLProcessingInstruction = 78,
124         XSLTProcessor = 79,
125         SVGSwitchElement = 80,
126         DocumentAll = 83,
127         FormElement = 84,
128         DemotedFormElement = 85,
129         SVGAnimationElement = 90,
130         KeyboardEventKeyLocation = 91,
131         LineClamp = 96,
132         SubFrameBeforeUnloadRegistered = 97,
133         SubFrameBeforeUnloadFired = 98,
134         TextReplaceWholeText = 100,
135         ConsoleMarkTimeline = 102,
136         CSSPseudoElementUserAgentCustomPseudo = 103,
137         ElementGetAttributeNode = 107, // Removed from DOM4.
138         ElementSetAttributeNode = 108, // Removed from DOM4.
139         ElementRemoveAttributeNode = 109, // Removed from DOM4.
140         ElementGetAttributeNodeNS = 110, // Removed from DOM4.
141         DocumentCreateAttribute = 111, // Removed from DOM4.
142         DocumentCreateAttributeNS = 112, // Removed from DOM4.
143         DocumentCreateCDATASection = 113, // Removed from DOM4.
144         DocumentInputEncoding = 114, // Removed from DOM4.
145         DocumentXMLEncoding = 115, // Removed from DOM4.
146         DocumentXMLStandalone = 116, // Removed from DOM4.
147         DocumentXMLVersion = 117, // Removed from DOM4.
148         NodeIsSameNode = 118, // Removed from DOM4.
149         NodeNamespaceURI = 120, // Removed from DOM4.
150         NodeLocalName = 122, // Removed from DOM4.
151         NavigatorProductSub = 123,
152         NavigatorVendor = 124,
153         NavigatorVendorSub = 125,
154         FileError = 126,
155         DocumentCharset = 127, // Documented as IE extensions = 0, from KHTML days.
156         PrefixedAnimationEndEvent = 128,
157         UnprefixedAnimationEndEvent = 129,
158         PrefixedAndUnprefixedAnimationEndEvent = 130,
159         PrefixedAnimationStartEvent = 131,
160         UnprefixedAnimationStartEvent = 132,
161         PrefixedAndUnprefixedAnimationStartEvent = 133,
162         PrefixedAnimationIterationEvent = 134,
163         UnprefixedAnimationIterationEvent = 135,
164         PrefixedAndUnprefixedAnimationIterationEvent = 136,
165         EventReturnValue = 137, // Legacy IE extension.
166         SVGSVGElement = 138,
167         InsertAdjacentText = 140,
168         InsertAdjacentElement = 141,
169         HasAttributes = 142, // Removed from DOM4.
170         DOMSubtreeModifiedEvent = 143,
171         DOMNodeInsertedEvent = 144,
172         DOMNodeRemovedEvent = 145,
173         DOMNodeRemovedFromDocumentEvent = 146,
174         DOMNodeInsertedIntoDocumentEvent = 147,
175         DOMCharacterDataModifiedEvent = 148,
176         DocumentAllLegacyCall = 150,
177         HTMLAppletElementLegacyCall = 151,
178         HTMLEmbedElementLegacyCall = 152,
179         HTMLObjectElementLegacyCall = 153,
180         GetMatchedCSSRules = 155,
181         SVGFontInCSS = 156,
182         AttributeOwnerElement = 160, // Removed in DOM4.
183         AttributeSpecified = 162, // Removed in DOM4.
184         PrefixedAudioDecodedByteCount = 164,
185         PrefixedVideoDecodedByteCount = 165,
186         PrefixedVideoSupportsFullscreen = 166,
187         PrefixedVideoDisplayingFullscreen = 167,
188         PrefixedVideoEnterFullscreen = 168,
189         PrefixedVideoExitFullscreen = 169,
190         PrefixedVideoEnterFullScreen = 170,
191         PrefixedVideoExitFullScreen = 171,
192         PrefixedVideoDecodedFrameCount = 172,
193         PrefixedVideoDroppedFrameCount = 173,
194         PrefixedElementRequestFullscreen = 176,
195         PrefixedElementRequestFullScreen = 177,
196         BarPropLocationbar = 178,
197         BarPropMenubar = 179,
198         BarPropPersonalbar = 180,
199         BarPropScrollbars = 181,
200         BarPropStatusbar = 182,
201         BarPropToolbar = 183,
202         InputTypeEmailMultiple = 184,
203         InputTypeEmailMaxLength = 185,
204         InputTypeEmailMultipleMaxLength = 186,
205         InputTypeText = 190,
206         InputTypeTextMaxLength = 191,
207         InputTypePassword = 192,
208         InputTypePasswordMaxLength = 193,
209         ShowModalDialog = 195,
210         PrefixedPageVisibility = 196,
211         CSSStyleSheetInsertRuleOptionalArg = 198, // Inconsistent with the specification and other browsers.
212         DocumentBeforeUnloadRegistered = 200,
213         DocumentBeforeUnloadFired = 201,
214         DocumentUnloadRegistered = 202,
215         DocumentUnloadFired = 203,
216         SVGLocatableNearestViewportElement = 204,
217         SVGLocatableFarthestViewportElement = 205,
218         HTMLHeadElementProfile = 207,
219         OverflowChangedEvent = 208,
220         SVGPointMatrixTransform = 209,
221         DOMFocusInOutEvent = 211,
222         FileGetLastModifiedDate = 212,
223         HTMLElementInnerText = 213,
224         HTMLElementOuterText = 214,
225         ReplaceDocumentViaJavaScriptURL = 215,
226         ElementSetAttributeNodeNS = 216, // Removed from DOM4.
227         ElementPrefixedMatchesSelector = 217,
228         CSSStyleSheetRules = 219,
229         CSSStyleSheetAddRule = 220,
230         CSSStyleSheetRemoveRule = 221,
231         // The above items are available in M33 branch.
232 
233         InitMessageEvent = 222,
234         ElementSetPrefix = 224, // Element.prefix is readonly in DOM4.
235         CSSStyleDeclarationGetPropertyCSSValue = 225,
236         PrefixedMediaCancelKeyRequest = 229,
237         DOMImplementationHasFeature = 230,
238         DOMImplementationHasFeatureReturnFalse = 231,
239         CanPlayTypeKeySystem = 232,
240         PrefixedDevicePixelRatioMediaFeature = 233,
241         PrefixedMaxDevicePixelRatioMediaFeature = 234,
242         PrefixedMinDevicePixelRatioMediaFeature = 235,
243         PrefixedTransform3dMediaFeature = 237,
244         PrefixedStorageQuota = 240,
245         ContentSecurityPolicyReportOnlyInMeta = 241,
246         ResetReferrerPolicy = 243,
247         CaseInsensitiveAttrSelectorMatch = 244, // Case-insensitivity dropped from specification.
248         FormNameAccessForImageElement = 246,
249         FormNameAccessForPastNamesMap = 247,
250         FormAssociationByParser = 248,
251         SVGSVGElementInDocument = 250,
252         SVGDocumentRootElement = 251,
253         MediaErrorEncrypted = 253,
254         EventSourceURL = 254,
255         WebSocketURL = 255,
256         WorkerSubjectToCSP = 257,
257         WorkerAllowedByChildBlockedByScript = 258,
258         DeprecatedWebKitGradient = 260,
259         DeprecatedWebKitLinearGradient = 261,
260         DeprecatedWebKitRepeatingLinearGradient = 262,
261         DeprecatedWebKitRadialGradient = 263,
262         DeprecatedWebKitRepeatingRadialGradient = 264,
263         PrefixedImageSmoothingEnabled = 267,
264         UnprefixedImageSmoothingEnabled = 268,
265         // The above items are available in M34 branch.
266 
267         TextAutosizing = 274,
268         HTMLAnchorElementPingAttribute = 276,
269         InsertAdjacentHTML = 278,
270         SVGClassName = 279,
271         HTMLAppletElement = 280,
272         HTMLMediaElementSeekToFragmentStart = 281,
273         HTMLMediaElementPauseAtFragmentEnd = 282,
274         PrefixedWindowURL = 283,
275         PrefixedWorkerURL = 284, // This didn't work because of crbug.com/376039. Available since M37.
276         WindowOrientation = 285,
277         DOMStringListContains = 286,
278         DocumentCaptureEvents = 287,
279         DocumentReleaseEvents = 288,
280         WindowCaptureEvents = 289,
281         WindowReleaseEvents = 290,
282         PrefixedGamepad = 291,
283         ElementAnimateKeyframeListEffectObjectTiming = 292,
284         ElementAnimateKeyframeListEffectDoubleTiming = 293,
285         ElementAnimateKeyframeListEffectNoTiming = 294,
286         DocumentXPathCreateExpression = 295,
287         DocumentXPathCreateNSResolver = 296,
288         DocumentXPathEvaluate = 297,
289         AttrGetValue = 298,
290         AttrSetValue = 299,
291         AnimationConstructorKeyframeListEffectObjectTiming = 300,
292         AnimationConstructorKeyframeListEffectDoubleTiming = 301,
293         AnimationConstructorKeyframeListEffectNoTiming = 302,
294         AttrSetValueWithElement = 303,
295         PrefixedCancelAnimationFrame = 304,
296         PrefixedCancelRequestAnimationFrame = 305,
297         NamedNodeMapGetNamedItem = 306,
298         NamedNodeMapSetNamedItem = 307,
299         NamedNodeMapRemoveNamedItem = 308,
300         NamedNodeMapItem = 309,
301         NamedNodeMapGetNamedItemNS = 310,
302         NamedNodeMapSetNamedItemNS = 311,
303         NamedNodeMapRemoveNamedItemNS = 312,
304         XHRProgressEventPosition = 316,
305         XHRProgressEventTotalSize = 317,
306         PrefixedDocumentIsFullscreen = 318,
307         PrefixedDocumentFullScreenKeyboardInputAllowed = 319,
308         PrefixedDocumentCurrentFullScreenElement = 320,
309         PrefixedDocumentCancelFullScreen = 321,
310         PrefixedDocumentFullscreenEnabled = 322,
311         PrefixedDocumentFullscreenElement = 323,
312         PrefixedDocumentExitFullscreen = 324,
313         // The above items are available in M35 branch.
314 
315         SVGForeignObjectElement = 325,
316         SelectionSetPosition = 327,
317         AnimationPlayerFinishEvent = 328,
318         SVGSVGElementInXMLDocument = 329,
319         CanvasRenderingContext2DSetAlpha = 330,
320         CanvasRenderingContext2DSetCompositeOperation = 331,
321         CanvasRenderingContext2DSetLineWidth = 332,
322         CanvasRenderingContext2DSetLineCap = 333,
323         CanvasRenderingContext2DSetLineJoin = 334,
324         CanvasRenderingContext2DSetMiterLimit = 335,
325         CanvasRenderingContext2DClearShadow = 336,
326         CanvasRenderingContext2DSetStrokeColor = 337,
327         CanvasRenderingContext2DSetFillColor = 338,
328         CanvasRenderingContext2DDrawImageFromRect = 339,
329         CanvasRenderingContext2DSetShadow = 340,
330         PrefixedPerformanceClearResourceTimings = 341,
331         PrefixedPerformanceSetResourceTimingBufferSize = 342,
332         EventSrcElement = 343,
333         EventCancelBubble = 344,
334         EventPath = 345,
335         EventClipboardData = 346,
336         NodeIteratorDetach = 347,
337         AttrNodeValue = 348,
338         AttrTextContent = 349,
339         EventGetReturnValueTrue = 350,
340         EventGetReturnValueFalse = 351,
341         EventSetReturnValueTrue = 352,
342         EventSetReturnValueFalse = 353,
343         NodeIteratorExpandEntityReferences = 354,
344         TreeWalkerExpandEntityReferences = 355,
345         WindowOffscreenBuffering = 356,
346         WindowDefaultStatus = 357,
347         WindowDefaultstatus = 358,
348         PrefixedTransitionEventConstructor = 361,
349         PrefixedMutationObserverConstructor = 362,
350         PrefixedIDBCursorConstructor = 363,
351         PrefixedIDBDatabaseConstructor = 364,
352         PrefixedIDBFactoryConstructor = 365,
353         PrefixedIDBIndexConstructor = 366,
354         PrefixedIDBKeyRangeConstructor = 367,
355         PrefixedIDBObjectStoreConstructor = 368,
356         PrefixedIDBRequestConstructor = 369,
357         PrefixedIDBTransactionConstructor = 370,
358         NotificationPermission = 371,
359         RangeDetach = 372,
360         HTMLTableElementVspace = 374,
361         HTMLTableElementHspace = 375,
362         PrefixedTouchRadiusX = 378,
363         PrefixedTouchRadiusY = 379,
364         PrefixedTouchRotationAngle = 380,
365         PrefixedTouchForce = 381,
366         PrefixedMouseEventMovementX = 382,
367         PrefixedMouseEventMovementY = 383,
368         PrefixedFileRelativePath = 386,
369         DocumentCaretRangeFromPoint = 387,
370         DocumentGetCSSCanvasContext = 388,
371         ElementScrollIntoViewIfNeeded = 389,
372         RangeCompareNode = 392,
373         RangeExpand = 393,
374         HTMLImageElementX = 396,
375         HTMLImageElementY = 397,
376         SelectionBaseNode = 400,
377         SelectionBaseOffset = 401,
378         SelectionExtentNode = 402,
379         SelectionExtentOffset = 403,
380         SelectionType = 404,
381         SelectionModify = 405,
382         SelectionSetBaseAndExtent = 406,
383         SelectionEmpty = 407,
384         VTTCue = 409,
385         VTTCueRender = 410,
386         VTTCueRenderVertical = 411,
387         VTTCueRenderSnapToLinesFalse = 412,
388         VTTCueRenderLineNotAuto = 413,
389         VTTCueRenderPositionNot50 = 414,
390         VTTCueRenderSizeNot100 = 415,
391         VTTCueRenderAlignNotMiddle = 416,
392         // The above items are available in M36 branch.
393 
394         ElementRequestPointerLock = 417,
395         VTTCueRenderRtl = 418,
396         PostMessageFromSecureToInsecure = 419,
397         PostMessageFromInsecureToSecure = 420,
398         DocumentExitPointerLock = 421,
399         DocumentPointerLockElement = 422,
400         PrefixedCursorZoomIn = 424,
401         PrefixedCursorZoomOut = 425,
402         CSSCharsetRuleEncoding = 426,
403         DocumentSetCharset = 427,
404         DocumentDefaultCharset = 428,
405         TextEncoderConstructor = 429,
406         TextEncoderEncode = 430,
407         TextDecoderConstructor = 431,
408         TextDecoderDecode = 432,
409         FocusInOutEvent = 433,
410         MouseEventMovementX = 434,
411         MouseEventMovementY = 435,
412         MixedContentRaw = 437,
413         MixedContentImage = 438,
414         MixedContentMedia = 439,
415         DocumentFonts = 440,
416         MixedContentFormsSubmitted = 441,
417         FormsSubmitted = 442,
418         TextInputEventOnInput = 443,
419         TextInputEventOnTextArea = 444,
420         TextInputEventOnContentEditable = 445,
421         TextInputEventOnNotNode = 446,
422         WebkitBeforeTextInsertedOnInput = 447,
423         WebkitBeforeTextInsertedOnTextArea = 448,
424         WebkitBeforeTextInsertedOnContentEditable = 449,
425         WebkitBeforeTextInsertedOnNotNode = 450,
426         WebkitEditableContentChangedOnInput = 451,
427         WebkitEditableContentChangedOnTextArea = 452,
428         WebkitEditableContentChangedOnContentEditable = 453,
429         WebkitEditableContentChangedOnNotNode = 454,
430         HTMLImports = 455,
431         ElementCreateShadowRoot = 456,
432         DocumentRegisterElement = 457,
433         EditingAppleInterchangeNewline = 458,
434         EditingAppleConvertedSpace = 459,
435         EditingApplePasteAsQuotation = 460,
436         EditingAppleStyleSpanClass = 461,
437         EditingAppleTabSpanClass = 462,
438         HTMLImportsAsyncAttribute = 463,
439         FontFaceSetReady = 464,
440         XMLHttpRequestSynchronous = 465,
441         CSSSelectorPseudoUnresolved = 466,
442         CSSSelectorPseudoShadow = 467,
443         CSSSelectorPseudoContent = 468,
444         CSSSelectorPseudoHost = 469,
445         CSSSelectorPseudoHostContext = 470,
446         CSSDeepCombinator = 471,
447         SyncXHRWithCredentials = 472,
448         // The above items are available in M37 branch.
449 
450         UseAsm = 473,
451         KeyEventNotAllowedInFullScreen = 474,
452         DOMWindowOpen = 475,
453         DOMWindowOpenFeatures = 476,
454         MediaStreamTrackGetSources = 478,
455         AspectRatioFlexItem = 479,
456         DetailsElement = 480,
457         DialogElement = 481,
458         MapElement = 482,
459         MeterElement = 483,
460         ProgressElement = 484,
461         VideoFullscreenAllowedExemption = 485,
462         PrefixedHTMLElementDropzone = 490,
463         WheelEventWheelDeltaX = 491,
464         WheelEventWheelDeltaY = 492,
465         WheelEventWheelDelta = 493,
466         SendBeacon = 494,
467         SendBeaconQuotaExceeded = 495,
468         SVGSMILElementInDocument = 501,
469         MouseEventOffsetX = 502,
470         MouseEventOffsetY = 503,
471         MouseEventX = 504,
472         MouseEventY = 505,
473         MouseEventFromElement = 506,
474         MouseEventToElement = 507,
475         RequestFileSystem = 508,
476         RequestFileSystemWorker = 509,
477         RequestFileSystemSyncWorker = 510,
478         UIEventLayerX = 511,
479         UIEventLayerY = 512,
480         UIEventPageX = 513,
481         UIEventPageY = 514,
482         BgPropertiesFixed = 515,
483         HTMLImageElementComposite = 516,
484         DevToolsConsoleTimeline = 517,
485         DevToolsConsoleProfile = 518,
486         SVGStyleElementTitle = 519,
487         PictureSourceSrc = 520,
488         // The above items are available in M38 branch.
489 
490         Picture = 521,
491         Sizes = 522,
492         SrcsetXDescriptor = 523,
493         SrcsetWDescriptor = 524,
494         SelectionContainsNode = 525,
495         MediaStreamEnded = 526,
496         MixedContentPrivateIPInPublicWebsitePassive = 527,
497         MixedContentPrivateIPInPublicWebsiteActive = 528,
498         XMLExternalResourceLoad = 529,
499         MixedContentPrivateHostnameInPublicHostname = 530,
500         LegacyProtocolEmbeddedAsSubresource = 531,
501         RequestedSubresourceWithEmbeddedCredentials = 532,
502         NotificationCreated = 533,
503         NotificationClosed = 534,
504         NotificationPermissionRequested = 535,
505         MediaStreamLabel = 536,
506         MediaStreamStop = 537,
507         ConsoleTimeline = 538,
508         ConsoleTimelineEnd = 539,
509         SRIElementWithMatchingIntegrityAttribute = 540,
510         SRIElementWithNonMatchingIntegrityAttribute = 541,
511         SRIElementWithUnparsableIntegrityAttribute = 542,
512         SRIElementWithIntegrityAttributeAndInsecureOrigin = 543,
513         SRIElementWithIntegrityAttributeAndInsecureResource = 544,
514         AnimationPlayerGetStartTime = 545,
515         AnimationPlayerSetStartTime = 546,
516         AnimationPlayerGetCurrentTime = 547,
517         AnimationPlayerSetCurrentTime = 548,
518         AnimationPlayerGetPlaybackRate = 549,
519         AnimationPlayerSetPlaybackRate = 550,
520         AnimationPlayerGetPlayState = 551,
521         AnimationPlayerFinish = 552,
522         AnimationPlayerPlay = 553,
523         AnimationPlayerPause = 554,
524         AnimationPlayerReverse = 555,
525         // Add new features immediately above this line. Don't change assigned
526         // numbers of any item, and don't reuse removed slots.
527         // Also, run update_use_counter_feature_enum.py in chromium/src/tools/metrics/histograms/
528         // to update the UMA mapping.
529         NumberOfFeatures, // This enum value must be last.
530     };
531 
532     // "count" sets the bit for this feature to 1. Repeated calls are ignored.
533     static void count(const Document&, Feature);
534     // This doesn't count for ExecutionContexts for shared workers and service
535     // workers.
536     static void count(const ExecutionContext*, Feature);
537     void count(CSSParserContext, CSSPropertyID);
538     void count(Feature);
539 
540     // "countDeprecation" sets the bit for this feature to 1, and sends a deprecation
541     // warning to the console. Repeated calls are ignored.
542     //
543     // Be considerate to developers' consoles: features should only send
544     // deprecation warnings when we're actively interested in removing them from
545     // the platform.
546     //
547     // The ExecutionContext* overload doesn't work for shared workers and
548     // service workers.
549     static void countDeprecation(const LocalDOMWindow*, Feature);
550     static void countDeprecation(ExecutionContext*, Feature);
551     static void countDeprecation(const Document&, Feature);
552     String deprecationMessage(Feature);
553 
554     void didCommitLoad();
555 
556     static UseCounter* getFrom(const Document*);
557     static UseCounter* getFrom(const CSSStyleSheet*);
558     static UseCounter* getFrom(const StyleSheetContents*);
559 
560     static int mapCSSPropertyIdToCSSSampleIdForHistogram(int id);
561 
562     static void muteForInspector();
563     static void unmuteForInspector();
564 
565 private:
566     static int m_muteCount;
567 
recordMeasurement(Feature feature)568     bool recordMeasurement(Feature feature)
569     {
570         if (UseCounter::m_muteCount)
571             return false;
572         ASSERT(feature != PageDestruction); // PageDestruction is reserved as a scaling factor.
573         ASSERT(feature < NumberOfFeatures);
574         if (!m_countBits) {
575             m_countBits = adoptPtr(new BitVector(NumberOfFeatures));
576             m_countBits->clearAll();
577         }
578 
579         if (m_countBits->quickGet(feature))
580             return false;
581 
582         m_countBits->quickSet(feature);
583         return true;
584     }
585 
586     void updateMeasurements();
587 
588     OwnPtr<BitVector> m_countBits;
589     BitVector m_CSSFeatureBits;
590 };
591 
592 } // namespace blink
593 
594 #endif // UseCounter_h
595