From b598ec354cbe0f86fc62d62a2ed7c05ea1b12daf Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Mon, 22 Oct 2012 13:08:52 -0400 Subject: [PATCH] Bug 801712 part 2. Switch ImageData to WebIDL bindings. r=peterv --- .../canvas/src/CanvasRenderingContext2D.cpp | 22 ++++---- content/canvas/src/CanvasRenderingContext2D.h | 6 +-- content/canvas/src/ImageData.cpp | 36 +++---------- content/canvas/src/ImageData.h | 5 +- dom/base/nsDOMClassInfo.cpp | 8 +-- dom/base/nsDOMClassInfoClasses.h | 1 - dom/base/nsDOMClassInfoID.h | 3 +- dom/base/nsJSEnvironment.cpp | 54 +++++++------------ dom/bindings/Bindings.conf | 5 +- .../canvas/nsIDOMCanvasRenderingContext2D.idl | 14 ++--- dom/webidl/CanvasRenderingContext2D.webidl | 1 - dom/webidl/ImageData.webidl | 17 ++++++ dom/webidl/WebIDL.mk | 1 + js/xpconnect/src/dom_quickstubs.qsconf | 19 +------ js/xpconnect/src/nsDOMQS.h | 18 ------- 15 files changed, 73 insertions(+), 137 deletions(-) create mode 100644 dom/webidl/ImageData.webidl diff --git a/content/canvas/src/CanvasRenderingContext2D.cpp b/content/canvas/src/CanvasRenderingContext2D.cpp index d38db528c08c..6b29389461fa 100644 --- a/content/canvas/src/CanvasRenderingContext2D.cpp +++ b/content/canvas/src/CanvasRenderingContext2D.cpp @@ -4193,7 +4193,7 @@ NS_IMETHODIMP CanvasRenderingContext2D::GetImageData(double aSx, double aSy, double aSw, double aSh, JSContext* aCx, - nsIDOMImageData** aRetval) + nsISupports** aRetval) { ErrorResult rv; *aRetval = GetImageData(aCx, aSx, aSy, aSw, aSh, rv).get(); @@ -4336,7 +4336,7 @@ CanvasRenderingContext2D::FillRuleChanged() void CanvasRenderingContext2D::PutImageData(JSContext* cx, - ImageData* imageData, double dx, + ImageData& imageData, double dx, double dy, ErrorResult& error) { if (!FloatValidate(dx, dy)) { @@ -4344,16 +4344,16 @@ CanvasRenderingContext2D::PutImageData(JSContext* cx, return; } - dom::Uint8ClampedArray arr(cx, imageData->GetDataObject()); + dom::Uint8ClampedArray arr(cx, imageData.GetDataObject()); error = PutImageData_explicit(JS_DoubleToInt32(dx), JS_DoubleToInt32(dy), - imageData->Width(), imageData->Height(), + imageData.Width(), imageData.Height(), arr.Data(), arr.Length(), false, 0, 0, 0, 0); } void CanvasRenderingContext2D::PutImageData(JSContext* cx, - ImageData* imageData, double dx, + ImageData& imageData, double dx, double dy, double dirtyX, double dirtyY, double dirtyWidth, double dirtyHeight, @@ -4364,10 +4364,10 @@ CanvasRenderingContext2D::PutImageData(JSContext* cx, return; } - dom::Uint8ClampedArray arr(cx, imageData->GetDataObject()); + dom::Uint8ClampedArray arr(cx, imageData.GetDataObject()); error = PutImageData_explicit(JS_DoubleToInt32(dx), JS_DoubleToInt32(dy), - imageData->Width(), imageData->Height(), + imageData.Width(), imageData.Height(), arr.Data(), arr.Length(), true, JS_DoubleToInt32(dirtyX), JS_DoubleToInt32(dirtyY), @@ -4575,11 +4575,11 @@ CanvasRenderingContext2D::CreateImageData(JSContext* cx, double sw, already_AddRefed CanvasRenderingContext2D::CreateImageData(JSContext* cx, - ImageData* imagedata, + ImageData& imagedata, ErrorResult& error) { - return mozilla::dom::CreateImageData(cx, this, imagedata->Width(), - imagedata->Height(), error); + return mozilla::dom::CreateImageData(cx, this, imagedata.Width(), + imagedata.Height(), error); } NS_IMETHODIMP @@ -4587,7 +4587,7 @@ CanvasRenderingContext2D::CreateImageData(const JS::Value &arg1, const JS::Value &arg2, JSContext* cx, uint8_t optional_argc, - nsIDOMImageData** retval) + nsISupports** retval) { /* Should never be called; handled entirely in new bindings */ return NS_ERROR_NOT_IMPLEMENTED; diff --git a/content/canvas/src/CanvasRenderingContext2D.h b/content/canvas/src/CanvasRenderingContext2D.h index 974d2703262d..c196f034dce5 100644 --- a/content/canvas/src/CanvasRenderingContext2D.h +++ b/content/canvas/src/CanvasRenderingContext2D.h @@ -289,14 +289,14 @@ public: CreateImageData(JSContext* cx, double sw, double sh, mozilla::ErrorResult& error); already_AddRefed - CreateImageData(JSContext* cx, mozilla::dom::ImageData* imagedata, + CreateImageData(JSContext* cx, mozilla::dom::ImageData& imagedata, mozilla::ErrorResult& error); already_AddRefed GetImageData(JSContext* cx, double sx, double sy, double sw, double sh, mozilla::ErrorResult& error); - void PutImageData(JSContext* cx, mozilla::dom::ImageData* imageData, + void PutImageData(JSContext* cx, mozilla::dom::ImageData& imageData, double dx, double dy, mozilla::ErrorResult& error); - void PutImageData(JSContext* cx, mozilla::dom::ImageData* imageData, + void PutImageData(JSContext* cx, mozilla::dom::ImageData& imageData, double dx, double dy, double dirtyX, double dirtyY, double dirtyWidth, double dirtyHeight, mozilla::ErrorResult& error); diff --git a/content/canvas/src/ImageData.cpp b/content/canvas/src/ImageData.cpp index 45bba4422831..ee6d54ba33f1 100644 --- a/content/canvas/src/ImageData.cpp +++ b/content/canvas/src/ImageData.cpp @@ -8,12 +8,10 @@ #include "nsDOMClassInfoID.h" #include "nsContentUtils.h" -#include "mozilla/dom/CanvasRenderingContext2DBinding.h" +#include "mozilla/dom/ImageDataBinding.h" #include "jsapi.h" -DOMCI_DATA(ImageData, mozilla::dom::ImageData) - namespace mozilla { namespace dom { @@ -21,9 +19,7 @@ NS_IMPL_CYCLE_COLLECTING_ADDREF(ImageData) NS_IMPL_CYCLE_COLLECTING_RELEASE(ImageData) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ImageData) - NS_INTERFACE_MAP_ENTRY(nsIDOMImageData) NS_INTERFACE_MAP_ENTRY(nsISupports) - NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(ImageData) NS_INTERFACE_MAP_END NS_IMPL_CYCLE_COLLECTION_CLASS(ImageData) @@ -40,30 +36,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(ImageData) tmp->DropData(); NS_IMPL_CYCLE_COLLECTION_UNLINK_END -/* readonly attribute unsigned long width; */ -NS_IMETHODIMP -ImageData::GetWidth(uint32_t* aWidth) -{ - *aWidth = Width(); - return NS_OK; -} - -/* readonly attribute unsigned long height; */ -NS_IMETHODIMP -ImageData::GetHeight(uint32_t* aHeight) -{ - *aHeight = Height(); - return NS_OK; -} - -/* readonly attribute jsval data; */ -NS_IMETHODIMP -ImageData::GetData(JSContext* aCx, JS::Value* aData) -{ - *aData = JS::ObjectOrNullValue(GetDataObject()); - return JS_WrapValue(aCx, aData) ? NS_OK : NS_ERROR_FAILURE; -} - void ImageData::HoldData() { @@ -79,5 +51,11 @@ ImageData::DropData() } } +JSObject* +ImageData::WrapObject(JSContext* cx, JSObject* scope) +{ + return ImageDataBinding::Wrap(cx, scope, this); +} + } // namespace dom } // namespace mozilla diff --git a/content/canvas/src/ImageData.h b/content/canvas/src/ImageData.h index fa5d6040d0fd..23a34e837332 100644 --- a/content/canvas/src/ImageData.h +++ b/content/canvas/src/ImageData.h @@ -21,7 +21,7 @@ namespace mozilla { namespace dom { -class ImageData MOZ_FINAL : public nsIDOMImageData +class ImageData MOZ_FINAL : public nsISupports { public: ImageData(uint32_t aWidth, uint32_t aHeight, JSObject& aData) @@ -40,7 +40,6 @@ public: } NS_DECL_CYCLE_COLLECTING_ISUPPORTS - NS_DECL_NSIDOMIMAGEDATA NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ImageData) uint32_t Width() const @@ -61,6 +60,8 @@ public: return mData; } + JSObject* WrapObject(JSContext* cx, JSObject* scope); + private: void HoldData(); void DropData(); diff --git a/dom/base/nsDOMClassInfo.cpp b/dom/base/nsDOMClassInfo.cpp index 456a736024f9..7843e1ece235 100644 --- a/dom/base/nsDOMClassInfo.cpp +++ b/dom/base/nsDOMClassInfo.cpp @@ -539,6 +539,8 @@ using mozilla::dom::indexedDB::IDBWrapperCache; #include "nsIOpenWindowEventDetail.h" #include "nsIDOMGlobalObjectConstructor.h" +#include "nsIDOMCanvasRenderingContext2D.h" + #include "DOMFileHandle.h" #include "FileRequest.h" #include "LockedFile.h" @@ -1340,8 +1342,6 @@ static nsDOMClassInfoData sClassInfoData[] = { DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(TextMetrics, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) - NS_DEFINE_CLASSINFO_DATA(ImageData, nsDOMGenericSH, - DOM_DEFAULT_SCRIPTABLE_FLAGS) NS_DEFINE_CLASSINFO_DATA(MozCanvasPrintState, nsDOMGenericSH, DOM_DEFAULT_SCRIPTABLE_FLAGS) @@ -3869,10 +3869,6 @@ nsDOMClassInfo::Init() DOM_CLASSINFO_MAP_ENTRY(nsIDOMTextMetrics) DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(ImageData, nsIDOMImageData) - DOM_CLASSINFO_MAP_ENTRY(nsIDOMImageData) - DOM_CLASSINFO_MAP_END - DOM_CLASSINFO_MAP_BEGIN(MozCanvasPrintState, nsIDOMMozCanvasPrintState) DOM_CLASSINFO_MAP_ENTRY(nsIDOMMozCanvasPrintState) DOM_CLASSINFO_MAP_END diff --git a/dom/base/nsDOMClassInfoClasses.h b/dom/base/nsDOMClassInfoClasses.h index d16483876f44..17c6f0173881 100644 --- a/dom/base/nsDOMClassInfoClasses.h +++ b/dom/base/nsDOMClassInfoClasses.h @@ -319,7 +319,6 @@ DOMCI_CLASS(HTMLCanvasElement) DOMCI_CLASS(CanvasGradient) DOMCI_CLASS(CanvasPattern) DOMCI_CLASS(TextMetrics) -DOMCI_CLASS(ImageData) DOMCI_CLASS(MozCanvasPrintState) // SmartCard Events diff --git a/dom/base/nsDOMClassInfoID.h b/dom/base/nsDOMClassInfoID.h index 1e752f05e51b..5c5c5486403d 100644 --- a/dom/base/nsDOMClassInfoID.h +++ b/dom/base/nsDOMClassInfoID.h @@ -55,8 +55,7 @@ DOMCI_CASTABLE_INTERFACE(nsGenericHTMLElement, nsGenericHTMLElement, 6, \ _extra) \ DOMCI_CASTABLE_INTERFACE(nsHTMLDocument, nsIDocument, 7, _extra) \ DOMCI_CASTABLE_INTERFACE(nsStyledElement, nsStyledElement, 8, _extra) \ -DOMCI_CASTABLE_INTERFACE(nsSVGStylableElement, nsIContent, 9, _extra) \ -DOMCI_CASTABLE_INTERFACE(nsIDOMImageData, nsIDOMImageData, 12, _extra) +DOMCI_CASTABLE_INTERFACE(nsSVGStylableElement, nsIContent, 9, _extra) // Make sure all classes mentioned in DOMCI_CASTABLE_INTERFACES // have been declared. diff --git a/dom/base/nsJSEnvironment.cpp b/dom/base/nsJSEnvironment.cpp index ee3b51208dc6..135eeb75f858 100644 --- a/dom/base/nsJSEnvironment.cpp +++ b/dom/base/nsJSEnvironment.cpp @@ -56,6 +56,7 @@ #include "nsScriptNameSpaceManager.h" #include "StructuredCloneTags.h" #include "mozilla/dom/ImageData.h" +#include "mozilla/dom/ImageDataBinding.h" #include "nsJSPrincipals.h" #include "jsdbgapi.h" @@ -3778,22 +3779,14 @@ NS_DOMReadStructuredClone(JSContext* cx, MOZ_ASSERT(dataArray.isObject()); // Construct the ImageData. - nsCOMPtr imageData = new ImageData(width, height, - dataArray.toObject()); + nsRefPtr imageData = new ImageData(width, height, + dataArray.toObject()); // Wrap it in a jsval. JSObject* global = JS_GetGlobalForScopeChain(cx); if (!global) { return nullptr; } - nsCOMPtr wrapper; - JS::Value val; - nsresult rv = - nsContentUtils::WrapNative(cx, global, imageData, &val, - getter_AddRefs(wrapper)); - if (NS_FAILED(rv)) { - return nullptr; - } - return val.toObjectOrNull(); + return imageData->WrapObject(cx, global); } // Don't know what this is. Bail. @@ -3807,32 +3800,23 @@ NS_DOMWriteStructuredClone(JSContext* cx, JSObject* obj, void *closure) { - nsCOMPtr wrappedNative; - nsContentUtils::XPConnect()-> - GetWrappedNativeOfJSObject(cx, obj, getter_AddRefs(wrappedNative)); - nsISupports *native = wrappedNative ? wrappedNative->Native() : nullptr; - - nsCOMPtr imageData = do_QueryInterface(native); - if (imageData) { - // Prepare the ImageData internals. - uint32_t width, height; - JS::Value dataArray; - if (NS_FAILED(imageData->GetWidth(&width)) || - NS_FAILED(imageData->GetHeight(&height)) || - NS_FAILED(imageData->GetData(cx, &dataArray))) - { - return false; - } - - // Write the internals to the stream. - return JS_WriteUint32Pair(writer, SCTAG_DOM_IMAGEDATA, 0) && - JS_WriteUint32Pair(writer, width, height) && - JS_WriteTypedArray(writer, dataArray); + ImageData* imageData; + nsresult rv = UnwrapObject(cx, obj, imageData); + if (NS_FAILED(rv)) { + // Don't know what this is. Bail. + xpc::Throw(cx, NS_ERROR_DOM_DATA_CLONE_ERR); + return JS_FALSE; } - // Don't know what this is. Bail. - xpc::Throw(cx, NS_ERROR_DOM_DATA_CLONE_ERR); - return JS_FALSE; + // Prepare the ImageData internals. + uint32_t width = imageData->Width(); + uint32_t height = imageData->Height(); + JS::Value dataArray = JS::ObjectValue(*imageData->GetDataObject()); + + // Write the internals to the stream. + return JS_WriteUint32Pair(writer, SCTAG_DOM_IMAGEDATA, 0) && + JS_WriteUint32Pair(writer, width, height) && + JS_WriteTypedArray(writer, dataArray); } void diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index d6dc44cbddb7..dcacd472bc3c 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -229,6 +229,10 @@ DOMInterfaces = { 'workers': True, }], +'ImageData': { + 'wrapperCache': False +}, + 'InputStream': [ { 'nativeType': 'nsIInputStream', @@ -628,7 +632,6 @@ addExternalIface('Element', nativeType='nsGenericElement') addExternalIface('File') addExternalIface('HitRegionOptions', nativeType='nsISupports') addExternalIface('HTMLElement') -addExternalIface('ImageData', nativeType='mozilla::dom::ImageData') addExternalIface('MediaStream') addExternalIface('Node', nativeType='nsINode') addExternalIface('PaintRequest') diff --git a/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl b/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl index 3ac4475e5fd0..12ceab7e6bed 100644 --- a/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl +++ b/dom/interfaces/canvas/nsIDOMCanvasRenderingContext2D.idl @@ -30,14 +30,6 @@ interface nsIDOMTextMetrics : nsISupports readonly attribute float width; }; -[scriptable, builtinclass, uuid(1ea11207-b3e3-4ffc-a256-bf5c7011e806)] -interface nsIDOMImageData : nsISupports -{ - readonly attribute unsigned long width; - readonly attribute unsigned long height; - [implicit_jscontext] readonly attribute jsval data; -}; - [scriptable, uuid(c835c768-2dcc-461c-82f5-3653710d2942)] interface nsIDOMCanvasRenderingContext2D : nsISupports { @@ -180,8 +172,9 @@ enum CanvasMultiGetterType { // void putImageData (in ImageData d, in float x, in float y); // ImageData = { width: #, height: #, data: [r, g, b, a, ...] } + // nsISupports is OK, because the binding code will deal correctly [implicit_jscontext] - nsIDOMImageData getImageData(in double sx, in double sy, in double sw, in double sh); + nsISupports getImageData(in double sx, in double sy, in double sw, in double sh); // void putImageData(ImageData imagedata, double dx, double dy); @@ -200,8 +193,9 @@ enum CanvasMultiGetterType { // ImageData createImageData(double w, double h); // ImageData createImageData(ImageData data); + // nsISupports is OK, because the binding code will deal correctly [implicit_jscontext, optional_argc] - nsIDOMImageData createImageData(in jsval arg1, [optional] in jsval arg2); + nsISupports createImageData(in jsval arg1, [optional] in jsval arg2); // image smoothing mode -- if disabled, images won't be smoothed // if scaled. diff --git a/dom/webidl/CanvasRenderingContext2D.webidl b/dom/webidl/CanvasRenderingContext2D.webidl index 2bad8547d4ae..54b18f867ed9 100644 --- a/dom/webidl/CanvasRenderingContext2D.webidl +++ b/dom/webidl/CanvasRenderingContext2D.webidl @@ -17,7 +17,6 @@ interface HitRegionOptions; interface HTMLCanvasElement; interface HTMLImageElement; interface HTMLVideoElement; -interface ImageData; interface TextMetrics; interface Window; interface XULElement; diff --git a/dom/webidl/ImageData.webidl b/dom/webidl/ImageData.webidl new file mode 100644 index 000000000000..855a3205e0a9 --- /dev/null +++ b/dom/webidl/ImageData.webidl @@ -0,0 +1,17 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. + * + * The origin of this IDL file is + * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#imagedata + * + * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and Opera Software ASA. + * You are granted a license to use, reproduce and create derivative works of this document. + */ + +interface ImageData { + readonly attribute unsigned long width; + readonly attribute unsigned long height; + readonly attribute Uint8ClampedArray data; +}; diff --git a/dom/webidl/WebIDL.mk b/dom/webidl/WebIDL.mk index 6f05e1b9c525..b037a069c306 100644 --- a/dom/webidl/WebIDL.mk +++ b/dom/webidl/WebIDL.mk @@ -31,6 +31,7 @@ webidl_files = \ HTMLCollection.webidl \ HTMLOptionsCollection.webidl \ HTMLPropertiesCollection.webidl \ + ImageData.webidl \ NodeList.webidl \ PaintRequestList.webidl \ Performance.webidl \ diff --git a/js/xpconnect/src/dom_quickstubs.qsconf b/js/xpconnect/src/dom_quickstubs.qsconf index 205561678833..58c2e828bfc6 100644 --- a/js/xpconnect/src/dom_quickstubs.qsconf +++ b/js/xpconnect/src/dom_quickstubs.qsconf @@ -61,7 +61,6 @@ members = [ 'nsIDOMTextMetrics.*', 'nsIDOMCanvasGradient.*', 'nsIDOMCanvasPattern.*', - 'nsIDOMImageData.*', # dom/interfaces/core 'nsIDOMCharacterData.data', @@ -457,7 +456,6 @@ irregularFilenames = { 'nsIDOMTextMetrics': 'nsIDOMCanvasRenderingContext2D', 'nsIDOMCanvasGradient': 'nsIDOMCanvasRenderingContext2D', 'nsIDOMCanvasPattern': 'nsIDOMCanvasRenderingContext2D', - 'nsIDOMImageData': 'nsIDOMCanvasRenderingContext2D', 'nsIDOMBlob': 'nsIDOMFile', @@ -484,14 +482,12 @@ customIncludes = [ 'nsSVGStylableElement.h', 'nsHTMLDocument.h', 'nsDOMQS.h', - 'nsDOMStringMap.h', - 'mozilla/dom/ImageData.h' + 'nsDOMStringMap.h' ] customReturnInterfaces = [ 'nsIDOMCanvasPattern', 'nsIDOMCanvasGradient', - 'nsIDOMImageData' ] nsIDOMNode_GetChildNodes_customMethodCallCode = """ @@ -997,18 +993,5 @@ customMethodCalls = { 'nsIDOMWindow_SetOnmouseleave' : { 'thisType' : 'nsIDOMWindow', 'unwrapThisFailureFatal' : False - }, - 'nsIDOMImageData_GetWidth': { - 'thisType': 'nsIDOMImageData', - 'code': 'uint32_t result = static_cast(self)->Width();', - 'canFail': False - }, - 'nsIDOMImageData_GetHeight': { - 'thisType': 'nsIDOMImageData', - 'code': 'uint32_t result = static_cast(self)->Height();', - 'canFail': False - }, - 'nsIDOMImageData_GetData': { - 'canFail': False } } diff --git a/js/xpconnect/src/nsDOMQS.h b/js/xpconnect/src/nsDOMQS.h index ae3390386c6f..cfbe6a1034ea 100644 --- a/js/xpconnect/src/nsDOMQS.h +++ b/js/xpconnect/src/nsDOMQS.h @@ -5,7 +5,6 @@ #ifndef nsDOMQS_h__ #define nsDOMQS_h__ -#include "mozilla/dom/ImageData.h" #include "nsDOMClassInfoID.h" #include "nsGenericHTMLElement.h" #include "nsHTMLCanvasElement.h" @@ -183,23 +182,6 @@ DEFINE_UNWRAP_CAST_HTML(optgroup, nsHTMLOptGroupElement) DEFINE_UNWRAP_CAST_HTML(option, nsHTMLOptionElement) 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) {