Bug 747825. Make the WebGLContext a wrapper cache. r=peterv

This commit is contained in:
Boris Zbarsky 2012-05-04 12:36:40 -04:00
parent 9f4754b67b
commit 6cb0048f56
4 changed files with 36 additions and 4 deletions

View File

@ -1193,22 +1193,33 @@ NS_IMPL_CYCLE_COLLECTING_ADDREF(WebGLContext)
NS_IMPL_CYCLE_COLLECTING_RELEASE(WebGLContext)
NS_IMPL_CYCLE_COLLECTION_CLASS(WebGLContext)
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(WebGLContext)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_TRACE_END
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(WebGLContext)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mCanvasElement)
NS_IMPL_CYCLE_COLLECTION_UNLINK_NSTARRAY(mEnabledExtensions)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(WebGLContext)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mCanvasElement)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSTARRAY_OF_NSCOMPTR(mEnabledExtensions)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
DOMCI_DATA(WebGLRenderingContext, WebGLContext)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebGLContext)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsIDOMWebGLRenderingContext)
NS_INTERFACE_MAP_ENTRY(nsICanvasRenderingContextInternal)
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
NS_INTERFACE_MAP_ENTRY(nsITimerCallback)
// If the exact way we cast to nsISupports here ever changes, fix our
// PreCreate hook!
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMWebGLRenderingContext)
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(WebGLRenderingContext)
NS_INTERFACE_MAP_END

View File

@ -523,7 +523,8 @@ class WebGLContext :
public nsICanvasRenderingContextInternal,
public nsSupportsWeakReference,
public nsITimerCallback,
public WebGLRectangleObject
public WebGLRectangleObject,
public nsWrapperCache
{
friend class WebGLMemoryMultiReporterWrapper;
friend class WebGLExtensionLoseContext;
@ -536,7 +537,12 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(WebGLContext, nsIDOMWebGLRenderingContext)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(WebGLContext,
nsIDOMWebGLRenderingContext)
nsINode* GetParentObject() {
return HTMLCanvasElement();
}
NS_DECL_NSIDOMWEBGLRENDERINGCONTEXT

View File

@ -10908,8 +10908,20 @@ WebGLExtensionSH::PreCreate(nsISupports *nativeObj, JSContext *cx,
WebGLExtension *ext = static_cast<WebGLExtension*>(nativeObj);
WebGLContext *webgl = ext->Context();
nsHTMLCanvasElement *canvas = webgl->HTMLCanvasElement();
nsINode *node = static_cast<nsINode*>(canvas);
nsINode *node = webgl->GetParentObject();
return WrapNativeParent(cx, globalObj, node, node, parentObj);
}
NS_IMETHODIMP
nsWebGLViewportHandlerSH::PreCreate(nsISupports *nativeObj, JSContext *cx,
JSObject *globalObj, JSObject **parentObj)
{
*parentObj = globalObj;
WebGLContext *webgl = static_cast<WebGLContext*>(
static_cast<nsIDOMWebGLRenderingContext*>(nativeObj));
nsINode *node = webgl->GetParentObject();
return WrapNativeParent(cx, globalObj, node, node, parentObj);
}

View File

@ -1612,6 +1612,9 @@ public:
return rv;
}
NS_IMETHOD PreCreate(nsISupports *nativeObj, JSContext *cx,
JSObject *globalObj, JSObject **parentObj);
static nsIClassInfo *doCreate(nsDOMClassInfoData* aData)
{
return new nsWebGLViewportHandlerSH(aData);