trackable_object.cc 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. #include "shell/browser/api/trackable_object.h"
  5. #include <memory>
  6. #include "base/bind.h"
  7. #include "base/supports_user_data.h"
  8. #include "shell/browser/atom_browser_main_parts.h"
  9. namespace mate {
  10. namespace {
  11. const char* kTrackedObjectKey = "TrackedObjectKey";
  12. class IDUserData : public base::SupportsUserData::Data {
  13. public:
  14. explicit IDUserData(int32_t id) : id_(id) {}
  15. operator int32_t() const { return id_; }
  16. private:
  17. int32_t id_;
  18. DISALLOW_COPY_AND_ASSIGN(IDUserData);
  19. };
  20. } // namespace
  21. TrackableObjectBase::TrackableObjectBase() : weak_factory_(this) {
  22. electron::AtomBrowserMainParts::Get()->RegisterDestructionCallback(
  23. GetDestroyClosure());
  24. }
  25. TrackableObjectBase::~TrackableObjectBase() {}
  26. base::OnceClosure TrackableObjectBase::GetDestroyClosure() {
  27. return base::BindOnce(&TrackableObjectBase::Destroy,
  28. weak_factory_.GetWeakPtr());
  29. }
  30. void TrackableObjectBase::Destroy() {
  31. delete this;
  32. }
  33. void TrackableObjectBase::AttachAsUserData(base::SupportsUserData* wrapped) {
  34. wrapped->SetUserData(kTrackedObjectKey,
  35. std::make_unique<IDUserData>(weak_map_id_));
  36. }
  37. // static
  38. int32_t TrackableObjectBase::GetIDFromWrappedClass(
  39. base::SupportsUserData* wrapped) {
  40. if (wrapped) {
  41. auto* id =
  42. static_cast<IDUserData*>(wrapped->GetUserData(kTrackedObjectKey));
  43. if (id)
  44. return *id;
  45. }
  46. return 0;
  47. }
  48. } // namespace mate