Record all objects created by API in browser.
authorCheng Zhao <zcbenz@gmail.com>
Sat, 20 Apr 2013 13:52:46 +0000 (21:52 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Sat, 20 Apr 2013 13:52:46 +0000 (21:52 +0800)
atom.gyp
browser/api/atom_api_event_emitter.cc
browser/api/atom_api_event_emitter.h
browser/api/atom_api_objects_registry.cc [new file with mode: 0644]
browser/api/atom_api_objects_registry.h [new file with mode: 0644]
browser/api/atom_api_recorded_object.cc [new file with mode: 0644]
browser/api/atom_api_recorded_object.h [new file with mode: 0644]
browser/atom_browser_context.cc
browser/atom_browser_context.h
browser/default_app/main.js

index c59fbd1..4317261 100644 (file)
--- a/atom.gyp
+++ b/atom.gyp
       'browser/api/atom_api_event_emitter.h',
       'browser/api/atom_api_extensions.cc',
       'browser/api/atom_api_extensions.h',
+      'browser/api/atom_api_objects_registry.cc',
+      'browser/api/atom_api_objects_registry.h',
+      'browser/api/atom_api_recorded_object.cc',
+      'browser/api/atom_api_recorded_object.h',
       'browser/api/atom_api_window.cc',
       'browser/api/atom_api_window.h',
       'browser/api/atom_bindings.cc',
index 6fe790b..7a88a1e 100644 (file)
@@ -16,8 +16,8 @@ namespace atom {
 
 namespace api {
 
-EventEmitter::EventEmitter(v8::Handle<v8::Object> wrapper) {
-  Wrap(wrapper);
+EventEmitter::EventEmitter(v8::Handle<v8::Object> wrapper)
+    : RecordedObject(wrapper) {
 }
 
 EventEmitter::~EventEmitter() {
index 4071355..021d91c 100644 (file)
@@ -7,8 +7,7 @@
 
 #include <iosfwd>
 
-#include "base/basictypes.h"
-#include "vendor/node/src/node_object_wrap.h"
+#include "browser/api/atom_api_recorded_object.h"
 
 namespace base {
 class ListValue;
@@ -21,16 +20,13 @@ namespace api {
 // Class interiting EventEmitter should assume it's a javascript object which
 // interits require('events').EventEmitter, this class provides many helper
 // methods to do event processing in C++.
-class EventEmitter : public node::ObjectWrap {
+class EventEmitter : public RecordedObject {
  public:
   virtual ~EventEmitter();
 
   // Emit an event and returns whether the handler has called preventDefault().
   bool Emit(const std::string& name, base::ListValue* args);
 
-  // Small accessor to return handle_, this follows Google C++ Style.
-  v8::Persistent<v8::Object>& handle() { return handle_; }
-
  protected:
   explicit EventEmitter(v8::Handle<v8::Object> wrapper);
 
diff --git a/browser/api/atom_api_objects_registry.cc b/browser/api/atom_api_objects_registry.cc
new file mode 100644 (file)
index 0000000..71e7efd
--- /dev/null
@@ -0,0 +1,19 @@
+// 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 "browser/api/atom_api_objects_registry.h"
+
+namespace atom {
+
+namespace api {
+
+ObjectsRegistry::ObjectsRegistry() {
+}
+
+ObjectsRegistry::~ObjectsRegistry() {
+}
+
+}  // namespace api
+
+}  // namespace atom
diff --git a/browser/api/atom_api_objects_registry.h b/browser/api/atom_api_objects_registry.h
new file mode 100644 (file)
index 0000000..a92bb9a
--- /dev/null
@@ -0,0 +1,37 @@
+// 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_BROWSER_API_ATOM_API_OBJECTS_REGISTRY_H_
+#define ATOM_BROWSER_API_ATOM_API_OBJECTS_REGISTRY_H_
+
+#include "base/id_map.h"
+#include "base/basictypes.h"
+
+namespace atom {
+
+namespace api {
+
+class RecordedObject;
+
+class ObjectsRegistry {
+ public:
+  ObjectsRegistry();
+  virtual ~ObjectsRegistry();
+
+  int Add(RecordedObject* data) { return id_map_.Add(data); }
+  void Remove(int id) { id_map_.Remove(id); }
+  void Clear() { id_map_.Clear(); }
+  RecordedObject* Lookup(int id) const { return id_map_.Lookup(id); }
+
+ private:
+  IDMap<RecordedObject> id_map_;
+
+  DISALLOW_COPY_AND_ASSIGN(ObjectsRegistry);
+};
+
+}  // namespace api
+
+}  // namespace atom
+
+#endif  // ATOM_BROWSER_API_ATOM_API_OBJECTS_REGISTRY_H_
diff --git a/browser/api/atom_api_recorded_object.cc b/browser/api/atom_api_recorded_object.cc
new file mode 100644 (file)
index 0000000..f530baf
--- /dev/null
@@ -0,0 +1,40 @@
+// 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_BROWSER_API_ATOM_API_RECORDED_OBJECT_
+#define ATOM_BROWSER_API_ATOM_API_RECORDED_OBJECT_
+
+#include "browser/api/atom_api_recorded_object.h"
+
+#include "base/compiler_specific.h"
+#include "browser/api/atom_api_objects_registry.h"
+#include "browser/atom_browser_context.h"
+
+namespace atom {
+
+namespace api {
+
+RecordedObject::RecordedObject(v8::Handle<v8::Object> wrapper)
+    : ALLOW_THIS_IN_INITIALIZER_LIST(id_(
+          AtomBrowserContext::Get()->objects_registry()->Add(this))) {
+  Wrap(wrapper);
+
+  wrapper->SetAccessor(v8::String::New("id"), IDGetter);
+}
+
+RecordedObject::~RecordedObject() {
+}
+
+// static
+v8::Handle<v8::Value> RecordedObject::IDGetter(v8::Local<v8::String> property,
+                                               const v8::AccessorInfo& info) {
+  RecordedObject* self = RecordedObject::Unwrap<RecordedObject>(info.This());
+  return v8::Integer::New(self->id_);
+}
+
+}  // namespace api
+
+}  // namespace atom
+
+#endif  // ATOM_BROWSER_API_ATOM_API_RECORDED_OBJECT_
diff --git a/browser/api/atom_api_recorded_object.h b/browser/api/atom_api_recorded_object.h
new file mode 100644 (file)
index 0000000..a5806ee
--- /dev/null
@@ -0,0 +1,42 @@
+// 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_BROWSER_API_ATOM_API_RECORDED_OBJECT_H_
+#define ATOM_BROWSER_API_ATOM_API_RECORDED_OBJECT_H_
+
+#include "base/basictypes.h"
+#include "vendor/node/src/node_object_wrap.h"
+
+namespace atom {
+
+namespace api {
+
+// Objects of this class will be recorded in C++ and available for RPC from
+// renderer.
+class RecordedObject : public node::ObjectWrap {
+ public:
+  virtual ~RecordedObject();
+
+  // Small accessor to return handle_, this follows Google C++ Style.
+  v8::Persistent<v8::Object>& handle() { return handle_; }
+
+  int id() const { return id_; }
+
+ protected:
+  explicit RecordedObject(v8::Handle<v8::Object> wrapper);
+
+ private:
+  static v8::Handle<v8::Value> IDGetter(v8::Local<v8::String> property,
+                                        const v8::AccessorInfo& info);
+
+  int id_;
+
+  DISALLOW_COPY_AND_ASSIGN(RecordedObject);
+};
+
+}  // namespace api
+
+}  // namespace atom
+
+#endif  // ATOM_BROWSER_API_ATOM_API_RECORDED_OBJECT_H_
index c7e3162..0d43f9b 100644 (file)
@@ -4,12 +4,15 @@
 
 #include "browser/atom_browser_context.h"
 
+#include "browser/api/atom_api_objects_registry.h"
+
 namespace atom {
 
 // static
 AtomBrowserContext* AtomBrowserContext::self_;
 
-AtomBrowserContext::AtomBrowserContext() {
+AtomBrowserContext::AtomBrowserContext()
+    : objects_registry_(new api::ObjectsRegistry) {
   DCHECK(!self_);
 
   self_ = this;
index 86c3a75..da60cfa 100644 (file)
@@ -5,10 +5,15 @@
 #ifndef ATOM_BROWSER_ATOM_BROWSER_CONTEXT_H_
 #define ATOM_BROWSER_ATOM_BROWSER_CONTEXT_H_
 
+#include "base/memory/scoped_ptr.h"
 #include "brightray/browser/browser_context.h"
 
 namespace atom {
 
+namespace api {
+class ObjectsRegistry;
+}
+
 class AtomBrowserContext : public brightray::BrowserContext {
  public:
   AtomBrowserContext();
@@ -17,9 +22,15 @@ class AtomBrowserContext : public brightray::BrowserContext {
   // We assume there is only one BrowserContext per browser process.
   static AtomBrowserContext* Get();
 
+  api::ObjectsRegistry* objects_registry() const {
+    return objects_registry_.get();
+  }
+
  private:
   static AtomBrowserContext* self_;
 
+  scoped_ptr<api::ObjectsRegistry> objects_registry_;
+
   DISALLOW_COPY_AND_ASSIGN(AtomBrowserContext);
 };
 
index f0fd53c..149a68e 100644 (file)
@@ -7,6 +7,8 @@ atom.browserMainParts.preMainMessageLoopRun = function() {
   mainWindow = new Window({ width: 800, height: 600 });
   mainWindow.url = 'file://' + __dirname + '/index.html';
 
+  console.log(mainWindow.id);
+
   mainWindow.on('page-title-updated', function(event, title) {
     event.preventDefault();