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

Unified 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, 3 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/peerconnection/RTCStatsReport.cpp
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCStatsReport.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCStatsReport.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f31b31d2e7ba65331ad7a7f11d630f0b8ae90613
--- /dev/null
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCStatsReport.cpp
@@ -0,0 +1,142 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "modules/peerconnection/RTCStatsReport.h"
+
+namespace blink {
+
+namespace {
+
+template<typename T>
+bool addPropertyValue(v8::Local<v8::Object>& v8Object, v8::Isolate* isolate, T name, v8::Local<v8::Value> value)
+{
+ return v8CallBoolean(v8Object->CreateDataProperty(isolate->GetCurrentContext(), v8String(isolate, name), value));
+}
+
+template<typename T>
+bool addPropertySequenceOfNumbers(v8::Local<v8::Object>& v8Object, v8::Isolate* isolate, WebString name, const WebVector<T>& webVector)
+{
+ v8::Local<v8::Array> v8Array = v8::Array::New(isolate, webVector.size());
+ for (size_t i = 0; i < webVector.size(); ++i) {
+ if (!v8CallBoolean(v8Array->CreateDataProperty(isolate->GetCurrentContext(), static_cast<uint32_t>(i), v8::Number::New(isolate, static_cast<double>(webVector[i])))))
+ return false;
+ }
+ return addPropertyValue(v8Object, isolate, name, v8Array);
+}
+
+bool addPropertySequenceOfStrings(v8::Local<v8::Object>& v8Object, v8::Isolate* isolate, WebString name, const WebVector<WebString>& webVector)
+{
+ v8::Local<v8::Array> v8Array = v8::Array::New(isolate, webVector.size());
+ for (size_t i = 0; i < webVector.size(); ++i) {
+ if (!v8CallBoolean(v8Array->CreateDataProperty(isolate->GetCurrentContext(), static_cast<uint32_t>(i), v8String(isolate, webVector[i]))))
+ return false;
+ }
+ return addPropertyValue(v8Object, isolate, name, v8Array);
+}
+
+v8::Local<v8::Value> webRTCStatsToValue(ScriptState* scriptState, const WebRTCStats* stats)
+{
+ v8::Isolate* isolate = scriptState->isolate();
+ v8::Local<v8::Object> v8Object = v8::Object::New(isolate);
+
+ bool success = true;
+ success &= addPropertyValue(v8Object, isolate, "id", v8String(isolate, stats->id()));
+ success &= addPropertyValue(v8Object, isolate, "timestamp", v8::Number::New(isolate, stats->timestamp()));
+ success &= addPropertyValue(v8Object, isolate, "type", v8String(isolate, stats->type()));
+ for (size_t i = 0; i < stats->membersCount() && success; ++i) {
+ std::unique_ptr<WebRTCStatsMember> member = stats->getMember(i);
+ if (!member->isDefined())
+ continue;
+ WebString name = member->name();
+ switch (member->type()) {
+ case WebRTCStatsMemberTypeInt32:
+ success &= addPropertyValue(v8Object, isolate, name, v8::Number::New(isolate, static_cast<double>(member->valueInt32())));
+ break;
+ case WebRTCStatsMemberTypeUint32:
+ success &= addPropertyValue(v8Object, isolate, name, v8::Number::New(isolate, static_cast<double>(member->valueUint32())));
+ break;
+ case WebRTCStatsMemberTypeInt64:
+ success &= addPropertyValue(v8Object, isolate, name, v8::Number::New(isolate, static_cast<double>(member->valueInt64())));
+ break;
+ case WebRTCStatsMemberTypeUint64:
+ success &= addPropertyValue(v8Object, isolate, name, v8::Number::New(isolate, static_cast<double>(member->valueUint64())));
+ break;
+ case WebRTCStatsMemberTypeDouble:
+ success &= addPropertyValue(v8Object, isolate, name, v8::Number::New(isolate, member->valueDouble()));
+ break;
+ case WebRTCStatsMemberTypeString:
+ success &= addPropertyValue(v8Object, isolate, name, v8String(isolate, member->valueString()));
+ break;
+ case WebRTCStatsMemberTypeSequenceInt32:
+ success &= addPropertySequenceOfNumbers(v8Object, isolate, name, member->valueSequenceInt32());
+ break;
+ case WebRTCStatsMemberTypeSequenceUint32:
+ success &= addPropertySequenceOfNumbers(v8Object, isolate, name, member->valueSequenceUint32());
+ break;
+ case WebRTCStatsMemberTypeSequenceInt64:
+ success &= addPropertySequenceOfNumbers(v8Object, isolate, name, member->valueSequenceInt64());
+ break;
+ case WebRTCStatsMemberTypeSequenceUint64:
+ success &= addPropertySequenceOfNumbers(v8Object, isolate, name, member->valueSequenceUint64());
+ break;
+ case WebRTCStatsMemberTypeSequenceDouble:
+ success &= addPropertySequenceOfNumbers(v8Object, isolate, name, member->valueSequenceDouble());
+ break;
+ case WebRTCStatsMemberTypeSequenceString:
+ success &= addPropertySequenceOfStrings(v8Object, isolate, name, member->valueSequenceString());
+ break;
+ default:
+ NOTREACHED();
+ }
+ }
+ if (!success) {
+ NOTREACHED();
+ return v8::Undefined(isolate);
+ }
+ return v8Object;
+}
+
+class RTCStatsReportIterationSource final : public PairIterable<String, v8::Local<v8::Value>>::IterationSource {
+public:
+ RTCStatsReportIterationSource(std::unique_ptr<WebRTCStatsReport> report)
+ : m_report(std::move(report))
+ {
+ }
+
+ bool next(ScriptState* scriptState, String& key, v8::Local<v8::Value>& value, ExceptionState& exceptionState) override
+ {
+ std::unique_ptr<WebRTCStats> stats = m_report->next();
+ if (!stats)
+ return false;
+ key = stats->id();
+ value = webRTCStatsToValue(scriptState, stats.get());
+ return true;
+ }
+
+private:
+ std::unique_ptr<WebRTCStatsReport> m_report;
+};
+
+} // namespace
+
+RTCStatsReport::RTCStatsReport(std::unique_ptr<WebRTCStatsReport> report)
+ : m_report(std::move(report))
+{
+}
+
+PairIterable<String, v8::Local<v8::Value>>::IterationSource* RTCStatsReport::startIteration(ScriptState*, ExceptionState&)
+{
+ return new RTCStatsReportIterationSource(m_report->copyHandle());
+}
+
+bool RTCStatsReport::getMapEntry(ScriptState* scriptState, const String& key, v8::Local<v8::Value>& value, ExceptionState&)
+{
+ std::unique_ptr<WebRTCStats> stats = m_report->getStats(key);
+ if (!stats)
+ return false;
+ value = webRTCStatsToValue(scriptState, stats.get());
+ return true;
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698