Make sure all native resources get freed on exit
authorCheng Zhao <zcbenz@gmail.com>
Wed, 4 Nov 2015 10:21:03 +0000 (18:21 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Wed, 4 Nov 2015 10:21:03 +0000 (18:21 +0800)
atom/browser/api/atom_api_global_shortcut.cc
atom/browser/api/atom_api_global_shortcut.h
atom/browser/api/atom_api_menu.cc
atom/browser/api/atom_api_menu.h
atom/browser/api/atom_api_menu_mac.h
atom/browser/api/atom_api_menu_mac.mm
atom/browser/api/atom_api_power_monitor.cc
atom/browser/api/atom_api_power_monitor.h
atom/browser/api/atom_api_power_save_blocker.cc
atom/browser/api/atom_api_power_save_blocker.h
atom/browser/api/atom_api_tray.h

index f5a03e4abf9010c3bd371e0778ab684d2dd2418e..6ab4fa4b61868cd8f1708761db3afed7c644af69 100644 (file)
@@ -23,6 +23,9 @@ GlobalShortcut::GlobalShortcut() {
 }
 
 GlobalShortcut::~GlobalShortcut() {
+}
+
+void GlobalShortcut::Destroy() {
   UnregisterAll();
 }
 
index 15cd3d4e0edb054b0d07ce52c671b6d489d43189..93eb7853ae0dc364f28294d0fb392eac3b62cac5 100644 (file)
@@ -8,9 +8,9 @@
 #include <map>
 #include <string>
 
+#include "atom/browser/api/trackable_object.h"
 #include "base/callback.h"
 #include "chrome/browser/extensions/global_shortcut_listener.h"
-#include "native_mate/wrappable.h"
 #include "native_mate/handle.h"
 #include "ui/base/accelerators/accelerator.h"
 
@@ -19,13 +19,16 @@ namespace atom {
 namespace api {
 
 class GlobalShortcut : public extensions::GlobalShortcutListener::Observer,
-                       public mate::Wrappable {
+                       public mate::TrackableObject<GlobalShortcut> {
  public:
   static mate::Handle<GlobalShortcut> Create(v8::Isolate* isolate);
 
  protected:
   GlobalShortcut();
-  virtual ~GlobalShortcut();
+  ~GlobalShortcut() override;
+
+  // mate::TrackableObject:
+  void Destroy() override;
 
   // mate::Wrappable implementations:
   mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
index 9bd724a9612e0364ee01a0f54210a2ade57e4c73..1f16a428da0114e1b5e1342fbe87ece275ca2b27 100644 (file)
@@ -27,6 +27,14 @@ Menu::Menu()
 Menu::~Menu() {
 }
 
+void Menu::Destroy() {
+  model_.reset();
+}
+
+bool Menu::IsDestroyed() const {
+  return !model_;
+}
+
 void Menu::AfterInit(v8::Isolate* isolate) {
   mate::Dictionary wrappable(isolate, GetWrapper(isolate));
   mate::Dictionary delegate;
index 0d93c0d46be6db6c6073bee6ac63292853963cef..545dd18e386c4ae0261708b063e3beff9f4179ea 100644 (file)
@@ -8,16 +8,16 @@
 #include <string>
 
 #include "atom/browser/api/atom_api_window.h"
+#include "atom/browser/api/trackable_object.h"
 #include "atom/browser/ui/atom_menu_model.h"
 #include "base/callback.h"
 #include "base/memory/scoped_ptr.h"
-#include "native_mate/wrappable.h"
 
 namespace atom {
 
 namespace api {
 
-class Menu : public mate::Wrappable,
+class Menu : public mate::TrackableObject<Menu>,
              public AtomMenuModel::Delegate {
  public:
   static mate::Wrappable* Create();
@@ -37,9 +37,13 @@ class Menu : public mate::Wrappable,
 
  protected:
   Menu();
-  virtual ~Menu();
+  ~Menu() override;
+
+  // mate::TrackableObject:
+  void Destroy() override;
 
   // mate::Wrappable:
+  bool IsDestroyed() const override;
   void AfterInit(v8::Isolate* isolate) override;
 
   // ui::SimpleMenuModel::Delegate:
index 5a086776a63962a015368e5194f8d7dfc8052e4a..baa2aff349e15e8c0208031cf666240eb5c20ed4 100644 (file)
@@ -19,6 +19,7 @@ class MenuMac : public Menu {
  protected:
   MenuMac();
 
+  void Destroy() override;
   void Popup(Window* window) override;
   void PopupAt(Window* window, int x, int y) override;
 
index 071753218d6a069d7f7acadc24b0ecbc755b906b..5936e0439f4f0f053694aeb31ae53f3847ff1cfa 100644 (file)
@@ -18,6 +18,11 @@ namespace api {
 MenuMac::MenuMac() {
 }
 
+void MenuMac::Destroy() {
+  menu_controller_.reset();
+  Menu::Destroy();
+}
+
 void MenuMac::Popup(Window* window) {
   NativeWindow* native_window = window->window();
   if (!native_window)
index 31b35e10cea8ae631406aa28e98937694b9739f7..eeb9475c28473b875590f42b90731fe8f4a0bd90 100644 (file)
@@ -19,6 +19,9 @@ PowerMonitor::PowerMonitor() {
 }
 
 PowerMonitor::~PowerMonitor() {
+}
+
+void PowerMonitor::Destroy() {
   base::PowerMonitor::Get()->RemoveObserver(this);
 }
 
index dcf0906b437fc44417f76a1da9edf8c54bdfc05a..9303b3ab288fd83311426f2d11578c656b7e166d 100644 (file)
@@ -5,7 +5,7 @@
 #ifndef ATOM_BROWSER_API_ATOM_API_POWER_MONITOR_H_
 #define ATOM_BROWSER_API_ATOM_API_POWER_MONITOR_H_
 
-#include "atom/browser/api/event_emitter.h"
+#include "atom/browser/api/trackable_object.h"
 #include "base/compiler_specific.h"
 #include "base/power_monitor/power_observer.h"
 #include "native_mate/handle.h"
@@ -14,14 +14,17 @@ namespace atom {
 
 namespace api {
 
-class PowerMonitor : public mate::EventEmitter,
+class PowerMonitor : public mate::TrackableObject<PowerMonitor>,
                      public base::PowerObserver {
  public:
   static v8::Local<v8::Value> Create(v8::Isolate* isolate);
 
  protected:
   PowerMonitor();
-  virtual ~PowerMonitor();
+  ~PowerMonitor() override;
+
+  // mate::TrackableObject:
+  void Destroy() override;
 
   // base::PowerObserver implementations:
   void OnPowerStateChange(bool on_battery_power) override;
index 58983e6c846a8b161b4f74b271ba978846bfa2dc..f77979ae417f9b4a72bf357a18c64b68f78d5180 100644 (file)
@@ -45,6 +45,11 @@ PowerSaveBlocker::PowerSaveBlocker()
 PowerSaveBlocker::~PowerSaveBlocker() {
 }
 
+void PowerSaveBlocker::Destroy() {
+  power_save_blocker_types_.clear();
+  power_save_blocker_.reset();
+}
+
 void PowerSaveBlocker::UpdatePowerSaveBlocker() {
   if (power_save_blocker_types_.empty()) {
     power_save_blocker_.reset();
index 9861f2b0f7cde0dec711632dd55f2c73a36cf216..e7ce97878ffb01025d91dbeb8623aa99a8009c42 100644 (file)
@@ -7,10 +7,10 @@
 
 #include <map>
 
+#include "atom/browser/api/trackable_object.h"
 #include "base/memory/scoped_ptr.h"
 #include "content/public/browser/power_save_blocker.h"
 #include "native_mate/handle.h"
-#include "native_mate/wrappable.h"
 
 namespace mate {
 class Dictionary;
@@ -20,13 +20,16 @@ namespace atom {
 
 namespace api {
 
-class PowerSaveBlocker : public mate::Wrappable {
+class PowerSaveBlocker : public mate::TrackableObject<PowerSaveBlocker> {
  public:
   static mate::Handle<PowerSaveBlocker> Create(v8::Isolate* isolate);
 
  protected:
   PowerSaveBlocker();
-  virtual ~PowerSaveBlocker();
+  ~PowerSaveBlocker() override;
+
+  // mate::TrackableObject:
+  void Destroy() override;
 
   // mate::Wrappable implementations:
   mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
@@ -48,7 +51,6 @@ class PowerSaveBlocker : public mate::Wrappable {
       std::map<int, content::PowerSaveBlocker::PowerSaveBlockerType>;
   PowerSaveBlockerTypeMap power_save_blocker_types_;
 
-
   DISALLOW_COPY_AND_ASSIGN(PowerSaveBlocker);
 };
 
index dc9302597cf310340f31126b3bea70ba37b0741e..9a423f61764f1a6fa7d8c596aded2edf8f7a3eef 100644 (file)
@@ -8,7 +8,7 @@
 #include <string>
 #include <vector>
 
-#include "atom/browser/api/event_emitter.h"
+#include "atom/browser/api/trackable_object.h"
 #include "atom/browser/ui/tray_icon_observer.h"
 #include "base/memory/scoped_ptr.h"
 
@@ -29,7 +29,7 @@ namespace api {
 
 class Menu;
 
-class Tray : public mate::EventEmitter,
+class Tray : public mate::TrackableObject<Tray>,
              public TrayIconObserver {
  public:
   static mate::Wrappable* New(v8::Isolate* isolate, const gfx::Image& image);
@@ -39,7 +39,7 @@ class Tray : public mate::EventEmitter,
 
  protected:
   explicit Tray(const gfx::Image& image);
-  virtual ~Tray();
+  ~Tray() override;
 
   // TrayIconObserver:
   void OnClicked(const gfx::Rect& bounds, int modifiers) override;
@@ -53,7 +53,9 @@ class Tray : public mate::EventEmitter,
   // mate::Wrappable:
   bool IsDestroyed() const override;
 
-  void Destroy();
+  // mate::TrackableObject:
+  void Destroy() override;
+
   void SetImage(mate::Arguments* args, const gfx::Image& image);
   void SetPressedImage(mate::Arguments* args, const gfx::Image& image);
   void SetToolTip(mate::Arguments* args, const std::string& tool_tip);