Index: third_party/WebKit/Source/core/frame/UseCounter.h |
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h |
index 214d162ea0ec547db73c8f626007000f1aec3aa9..63a240cab38da3b3310c24024ba6957cd0e5d0c8 100644 |
--- a/third_party/WebKit/Source/core/frame/UseCounter.h |
+++ b/third_party/WebKit/Source/core/frame/UseCounter.h |
@@ -26,14 +26,16 @@ |
#ifndef UseCounter_h |
#define UseCounter_h |
+#include <v8.h> |
#include "core/CSSPropertyNames.h" |
#include "core/CoreExport.h" |
#include "core/css/parser/CSSParserMode.h" |
+#include "platform/heap/GarbageCollected.h" |
+#include "platform/heap/HeapAllocator.h" |
#include "platform/weborigin/KURL.h" |
#include "wtf/BitVector.h" |
#include "wtf/Noncopyable.h" |
#include "wtf/text/WTFString.h" |
-#include <v8.h> |
namespace blink { |
@@ -55,7 +57,8 @@ class StyleSheetContents; |
// "Automatically send usage statistics and crash reports to Google" setting |
// enabled: |
// http://www.google.com/chrome/intl/en/privacy.html |
- |
+// |
+// Changes on UseCounter are observable by UseCounter::Observer. |
class CORE_EXPORT UseCounter { |
DISALLOW_NEW(); |
WTF_MAKE_NONCOPYABLE(UseCounter); |
@@ -1467,6 +1470,19 @@ class CORE_EXPORT UseCounter { |
NumberOfFeatures, // This enum value must be last. |
}; |
+ // An interface to observe UseCounter changes. Note that this is never |
+ // notified when the counter is disabled by |m_muteCount| or |
+ // |m_disableReporting|. |
+ class Observer : public GarbageCollected<Observer> { |
+ public: |
+ // Notified when a feature is counted for the first time. This should return |
+ // true if it no longer needs to observe changes so that the counter can |
+ // remove a reference to the observer and stop notifications. |
+ virtual bool onCountFeature(Feature) = 0; |
+ |
+ DEFINE_INLINE_VIRTUAL_TRACE() {} |
+ }; |
+ |
// "count" sets the bit for this feature to 1. Repeated calls are ignored. |
static void count(const Frame*, Feature); |
static void count(const Document&, Feature); |
@@ -1487,6 +1503,9 @@ class CORE_EXPORT UseCounter { |
static bool isCounted(Document&, const String&); |
bool isCounted(CSSPropertyID unresolvedProperty); |
+ // Retains a reference to the observer to notify of UseCounter changes. |
+ void addObserver(Observer*); |
+ |
// Invoked when a new document is loaded into the main frame of the page. |
void didCommitLoad(KURL); |
@@ -1503,7 +1522,14 @@ class CORE_EXPORT UseCounter { |
// reporting disabled. |
bool hasRecordedMeasurement(Feature) const; |
+ DECLARE_TRACE(); |
+ |
private: |
+ // Notifies that a feature is newly counted to |m_observers|. This shouldn't |
+ // be called when the counter is disabled by |m_muteCount| or |
+ // |m_disableReporting|. |
+ void notifyFeatureCounted(Feature); |
+ |
EnumerationHistogram& featuresHistogram() const; |
EnumerationHistogram& cssHistogram() const; |
@@ -1521,6 +1547,8 @@ class CORE_EXPORT UseCounter { |
BitVector m_featuresRecorded; |
BitVector m_CSSRecorded; |
+ HeapHashSet<Member<Observer>> m_observers; |
+ |
// Encapsulates the work to preserve the old "FeatureObserver" histogram with |
// original semantics |
// TODO(rbyers): remove this - http://crbug.com/676837 |