Initial Implementation of Node prelaunch
[platform/framework/web/crosswalk-tizen.git] / atom / browser / api / trackable_object.cc
1 // Copyright (c) 2015 GitHub, Inc.
2 // Use of this source code is governed by the MIT license that can be
3 // found in the LICENSE file.
4
5 #include "atom/browser/api/trackable_object.h"
6
7 #include "atom/browser/atom_browser_main_parts.h"
8 #include "base/bind.h"
9 #include "base/supports_user_data.h"
10
11 namespace mate {
12
13 namespace {
14
15 const char* kTrackedObjectKey = "TrackedObjectKey";
16
17 class IDUserData : public base::SupportsUserData::Data {
18  public:
19   explicit IDUserData(int32_t id) : id_(id) {}
20
21   operator int32_t() const { return id_; }
22
23  private:
24   int32_t id_;
25
26   DISALLOW_COPY_AND_ASSIGN(IDUserData);
27 };
28
29 }  // namespace
30
31 TrackableObjectBase::TrackableObjectBase()
32     : weak_map_id_(0), weak_factory_(this) {
33   cleanup_ = RegisterDestructionCallback(GetDestroyClosure());
34 }
35
36 TrackableObjectBase::~TrackableObjectBase() {
37   cleanup_.Run();
38 }
39
40 base::Closure TrackableObjectBase::GetDestroyClosure() {
41   return base::Bind(&TrackableObjectBase::Destroy, weak_factory_.GetWeakPtr());
42 }
43
44 void TrackableObjectBase::Destroy() {
45   delete this;
46 }
47
48 void TrackableObjectBase::AttachAsUserData(base::SupportsUserData* wrapped) {
49   wrapped->SetUserData(kTrackedObjectKey, new IDUserData(weak_map_id_));
50 }
51
52 // static
53 int32_t TrackableObjectBase::GetIDFromWrappedClass(base::SupportsUserData* w) {
54   auto id = static_cast<IDUserData*>(w->GetUserData(kTrackedObjectKey));
55   if (id)
56     return *id;
57   else
58     return 0;
59 }
60
61 // static
62 base::Closure TrackableObjectBase::RegisterDestructionCallback(
63     const base::Closure& c) {
64   if (atom::AtomBrowserMainParts::Get())
65     return atom::AtomBrowserMainParts::Get()->RegisterDestructionCallback(c);
66 }
67
68 }  // namespace mate