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
36namespace blink {
37
38class CSSStyleSheet;
39class LocalDOMWindow;
40class Document;
41class ExecutionContext;
42class 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
55class UseCounter {
56    WTF_MAKE_NONCOPYABLE(UseCounter);
57public:
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
565private:
566    static int m_muteCount;
567
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