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

Unified Diff: gin/data_object_builder.h

Issue 2845463002: gin: Create a DataObjectBuilder class to help create simple data objects. (Closed)
Patch Set: devlin, jochen Created 3 years, 8 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
« no previous file with comments | « gin/BUILD.gn ('k') | gin/data_object_builder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_
« no previous file with comments | « gin/BUILD.gn ('k') | gin/data_object_builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698