// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

// This file defines a list of use counters, which are things that can
// record usage of Web platform features and then report this information
// through Telemetry.
//
// The format of this file is very strict.  Each line can be:
//
//   (a) a blank line
//
//   (b) a comment, which is a line that begins with "//"
//
//   (c) one of three possible use counter declarations:
//
//         method <IDL interface name>.<IDL operation name>
//         attribute <IDL interface name>.<IDL attribute name>
//         custom <any valid identifier> <description>
//
// The <description> for custom counters will be appended to "Whether a document "
// or "Whether a page ", so phrase it appropriately.  For instance, "constructs a
// Foo object" or "calls Document.bar('some value')".  It may contain any
// character (including whitespace).
//
// To actually cause use counters to be incremented, DOM methods
// and attributes must have a [UseCounter] extended attribute in
// the Web IDL file.
//
// Custom counters are incremented when
// SetUseCounter(eUseCounter_custom_MyName) is called on a Document object.
//
// You might reasonably ask why we have this file and we require
// annotating things with [UseCounter] in the relevant WebIDL file as
// well.  Generating things from bindings codegen and ensuring all the
// dependencies were correct would have been rather difficult.
//
// NOTE: You might need a data collection review if you are adding
// a custom use counter. And for WebIDL methods or attributes,
// deprecated operations, or CSS properties: you almost certainly
// don’t need a data collection review.
// https://firefox-source-docs.mozilla.org/dom/use-counters.html#data-review

method SVGSVGElement.getElementById
attribute SVGSVGElement.currentScale

// Push API
method PushManager.subscribe
method PushSubscription.unsubscribe

// window.sidebar
attribute Window.sidebar

// DataTransfer API (gecko-only methods)
method DataTransfer.addElement
attribute DataTransfer.mozItemCount
attribute DataTransfer.mozCursor
method DataTransfer.mozTypesAt
method DataTransfer.mozClearDataAt
method DataTransfer.mozSetDataAt
method DataTransfer.mozGetDataAt
attribute DataTransfer.mozUserCancelled
attribute DataTransfer.mozSourceNode

// Element non-standard events
custom onoverflow sets an element onoverflow event listener
custom onunderflow sets an element onunderflow event listener

// JavaScript feature usage
custom JS_asmjs uses asm.js
custom JS_wasm uses WebAssembly
custom JS_wasm_legacy_exceptions uses WebAssembly legacy exception-handling
custom JS_subclassing_array_type_2 Array is Type II subclassed
custom JS_subclassing_array_type_3 Array is Type III subclassed
custom JS_subclassing_promise_type_2 Promise is Type II subclassed
custom JS_subclassing_promise_type_3 Promise is Type III subclassed
custom JS_subclassing_typedarray_type_2 TypedArray is Type II subclassed
custom JS_subclassing_typedarray_type_3 TypedArray is Type III subclassed
custom JS_subclassing_arraybuffer_type_3 ArrayBuffer is Type III subclassed
custom JS_subclassing_sharedarraybuffer_type_3 SharedArrayBuffer is Type III subclassed
custom JS_subclassing_regexp_type_3 RegExp is Type III subclassed
custom JS_subclassing_regexp_type_4 RegExp is Type IV subclassed

// Console API
method console.assert
method console.clear
method console.count
method console.countReset
method console.debug
method console.error
method console.info
method console.log
method console.table
method console.trace
method console.warn
method console.dir
method console.dirxml
method console.group
method console.groupCollapsed
method console.groupEnd
method console.time
method console.timeLog
method console.timeEnd
method console.exception
method console.timeStamp
method console.profile
method console.profileEnd

// document.open information
custom DocumentOpen calls document.open in a way that creates a new Window object

// HTMLDocument named getter
custom HTMLDocumentNamedGetterHit calls to the named getter on HTMLDocument that find something via the name lookup

custom FilteredCrossOriginIFrame cross-origin <iframe> within a CSS/SVG filter

// Custom Elements
method CustomElementRegistry.define
custom CustomizedBuiltin registers a customized built-in element

// XSLT
custom XSLStylesheet uses an XSL Stylesheet
method XSLTProcessor.constructor

// Shadow DOM
method Element.attachShadow

// Non-standard capture methods
method Element.setCapture
method Element.releaseCapture

// Pointer Capture
method Element.setPointerCapture
method Element.releasePointerCapture

// Media Device Access
method MediaDevices.enumerateDevices
custom EnumerateDevicesInsec calls MediaDevices.enumerateDevices from an insecure context
custom EnumerateDevicesUnfocused calls MediaDevices.enumerateDevices from a unfocused document
method MediaDevices.getUserMedia
method Navigator.mozGetUserMedia
custom GetUserMediaUnfocused calls MediaDevices.getUserMedia from an unfocused document
custom GetUserMediaInsec calls MediaDevices.getUserMedia from an insecure context
custom MozGetUserMediaInsec calls Navigator.mozGetUserMedia from an insecure context
method MediaDevices.getDisplayMedia

// Non-standard Document.mozSetImageElement.
method Document.mozSetImageElement

// Non-standard Window.DOMMouseScroll and MozMousePixelScroll
custom ondommousescroll sets DOMMouseScroll event listener
custom onmozmousepixelscroll sets MozMousePixelScroll event listener

custom PercentageStrokeWidthInSVG whether percentage stroke-width is used in SVG elements (excluding <text>)
custom PercentageStrokeWidthInSVGText whether percentage stroke-width is used in SVG <text>

// Missing-property use counters.  We claim these are "method" use
// counters, because we don't need a separate description string for
// them and we only need one use counter, not a getter/setter pair.
method Clipboard.read
method Clipboard.readText
method Clipboard.write
method DataTransferItem.webkitGetAsEntry
method Document.caretRangeFromPoint
method Document.exitPictureInPicture
method Document.featurePolicy
method Document.onbeforecopy
method Document.onbeforecut
method Document.onbeforepaste
method Document.oncancel
method Document.onfreeze
method Document.onmousewheel
method Document.onresume
method Document.onsearch
method Document.onwebkitfullscreenchange
method Document.onwebkitfullscreenerror
method Document.pictureInPictureElement
method Document.pictureInPictureEnabled
method Document.registerElement
method Document.wasDiscarded
method Document.webkitCancelFullScreen
method Document.webkitCurrentFullScreenElement
method Document.webkitExitFullscreen
method Document.webkitFullscreenElement
method Document.webkitFullscreenEnabled
method Document.webkitHidden
method Document.webkitIsFullScreen
method Document.webkitVisibilityState
method Document.xmlEncoding
method Document.xmlStandalone
method Document.xmlVersion
method Element.computedStyleMap
method Element.onmousewheel
method Element.scrollIntoViewIfNeeded
method HTMLButtonElement.popoverTargetAction
method HTMLButtonElement.popoverTargetElement
method HTMLElement.attributeStyleMap
method HTMLElement.hidePopover
method HTMLElement.popover
method HTMLElement.showPopover
method HTMLElement.togglePopover
method HTMLIFrameElement.loading
method HTMLInputElement.capture
method HTMLInputElement.incremental
method HTMLInputElement.onsearch
method HTMLInputElement.popoverTargetAction
method HTMLInputElement.popoverTargetElement
method HTMLInputElement.webkitdirectory
method HTMLInputElement.webkitEntries
method HTMLMediaElement.disableRemotePlayback
method HTMLMediaElement.remote
method HTMLVideoElement.cancelVideoFrameCallback
method HTMLVideoElement.disablePictureInPicture
method HTMLVideoElement.onenterpictureinpicture
method HTMLVideoElement.onleavepictureinpicture
method HTMLVideoElement.playsInline
method HTMLVideoElement.requestPictureInPicture
method HTMLVideoElement.requestVideoFrameCallback
method ImageData.colorSpace
method Location.ancestorOrigins
method Navigator.canShare
method Navigator.clearAppBadge
method Navigator.setAppBadge
method Navigator.share
method Navigator.userActivation
method Navigator.wakeLock
method ShadowRoot.pictureInPictureElement
method Window.AbsoluteOrientationSensor
method Window.Accelerometer
method Window.BackgroundFetchManager
method Window.BackgroundFetchRecord
method Window.BackgroundFetchRegistration
method Window.BeforeInstallPromptEvent
method Window.Bluetooth
method Window.BluetoothCharacteristicProperties
method Window.BluetoothDevice
method Window.BluetoothRemoteGATTCharacteristic
method Window.BluetoothRemoteGATTDescriptor
method Window.BluetoothRemoteGATTServer
method Window.BluetoothRemoteGATTService
method Window.BluetoothUUID
method Window.CanvasCaptureMediaStreamTrack
method Window.chrome
method Window.ClipboardItem
method Window.CSSImageValue
method Window.CSSKeywordValue
method Window.CSSMathClamp
method Window.CSSMathInvert
method Window.CSSMathMax
method Window.CSSMathMin
method Window.CSSMathNegate
method Window.CSSMathProduct
method Window.CSSMathSum
method Window.CSSMathValue
method Window.CSSMatrixComponent
method Window.CSSNumericArray
method Window.CSSNumericValue
method Window.CSSPerspective
method Window.CSSPositionValue
method Window.CSSPropertyRule
method Window.CSSRotate
method Window.CSSScale
method Window.CSSSkew
method Window.CSSSkewX
method Window.CSSSkewY
method Window.CSSStyleValue
method Window.CSSTransformComponent
method Window.CSSTransformValue
method Window.CSSTranslate
method Window.CSSUnitValue
method Window.CSSUnparsedValue
method Window.CSSVariableReferenceValue
method Window.defaultStatus
// See comments in Window.webidl about why this is disabled.
//method Window.defaultstatus
method Window.DeviceMotionEventAcceleration
method Window.DeviceMotionEventRotationRate
method Window.DOMError
method Window.EncodedVideoChunk
method Window.EnterPictureInPictureEvent
method Window.External
method Window.FederatedCredential
method Window.Gyroscope
method Window.HTMLContentElement
method Window.HTMLShadowElement
method Window.ImageCapture
method Window.InputDeviceCapabilities
method Window.InputDeviceInfo
method Window.Keyboard
method Window.KeyboardLayoutMap
method Window.LinearAccelerationSensor
method Window.MediaSettingsRange
method Window.MIDIAccess
method Window.MIDIConnectionEvent
method Window.MIDIInput
method Window.MIDIInputMap
method Window.MIDIMessageEvent
method Window.MIDIOutput
method Window.MIDIOutputMap
method Window.MIDIPort
method Window.NetworkInformation
method Window.offscreenBuffering
method Window.onbeforeinstallprompt
method Window.oncancel
method Window.onmousewheel
method Window.onorientationchange
method Window.onsearch
method Window.onselectionchange
method Window.openDatabase
method Window.orientation
method Window.OrientationSensor
method Window.OverconstrainedError
method Window.PasswordCredential
method Window.PaymentAddress
method Window.PaymentInstruments
method Window.PaymentManager
method Window.PaymentMethodChangeEvent
method Window.PaymentRequest
method Window.PaymentRequestUpdateEvent
method Window.PaymentResponse
method Window.PerformanceLongTaskTiming
method Window.PhotoCapabilities
method Window.PictureInPictureEvent
method Window.PictureInPictureWindow
method Window.Presentation
method Window.PresentationAvailability
method Window.PresentationConnection
method Window.PresentationConnectionAvailableEvent
method Window.PresentationConnectionCloseEvent
method Window.PresentationConnectionList
method Window.PresentationReceiver
method Window.PresentationRequest
method Window.RelativeOrientationSensor
method Window.RemotePlayback
method Window.Report
method Window.ReportBody
method Window.ReportingObserver
method Window.RTCError
method Window.RTCErrorEvent
method Window.RTCIceTransport
method Window.RTCPeerConnectionIceErrorEvent
method Window.Sensor
method Window.SensorErrorEvent
method Window.SpeechRecognitionAlternative
method Window.SpeechRecognitionResult
method Window.SpeechRecognitionResultList
method Window.styleMedia
method Window.StylePropertyMap
method Window.StylePropertyMapReadOnly
method Window.SVGDiscardElement
method Window.SyncManager
method Window.TaskAttributionTiming
method Window.TextEvent
method Window.Touch
method Window.TouchEvent
method Window.TouchList
method Window.USB
method Window.USBAlternateInterface
method Window.USBConfiguration
method Window.USBConnectionEvent
method Window.USBDevice
method Window.USBEndpoint
method Window.USBInterface
method Window.USBInTransferResult
method Window.USBIsochronousInTransferPacket
method Window.USBIsochronousInTransferResult
method Window.USBIsochronousOutTransferPacket
method Window.USBIsochronousOutTransferResult
method Window.USBOutTransferResult
method Window.UserActivation
method Window.VideoColorSpace
method Window.VideoDecoder
method Window.VideoEncoder
method Window.VideoFrame
method Window.WakeLock
method Window.WakeLockSentinel
method Window.webkitCancelAnimationFrame
method Window.webkitMediaStream
method Window.WebKitMutationObserver
method Window.webkitRequestAnimationFrame
method Window.webkitRequestFileSystem
method Window.webkitResolveLocalFileSystemURL
method Window.webkitRTCPeerConnection
method Window.webkitSpeechGrammar
method Window.webkitSpeechGrammarList
method Window.webkitSpeechRecognition
method Window.webkitSpeechRecognitionError
method Window.webkitSpeechRecognitionEvent
method Window.webkitStorageInfo
method WorkerNavigator.permissions

// Gecko-specific command usage of `Document.execCommand`
custom DocumentExecCommandContentReadOnly calls execCommand with contentReadOnly

// Methods used in frameworks to create DOM from strings
method DOMParser.parseFromString
method Range.createContextualFragment

// Gecko-specific command usage of `Document.queryCommandState` or `Document.queryCommandValue`
custom DocumentQueryCommandStateOrValueContentReadOnly calls queryCommandState or queryCommandValue with contentReadOnly
custom DocumentQueryCommandStateOrValueInsertBrOnReturn calls queryCommandState or queryCommandValue with insertBrOnReturn

// Gecko-specific command usage of `Document.queryCommandSupported` or `Document.queryCommandEnabled`
custom DocumentQueryCommandSupportedOrEnabledContentReadOnly calls queryCommandSupported or queryCommandEnabled with contentReadOnly
custom DocumentQueryCommandSupportedOrEnabledInsertBrOnReturn calls queryCommandSupported or queryCommandEnabled with insertBrOnReturn

// SVG filters
custom feBlend uses the feBlend SVG filter.
custom feColorMatrix uses the feColorMatrix SVG filter.
custom feComponentTransfer uses the feComponentTransfer SVG filter.
custom feComposite uses the feComposite SVG filter.
custom feConvolveMatrix uses the feConvolveMatrix SVG filter.
custom feDiffuseLighting uses the feDiffuseLighting SVG filter.
custom feDisplacementMap uses the feDisplacementMap SVG filter.
custom feFlood uses the feFlood SVG filter.
custom feGaussianBlur uses the feGaussianBlur SVG filter.
custom feImage uses the feImage SVG filter.
custom feMerge uses the feMerge SVG filter.
custom feMorphology uses the feMorphology SVG filter.
custom feOffset uses the feOffset SVG filter.
custom feSpecularLighting uses the feSpecularLighting SVG filter.
custom feTile uses the feTile SVG filter.
custom feTurbulence uses the feTurbulence SVG filter.

custom WrFilterFallback triggers the blob fallback for an SVG filter.

// Sanitizer API
method Sanitizer.constructor
method Sanitizer.sanitize
method Element.setHTML

// Features that might be deprecated in the future
custom WindowOpenEmptyUrl calls window.open with an empty url argument

// Unsupported web APIs in Private Browsing Mode
custom PrivateBrowsingIDBFactoryOpen calls indexedDB.open in Private Browsing Mode
custom PrivateBrowsingIDBFactoryDeleteDatabase calls indexedDB.deleteDatabase in Private Browsing Mode
custom PrivateBrowsingCachesMatch calls caches.match in Private Browsing Mode
custom PrivateBrowsingCachesHas calls caches.has in Private Browsing Mode
custom PrivateBrowsingCachesOpen calls caches.open in Private Browsing Mode
custom PrivateBrowsingCachesDelete calls caches.delete in Private Browsing Mode
custom PrivateBrowsingCachesKeys calls caches.keys in Private Browsing Mode
custom PrivateBrowsingNavigatorServiceWorker accesses navigator.serviceWorker in Private Browsing Mode

// Mechanism for rewriting old YouTube flash embeds to use HTML5 video
custom YouTubeFlashEmbed in <object> or <embed>

method Scheduler.postTask

method HTMLDialogElement.show

// Use Counters for HTTPS Features like Mixed-Content-Blocking, HTTPS-First ...
custom MixedContentUpgradedImageSuccess includes a mixed content img element that loads.
custom MixedContentUpgradedImageFailure includes a mixed content img element that does not load.
custom MixedContentUpgradedVideoSuccess includes a mixed content video element that loads.
custom MixedContentUpgradedVideoFailure includes a mixed content video element that does not laod.
custom MixedContentUpgradedAudioSuccess includes a mixed content audio element that loads.
custom MixedContentUpgradedAudioFailure includes a mixed content audio element that does not load.
// Counterparts for when we do not enable upgrading
custom MixedContentNotUpgradedImageSuccess includes a mixed content img element that loads.
custom MixedContentNotUpgradedImageFailure includes a mixed content img element that does not load.
custom MixedContentNotUpgradedVideoSuccess includes a mixed content video element that loads.
custom MixedContentNotUpgradedVideoFailure includes a mixed content video element that does not laod.
custom MixedContentNotUpgradedAudioSuccess includes a mixed content audio element that loads.
custom MixedContentNotUpgradedAudioFailure includes a mixed content audio element that does not load.

// NOTE: You might need a data collection review if you are adding
// a custom use counter. And for WebIDL methods or attributes,
// deprecated operations, or CSS properties: you almost certainly
// don’t need a data collection review.
// https://firefox-source-docs.mozilla.org/dom/use-counters.html#data-review
