electron/shell/common/gin_helper/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 "shell/common/gin_helper/trackable_object.h"
2015-06-24 06:36:05 +00:00
#include <memory>
2015-06-24 09:58:12 +00:00
#include "base/bind.h"
#include "base/supports_user_data.h"
#include "shell/browser/electron_browser_main_parts.h"
#include "shell/common/gin_helper/locker.h"
namespace gin_helper {
2015-06-24 06:36:05 +00:00
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
TrackableObjectBase::TrackableObjectBase() {
// TODO(zcbenz): Make TrackedObject work in renderer process.
DCHECK(gin_helper::Locker::IsBrowserProcess())
<< "This class only works for browser process";
electron::ElectronBrowserMainParts::Get()->RegisterDestructionCallback(
GetDestroyClosure());
2015-06-24 06:36:05 +00:00
}
TrackableObjectBase::~TrackableObjectBase() = default;
2015-06-24 06:36:05 +00:00
base::OnceClosure TrackableObjectBase::GetDestroyClosure() {
return base::BindOnce(&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,
2018-04-18 01:55:30 +00:00
std::make_unique<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
}
} // namespace gin_helper