| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google, Inc. All rights reserved. | 2 * Copyright (C) 2012 Google, Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| 11 * documentation and/or other materials provided with the distribution. | 11 * documentation and/or other materials provided with the distribution. |
| 12 * | 12 * |
| 13 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY | 13 * THIS SOFTWARE IS PROVIDED BY GOOGLE INC. ``AS IS'' AND ANY |
| 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
| 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 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. | 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 24 */ | 24 */ |
| 25 | 25 |
| 26 #ifndef UseCounter_h | 26 #ifndef UseCounter_h |
| 27 #define UseCounter_h | 27 #define UseCounter_h |
| 28 | 28 |
| 29 #include <v8.h> |
| 29 #include "core/CSSPropertyNames.h" | 30 #include "core/CSSPropertyNames.h" |
| 30 #include "core/CoreExport.h" | 31 #include "core/CoreExport.h" |
| 31 #include "core/css/parser/CSSParserMode.h" | 32 #include "core/css/parser/CSSParserMode.h" |
| 33 #include "platform/heap/GarbageCollected.h" |
| 34 #include "platform/heap/HeapAllocator.h" |
| 32 #include "platform/weborigin/KURL.h" | 35 #include "platform/weborigin/KURL.h" |
| 33 #include "wtf/BitVector.h" | 36 #include "wtf/BitVector.h" |
| 34 #include "wtf/Noncopyable.h" | 37 #include "wtf/Noncopyable.h" |
| 35 #include "wtf/text/WTFString.h" | 38 #include "wtf/text/WTFString.h" |
| 36 #include <v8.h> | |
| 37 | 39 |
| 38 namespace blink { | 40 namespace blink { |
| 39 | 41 |
| 40 class CSSStyleSheet; | 42 class CSSStyleSheet; |
| 41 class Document; | 43 class Document; |
| 42 class EnumerationHistogram; | 44 class EnumerationHistogram; |
| 43 class ExecutionContext; | 45 class ExecutionContext; |
| 44 class Frame; | 46 class Frame; |
| 45 class StyleSheetContents; | 47 class StyleSheetContents; |
| 46 | 48 |
| 47 // UseCounter is used for counting the number of times features of | 49 // UseCounter is used for counting the number of times features of |
| 48 // Blink are used on real web pages and help us know commonly | 50 // Blink are used on real web pages and help us know commonly |
| 49 // features are used and thus when it's safe to remove or change them. | 51 // features are used and thus when it's safe to remove or change them. |
| 50 // | 52 // |
| 51 // The Chromium Content layer controls what is done with this data. | 53 // The Chromium Content layer controls what is done with this data. |
| 52 // | 54 // |
| 53 // For instance, in Google Chrome, these counts are submitted anonymously | 55 // For instance, in Google Chrome, these counts are submitted anonymously |
| 54 // through the UMA histogram recording system in Chrome for users who have the | 56 // through the UMA histogram recording system in Chrome for users who have the |
| 55 // "Automatically send usage statistics and crash reports to Google" setting | 57 // "Automatically send usage statistics and crash reports to Google" setting |
| 56 // enabled: | 58 // enabled: |
| 57 // http://www.google.com/chrome/intl/en/privacy.html | 59 // http://www.google.com/chrome/intl/en/privacy.html |
| 58 | 60 // |
| 61 // Changes on UseCounter are observable by UseCounter::Observer. |
| 59 class CORE_EXPORT UseCounter { | 62 class CORE_EXPORT UseCounter { |
| 60 DISALLOW_NEW(); | 63 DISALLOW_NEW(); |
| 61 WTF_MAKE_NONCOPYABLE(UseCounter); | 64 WTF_MAKE_NONCOPYABLE(UseCounter); |
| 62 | 65 |
| 63 public: | 66 public: |
| 64 enum Context { | 67 enum Context { |
| 65 DefaultContext, | 68 DefaultContext, |
| 66 // Counters for SVGImages (lifetime independent from other pages). | 69 // Counters for SVGImages (lifetime independent from other pages). |
| 67 SVGImageContext | 70 SVGImageContext |
| 68 }; | 71 }; |
| (...skipping 1391 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1460 V8DeprecatedStorageQuota_RequestQuota_Method = 1811, | 1463 V8DeprecatedStorageQuota_RequestQuota_Method = 1811, |
| 1461 V8FileReaderSync_Constructor = 1812, | 1464 V8FileReaderSync_Constructor = 1812, |
| 1462 | 1465 |
| 1463 // Add new features immediately above this line. Don't change assigned | 1466 // Add new features immediately above this line. Don't change assigned |
| 1464 // numbers of any item, and don't reuse removed slots. | 1467 // numbers of any item, and don't reuse removed slots. |
| 1465 // Also, run update_use_counter_feature_enum.py in | 1468 // Also, run update_use_counter_feature_enum.py in |
| 1466 // chromium/src/tools/metrics/histograms/ to update the UMA mapping. | 1469 // chromium/src/tools/metrics/histograms/ to update the UMA mapping. |
| 1467 NumberOfFeatures, // This enum value must be last. | 1470 NumberOfFeatures, // This enum value must be last. |
| 1468 }; | 1471 }; |
| 1469 | 1472 |
| 1473 // An interface to observe UseCounter changes. Note that this is never |
| 1474 // notified when the counter is disabled by |m_muteCount| or |
| 1475 // |m_disableReporting|. |
| 1476 class Observer : public GarbageCollected<Observer> { |
| 1477 public: |
| 1478 // Notified when a feature is counted for the first time. This should return |
| 1479 // true if it no longer needs to observe changes so that the counter can |
| 1480 // remove a reference to the observer and stop notifications. |
| 1481 virtual bool onCountFeature(Feature) = 0; |
| 1482 |
| 1483 DEFINE_INLINE_VIRTUAL_TRACE() {} |
| 1484 }; |
| 1485 |
| 1470 // "count" sets the bit for this feature to 1. Repeated calls are ignored. | 1486 // "count" sets the bit for this feature to 1. Repeated calls are ignored. |
| 1471 static void count(const Frame*, Feature); | 1487 static void count(const Frame*, Feature); |
| 1472 static void count(const Document&, Feature); | 1488 static void count(const Document&, Feature); |
| 1473 static void count(ExecutionContext*, Feature); | 1489 static void count(ExecutionContext*, Feature); |
| 1474 | 1490 |
| 1475 void count(CSSParserMode, CSSPropertyID); | 1491 void count(CSSParserMode, CSSPropertyID); |
| 1476 void count(Feature); | 1492 void count(Feature); |
| 1477 | 1493 |
| 1478 // Count only features if they're being used in an iframe which does not | 1494 // Count only features if they're being used in an iframe which does not |
| 1479 // have script access into the top level document. | 1495 // have script access into the top level document. |
| 1480 static void countCrossOriginIframe(const Document&, Feature); | 1496 static void countCrossOriginIframe(const Document&, Feature); |
| 1481 | 1497 |
| 1482 // Return whether the Feature was previously counted for this document. | 1498 // Return whether the Feature was previously counted for this document. |
| 1483 // NOTE: only for use in testing. | 1499 // NOTE: only for use in testing. |
| 1484 static bool isCounted(Document&, Feature); | 1500 static bool isCounted(Document&, Feature); |
| 1485 // Return whether the CSSPropertyID was previously counted for this document. | 1501 // Return whether the CSSPropertyID was previously counted for this document. |
| 1486 // NOTE: only for use in testing. | 1502 // NOTE: only for use in testing. |
| 1487 static bool isCounted(Document&, const String&); | 1503 static bool isCounted(Document&, const String&); |
| 1488 bool isCounted(CSSPropertyID unresolvedProperty); | 1504 bool isCounted(CSSPropertyID unresolvedProperty); |
| 1489 | 1505 |
| 1506 // Adds an observer to Document's UseCounter. UseCounter retains a reference |
| 1507 // to the observer. |
| 1508 static void addObserver(Document&, Observer*); |
| 1509 |
| 1490 // Invoked when a new document is loaded into the main frame of the page. | 1510 // Invoked when a new document is loaded into the main frame of the page. |
| 1491 void didCommitLoad(KURL); | 1511 void didCommitLoad(KURL); |
| 1492 | 1512 |
| 1493 static int mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyID); | 1513 static int mapCSSPropertyIdToCSSSampleIdForHistogram(CSSPropertyID); |
| 1494 | 1514 |
| 1495 // When muted, all calls to "count" functions are ignoed. May be nested. | 1515 // When muted, all calls to "count" functions are ignoed. May be nested. |
| 1496 void muteForInspector(); | 1516 void muteForInspector(); |
| 1497 void unmuteForInspector(); | 1517 void unmuteForInspector(); |
| 1498 | 1518 |
| 1499 void recordMeasurement(Feature); | 1519 void recordMeasurement(Feature); |
| 1500 | 1520 |
| 1501 // Return whether the feature has been seen since the last page load | 1521 // Return whether the feature has been seen since the last page load |
| 1502 // (except when muted). Does include features seen in documents which have | 1522 // (except when muted). Does include features seen in documents which have |
| 1503 // reporting disabled. | 1523 // reporting disabled. |
| 1504 bool hasRecordedMeasurement(Feature) const; | 1524 bool hasRecordedMeasurement(Feature) const; |
| 1505 | 1525 |
| 1526 DECLARE_TRACE(); |
| 1527 |
| 1506 private: | 1528 private: |
| 1529 // Notifies that a feature is newly counted to |m_observers|. This shouldn't |
| 1530 // be called when the counter is disabled by |m_muteCount| or |
| 1531 // |m_disableReporting|. |
| 1532 void notifyFeatureCounted(Feature); |
| 1533 |
| 1507 EnumerationHistogram& featuresHistogram() const; | 1534 EnumerationHistogram& featuresHistogram() const; |
| 1508 EnumerationHistogram& cssHistogram() const; | 1535 EnumerationHistogram& cssHistogram() const; |
| 1509 | 1536 |
| 1510 // If non-zero, ignore all 'count' calls completely. | 1537 // If non-zero, ignore all 'count' calls completely. |
| 1511 unsigned m_muteCount; | 1538 unsigned m_muteCount; |
| 1512 | 1539 |
| 1513 // If true, disable reporting all histogram entries. | 1540 // If true, disable reporting all histogram entries. |
| 1514 bool m_disableReporting; | 1541 bool m_disableReporting; |
| 1515 | 1542 |
| 1516 // The scope represented by this UseCounter instance. | 1543 // The scope represented by this UseCounter instance. |
| 1517 Context m_context; | 1544 Context m_context; |
| 1518 | 1545 |
| 1519 // Track what features/properties have been reported to the (non-legacy) | 1546 // Track what features/properties have been reported to the (non-legacy) |
| 1520 // histograms. | 1547 // histograms. |
| 1521 BitVector m_featuresRecorded; | 1548 BitVector m_featuresRecorded; |
| 1522 BitVector m_CSSRecorded; | 1549 BitVector m_CSSRecorded; |
| 1523 | 1550 |
| 1551 HeapHashSet<Member<Observer>> m_observers; |
| 1552 |
| 1524 // Encapsulates the work to preserve the old "FeatureObserver" histogram with | 1553 // Encapsulates the work to preserve the old "FeatureObserver" histogram with |
| 1525 // original semantics | 1554 // original semantics |
| 1526 // TODO(rbyers): remove this - http://crbug.com/676837 | 1555 // TODO(rbyers): remove this - http://crbug.com/676837 |
| 1527 class CORE_EXPORT LegacyCounter { | 1556 class CORE_EXPORT LegacyCounter { |
| 1528 public: | 1557 public: |
| 1529 LegacyCounter(); | 1558 LegacyCounter(); |
| 1530 ~LegacyCounter(); | 1559 ~LegacyCounter(); |
| 1531 void countFeature(Feature); | 1560 void countFeature(Feature); |
| 1532 void countCSS(CSSPropertyID); | 1561 void countCSS(CSSPropertyID); |
| 1533 void updateMeasurements(); | 1562 void updateMeasurements(); |
| 1534 | 1563 |
| 1535 private: | 1564 private: |
| 1536 // Tracks what features/properties need to be reported to the legacy | 1565 // Tracks what features/properties need to be reported to the legacy |
| 1537 // histograms. | 1566 // histograms. |
| 1538 BitVector m_featureBits; | 1567 BitVector m_featureBits; |
| 1539 BitVector m_CSSBits; | 1568 BitVector m_CSSBits; |
| 1540 } m_legacyCounter; | 1569 } m_legacyCounter; |
| 1541 }; | 1570 }; |
| 1542 | 1571 |
| 1543 } // namespace blink | 1572 } // namespace blink |
| 1544 | 1573 |
| 1545 #endif // UseCounter_h | 1574 #endif // UseCounter_h |
| OLD | NEW |