From 7ea5be2e60251c2d5d0fd37fa44bc16983f2e8a0 Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Thu, 26 Jan 2012 16:55:30 +0100 Subject: [PATCH] Bug 719949 - Unmark listeners in XHR, WebSocket and EventSource if the object is black, r=mccr8 --HG-- extra : rebase_source : ceff390170c3ad35baa33a7f16ec39e3393a81be --- content/base/src/nsEventSource.cpp | 25 +++++++++++++++++++++++++ content/base/src/nsEventSource.h | 4 ++-- content/base/src/nsWebSocket.cpp | 26 ++++++++++++++++++++++++++ content/base/src/nsWebSocket.h | 4 ++-- content/base/src/nsXMLHttpRequest.cpp | 26 ++++++++++++++++++++++++++ content/base/src/nsXMLHttpRequest.h | 4 ++-- 6 files changed, 83 insertions(+), 6 deletions(-) diff --git a/content/base/src/nsEventSource.cpp b/content/base/src/nsEventSource.cpp index a68503d6eff..0ca25bf9038 100644 --- a/content/base/src/nsEventSource.cpp +++ b/content/base/src/nsEventSource.cpp @@ -63,6 +63,7 @@ #include "mozilla/Preferences.h" #include "xpcpublic.h" #include "nsCrossSiteListenerProxy.h" +#include "nsWrapperCacheInlines.h" using namespace mozilla; @@ -105,6 +106,30 @@ nsEventSource::~nsEventSource() NS_IMPL_CYCLE_COLLECTION_CLASS(nsEventSource) +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsEventSource) + if (tmp->IsBlack()) { + if (tmp->mListenerManager) { + tmp->mListenerManager->UnmarkGrayJSListeners(); + NS_UNMARK_LISTENER_WRAPPER(Open) + NS_UNMARK_LISTENER_WRAPPER(Message) + NS_UNMARK_LISTENER_WRAPPER(Error) + } + return true; + } +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END + +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsEventSource) + return tmp->IsBlack(); +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END + +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsEventSource) + return tmp->IsBlack(); +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END + +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(nsEventSource, + nsDOMEventTargetWrapperCache) +NS_IMPL_CYCLE_COLLECTION_TRACE_END + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsEventSource, nsDOMEventTargetWrapperCache) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mSrc) diff --git a/content/base/src/nsEventSource.h b/content/base/src/nsEventSource.h index e6bf37b259a..760bc40c4d9 100644 --- a/content/base/src/nsEventSource.h +++ b/content/base/src/nsEventSource.h @@ -84,8 +84,8 @@ public: nsEventSource(); virtual ~nsEventSource(); NS_DECL_ISUPPORTS_INHERITED - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsEventSource, - nsDOMEventTargetWrapperCache) + NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_INHERITED(nsEventSource, + nsDOMEventTargetWrapperCache) NS_DECL_NSIEVENTSOURCE diff --git a/content/base/src/nsWebSocket.cpp b/content/base/src/nsWebSocket.cpp index 9f2d2ff0af4..8cc48cdc6a2 100644 --- a/content/base/src/nsWebSocket.cpp +++ b/content/base/src/nsWebSocket.cpp @@ -82,6 +82,7 @@ #include "jstypedarray.h" #include "prmem.h" #include "nsDOMFile.h" +#include "nsWrapperCacheInlines.h" using namespace mozilla; @@ -429,6 +430,31 @@ nsWebSocket::~nsWebSocket() NS_IMPL_CYCLE_COLLECTION_CLASS(nsWebSocket) +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsWebSocket) + if (tmp->IsBlack()) { + if (tmp->mListenerManager) { + tmp->mListenerManager->UnmarkGrayJSListeners(); + NS_UNMARK_LISTENER_WRAPPER(Open) + NS_UNMARK_LISTENER_WRAPPER(Error) + NS_UNMARK_LISTENER_WRAPPER(Message) + NS_UNMARK_LISTENER_WRAPPER(Close) + } + return true; + } +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END + +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsWebSocket) + return tmp->IsBlack(); +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END + +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsWebSocket) + return tmp->IsBlack(); +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END + +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(nsWebSocket, + nsDOMEventTargetWrapperCache) +NS_IMPL_CYCLE_COLLECTION_TRACE_END + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsWebSocket, nsDOMEventTargetWrapperCache) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mOnOpenListener) diff --git a/content/base/src/nsWebSocket.h b/content/base/src/nsWebSocket.h index 71efa967d7e..084bd8f6cef 100644 --- a/content/base/src/nsWebSocket.h +++ b/content/base/src/nsWebSocket.h @@ -83,8 +83,8 @@ public: nsWebSocket(); virtual ~nsWebSocket(); NS_DECL_ISUPPORTS_INHERITED - NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsWebSocket, - nsDOMEventTargetWrapperCache) + NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_INHERITED(nsWebSocket, + nsDOMEventTargetWrapperCache) NS_DECL_NSIWEBSOCKET NS_DECL_NSIINTERFACEREQUESTOR NS_DECL_NSIWEBSOCKETLISTENER diff --git a/content/base/src/nsXMLHttpRequest.cpp b/content/base/src/nsXMLHttpRequest.cpp index 1498bf50314..0dc24ea7fff 100644 --- a/content/base/src/nsXMLHttpRequest.cpp +++ b/content/base/src/nsXMLHttpRequest.cpp @@ -105,6 +105,7 @@ #include "nsIFileChannel.h" #include "mozilla/Telemetry.h" #include "sampler.h" +#include "nsWrapperCacheInlines.h" using namespace mozilla; @@ -578,6 +579,31 @@ nsXMLHttpRequest::SetRequestObserver(nsIRequestObserver* aObserver) NS_IMPL_CYCLE_COLLECTION_CLASS(nsXMLHttpRequest) +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsXMLHttpRequest) + if (tmp->IsBlack()) { + if (tmp->mListenerManager) { + tmp->mListenerManager->UnmarkGrayJSListeners(); + NS_UNMARK_LISTENER_WRAPPER(Load) + NS_UNMARK_LISTENER_WRAPPER(Error) + NS_UNMARK_LISTENER_WRAPPER(Abort) + NS_UNMARK_LISTENER_WRAPPER(LoadStart) + NS_UNMARK_LISTENER_WRAPPER(Progress) + NS_UNMARK_LISTENER_WRAPPER(Loadend) + NS_UNMARK_LISTENER_WRAPPER(UploadProgress) + NS_UNMARK_LISTENER_WRAPPER(Readystatechange) + } + return true; + } +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END + +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsXMLHttpRequest) + return tmp->IsBlack(); +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END + +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsXMLHttpRequest) + return tmp->IsBlack(); +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsXMLHttpRequest, nsXHREventTarget) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mContext) diff --git a/content/base/src/nsXMLHttpRequest.h b/content/base/src/nsXMLHttpRequest.h index 620b1005558..3bcdb7c6f3a 100644 --- a/content/base/src/nsXMLHttpRequest.h +++ b/content/base/src/nsXMLHttpRequest.h @@ -199,8 +199,8 @@ public: void SetRequestObserver(nsIRequestObserver* aObserver); - NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(nsXMLHttpRequest, - nsXHREventTarget) + NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_INHERITED(nsXMLHttpRequest, + nsXHREventTarget) bool AllowUploadProgress(); void RootResultArrayBuffer();