trackable_object.cc 1.6 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/common/gin_helper/trackable_object.h"
  5. #include <memory>
  6. #include "base/functional/bind.h"
  7. #include "base/supports_user_data.h"
  8. #include "shell/browser/electron_browser_main_parts.h"
  9. #include "shell/common/process_util.h"
  10. namespace gin_helper {
  11. namespace {
  12. const char kTrackedObjectKey[] = "TrackedObjectKey";
  13. class IDUserData : public base::SupportsUserData::Data {
  14. public:
  15. explicit IDUserData(int32_t id) : id_(id) {}
  16. explicit operator int32_t() const { return id_; }
  17. private:
  18. int32_t id_;
  19. };
  20. } // namespace
  21. TrackableObjectBase::TrackableObjectBase() {
  22. // TODO(zcbenz): Make TrackedObject work in renderer process.
  23. DCHECK(electron::IsBrowserProcess())
  24. << "This class only works for browser process";
  25. }
  26. TrackableObjectBase::~TrackableObjectBase() = default;
  27. base::OnceClosure TrackableObjectBase::GetDestroyClosure() {
  28. return base::BindOnce(&TrackableObjectBase::Destroy,
  29. weak_factory_.GetWeakPtr());
  30. }
  31. void TrackableObjectBase::Destroy() {
  32. delete this;
  33. }
  34. void TrackableObjectBase::AttachAsUserData(base::SupportsUserData* wrapped) {
  35. wrapped->SetUserData(kTrackedObjectKey,
  36. std::make_unique<IDUserData>(weak_map_id_));
  37. }
  38. // static
  39. int32_t TrackableObjectBase::GetIDFromWrappedClass(
  40. base::SupportsUserData* wrapped) {
  41. if (wrapped) {
  42. auto* id =
  43. static_cast<IDUserData*>(wrapped->GetUserData(kTrackedObjectKey));
  44. if (id)
  45. return int32_t(*id);
  46. }
  47. return 0;
  48. }
  49. } // namespace gin_helper