diff --git a/content/canvas/public/nsICanvasRenderingContextInternal.h b/content/canvas/public/nsICanvasRenderingContextInternal.h index ab66374adc0..2f394d1716a 100644 --- a/content/canvas/public/nsICanvasRenderingContextInternal.h +++ b/content/canvas/public/nsICanvasRenderingContextInternal.h @@ -50,6 +50,10 @@ public: { mCanvasElement = aParentCanvas; } + nsHTMLCanvasElement* GetParentObject() const + { + return mCanvasElement; + } // Sets the dimensions of the canvas, in pixels. Called // whenever the size of the element changes. diff --git a/content/canvas/src/WebGLContext.cpp b/content/canvas/src/WebGLContext.cpp index 3bcd06d2978..100c310c7e6 100644 --- a/content/canvas/src/WebGLContext.cpp +++ b/content/canvas/src/WebGLContext.cpp @@ -1240,7 +1240,8 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebGLContext) 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_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, + nsICanvasRenderingContextInternal) NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(WebGLRenderingContext) NS_INTERFACE_MAP_END diff --git a/content/canvas/src/WebGLContext.h b/content/canvas/src/WebGLContext.h index 8209e3a39d4..cb7c14e8ff5 100644 --- a/content/canvas/src/WebGLContext.h +++ b/content/canvas/src/WebGLContext.h @@ -482,10 +482,6 @@ public: NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(WebGLContext, nsIDOMWebGLRenderingContext) - nsINode* GetParentObject() { - return mCanvasElement; - } - virtual JSObject* WrapObject(JSContext *cx, JSObject *scope, bool *triedToWrap); diff --git a/content/canvas/src/nsCanvasRenderingContext2D.cpp b/content/canvas/src/nsCanvasRenderingContext2D.cpp index b39644c7d52..0f1a600c7d4 100644 --- a/content/canvas/src/nsCanvasRenderingContext2D.cpp +++ b/content/canvas/src/nsCanvasRenderingContext2D.cpp @@ -595,9 +595,8 @@ protected: * Gets the pres shell from either the canvas element or the doc shell */ nsIPresShell *GetPresShell() { - nsCOMPtr content = do_QueryObject(mCanvasElement); - if (content) { - return content->OwnerDoc()->GetShell(); + if (mCanvasElement) { + return mCanvasElement->OwnerDoc()->GetShell(); } if (mDocShell) { nsCOMPtr shell; @@ -772,7 +771,8 @@ DOMCI_DATA(CanvasRenderingContext2D, nsCanvasRenderingContext2D) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsCanvasRenderingContext2D) NS_INTERFACE_MAP_ENTRY(nsIDOMCanvasRenderingContext2D) NS_INTERFACE_MAP_ENTRY(nsICanvasRenderingContextInternal) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMCanvasRenderingContext2D) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, + nsICanvasRenderingContextInternal) NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(CanvasRenderingContext2D) NS_INTERFACE_MAP_END @@ -1177,10 +1177,9 @@ nsCanvasRenderingContext2D::EnsureSurface() gfxASurface::gfxImageFormat format = GetImageFormat(); if (!PR_GetEnv("MOZ_CANVAS_IMAGE_SURFACE")) { - nsCOMPtr content = do_QueryObject(mCanvasElement); nsIDocument* ownerDoc = nsnull; - if (content) - ownerDoc = content->OwnerDoc(); + if (mCanvasElement) + ownerDoc = mCanvasElement->OwnerDoc(); nsRefPtr layerManager = nsnull; if (ownerDoc) diff --git a/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp b/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp index 73ec7e8bf01..0e56dd835a3 100644 --- a/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp +++ b/content/canvas/src/nsCanvasRenderingContext2DAzure.cpp @@ -89,6 +89,8 @@ #include "mozilla/ipc/PDocumentRendererParent.h" #include "mozilla/Preferences.h" #include "mozilla/unused.h" +#include "nsCCUncollectableMarker.h" +#include "nsWrapperCacheInlines.h" #ifdef XP_WIN #include "gfxWindowsPlatform.h" @@ -364,7 +366,8 @@ static const Float SIGMA_MAX = 100; **/ class nsCanvasRenderingContext2DAzure : public nsIDOMCanvasRenderingContext2D, - public nsICanvasRenderingContextInternal + public nsICanvasRenderingContextInternal, + public nsWrapperCache { public: nsCanvasRenderingContext2DAzure(); @@ -405,7 +408,8 @@ public: // nsISupports interface + CC NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_CYCLE_COLLECTION_CLASS_AMBIGUOUS(nsCanvasRenderingContext2DAzure, nsIDOMCanvasRenderingContext2D) + NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_AMBIGUOUS( + nsCanvasRenderingContext2DAzure, nsIDOMCanvasRenderingContext2D) // nsIDOMCanvasRenderingContext2D interface NS_DECL_NSIDOMCANVASRENDERINGCONTEXT2D @@ -586,9 +590,8 @@ protected: * Gets the pres shell from either the canvas element or the doc shell */ nsIPresShell *GetPresShell() { - nsCOMPtr content = do_QueryObject(mCanvasElement); - if (content) { - return content->OwnerDoc()->GetShell(); + if (mCanvasElement) { + return mCanvasElement->OwnerDoc()->GetShell(); } if (mDocShell) { nsCOMPtr shell; @@ -938,18 +941,46 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(nsCanvasRenderingContext2DAzure) NS_IMPL_CYCLE_COLLECTION_CLASS(nsCanvasRenderingContext2DAzure) NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsCanvasRenderingContext2DAzure) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mCanvasElement) + NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(nsCanvasRenderingContext2DAzure) + NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER +NS_IMPL_CYCLE_COLLECTION_TRACE_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsCanvasRenderingContext2DAzure) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(mCanvasElement, nsINode) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsCanvasRenderingContext2DAzure) + if (nsCCUncollectableMarker::sGeneration && tmp->IsBlack()) { + nsGenericElement* canvasElement = tmp->mCanvasElement; + if (canvasElement) { + if (canvasElement->IsPurple()) { + canvasElement->RemovePurple(); + } + nsGenericElement::MarkNodeChildren(canvasElement); + } + return true; + } +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END + +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(nsCanvasRenderingContext2DAzure) + return nsCCUncollectableMarker::sGeneration && tmp->IsBlack(); +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END + +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(nsCanvasRenderingContext2DAzure) + return nsCCUncollectableMarker::sGeneration && tmp->IsBlack(); +NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END + // XXX // DOMCI_DATA(CanvasRenderingContext2D, nsCanvasRenderingContext2DAzure) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsCanvasRenderingContext2DAzure) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_ENTRY(nsIDOMCanvasRenderingContext2D) NS_INTERFACE_MAP_ENTRY(nsICanvasRenderingContextInternal) - NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMCanvasRenderingContext2D) + NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, + nsICanvasRenderingContextInternal) NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(CanvasRenderingContext2D) NS_INTERFACE_MAP_END @@ -1241,10 +1272,9 @@ nsCanvasRenderingContext2DAzure::SetDimensions(PRInt32 width, PRInt32 height) if (size.width <= 0xFFFF && size.height <= 0xFFFF && size.width >= 0 && size.height >= 0) { SurfaceFormat format = GetSurfaceFormat(); - nsCOMPtr content = do_QueryObject(mCanvasElement); nsIDocument* ownerDoc = nsnull; - if (content) { - ownerDoc = content->OwnerDoc(); + if (mCanvasElement) { + ownerDoc = mCanvasElement->OwnerDoc(); } nsRefPtr layerManager = nsnull; diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 35386394c31..55fa98ce9bb 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -24,6 +24,8 @@ #include "xpcpublic.h" #include "xpcprivate.h" #include "XPCWrapper.h" +#include "XPCQuickStubs.h" +#include "nsDOMQS.h" #include "mozilla/dom/RegisterBindings.h" @@ -415,8 +417,7 @@ #include "nsIDOMSVGZoomAndPan.h" #include "nsIDOMSVGZoomEvent.h" -#include "nsIDOMCanvasRenderingContext2D.h" -#include "nsIDOMWebGLRenderingContext.h" +#include "nsICanvasRenderingContextInternal.h" #include "nsIImageDocument.h" @@ -621,13 +622,21 @@ static const char kDOMStringBundleURL[] = // nothing #endif -DOMCI_DATA(Crypto, void) -DOMCI_DATA(CRMFObject, void) -DOMCI_DATA(SmartCardEvent, void) -DOMCI_DATA(ContentFrameMessageManager, void) +/** + * To generate the bitmap for a class that we're sure doesn't implement any of + * the interfaces in DOMCI_CASTABLE_INTERFACES. + */ +#define DOMCI_DATA_NO_CLASS(_dom_class) \ +const PRUint32 kDOMClassInfo_##_dom_class##_interfaces = \ + 0; -DOMCI_DATA(DOMPrototype, void) -DOMCI_DATA(DOMConstructor, void) +DOMCI_DATA_NO_CLASS(Crypto) +DOMCI_DATA_NO_CLASS(CRMFObject) +DOMCI_DATA_NO_CLASS(SmartCardEvent) +DOMCI_DATA_NO_CLASS(ContentFrameMessageManager) + +DOMCI_DATA_NO_CLASS(DOMPrototype) +DOMCI_DATA_NO_CLASS(DOMConstructor) #define NS_DEFINE_CLASSINFO_DATA_WITH_NAME(_class, _name, _helper, \ _flags) \ @@ -691,6 +700,10 @@ public: } // anonymous namespace +typedef nsNewDOMBindingSH + nsCanvasRenderingContextSH; + + // This list of NS_DEFINE_CLASSINFO_DATA macros is what gives the DOM // classes their correct behavior when used through XPConnect. The // arguments that are passed to NS_DEFINE_CLASSINFO_DATA are @@ -1317,7 +1330,8 @@ static nsDOMClassInfoData sClassInfoData[] = { NS_DEFINE_CLASSINFO_DATA(HTMLCanvasElement, nsElementSH, ELEMENT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(CanvasRenderingContext2D, nsDOMGenericSH, + NS_DEFINE_CLASSINFO_DATA(CanvasRenderingContext2D, + nsCanvasRenderingContextSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(CanvasGradient, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) @@ -2002,8 +2016,7 @@ WrapNative(JSContext *cx, JSObject *scope, nsISupports *native, // nsWrapperCache. static inline nsresult WrapNativeParent(JSContext *cx, JSObject *scope, nsISupports *native, - nsWrapperCache *nativeWrapperCache, - JSObject **parentObj) + nsWrapperCache *nativeWrapperCache, JSObject **parentObj) { // In the common case, |native| is a wrapper cache with an existing wrapper #ifdef DEBUG @@ -2033,6 +2046,14 @@ WrapNativeParent(JSContext *cx, JSObject *scope, nsISupports *native, return NS_OK; } +template +static inline nsresult +WrapNativeParent(JSContext *cx, JSObject *scope, P *parent, + JSObject **parentObj) +{ + return WrapNativeParent(cx, scope, ToSupports(parent), parent, parentObj); +} + // Helper to handle torn-down inner windows. static inline nsresult SetParentToWindow(nsGlobalWindow *win, JSObject **parent) @@ -7976,8 +7997,7 @@ nsNodeSH::PreCreate(nsISupports *nativeObj, JSContext *cx, JSObject *globalObj, // to wrap here? But that's not always reachable, let's use // globalObj for now... - nsresult rv = WrapNativeParent(cx, globalObj, native_parent, native_parent, - parentObj); + nsresult rv = WrapNativeParent(cx, globalObj, native_parent, parentObj); NS_ENSURE_SUCCESS(rv, rv); return node->IsInNativeAnonymousSubtree() ? @@ -10312,7 +10332,7 @@ nsCSSStyleDeclSH::PreCreate(nsISupports *nativeObj, JSContext *cx, } nsresult rv = - WrapNativeParent(cx, globalObj, native_parent, native_parent, parentObj); + WrapNativeParent(cx, globalObj, native_parent, parentObj); NS_ENSURE_SUCCESS(rv, rv); return NS_SUCCESS_ALLOW_SLIM_WRAPPERS; @@ -10927,7 +10947,7 @@ WebGLExtensionSH::PreCreate(nsISupports *nativeObj, JSContext *cx, WebGLContext *webgl = ext->Context(); nsINode *node = webgl->GetParentObject(); - return WrapNativeParent(cx, globalObj, node, node, parentObj); + return WrapNativeParent(cx, globalObj, node, parentObj); } nsresult @@ -10940,15 +10960,18 @@ nsNewDOMBindingNoWrapperCacheSH::PreCreate(nsISupports *nativeObj, return NS_ERROR_UNEXPECTED; } +template NS_IMETHODIMP -nsWebGLViewportHandlerSH::PreCreate(nsISupports *nativeObj, JSContext *cx, - JSObject *globalObj, JSObject **parentObj) +nsNewDOMBindingSH::PreCreate(nsISupports *nativeObj, + JSContext *cx, + JSObject *globalObj, + JSObject **parentObj) { *parentObj = globalObj; - WebGLContext *webgl = static_cast( - static_cast(nativeObj)); - nsINode *node = webgl->GetParentObject(); - - return WrapNativeParent(cx, globalObj, node, node, parentObj); + T *native = static_cast(static_cast(nativeObj)); + if (!native->GetParentObject()) { + return NS_OK; + } + return WrapNativeParent(cx, globalObj, native->GetParentObject(), parentObj); } diff --git a/dom/base/nsDOMClassInfo.h b/dom/base/nsDOMClassInfo.h index 9c4a481756a..53d6f15dc38 100644 --- a/dom/base/nsDOMClassInfo.h +++ b/dom/base/nsDOMClassInfo.h @@ -26,6 +26,7 @@ class DOMSVGStringList; class DOMSVGTransformList; } class nsGlobalWindow; +class nsICanvasRenderingContextInternal; class nsIDOMDocument; class nsIDOMHTMLOptionsCollection; class nsIDOMSVGLength; @@ -1531,40 +1532,6 @@ public: } }; -class nsWebGLViewportHandlerSH : public nsDOMGenericSH -{ -protected: - nsWebGLViewportHandlerSH(nsDOMClassInfoData *aData) : nsDOMGenericSH(aData) - { - } - - virtual ~nsWebGLViewportHandlerSH() - { - } - -public: - NS_IMETHOD PostCreatePrototype(JSContext * cx, JSObject * proto) { - nsresult rv = nsDOMGenericSH::PostCreatePrototype(cx, proto); - if (NS_SUCCEEDED(rv)) { - if (!::JS_DefineProperty(cx, proto, "VIEWPORT", INT_TO_JSVAL(0x0BA2), - nsnull, nsnull, JSPROP_ENUMERATE)) - { - return NS_ERROR_UNEXPECTED; - } - } - return rv; - } - - NS_IMETHOD PreCreate(nsISupports *nativeObj, JSContext *cx, - JSObject *globalObj, JSObject **parentObj); - - static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) - { - return new nsWebGLViewportHandlerSH(aData); - } -}; - - // Template for SVGXXXList helpers template @@ -1614,4 +1581,58 @@ public: } }; +template +class nsNewDOMBindingSH : public nsDOMGenericSH +{ +protected: + nsNewDOMBindingSH(nsDOMClassInfoData* aData) : nsDOMGenericSH(aData) + { + } + + virtual ~nsNewDOMBindingSH() + { + } + +public: + NS_IMETHOD PreCreate(nsISupports *nativeObj, JSContext *cx, + JSObject *globalObj, JSObject **parentObj); + + static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) + { + return new nsNewDOMBindingSH(aData); + } +}; + +class nsWebGLViewportHandlerSH + : public nsNewDOMBindingSH +{ +protected: + nsWebGLViewportHandlerSH(nsDOMClassInfoData *aData) + : nsNewDOMBindingSH(aData) + { + } + + virtual ~nsWebGLViewportHandlerSH() + { + } + +public: + NS_IMETHOD PostCreatePrototype(JSContext * cx, JSObject * proto) { + nsresult rv = nsDOMGenericSH::PostCreatePrototype(cx, proto); + if (NS_SUCCEEDED(rv)) { + if (!::JS_DefineProperty(cx, proto, "VIEWPORT", INT_TO_JSVAL(0x0BA2), + nsnull, nsnull, JSPROP_ENUMERATE)) + { + return NS_ERROR_UNEXPECTED; + } + } + return rv; + } + + static nsIClassInfo *doCreate(nsDOMClassInfoData* aData) + { + return new nsWebGLViewportHandlerSH(aData); + } +}; + #endif /* nsDOMClassInfo_h___ */ diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index b0807abdbfd..ed45df08a2f 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -502,13 +502,13 @@ template inline nsISupports* GetParentPointer(T* aObject) { - return aObject; + return ToSupports(aObject); } inline nsISupports* GetParentPointer(const ParentObject& aObject) { - return aObject.mObject; + return ToSupports(aObject.mObject); } // Only set allowNativeWrapper to false if you really know you need it, if in diff --git a/js/xpconnect/src/nsDOMQS.h b/js/xpconnect/src/nsDOMQS.h index 55af6db2719..f996b8a08e3 100644 --- a/js/xpconnect/src/nsDOMQS.h +++ b/js/xpconnect/src/nsDOMQS.h @@ -179,6 +179,23 @@ DEFINE_UNWRAP_CAST_HTML(canvas, nsHTMLCanvasElement) DEFINE_UNWRAP_CAST_HTML(img, nsHTMLImageElement) DEFINE_UNWRAP_CAST_HTML(video, nsHTMLVideoElement) +template <> +inline nsresult +xpc_qsUnwrapArg(JSContext *cx, jsval v, + mozilla::dom::ImageData **ppArg, + mozilla::dom::ImageData **ppArgRef, + jsval *vp) +{ + nsIDOMImageData* arg; + nsIDOMImageData* argRef; + nsresult rv = xpc_qsUnwrapArg(cx, v, &arg, &argRef, vp); + if (NS_SUCCEEDED(rv)) { + *ppArg = static_cast(arg); + *ppArgRef = static_cast(argRef); + } + return rv; +} + inline nsISupports* ToSupports(nsContentList *p) {