@@ -248,6 +248,7 @@ void MinXmlHttpRequest::handle_requestResponse(cocos2d::network::HttpClient *sen
248
248
callback.set (_onloadendCallback);
249
249
_notify (callback, JS::HandleValueArray::empty ());
250
250
}
251
+ _clearCallbacks ();
251
252
return ;
252
253
}
253
254
}
@@ -291,6 +292,7 @@ void MinXmlHttpRequest::handle_requestResponse(cocos2d::network::HttpClient *sen
291
292
callback.set (_onloadendCallback);
292
293
_notify (callback, JS::HandleValueArray::empty ());
293
294
}
295
+ _clearCallbacks ();
294
296
}
295
297
/* *
296
298
* @brief Send out request and fire callback when done.
@@ -303,6 +305,27 @@ void MinXmlHttpRequest::_sendRequest(JSContext *cx)
303
305
_httpRequest->release ();
304
306
}
305
307
308
+ #define REMOVE_CALLBACK (x ) \
309
+ if (x)\
310
+ { \
311
+ JS::RootedValue callback (_cx); \
312
+ callback.set (OBJECT_TO_JSVAL (x)); \
313
+ js_remove_object_root (callback); \
314
+ x = nullptr ; \
315
+ } \
316
+
317
+ void MinXmlHttpRequest::_clearCallbacks ()
318
+ {
319
+ JSB_AUTOCOMPARTMENT_WITH_GLOBAL_OBJCET
320
+ REMOVE_CALLBACK (_onreadystateCallback)
321
+ REMOVE_CALLBACK (_onloadstartCallback)
322
+ REMOVE_CALLBACK (_onabortCallback)
323
+ REMOVE_CALLBACK (_onerrorCallback)
324
+ REMOVE_CALLBACK (_onloadCallback)
325
+ REMOVE_CALLBACK (_onloadendCallback)
326
+ REMOVE_CALLBACK (_ontimeoutCallback)
327
+ }
328
+
306
329
MinXmlHttpRequest::MinXmlHttpRequest ()
307
330
: _url()
308
331
{
@@ -352,49 +375,7 @@ MinXmlHttpRequest::MinXmlHttpRequest(JSContext *cx)
352
375
*/
353
376
MinXmlHttpRequest::~MinXmlHttpRequest ()
354
377
{
355
- JS::RootedValue callback (_cx);
356
- if (_onreadystateCallback)
357
- {
358
- callback.set (OBJECT_TO_JSVAL (_onreadystateCallback));
359
- js_remove_object_root (callback);
360
- }
361
- if (_onloadstartCallback)
362
- {
363
- callback.set (OBJECT_TO_JSVAL (_onloadstartCallback));
364
- js_remove_object_root (callback);
365
- }
366
- if (_onabortCallback)
367
- {
368
- callback.set (OBJECT_TO_JSVAL (_onabortCallback));
369
- js_remove_object_root (callback);
370
- }
371
- if (_onerrorCallback)
372
- {
373
- callback.set (OBJECT_TO_JSVAL (_onerrorCallback));
374
- js_remove_object_root (callback);
375
- }
376
- if (_onloadCallback)
377
- {
378
- callback.set (OBJECT_TO_JSVAL (_onloadCallback));
379
- js_remove_object_root (callback);
380
- }
381
- if (_onloadendCallback)
382
- {
383
- callback.set (OBJECT_TO_JSVAL (_onloadendCallback));
384
- js_remove_object_root (callback);
385
- }
386
- if (_ontimeoutCallback)
387
- {
388
- callback.set (OBJECT_TO_JSVAL (_ontimeoutCallback));
389
- js_remove_object_root (callback);
390
- }
391
-
392
- if (_httpRequest)
393
- {
394
- // We don't need to release _httpRequest here since it will be released in the http callback.
395
- // _httpRequest->release();
396
- }
397
-
378
+ _clearCallbacks ();
398
379
CC_SAFE_FREE (_data);
399
380
CC_SAFE_RELEASE_NULL (_scheduler);
400
381
}
@@ -890,6 +871,7 @@ void MinXmlHttpRequest::update(float dt)
890
871
{
891
872
JS::RootedObject callback (_cx, _ontimeoutCallback);
892
873
_notify (callback, JS::HandleValueArray::empty ());
874
+ _clearCallbacks ();
893
875
}
894
876
_elapsedTime = 0 ;
895
877
_readyState = UNSENT;
@@ -916,6 +898,7 @@ JS_BINDED_FUNC_IMPL(MinXmlHttpRequest, abort)
916
898
{
917
899
JS::RootedObject callback (cx, _onabortCallback);
918
900
_notify (callback, JS::HandleValueArray::empty ());
901
+ _clearCallbacks ();
919
902
}
920
903
921
904
return true ;
0 commit comments