| Index: gin/data_object_builder.h
|
| diff --git a/gin/data_object_builder.h b/gin/data_object_builder.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8d75dfd2356b57a61bbb03d2f62b127f429a3236
|
| --- /dev/null
|
| +++ b/gin/data_object_builder.h
|
| @@ -0,0 +1,69 @@
|
| +// Copyright 2017 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.
|
| +
|
| +#ifndef GIN_DATA_OBJECT_BUILDER_H_
|
| +#define GIN_DATA_OBJECT_BUILDER_H_
|
| +
|
| +#include <utility>
|
| +
|
| +#include "base/logging.h"
|
| +#include "base/macros.h"
|
| +#include "base/strings/string_piece.h"
|
| +#include "gin/converter.h"
|
| +#include "gin/gin_export.h"
|
| +#include "v8/include/v8.h"
|
| +
|
| +namespace gin {
|
| +
|
| +// Constructs a JavaScript object with a series of data properties.
|
| +// (As with default data properties in JavaScript, these properties are
|
| +// configurable, writable and enumerable.)
|
| +//
|
| +// Values are automatically converted using gin::Converter, though if
|
| +// using a type where the conversion may fail, callers must convert ahead of
|
| +// time.
|
| +//
|
| +// This class avoids the pitfall of using v8::Object::Set, which may invoke
|
| +// setters on the object prototype.
|
| +//
|
| +// Expected usage:
|
| +// v8::Local<v8::Object> object = gin::DataObjectBuilder(isolate)
|
| +// .Set("boolean", true)
|
| +// .Set("integer", 42)
|
| +// .Build();
|
| +//
|
| +// Because this builder class contains local handles, callers must ensure it
|
| +// does not outlive the scope in which it is created.
|
| +class GIN_EXPORT DataObjectBuilder {
|
| + public:
|
| + explicit DataObjectBuilder(v8::Isolate* isolate);
|
| +
|
| + template <typename T>
|
| + DataObjectBuilder& Set(base::StringPiece key, T&& value) {
|
| + DCHECK(!object_.IsEmpty());
|
| + v8::Local<v8::String> v8_key = StringToSymbol(isolate_, key);
|
| + v8::Local<v8::Value> v8_value =
|
| + ConvertToV8(isolate_, std::forward<T>(value));
|
| + CHECK(object_->CreateDataProperty(context_, v8_key, v8_value).ToChecked());
|
| + return *this;
|
| + }
|
| +
|
| + v8::Local<v8::Object> Build() {
|
| + DCHECK(!object_.IsEmpty());
|
| + v8::Local<v8::Object> result = object_;
|
| + object_.Clear();
|
| + return result;
|
| + }
|
| +
|
| + private:
|
| + v8::Isolate* isolate_;
|
| + v8::Local<v8::Context> context_;
|
| + v8::Local<v8::Object> object_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(DataObjectBuilder);
|
| +};
|
| +
|
| +} // namespace gin
|
| +
|
| +#endif // GIN_DATA_OBJECT_BUILDER_H_
|
|
|