Browse Source

When JSEventHelper is GC'd clear the event handlers, added method to remove event subscriptions by receiver

Josh Engebretson 9 years ago
parent
commit
6a3c1eec68

+ 32 - 0
Source/Atomic/Core/Object.cpp

@@ -564,4 +564,36 @@ HashMap<StringHash, String>& EventNameRegistrar::GetEventNameMap()
     return eventNames_;
 }
 
+// ATOMIC BEGIN
+
+void Object::UnsubscribeFromEventReceiver(Object* receiver)
+{
+    EventHandler* handler = eventHandlers_.First();
+    EventHandler* previous = 0;
+
+    while (handler)
+    {
+        if (handler->GetReceiver() == receiver)
+        {
+
+            if (handler->GetSender())
+                context_->RemoveEventReceiver(this, handler->GetSender(), handler->GetEventType());
+            else
+                context_->RemoveEventReceiver(this, handler->GetEventType());
+
+            EventHandler* next = eventHandlers_.Next(handler);
+            eventHandlers_.Erase(handler, previous);
+            handler = next;
+        }
+        else
+        {
+            previous = handler;
+            handler = eventHandlers_.Next(handler);
+        }
+    }
+
+}
+
+// ATOMIC END
+
 }

+ 3 - 0
Source/Atomic/Core/Object.h

@@ -187,6 +187,9 @@ public:
 
     virtual bool IsObject() const { return true; }
 
+    /// Unsubscribe from event for specific receiver (where the event handler isn't necessarily in the subscribed object)
+    void UnsubscribeFromEventReceiver(Object* receiver);
+
     static ClassID GetClassIDStatic() { static const int typeID = 0; return (ClassID) &typeID; }
     static const Atomic::String& GetTypeNameStatic() { static const Atomic::String typeNameStatic("Object"); return typeNameStatic; }
 

+ 11 - 0
Source/AtomicJS/Javascript/JSEventHelper.cpp

@@ -113,7 +113,18 @@ JSEventHelper::JSEventHelper(Context* context, Object* object) :
 
 JSEventHelper::~JSEventHelper()
 {
+    Clear();
+}
+
+void JSEventHelper::Clear()
+{
+    UnsubscribeFromAllEvents();
 
+    if (!object_.Expired())
+    {
+        object_->UnsubscribeFromEventReceiver(this);
+    }
+    
 }
 
 void JSEventHelper::AddEventHandler(StringHash eventType)

+ 2 - 0
Source/AtomicJS/Javascript/JSEventHelper.h

@@ -62,6 +62,8 @@ public:
     void AddEventHandler(StringHash eventType);
     void AddEventHandler(Object* sender, StringHash eventType);
 
+    void Clear();
+
 private:
 
     void HandleEvent(StringHash eventType, VariantMap& eventData);