Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: third_party/WebKit/Source/modules/peerconnection/RTCStatsReport.cpp

Issue 2363673002: Promise-based RTCPeerConnection::getStats implementation. (Closed)
Patch Set: RTCStatsReport.idl behind getStats-flag instead of updating virtual/stable/webexposed/global-interf… Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "modules/peerconnection/RTCStatsReport.h"
6
7 namespace blink {
8
9 namespace {
10
11 template<typename T>
12 bool addPropertyValue(v8::Local<v8::Object>& v8Object, v8::Isolate* isolate, T n ame, v8::Local<v8::Value> value)
13 {
14 return v8CallBoolean(v8Object->CreateDataProperty(isolate->GetCurrentContext (), v8String(isolate, name), value));
15 }
16
17 template<typename T>
18 bool addPropertySequenceOfNumbers(v8::Local<v8::Object>& v8Object, v8::Isolate* isolate, WebString name, const WebVector<T>& webVector)
19 {
20 v8::Local<v8::Array> v8Array = v8::Array::New(isolate, webVector.size());
21 for (size_t i = 0; i < webVector.size(); ++i) {
22 if (!v8CallBoolean(v8Array->CreateDataProperty(isolate->GetCurrentContex t(), static_cast<uint32_t>(i), v8::Number::New(isolate, static_cast<double>(webV ector[i])))))
23 return false;
24 }
25 return addPropertyValue(v8Object, isolate, name, v8Array);
26 }
27
28 bool addPropertySequenceOfStrings(v8::Local<v8::Object>& v8Object, v8::Isolate* isolate, WebString name, const WebVector<WebString>& webVector)
29 {
30 v8::Local<v8::Array> v8Array = v8::Array::New(isolate, webVector.size());
31 for (size_t i = 0; i < webVector.size(); ++i) {
32 if (!v8CallBoolean(v8Array->CreateDataProperty(isolate->GetCurrentContex t(), static_cast<uint32_t>(i), v8String(isolate, webVector[i]))))
33 return false;
34 }
35 return addPropertyValue(v8Object, isolate, name, v8Array);
36 }
37
38 v8::Local<v8::Value> webRTCStatsToValue(ScriptState* scriptState, const WebRTCSt ats* stats)
39 {
40 v8::Isolate* isolate = scriptState->isolate();
41 v8::Local<v8::Object> v8Object = v8::Object::New(isolate);
42
43 bool success = true;
44 success &= addPropertyValue(v8Object, isolate, "id", v8String(isolate, stats ->id()));
45 success &= addPropertyValue(v8Object, isolate, "timestamp", v8::Number::New( isolate, stats->timestamp()));
46 success &= addPropertyValue(v8Object, isolate, "type", v8String(isolate, sta ts->type()));
47 for (size_t i = 0; i < stats->membersCount() && success; ++i) {
48 std::unique_ptr<WebRTCStatsMember> member = stats->getMember(i);
49 if (!member->isDefined())
50 continue;
51 WebString name = member->name();
52 switch (member->type()) {
53 case WebRTCStatsMemberTypeInt32:
54 success &= addPropertyValue(v8Object, isolate, name, v8::Number::New (isolate, static_cast<double>(member->valueInt32())));
55 break;
56 case WebRTCStatsMemberTypeUint32:
57 success &= addPropertyValue(v8Object, isolate, name, v8::Number::New (isolate, static_cast<double>(member->valueUint32())));
58 break;
59 case WebRTCStatsMemberTypeInt64:
60 success &= addPropertyValue(v8Object, isolate, name, v8::Number::New (isolate, static_cast<double>(member->valueInt64())));
61 break;
62 case WebRTCStatsMemberTypeUint64:
63 success &= addPropertyValue(v8Object, isolate, name, v8::Number::New (isolate, static_cast<double>(member->valueUint64())));
64 break;
65 case WebRTCStatsMemberTypeDouble:
66 success &= addPropertyValue(v8Object, isolate, name, v8::Number::New (isolate, member->valueDouble()));
67 break;
68 case WebRTCStatsMemberTypeString:
69 success &= addPropertyValue(v8Object, isolate, name, v8String(isolat e, member->valueString()));
70 break;
71 case WebRTCStatsMemberTypeSequenceInt32:
72 success &= addPropertySequenceOfNumbers(v8Object, isolate, name, mem ber->valueSequenceInt32());
73 break;
74 case WebRTCStatsMemberTypeSequenceUint32:
75 success &= addPropertySequenceOfNumbers(v8Object, isolate, name, mem ber->valueSequenceUint32());
76 break;
77 case WebRTCStatsMemberTypeSequenceInt64:
78 success &= addPropertySequenceOfNumbers(v8Object, isolate, name, mem ber->valueSequenceInt64());
79 break;
80 case WebRTCStatsMemberTypeSequenceUint64:
81 success &= addPropertySequenceOfNumbers(v8Object, isolate, name, mem ber->valueSequenceUint64());
82 break;
83 case WebRTCStatsMemberTypeSequenceDouble:
84 success &= addPropertySequenceOfNumbers(v8Object, isolate, name, mem ber->valueSequenceDouble());
85 break;
86 case WebRTCStatsMemberTypeSequenceString:
87 success &= addPropertySequenceOfStrings(v8Object, isolate, name, mem ber->valueSequenceString());
88 break;
89 default:
90 NOTREACHED();
91 }
92 }
93 if (!success) {
94 NOTREACHED();
95 return v8::Undefined(isolate);
96 }
97 return v8Object;
98 }
99
100 class RTCStatsReportIterationSource final : public PairIterable<String, v8::Loca l<v8::Value>>::IterationSource {
101 public:
102 RTCStatsReportIterationSource(std::unique_ptr<WebRTCStatsReport> report)
103 : m_report(std::move(report))
104 {
105 }
106
107 bool next(ScriptState* scriptState, String& key, v8::Local<v8::Value>& value , ExceptionState& exceptionState) override
108 {
109 std::unique_ptr<WebRTCStats> stats = m_report->next();
110 if (!stats)
111 return false;
112 key = stats->id();
113 value = webRTCStatsToValue(scriptState, stats.get());
114 return true;
115 }
116
117 private:
118 std::unique_ptr<WebRTCStatsReport> m_report;
119 };
120
121 } // namespace
122
123 RTCStatsReport::RTCStatsReport(std::unique_ptr<WebRTCStatsReport> report)
124 : m_report(std::move(report))
125 {
126 }
127
128 PairIterable<String, v8::Local<v8::Value>>::IterationSource* RTCStatsReport::sta rtIteration(ScriptState*, ExceptionState&)
129 {
130 return new RTCStatsReportIterationSource(m_report->copyHandle());
131 }
132
133 bool RTCStatsReport::getMapEntry(ScriptState* scriptState, const String& key, v8 ::Local<v8::Value>& value, ExceptionState&)
134 {
135 std::unique_ptr<WebRTCStats> stats = m_report->getStats(key);
136 if (!stats)
137 return false;
138 value = webRTCStatsToValue(scriptState, stats.get());
139 return true;
140 }
141
142 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698