electron/atom/browser/api/trackable_object.cc

69 lines
1.6 KiB
C++
Raw Normal View History

2015-06-24 06:36:05 +00:00
// Copyright (c) 2015 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "atom/browser/api/trackable_object.h"
2015-06-24 09:58:12 +00:00
#include "atom/browser/atom_browser_main_parts.h"
#include "base/bind.h"
#include "base/supports_user_data.h"
2015-06-24 06:36:05 +00:00
namespace mate {
namespace {
const char* kTrackedObjectKey = "TrackedObjectKey";
class IDUserData : public base::SupportsUserData::Data {
public:
explicit IDUserData(int32_t id) : id_(id) {}
operator int32_t() const { return id_; }
private:
int32_t id_;
DISALLOW_COPY_AND_ASSIGN(IDUserData);
};
} // namespace
2015-06-24 09:58:12 +00:00
TrackableObjectBase::TrackableObjectBase()
: weak_map_id_(0), wrapped_(nullptr) {
2015-06-24 06:36:05 +00:00
}
2015-06-24 09:58:12 +00:00
TrackableObjectBase::~TrackableObjectBase() {
2015-06-24 06:36:05 +00:00
}
2015-06-24 09:58:12 +00:00
void TrackableObjectBase::AfterInit(v8::Isolate* isolate) {
2015-06-24 07:37:04 +00:00
if (wrapped_)
AttachAsUserData(wrapped_);
2015-06-24 06:36:05 +00:00
}
2015-06-24 09:58:12 +00:00
void TrackableObjectBase::AttachAsUserData(base::SupportsUserData* wrapped) {
2015-06-24 07:37:04 +00:00
if (weak_map_id_ != 0) {
wrapped->SetUserData(kTrackedObjectKey, new IDUserData(weak_map_id_));
wrapped_ = nullptr;
} else {
2015-06-24 09:58:12 +00:00
// If the TrackableObjectBase is not ready yet then delay SetUserData until
2015-06-24 07:37:04 +00:00
// AfterInit is called.
wrapped_ = wrapped;
}
}
2015-06-24 09:58:12 +00:00
// static
int32_t TrackableObjectBase::GetIDFromWrappedClass(base::SupportsUserData* w) {
auto id = static_cast<IDUserData*>(w->GetUserData(kTrackedObjectKey));
if (id)
return *id;
else
return 0;
}
// static
void TrackableObjectBase::RegisterDestructionCallback(void (*c)()) {
atom::AtomBrowserMainParts::Get()->RegisterDestructionCallback(base::Bind(c));
}
2015-06-24 06:36:05 +00:00
} // namespace mate