From 7ef0c1aff5fecb44569f5fb9049e255c448b0347 Mon Sep 17 00:00:00 2001 From: Evan Shrubsole Date: Mon, 31 Oct 2022 11:05:33 +0000 Subject: [PATCH] Implement RTCNonStandardStatsMember using StatExposureCriteria MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a new StatExposureCriteria for non-standard stats. This removes the virtual call to is_standardized() which can simply use the StatExposureCriteria. Bug: webrtc:14546 Change-Id: If4174019ff8cc6559ab0dc9a04e0f8a6631b9842 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/279045 Reviewed-by: Harald Alvestrand Reviewed-by: Henrik Boström Commit-Queue: Evan Shrubsole Reviewed-by: Mirko Bonadei Cr-Commit-Position: refs/heads/main@{#39057} --- api/stats/rtc_stats.h | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/api/stats/rtc_stats.h b/api/stats/rtc_stats.h index abe2a5bcbf..a08d4bd8f9 100644 --- a/api/stats/rtc_stats.h +++ b/api/stats/rtc_stats.h @@ -229,6 +229,8 @@ enum class StatExposureCriteria : uint8_t { // to JavaScript. The requirements for exposure are written in the spec at // https://w3c.github.io/webrtc-stats/#limiting-exposure-of-hardware-capabilities. kHardwareCapability, + // The stat is non-standard so user agents should filter these. + kNonStandard, }; // Interface for `RTCStats` members, which have a name and a value of a type @@ -268,7 +270,9 @@ class RTCStatsMemberInterface { virtual bool is_defined() const = 0; // Is this part of the stats spec? Used so that chromium can easily filter // out anything unstandardized. - virtual bool is_standardized() const = 0; + bool is_standardized() const { + return exposure_criteria() != StatExposureCriteria::kNonStandard; + } // Non-standard stats members can have group IDs in order to be exposed in // JavaScript through experiments. Standardized stats have no group IDs. virtual std::vector group_ids() const { return {}; } @@ -330,7 +334,6 @@ class RTCStatsMember : public RTCStatsMemberInterface { bool is_sequence() const override; bool is_string() const override; bool is_defined() const override { return value_.has_value(); } - bool is_standardized() const override { return true; } std::string ValueToString() const override; std::string ValueToJson() const override; @@ -500,35 +503,40 @@ extern template class RTC_EXPORT_TEMPLATE_DECLARE(RTC_EXPORT) // Using inheritance just so that it's obvious from the member's declaration // whether it's standardized or not. template -class RTCNonStandardStatsMember : public RTCStatsMember { +class RTCNonStandardStatsMember + : public RTCRestrictedStatsMember { public: explicit RTCNonStandardStatsMember(const char* name) - : RTCStatsMember(name) {} + : RTCRestrictedStatsBase(name) {} RTCNonStandardStatsMember(const char* name, std::initializer_list group_ids) - : RTCStatsMember(name), group_ids_(group_ids) {} + : RTCRestrictedStatsBase(name), group_ids_(group_ids) {} RTCNonStandardStatsMember(const char* name, const T& value) - : RTCStatsMember(name, value) {} + : RTCRestrictedStatsBase(name, value) {} RTCNonStandardStatsMember(const char* name, T&& value) - : RTCStatsMember(name, std::move(value)) {} - explicit RTCNonStandardStatsMember(const RTCNonStandardStatsMember& other) - : RTCStatsMember(other), group_ids_(other.group_ids_) {} - explicit RTCNonStandardStatsMember(RTCNonStandardStatsMember&& other) - : RTCStatsMember(std::move(other)), + : RTCRestrictedStatsBase(name, std::move(value)) {} + RTCNonStandardStatsMember(const RTCNonStandardStatsMember& other) + : RTCRestrictedStatsBase(other), group_ids_(other.group_ids_) {} + RTCNonStandardStatsMember(RTCNonStandardStatsMember&& other) + : RTCRestrictedStatsBase(std::move(other)), group_ids_(std::move(other.group_ids_)) {} - bool is_standardized() const override { return false; } - std::vector group_ids() const override { return group_ids_; } - T& operator=(const T& value) { return RTCStatsMember::operator=(value); } + T& operator=(const T& value) { + return RTCRestrictedStatsMember< + T, StatExposureCriteria::kNonStandard>::operator=(value); + } T& operator=(const T&& value) { - return RTCStatsMember::operator=(std::move(value)); + return RTCRestrictedStatsMember< + T, StatExposureCriteria::kNonStandard>::operator=(std::move(value)); } private: + using RTCRestrictedStatsBase = + RTCRestrictedStatsMember; std::vector group_ids_; };