From 7f0658efa7aa3f356c17e0406e4ecb3a15d2ac70 Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Wed, 24 Jun 2015 14:36:05 +0800 Subject: [PATCH] Add mate::TrackableObject --- atom/browser/api/atom_api_web_contents.h | 4 +-- atom/browser/api/trackable_object.cc | 39 +++++++++++++++++++++ atom/browser/api/trackable_object.h | 43 ++++++++++++++++++++++++ atom/browser/atom_browser_main_parts.cc | 2 ++ atom/common/id_weak_map.cc | 4 +++ atom/common/id_weak_map.h | 3 ++ filenames.gypi | 2 ++ 7 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 atom/browser/api/trackable_object.cc create mode 100644 atom/browser/api/trackable_object.h diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index a2bfda874cb..d0179d7eb09 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -8,7 +8,7 @@ #include #include -#include "atom/browser/api/event_emitter.h" +#include "atom/browser/api/trackable_object.h" #include "atom/browser/common_web_contents_delegate.h" #include "content/public/browser/browser_plugin_guest_delegate.h" #include "content/public/common/favicon_url.h" @@ -46,7 +46,7 @@ struct SetSizeParams { scoped_ptr normal_size; }; -class WebContents : public mate::EventEmitter, +class WebContents : public mate::TrackableObject, public content::BrowserPluginGuestDelegate, public CommonWebContentsDelegate, public content::WebContentsObserver, diff --git a/atom/browser/api/trackable_object.cc b/atom/browser/api/trackable_object.cc new file mode 100644 index 00000000000..fb0762af5bc --- /dev/null +++ b/atom/browser/api/trackable_object.cc @@ -0,0 +1,39 @@ +// 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" + +namespace mate { + +atom::IDWeakMap TrackableObject::weak_map_; + +// static +TrackableObject* TrackableObject::FromWeakMapID(v8::Isolate* isolate, + int32_t id) { + v8::MaybeLocal object = weak_map_.Get(isolate, id); + if (object.IsEmpty()) + return nullptr; + + TrackableObject* self = nullptr; + mate::ConvertFromV8(isolate, object.ToLocalChecked(), &self); + return self; +} + +// static +void TrackableObject::ReleaseAllWeakReferences() { + weak_map_.Clear(); +} + +TrackableObject::TrackableObject() : weak_map_id_(0) { +} + +TrackableObject::~TrackableObject() { + weak_map_.Remove(weak_map_id_); +} + +void TrackableObject::AfterInit(v8::Isolate* isolate) { + weak_map_id_ = weak_map_.Add(isolate, GetWrapper(isolate)); +} + +} // namespace mate diff --git a/atom/browser/api/trackable_object.h b/atom/browser/api/trackable_object.h new file mode 100644 index 00000000000..e3030d32d23 --- /dev/null +++ b/atom/browser/api/trackable_object.h @@ -0,0 +1,43 @@ +// Copyright (c) 2015 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_BROWSER_API_TRACKABLE_OBJECT_H_ +#define ATOM_BROWSER_API_TRACKABLE_OBJECT_H_ + +#include "atom/browser/api/event_emitter.h" +#include "atom/common/id_weak_map.h" + +namespace mate { + +// All instances of TrackableObject will be kept in a weak map and can be got +// from its ID. +class TrackableObject : public mate::EventEmitter { + public: + // Find out the TrackableObject from its ID in weak map: + static TrackableObject* FromWeakMapID(v8::Isolate* isolate, int32_t id); + + // Releases all weak references in weak map, called when app is terminating. + static void ReleaseAllWeakReferences(); + + // mate::Wrappable: + void AfterInit(v8::Isolate* isolate) override; + + // The ID in weak map. + int32_t weak_map_id() const { return weak_map_id_; } + + protected: + TrackableObject(); + ~TrackableObject() override; + + private: + static atom::IDWeakMap weak_map_; + + int32_t weak_map_id_; + + DISALLOW_COPY_AND_ASSIGN(TrackableObject); +}; + +} // namespace mate + +#endif // ATOM_BROWSER_API_TRACKABLE_OBJECT_H_ diff --git a/atom/browser/atom_browser_main_parts.cc b/atom/browser/atom_browser_main_parts.cc index a63ec9a703b..b2a00452c75 100644 --- a/atom/browser/atom_browser_main_parts.cc +++ b/atom/browser/atom_browser_main_parts.cc @@ -4,6 +4,7 @@ #include "atom/browser/atom_browser_main_parts.h" +#include "atom/browser/api/trackable_object.h" #include "atom/browser/atom_browser_client.h" #include "atom/browser/atom_browser_context.h" #include "atom/browser/browser.h" @@ -36,6 +37,7 @@ AtomBrowserMainParts::AtomBrowserMainParts() } AtomBrowserMainParts::~AtomBrowserMainParts() { + mate::TrackableObject::ReleaseAllWeakReferences(); } // static diff --git a/atom/common/id_weak_map.cc b/atom/common/id_weak_map.cc index 68923b143dd..4b653cafee3 100644 --- a/atom/common/id_weak_map.cc +++ b/atom/common/id_weak_map.cc @@ -55,6 +55,10 @@ void IDWeakMap::Remove(int32_t id) { map_.erase(iter); } +void IDWeakMap::Clear() { + map_.clear(); +} + int32_t IDWeakMap::GetNextID() { return ++next_id_; } diff --git a/atom/common/id_weak_map.h b/atom/common/id_weak_map.h index cd010984a09..ce1a9a12879 100644 --- a/atom/common/id_weak_map.h +++ b/atom/common/id_weak_map.h @@ -34,6 +34,9 @@ class IDWeakMap { // Remove object with |id| in the WeakMap. void Remove(int32_t key); + // Clears the weak map. + void Clear(); + private: // Returns next available ID. int32_t GetNextID(); diff --git a/filenames.gypi b/filenames.gypi index da18fbe14f1..f5f7f8686c2 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -96,6 +96,8 @@ 'atom/browser/api/event.h', 'atom/browser/api/event_emitter.cc', 'atom/browser/api/event_emitter.h', + 'atom/browser/api/trackable_object.cc', + 'atom/browser/api/trackable_object.h', 'atom/browser/auto_updater.cc', 'atom/browser/auto_updater.h', 'atom/browser/auto_updater_delegate.h',