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 |