Changeset 217583 in webkit


Ignore:
Timestamp:
May 30, 2017 4:32:00 PM (7 years ago)
Author:
commit-queue@webkit.org
Message:

Add support for Certificate and IceCandidatePair stats
https://bugs.webkit.org/show_bug.cgi?id=172734

Patch by Youenn Fablet <youenn@apple.com> on 2017-05-30
Reviewed by Geoff Garen.

Source/WebCore:

Covered by updated test.

Adding support for these two stats in the IDL and in the libwebrtc binding code.

  • Modules/mediastream/RTCStatsReport.h:

(WebCore::RTCStatsReport::IceCandidatePairStats::IceCandidatePairStats):
(WebCore::RTCStatsReport::CertificateStats::CertificateStats):

  • Modules/mediastream/RTCStatsReport.idl:
  • Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:

(WebCore::iceCandidatePairState):
(WebCore::fillRTCIceCandidatePairStats):
(WebCore::fillRTCCertificateStats):
(WebCore::LibWebRTCMediaEndpoint::StatsCollector::OnStatsDelivered):

LayoutTests:

  • webrtc/video-stats.html:
Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r217576 r217583  
     12017-05-30  Youenn Fablet  <youenn@apple.com>
     2
     3        Add support for Certificate and IceCandidatePair stats
     4        https://bugs.webkit.org/show_bug.cgi?id=172734
     5
     6        Reviewed by Geoff Garen.
     7
     8        * webrtc/video-stats.html:
     9
    1102017-05-30  Chris Dumez  <cdumez@apple.com>
    211
  • trunk/LayoutTests/webrtc/video-stats.html

    r217519 r217583  
    1010        <script src ="routines.js"></script>
    1111        <script>
     12function getStatsType(connection)
     13{
     14    return connection.getStats().then((report) => {
     15        var reportTypes = [];
     16        report.forEach((statItem) => {
     17            if (reportTypes.indexOf(statItem.type) === -1)
     18                reportTypes.push(statItem.type);
     19        });
     20        return reportTypes.sort();
     21    });
     22}
    1223
    1324function checkStatsReportIterator(report)
     
    115126    }).then(() => {
    116127        return checkOutboundFramesNumberIncreased(firstConnection, statsFirstConnection, 0);
     128    }).then(() => {
     129        return getStatsType(firstConnection);
     130    }).then((types) => {
     131        assert_array_equals(types, ["candidate-pair", "certificate", "outbound-rtp"]);
     132    }).then(() => {
     133        return getStatsType(secondConnection);
     134    }).then((types) => {
     135        assert_array_equals(types, ["candidate-pair", "certificate", "inbound-rtp", "track"]);
    117136    });
    118137}, "Basic video stats");
  • trunk/Source/WebCore/ChangeLog

    r217582 r217583  
     12017-05-30  Youenn Fablet  <youenn@apple.com>
     2
     3        Add support for Certificate and IceCandidatePair stats
     4        https://bugs.webkit.org/show_bug.cgi?id=172734
     5
     6        Reviewed by Geoff Garen.
     7
     8        Covered by updated test.
     9
     10        Adding support for these two stats in the IDL and in the libwebrtc binding code.
     11
     12        * Modules/mediastream/RTCStatsReport.h:
     13        (WebCore::RTCStatsReport::IceCandidatePairStats::IceCandidatePairStats):
     14        (WebCore::RTCStatsReport::CertificateStats::CertificateStats):
     15        * Modules/mediastream/RTCStatsReport.idl:
     16        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
     17        (WebCore::iceCandidatePairState):
     18        (WebCore::fillRTCIceCandidatePairStats):
     19        (WebCore::fillRTCCertificateStats):
     20        (WebCore::LibWebRTCMediaEndpoint::StatsCollector::OnStatsDelivered):
     21
    1222017-05-30  Jiewen Tan  <jiewen_tan@apple.com>
    223
  • trunk/Source/WebCore/Modules/mediastream/RTCStatsReport.h

    r217519 r217583  
    152152    };
    153153
     154    enum class IceCandidatePairState {
     155        Frozen,
     156        Waiting,
     157        Inprogress,
     158        Failed,
     159        Succeeded,
     160        Cancelled
     161    };
     162
     163    struct IceCandidatePairStats : Stats {
     164        IceCandidatePairStats() { type = RTCStatsReport::Type::CandidatePair; }
     165
     166        String transportId;
     167        String localCandidateId;
     168        String remoteCandidateId;
     169        IceCandidatePairState state;
     170        unsigned long long priority { 0 };
     171        bool nominated { false };
     172        bool writable { false };
     173        bool readable { false };
     174        unsigned long long bytesSent { 0 };
     175        unsigned long long bytesReceived { 0 };
     176        double totalRoundTripTime { 0 };
     177        double currentRoundTripTime { 0 };
     178        double availableOutgoingBitrate { 0 };
     179        double availableIncomingBitrate { 0 };
     180        unsigned long long requestsReceived { 0 };
     181        unsigned long long requestsSent { 0 };
     182        unsigned long long responsesReceived { 0 };
     183        unsigned long long responsesSent { 0 };
     184        unsigned long long retransmissionsReceived { 0 };
     185        unsigned long long retransmissionsSent { 0 };
     186        unsigned long long consentRequestsReceived { 0 };
     187        unsigned long long consentRequestsSent { 0 };
     188        unsigned long long consentResponsesReceived { 0 };
     189        unsigned long long consentResponsesSent { 0 };
     190    };
     191
     192    struct CertificateStats : Stats {
     193        CertificateStats() { type = RTCStatsReport::Type::Certificate; }
     194
     195        String fingerprint;
     196        String fingerprintAlgorithm;
     197        String base64Certificate;
     198        String issuerCertificateId;
     199    };
     200
    154201private:
    155202    RTCStatsReport() = default;
  • trunk/Source/WebCore/Modules/mediastream/RTCStatsReport.idl

    r217519 r217583  
    134134};
    135135
     136enum RTCStatsIceCandidatePairState {
     137    "frozen",
     138    "waiting",
     139    "inprogress",
     140    "failed",
     141    "succeeded",
     142    "cancelled"
     143};
     144
     145[ JSGenerateToJSObject ]
     146dictionary RTCIceCandidatePairStats : RTCStats {
     147    DOMString transportId;
     148    DOMString localCandidateId;
     149    DOMString remoteCandidateId;
     150    RTCStatsIceCandidatePairState state;
     151    unsigned long long priority;
     152    boolean nominated;
     153    boolean writable;
     154    boolean readable;
     155    unsigned long long bytesSent;
     156    unsigned long long bytesReceived;
     157    double totalRoundTripTime;
     158    double currentRoundTripTime;
     159    double availableOutgoingBitrate;
     160    double availableIncomingBitrate;
     161    unsigned long long requestsReceived;
     162    unsigned long long requestsSent;
     163    unsigned long long responsesReceived;
     164    unsigned long long responsesSent;
     165    // FIXME: Expose other fields once libwebrtc support them.
     166};
     167
     168[ JSGenerateToJSObject ]
     169dictionary RTCCertificateStats : RTCStats {
     170    DOMString fingerprint;
     171    DOMString fingerprintAlgorithm;
     172    DOMString base64Certificate;
     173    DOMString issuerCertificateId;
     174};
     175
    136176// FIXME 169662: missing RTCCodecStats
    137177// FIXME 169662: missing RTCPeerConnectionStats
     
    139179// FIXME 169662: missing RTCTransportStats
    140180// FIXME 169662: missing RTCIceCandidateStats
    141 // FIXME 169662: missing RTCIceCandidatePairStats
    142181// FIXME 169662: missing RTCStatsIceCandidatePairState
    143 // FIXME 169662: missing RTCCertificateStats
  • trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp

    r217519 r217583  
    387387}
    388388
     389static inline RTCStatsReport::IceCandidatePairState iceCandidatePairState(const std::string& state)
     390{
     391    if (state == "frozen")
     392        return RTCStatsReport::IceCandidatePairState::Frozen;
     393    if (state == "waiting")
     394        return RTCStatsReport::IceCandidatePairState::Waiting;
     395    if (state == "in-progress")
     396        return RTCStatsReport::IceCandidatePairState::Inprogress;
     397    if (state == "failed")
     398        return RTCStatsReport::IceCandidatePairState::Failed;
     399    if (state == "succeeded")
     400        return RTCStatsReport::IceCandidatePairState::Succeeded;
     401    if (state == "cancelled")
     402        return RTCStatsReport::IceCandidatePairState::Cancelled;
     403    ASSERT_NOT_REACHED();
     404    return RTCStatsReport::IceCandidatePairState::Frozen;
     405}
     406
     407static inline void fillRTCIceCandidatePairStats(RTCStatsReport::IceCandidatePairStats& stats, const webrtc::RTCIceCandidatePairStats& rtcStats)
     408{
     409    fillRTCStats(stats, rtcStats);
     410
     411    if (rtcStats.transport_id.is_defined())
     412        stats.transportId = fromStdString(*rtcStats.transport_id);
     413    if (rtcStats.local_candidate_id.is_defined())
     414        stats.localCandidateId = fromStdString(*rtcStats.local_candidate_id);
     415    if (rtcStats.remote_candidate_id.is_defined())
     416        stats.remoteCandidateId = fromStdString(*rtcStats.remote_candidate_id);
     417    if (rtcStats.state.is_defined())
     418        stats.state = iceCandidatePairState(*rtcStats.state);
     419
     420    if (rtcStats.priority.is_defined())
     421        stats.priority = *rtcStats.priority;
     422    if (rtcStats.nominated.is_defined())
     423        stats.nominated = *rtcStats.nominated;
     424    if (rtcStats.writable.is_defined())
     425        stats.writable = *rtcStats.writable;
     426    if (rtcStats.readable.is_defined())
     427        stats.readable = *rtcStats.readable;
     428
     429    if (rtcStats.bytes_sent.is_defined())
     430        stats.bytesSent = *rtcStats.bytes_sent;
     431    if (rtcStats.bytes_received.is_defined())
     432        stats.bytesReceived = *rtcStats.bytes_received;
     433    if (rtcStats.total_round_trip_time.is_defined())
     434        stats.totalRoundTripTime = *rtcStats.total_round_trip_time;
     435    if (rtcStats.current_round_trip_time.is_defined())
     436        stats.currentRoundTripTime = *rtcStats.current_round_trip_time;
     437    if (rtcStats.available_outgoing_bitrate.is_defined())
     438        stats.availableOutgoingBitrate = *rtcStats.available_outgoing_bitrate;
     439    if (rtcStats.available_incoming_bitrate.is_defined())
     440        stats.availableIncomingBitrate = *rtcStats.available_incoming_bitrate;
     441
     442    if (rtcStats.requests_received.is_defined())
     443        stats.requestsReceived = *rtcStats.requests_received;
     444    if (rtcStats.requests_sent.is_defined())
     445        stats.requestsSent = *rtcStats.requests_sent;
     446    if (rtcStats.responses_received.is_defined())
     447        stats.responsesReceived = *rtcStats.responses_received;
     448    if (rtcStats.responses_sent.is_defined())
     449        stats.responsesSent = *rtcStats.responses_sent;
     450
     451    if (rtcStats.requests_received.is_defined())
     452        stats.retransmissionsReceived = *rtcStats.requests_received;
     453    if (rtcStats.requests_sent.is_defined())
     454        stats.retransmissionsSent = *rtcStats.requests_sent;
     455    if (rtcStats.responses_received.is_defined())
     456        stats.consentRequestsReceived = *rtcStats.responses_received;
     457    if (rtcStats.responses_sent.is_defined())
     458        stats.consentRequestsSent = *rtcStats.responses_sent;
     459    if (rtcStats.responses_received.is_defined())
     460        stats.consentResponsesReceived = *rtcStats.responses_received;
     461    if (rtcStats.responses_sent.is_defined())
     462        stats.consentResponsesSent = *rtcStats.responses_sent;
     463}
     464
     465static inline void fillRTCCertificateStats(RTCStatsReport::CertificateStats& stats, const webrtc::RTCCertificateStats& rtcStats)
     466{
     467    fillRTCStats(stats, rtcStats);
     468
     469    if (rtcStats.fingerprint.is_defined())
     470        stats.fingerprint = fromStdString(*rtcStats.fingerprint);
     471    if (rtcStats.fingerprint_algorithm.is_defined())
     472        stats.fingerprintAlgorithm = fromStdString(*rtcStats.fingerprint_algorithm);
     473    if (rtcStats.base64_certificate.is_defined())
     474        stats.base64Certificate = fromStdString(*rtcStats.base64_certificate);
     475    if (rtcStats.issuer_certificate_id.is_defined())
     476        stats.issuerCertificateId = fromStdString(*rtcStats.issuer_certificate_id);
     477}
     478
    389479void LibWebRTCMediaEndpoint::StatsCollector::OnStatsDelivered(const rtc::scoped_refptr<const webrtc::RTCStatsReport>& rtcReport)
    390480{
     
    414504                fillRTCDataChannelStats(stats, static_cast<const webrtc::RTCDataChannelStats&>(rtcStats));
    415505                report->addStats<IDLDictionary<RTCStatsReport::DataChannelStats>>(WTFMove(stats));
     506            } else if (rtcStats.type() == webrtc::RTCIceCandidatePairStats::kType) {
     507                RTCStatsReport::IceCandidatePairStats stats;
     508                fillRTCIceCandidatePairStats(stats, static_cast<const webrtc::RTCIceCandidatePairStats&>(rtcStats));
     509                report->addStats<IDLDictionary<RTCStatsReport::IceCandidatePairStats>>(WTFMove(stats));
     510            } else if (rtcStats.type() == webrtc::RTCCertificateStats::kType) {
     511                RTCStatsReport::CertificateStats stats;
     512                fillRTCCertificateStats(stats, static_cast<const webrtc::RTCCertificateStats&>(rtcStats));
     513                report->addStats<IDLDictionary<RTCStatsReport::CertificateStats>>(WTFMove(stats));
    416514            }
    417515        }
Note: See TracChangeset for help on using the changeset viewer.