Index: mojo/bindings/js/handle.cc |
diff --git a/mojo/bindings/js/handle.cc b/mojo/bindings/js/handle.cc |
index e1d0fb04b60c063466536c04f48502c7b1423179..5273adc9e0ff7ac13b1652777f6c036a5a34b54d 100644 |
--- a/mojo/bindings/js/handle.cc |
+++ b/mojo/bindings/js/handle.cc |
@@ -4,6 +4,8 @@ |
#include "mojo/bindings/js/handle.h" |
+#include "base/logging.h" |
+ |
namespace gin { |
gin::WrapperInfo HandleWrapper::kWrapperInfo = { gin::kEmbedderNativeGin }; |
@@ -13,6 +15,30 @@ HandleWrapper::HandleWrapper(MojoHandle handle) |
} |
HandleWrapper::~HandleWrapper() { |
+ NotifyCloseObservers(); |
+} |
+ |
+void HandleWrapper::Close() { |
+ NotifyCloseObservers(); |
+ handle_.reset(); |
+} |
+ |
+void HandleWrapper::AddCloseObserver(CloseObserver* observer) { |
+ bool inserted = observers_.insert(observer).second; |
+ DCHECK(inserted); |
+} |
+ |
+void HandleWrapper::RemoveCloseObserver(CloseObserver* observer) { |
+ size_t removed = observers_.erase(observer); |
+ DCHECK_EQ(removed, 1u); |
+} |
+ |
+void HandleWrapper::NotifyCloseObservers() { |
+ for (std::set<CloseObserver*>::iterator it = observers_.begin(); |
+ it != observers_.end();) { |
+ (*it++)->OnHandleClosed(); |
abarth-chromium
2014/09/03 05:21:55
What if observers_ is modified during this iterati
Sam McNally
2014/09/03 05:37:27
Done.
|
+ } |
+ observers_.clear(); |
} |
v8::Handle<v8::Value> Converter<mojo::Handle>::ToV8(v8::Isolate* isolate, |