Add the RemoteObject API in renderer. (not implemented yet)
authorCheng Zhao <zcbenz@gmail.com>
Mon, 22 Apr 2013 01:13:25 +0000 (09:13 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Mon, 22 Apr 2013 01:13:25 +0000 (09:13 +0800)
atom.gyp
common/api/atom_extensions.h
renderer/api/atom_api_remote_object.cc [new file with mode: 0644]
renderer/api/atom_api_remote_object.h [new file with mode: 0644]
renderer/api/lib/remote_object.coffee [new file with mode: 0644]
vendor/node

index 0f3b3ed..9df27fd 100644 (file)
--- a/atom.gyp
+++ b/atom.gyp
@@ -9,6 +9,7 @@
       'browser/api/lib/atom.coffee',
       'browser/api/lib/window.coffee',
       'browser/atom/atom.coffee',
+      'renderer/api/lib/remote_object.coffee',
     ],
     'lib_sources': [
       'app/atom_main_delegate.cc',
@@ -52,6 +53,8 @@
       'common/options_switches.h',
       'common/v8_value_converter_impl.cc',
       'common/v8_value_converter_impl.h',
+      'renderer/api/atom_api_remote_object.cc',
+      'renderer/api/atom_api_remote_object.h',
       'renderer/atom_render_view_observer.cc',
       'renderer/atom_render_view_observer.h',
       'renderer/atom_renderer_client.cc',
index 47bdd37..104f3e6 100644 (file)
@@ -10,4 +10,6 @@ NODE_EXT_LIST_START
 
 NODE_EXT_LIST_ITEM(atom_browser_window)
 
+NODE_EXT_LIST_ITEM(atom_renderer_remote_object)
+
 NODE_EXT_LIST_END
diff --git a/renderer/api/atom_api_remote_object.cc b/renderer/api/atom_api_remote_object.cc
new file mode 100644 (file)
index 0000000..030675a
--- /dev/null
@@ -0,0 +1,78 @@
+// Copyright (c) 2013 GitHub, Inc. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "renderer/api/atom_api_remote_object.h"
+
+#include "base/logging.h"
+
+namespace atom {
+
+namespace api {
+
+RemoteObject::RemoteObject(v8::Handle<v8::Object> wrapper,
+                           const std::string& type)
+    : id_(-1) {
+  // TODO apply for new object in browser.
+  Wrap(wrapper);
+}
+
+RemoteObject::RemoteObject(v8::Handle<v8::Object> wrapper, int id)
+    : id_(id) {
+  Wrap(wrapper);
+}
+
+RemoteObject::~RemoteObject() {
+  Destroy();
+}
+
+void RemoteObject::Destroy() {
+  DCHECK(id_ > 0);
+
+  // TODO release me in browser.
+}
+
+// static
+v8::Handle<v8::Value> RemoteObject::New(const v8::Arguments &args) {
+  v8::HandleScope scope;
+
+  if (args[0]->IsString())
+    new RemoteObject(args.This(), *v8::String::Utf8Value(args[0]));
+  else if (args[0]->IsNumber())
+    new RemoteObject(args.This(), args[0]->IntegerValue());
+  else
+    return node::ThrowTypeError("Bad argument");
+
+  return args.This();
+}
+
+// static
+v8::Handle<v8::Value> RemoteObject::Destroy(const v8::Arguments &args) {
+  RemoteObject* self = ObjectWrap::Unwrap<RemoteObject>(args.This());
+
+  // TODO try to call remote object's destroy method first.
+
+  delete self;
+
+  return v8::Undefined();
+}
+
+// static
+void RemoteObject::Initialize(v8::Handle<v8::Object> target) {
+  v8::HandleScope scope;
+
+  v8::Local<v8::FunctionTemplate> t =
+      v8::FunctionTemplate::New(RemoteObject::New);
+  t->InstanceTemplate()->SetInternalFieldCount(1);
+  t->SetClassName(v8::String::NewSymbol("RemoteObject"));
+
+  NODE_SET_PROTOTYPE_METHOD(t, "destroy", Destroy);
+
+  target->Set(v8::String::NewSymbol("RemoteObject"), t->GetFunction());
+}
+
+}  // namespace api
+
+}  // namespace atom
+
+NODE_MODULE(atom_renderer_remote_object, atom::api::RemoteObject::Initialize)
diff --git a/renderer/api/atom_api_remote_object.h b/renderer/api/atom_api_remote_object.h
new file mode 100644 (file)
index 0000000..a9e09ce
--- /dev/null
@@ -0,0 +1,47 @@
+// Copyright (c) 2013 GitHub, Inc. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ATOM_RENDERER_ATOM_API_REMOTE_OBJECT_H_
+#define ATOM_RENDERER_ATOM_API_REMOTE_OBJECT_H_
+
+#include <iosfwd>
+
+#include "base/basictypes.h"
+#include "vendor/node/src/node_object_wrap.h"
+
+namespace atom {
+
+namespace api {
+
+// Every instance of RemoteObject represents an object in browser.
+class RemoteObject : public node::ObjectWrap {
+ public:
+  virtual ~RemoteObject();
+
+  static void Initialize(v8::Handle<v8::Object> target);
+
+  // Tell browser to destroy this object.
+  void Destroy();
+
+  int id() const { return id_; }
+
+ protected:
+  explicit RemoteObject(v8::Handle<v8::Object> wrapper,
+                        const std::string& type);
+  explicit RemoteObject(v8::Handle<v8::Object> wrapper, int id);
+
+ private:
+  static v8::Handle<v8::Value> New(const v8::Arguments &args);
+  static v8::Handle<v8::Value> Destroy(const v8::Arguments &args);
+
+  int id_;
+
+  DISALLOW_COPY_AND_ASSIGN(RemoteObject);
+};
+
+}  // namespace api
+
+}  // namespace atom
+
+#endif  // ATOM_RENDERER_ATOM_API_REMOTE_OBJECT_H_
diff --git a/renderer/api/lib/remote_object.coffee b/renderer/api/lib/remote_object.coffee
new file mode 100644 (file)
index 0000000..d1d39a2
--- /dev/null
@@ -0,0 +1,3 @@
+RemoteObject = process.atom_binding('remote_object').RemoteObject
+
+module.exports = RemoteObject
index bfdcb5b..027d18b 160000 (submodule)
@@ -1 +1 @@
-Subproject commit bfdcb5bae8f01b877fbad84bb260a53ba7ca1e92
+Subproject commit 027d18bde8c24534215095aadceb78e7a61b2b5c