Commit b9cba6385a3e8c9e1550b4519e5afc5043652077

  • avatar
  • Patrick Stählin <pstaehlin @futu…lab.ch>
  • Tue Aug 24 23:21:04 CEST 2010
Properly unsubscribe property listeners
core/scripting/propertyscriptextension.cpp
(12 / 4)
  
3737 m_NextListenerID(1)
3838 { } // ctor
3939
40 PropertyScriptExtension::~PropertyScriptExtension() {
41 scrubVector(m_Listeners);
42 } // dtor
43
4044 JSBool global_prop_setProperty(JSContext* cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) {
4145 if(argc < 2) {
4246 Logger::getInstance()->log("JS: global_prop_setProperty: need two arguments: property-path & value", lsError);
251251 m_Listeners.push_back(_pListener);
252252 } // addListener
253253
254 void PropertyScriptExtension::removeListener(const std::string& _identifier) {
254 void PropertyScriptExtension::removeListener(const std::string& _identifier, bool _destroy) {
255255 for(std::vector<PropertyScriptListener*>::iterator it = m_Listeners.begin(), e = m_Listeners.end();
256256 it != e; ++it) {
257257 if((*it)->getIdentifier() == _identifier) {
258 (*it)->unsubscribe();
258 PropertyScriptListener* pListener = *it;
259 pListener->unsubscribe();
259260 m_Listeners.erase(it);
261 if(_destroy) {
262 delete pListener;
263 }
260264 return;
261265 }
262266 }
284284 } // ctor
285285
286286 PropertyScriptListener::~PropertyScriptListener() {
287 m_pExtension->removeListener(m_Identifier);
288 } // dtor
287 m_pExtension->removeListener(m_Identifier, false);
288 }
289289
290290 void PropertyScriptListener::createScriptObject() {
291291 if(m_pScriptObject == NULL) {
core/scripting/propertyscriptextension.h
(3 / 3)
  
4848 PropertyScriptExtension* m_pExtension;
4949 JSObject* m_pFunctionObject;
5050 jsval m_Function;
51 std::string m_Identifier;
51 const std::string m_Identifier;
5252 boost::scoped_ptr<ScriptObject> m_pScriptObject;
5353 ScriptFunctionRooter m_FunctionRoot;
5454 }; // PropertyScriptListener
5656 class PropertyScriptExtension : public ScriptExtension {
5757 public:
5858 PropertyScriptExtension(PropertySystem& _propertySystem);
59 virtual ~PropertyScriptExtension() {}
59 virtual ~PropertyScriptExtension();
6060
6161 virtual void extendContext(ScriptContext& _context);
6262
6565 JSObject* createJSProperty(ScriptContext& _ctx, boost::shared_ptr<PropertyNode> _node);
6666 std::string produceListenerID();
6767 void addListener(PropertyScriptListener* _pListener);
68 void removeListener(const std::string& _identifier);
68 void removeListener(const std::string& _identifier, bool _destroy = true);
6969 private:
7070 PropertySystem& m_PropertySystem;
7171 std::vector<PropertyScriptListener*> m_Listeners;
tests/modeljstests.cpp
(3 / 5)
  
362362
363363 boost::scoped_ptr<ScriptContext> ctx(env->getContext());
364364 ctx->evaluate<void>("setProperty('/testing', 1); setProperty('/triggered', false); "
365 "listener_ident = setListener('/testing', function(changedNode) { setProperty('/triggered', true); }); "
365 "var listener_ident = setListener('/testing', function(changedNode) { setProperty('/triggered', true); }); "
366366 );
367367
368368 BOOST_CHECK_EQUAL(propSys.getBoolValue("/triggered"), false);
414414
415415 boost::scoped_ptr<ScriptContext> ctx(env->getContext());
416416 ctx->evaluate<void>("setProperty('/testing', 1); setProperty('/triggered', false); "
417 "other_ident = setListener('/triggered', function() { setProperty('/itWorks', true); } ); "
418 "listener_ident = setListener('/testing', function(changedNode) { setProperty('/triggered', true); }); "
417 "var other_ident = setListener('/triggered', function() { setProperty('/itWorks', true); } ); "
418 "var listener_ident = setListener('/testing', function(changedNode) { setProperty('/triggered', true); }); "
419419 );
420420
421421 propSys.setBoolValue("/testing", true);
422422
423423 BOOST_CHECK_EQUAL(propSys.getBoolValue("/itWorks"), true);
424424
425 // TODO: find out why it crashes w/o those lines
426425 ctx->evaluate<void>("removeListener(other_ident); "
427426 "removeListener(listener_ident); "
428427 );
494494 sleepMS(100);
495495 }
496496
497 // TODO: find out why it crashes w/o those lines
498497 ctx->evaluate<void>("removeListener(l1); removeListener(l2);");
499498} // testThreading
500499