// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_RENDERER_MEDIA_WEBRTC_UMA_HISTOGRAMS_H_ #define CONTENT_RENDERER_MEDIA_WEBRTC_UMA_HISTOGRAMS_H_ #include "base/memory/singleton.h" #include "base/threading/non_thread_safe.h" #include "content/common/content_export.h" namespace content { // Helper enum used for histogramming calls to WebRTC APIs from JavaScript. enum JavaScriptAPIName { WEBKIT_GET_USER_MEDIA, WEBKIT_PEER_CONNECTION, WEBKIT_DEPRECATED_PEER_CONNECTION, WEBKIT_RTC_PEER_CONNECTION, WEBKIT_GET_MEDIA_DEVICES, INVALID_NAME }; // Helper method used to collect information about the number of times // different WebRTC APIs are called from JavaScript. // // This contributes to two histograms; the former is a raw count of // the number of times the APIs are called, and be viewed at // chrome://histograms/WebRTC.webkitApiCount. // // The latter is a count of the number of times the APIs are called // that gets incremented only once per "session" as established by the // PerSessionWebRTCAPIMetrics singleton below. It can be viewed at // chrome://histograms/WebRTC.webkitApiCountPerSession. void UpdateWebRTCMethodCount(JavaScriptAPIName api_name); // A singleton that keeps track of the number of MediaStreams being // sent over PeerConnections. It uses the transition to zero such // streams to demarcate the start of a new "session". Note that this // is a rough approximation of sessions, as you could conceivably have // multiple tabs using this renderer process, and each of them using // PeerConnections. // // The UpdateWebRTCMethodCount function above uses this class to log a // metric at most once per session. class CONTENT_EXPORT PerSessionWebRTCAPIMetrics : public base::NonThreadSafe { public: virtual ~PerSessionWebRTCAPIMetrics(); static PerSessionWebRTCAPIMetrics* GetInstance(); // Increment/decrement the number of streams being sent or received // over any current PeerConnection. void IncrementStreamCounter(); void DecrementStreamCounter(); protected: friend struct DefaultSingletonTraits<PerSessionWebRTCAPIMetrics>; friend void UpdateWebRTCMethodCount(JavaScriptAPIName); // Protected so that unit tests can test without this being a // singleton. PerSessionWebRTCAPIMetrics(); // Overridable by unit tests. virtual void LogUsage(JavaScriptAPIName api_name); // Called by UpdateWebRTCMethodCount above. Protected rather than // private so that unit tests can call it. void LogUsageOnlyOnce(JavaScriptAPIName api_name); private: void ResetUsage(); int num_streams_; bool has_used_api_[INVALID_NAME]; DISALLOW_COPY_AND_ASSIGN(PerSessionWebRTCAPIMetrics); }; } // namespace content #endif // CONTENT_RENDERER_MEDIA_WEBRTC_UMA_HISTOGRAMS_H_