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

Unified Diff: gin/data_object_builder.h

Issue 2845463002: gin: Create a DataObjectBuilder class to help create simple data objects. (Closed)
Patch Set: data_object_builder.cc 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
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..3fb29f142ed00d9122d30f2c12094b00b02fbc6c
--- /dev/null
+++ b/gin/data_object_builder.h
@@ -0,0 +1,57 @@
+// 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/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.
Devlin 2017/04/26 15:50:31 Optional: Maybe worth describing that the new prop
jbroman 2017/04/26 17:47:31 Done.
+// Values are automatically converted using gin::Converter.
+// This class avoids the pitfall of using Set, which may invoke setters on the
Devlin 2017/04/26 15:50:31 nit: maybe specify v8::Object::Set()?
jbroman 2017/04/26 17:47:31 Done.
+// object prototype.
+//
+// Expected usage:
+// v8::Local<v8::Object> object = gin::DataObjectBuilder(isolate)
+// .Set("boolean", true)
+// .Set("integer", 42)
+// .Finish();
+//
+// 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) {
Devlin 2017/04/26 15:50:31 Note: this won't work for std::vectors or potentia
jbroman 2017/04/26 17:47:31 Yeah, I waffled on this a little. It is easy enoug
Devlin 2017/04/26 18:30:23 Punting to callers sgtm.
+ v8::Local<v8::String> v8_key = StringToSymbol(isolate_, key);
Devlin 2017/04/26 15:50:31 DCHECK(!object_.IsEmpty()) (enforcing single-use)?
jbroman 2017/04/26 17:47:31 Could do. It will crash anyways when it's derefere
Devlin 2017/04/26 18:30:23 DCHECK gives a nice stack trace. nullptr access g
jbroman 2017/04/27 15:26:30 Done.
+ v8::Local<v8::Value> v8_value =
+ ConvertToV8(isolate_, std::forward<T>(value));
+ CHECK(object_->CreateDataProperty(context_, v8_key, v8_value).ToChecked());
+ return *this;
Devlin 2017/04/26 15:50:31 over the course of <n> template specializations, t
jbroman 2017/04/26 17:47:31 As you note the ConvertToV8 call still is inline,
+ }
+
+ v8::Local<v8::Object> Finish() {
Devlin 2017/04/26 15:50:31 is it worth defining this inline?
jbroman 2017/04/26 17:47:31 Not needed. My Blink-side habits tend to favour in
+ v8::Local<v8::Object> result = object_;
Devlin 2017/04/26 15:50:31 here, too, maybe DCHECK(!object_.IsEmpty())?
jbroman 2017/04/26 17:47:31 I could. It takes away my ability to test it (beca
Devlin 2017/04/26 18:30:23 IMO, DCHECK is better than safely handling a resul
+ object_.Clear();
+ return result;
+ }
+
+ private:
+ v8::Isolate* isolate_;
+ v8::Local<v8::Context> context_;
+ v8::Local<v8::Object> object_;
Devlin 2017/04/26 15:50:32 DISALLOW_COPY_AND_ASSIGN()
jbroman 2017/04/26 17:47:31 Done.
+};
+
+} // namespace gin
+
+#endif // GIN_DATA_OBJECT_BUILDER_H_
« no previous file with comments | « gin/BUILD.gn ('k') | gin/data_object_builder.cc » ('j') | gin/data_object_builder.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698