Commit 707a2ce3 authored by Jeremy Roman's avatar Jeremy Roman Committed by Commit Bot

Move RTCStatsReport to use V8ObjectBuilder.

Bug: 670615
Change-Id: Ia42b62d84082a431e615721cb0065d5d6b43fdd3
Reviewed-on: https://chromium-review.googlesource.com/c/1280856Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarHenrik Boström <hbos@chromium.org>
Commit-Queue: Jeremy Roman <jbroman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#600104}
parent eeb3c127
...@@ -4,153 +4,87 @@ ...@@ -4,153 +4,87 @@
#include "third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h" #include "third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h"
#include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h"
namespace blink { namespace blink {
namespace { namespace {
template <typename T> v8::Local<v8::Value> WebRTCStatsToValue(ScriptState* script_state,
bool AddPropertyValue(v8::Local<v8::Object>& v8_object, const WebRTCStats* stats) {
v8::Isolate* isolate, V8ObjectBuilder builder(script_state);
T name,
v8::Local<v8::Value> value) {
return V8CallBoolean(v8_object->CreateDataProperty(
isolate->GetCurrentContext(), V8String(isolate, name), value));
}
bool AddPropertySequenceOfBooleans(v8::Local<v8::Object>& v8_object,
v8::Isolate* isolate,
WebString name,
const WebVector<int>& web_vector) {
v8::Local<v8::Array> v8_array = v8::Array::New(isolate, web_vector.size());
for (size_t i = 0; i < web_vector.size(); ++i) {
if (!V8CallBoolean(v8_array->CreateDataProperty(
isolate->GetCurrentContext(), static_cast<uint32_t>(i),
v8::Boolean::New(isolate, static_cast<bool>(web_vector[i])))))
return false;
}
return AddPropertyValue(v8_object, isolate, name, v8_array);
}
template <typename T> builder.AddString("id", stats->Id());
bool AddPropertySequenceOfNumbers(v8::Local<v8::Object>& v8_object, builder.AddNumber("timestamp", stats->Timestamp());
v8::Isolate* isolate, builder.AddString("type", stats->GetType());
WebString name,
const WebVector<T>& web_vector) {
v8::Local<v8::Array> v8_array = v8::Array::New(isolate, web_vector.size());
for (size_t i = 0; i < web_vector.size(); ++i) {
if (!V8CallBoolean(v8_array->CreateDataProperty(
isolate->GetCurrentContext(), static_cast<uint32_t>(i),
v8::Number::New(isolate, static_cast<double>(web_vector[i])))))
return false;
}
return AddPropertyValue(v8_object, isolate, name, v8_array);
}
bool AddPropertySequenceOfStrings(v8::Local<v8::Object>& v8_object, auto add_vector = [&builder](const WebString& name, auto web_vector) {
v8::Isolate* isolate, Vector<typename decltype(web_vector)::value_type> vector(web_vector.size());
WebString name, std::move(web_vector.begin(), web_vector.end(), vector.begin());
const WebVector<WebString>& web_vector) { builder.Add(name, vector);
v8::Local<v8::Array> v8_array = v8::Array::New(isolate, web_vector.size()); };
for (size_t i = 0; i < web_vector.size(); ++i) {
if (!V8CallBoolean(v8_array->CreateDataProperty(
isolate->GetCurrentContext(), static_cast<uint32_t>(i),
V8String(isolate, web_vector[i]))))
return false;
}
return AddPropertyValue(v8_object, isolate, name, v8_array);
}
v8::Local<v8::Value> WebRTCStatsToValue(ScriptState* script_state, for (size_t i = 0; i < stats->MembersCount(); ++i) {
const WebRTCStats* stats) {
v8::Isolate* isolate = script_state->GetIsolate();
v8::Local<v8::Object> v8_object = v8::Object::New(isolate);
bool success = true;
success &= AddPropertyValue(v8_object, isolate, "id",
V8String(isolate, stats->Id()));
success &= AddPropertyValue(v8_object, isolate, "timestamp",
v8::Number::New(isolate, stats->Timestamp()));
success &= AddPropertyValue(v8_object, isolate, "type",
V8String(isolate, stats->GetType()));
for (size_t i = 0; i < stats->MembersCount() && success; ++i) {
std::unique_ptr<WebRTCStatsMember> member = stats->GetMember(i); std::unique_ptr<WebRTCStatsMember> member = stats->GetMember(i);
if (!member->IsDefined()) if (!member->IsDefined())
continue; continue;
WebString name = member->GetName(); WebString name = member->GetName();
switch (member->GetType()) { switch (member->GetType()) {
case kWebRTCStatsMemberTypeBool: case kWebRTCStatsMemberTypeBool:
success &= builder.AddBoolean(name, member->ValueBool());
AddPropertyValue(v8_object, isolate, name,
v8::Boolean::New(isolate, member->ValueBool()));
break; break;
case kWebRTCStatsMemberTypeInt32: case kWebRTCStatsMemberTypeInt32:
success &= AddPropertyValue( builder.AddNumber(name, static_cast<double>(member->ValueInt32()));
v8_object, isolate, name,
v8::Number::New(isolate,
static_cast<double>(member->ValueInt32())));
break; break;
case kWebRTCStatsMemberTypeUint32: case kWebRTCStatsMemberTypeUint32:
success &= AddPropertyValue( builder.AddNumber(name, static_cast<double>(member->ValueUint32()));
v8_object, isolate, name,
v8::Number::New(isolate,
static_cast<double>(member->ValueUint32())));
break; break;
case kWebRTCStatsMemberTypeInt64: case kWebRTCStatsMemberTypeInt64:
success &= AddPropertyValue( builder.AddNumber(name, static_cast<double>(member->ValueInt64()));
v8_object, isolate, name,
v8::Number::New(isolate,
static_cast<double>(member->ValueInt64())));
break; break;
case kWebRTCStatsMemberTypeUint64: case kWebRTCStatsMemberTypeUint64:
success &= AddPropertyValue( builder.AddNumber(name, static_cast<double>(member->ValueUint64()));
v8_object, isolate, name,
v8::Number::New(isolate,
static_cast<double>(member->ValueUint64())));
break; break;
case kWebRTCStatsMemberTypeDouble: case kWebRTCStatsMemberTypeDouble:
success &= builder.AddNumber(name, member->ValueDouble());
AddPropertyValue(v8_object, isolate, name,
v8::Number::New(isolate, member->ValueDouble()));
break; break;
case kWebRTCStatsMemberTypeString: case kWebRTCStatsMemberTypeString:
success &= AddPropertyValue(v8_object, isolate, name, builder.AddString(name, member->ValueString());
V8String(isolate, member->ValueString()));
break; break;
case kWebRTCStatsMemberTypeSequenceBool: case kWebRTCStatsMemberTypeSequenceBool: {
success &= AddPropertySequenceOfBooleans(v8_object, isolate, name, WebVector<int> sequence = member->ValueSequenceBool();
member->ValueSequenceBool()); Vector<bool> vector(sequence.size());
std::copy(sequence.begin(), sequence.end(), vector.begin());
builder.Add(name, vector);
break; break;
}
case kWebRTCStatsMemberTypeSequenceInt32: case kWebRTCStatsMemberTypeSequenceInt32:
success &= AddPropertySequenceOfNumbers(v8_object, isolate, name, add_vector(name, member->ValueSequenceInt32());
member->ValueSequenceInt32());
break; break;
case kWebRTCStatsMemberTypeSequenceUint32: case kWebRTCStatsMemberTypeSequenceUint32:
success &= AddPropertySequenceOfNumbers(v8_object, isolate, name, add_vector(name, member->ValueSequenceUint32());
member->ValueSequenceUint32());
break; break;
case kWebRTCStatsMemberTypeSequenceInt64: case kWebRTCStatsMemberTypeSequenceInt64:
success &= AddPropertySequenceOfNumbers(v8_object, isolate, name, add_vector(name, member->ValueSequenceInt64());
member->ValueSequenceInt64());
break; break;
case kWebRTCStatsMemberTypeSequenceUint64: case kWebRTCStatsMemberTypeSequenceUint64:
success &= AddPropertySequenceOfNumbers(v8_object, isolate, name, add_vector(name, member->ValueSequenceUint64());
member->ValueSequenceUint64());
break; break;
case kWebRTCStatsMemberTypeSequenceDouble: case kWebRTCStatsMemberTypeSequenceDouble:
success &= AddPropertySequenceOfNumbers(v8_object, isolate, name, add_vector(name, member->ValueSequenceDouble());
member->ValueSequenceDouble());
break; break;
case kWebRTCStatsMemberTypeSequenceString: case kWebRTCStatsMemberTypeSequenceString:
success &= AddPropertySequenceOfStrings(v8_object, isolate, name, add_vector(name, member->ValueSequenceString());
member->ValueSequenceString());
break; break;
default: default:
NOTREACHED(); NOTREACHED();
} }
} }
if (!success) {
v8::Local<v8::Object> v8_object = builder.V8Value();
if (v8_object.IsEmpty()) {
NOTREACHED(); NOTREACHED();
return v8::Undefined(isolate); return v8::Undefined(script_state->GetIsolate());
} }
return v8_object; return v8_object;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment