electron/atom/browser/api/trackable_object.cc

72 lines
1.7 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/memory/ptr_util.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), weak_factory_(this) {
cleanup_ = RegisterDestructionCallback(GetDestroyClosure());
2015-06-24 06:36:05 +00:00
}
2015-06-24 09:58:12 +00:00
TrackableObjectBase::~TrackableObjectBase() {
cleanup_.Run();
2015-06-24 06:36:05 +00:00
}
base::Closure TrackableObjectBase::GetDestroyClosure() {
return base::Bind(&TrackableObjectBase::Destroy, weak_factory_.GetWeakPtr());
}
void TrackableObjectBase::Destroy() {
delete this;
}
2015-06-24 09:58:12 +00:00
void TrackableObjectBase::AttachAsUserData(base::SupportsUserData* wrapped) {
wrapped->SetUserData(kTrackedObjectKey,
base::MakeUnique<IDUserData>(weak_map_id_));
}
2015-06-24 09:58:12 +00:00
// static
int32_t TrackableObjectBase::GetIDFromWrappedClass(
base::SupportsUserData* wrapped) {
if (wrapped) {
auto id = static_cast<IDUserData*>(wrapped->GetUserData(kTrackedObjectKey));
if (id)
return *id;
}
return 0;
2015-06-24 09:58:12 +00:00
}
// static
base::Closure TrackableObjectBase::RegisterDestructionCallback(
const base::Closure& c) {
return atom::AtomBrowserMainParts::Get()->RegisterDestructionCallback(c);
2015-06-24 09:58:12 +00:00
}
2015-06-24 06:36:05 +00:00
} // namespace mate