Bug 826740 - Part d: Use implicit_jscontext to simplify nsIDOMHTMLCanvasElement.getContext; r=khuey

This commit is contained in:
Ms2ger 2013-04-13 09:05:33 +02:00
Родитель a0616a7d2a
Коммит 096dddd2e4
3 изменённых файлов: 26 добавлений и 16 удалений

Просмотреть файл

@ -152,6 +152,8 @@ public:
// take a snapshot of the canvas that needs to be "live" (e.g. -moz-element). // take a snapshot of the canvas that needs to be "live" (e.g. -moz-element).
void MarkContextClean(); void MarkContextClean();
nsresult GetContext(const nsAString& aContextId, nsISupports** aContext);
virtual nsXPCClassInfo* GetClassInfo(); virtual nsXPCClassInfo* GetClassInfo();
virtual nsIDOMNode* AsDOMNode() { return this; } virtual nsIDOMNode* AsDOMNode() { return this; }

Просмотреть файл

@ -236,8 +236,7 @@ HTMLCanvasElement::DispatchPrintCallback(nsITimerCallback* aCallback)
if (!mCurrentContext) { if (!mCurrentContext) {
nsresult rv; nsresult rv;
nsCOMPtr<nsISupports> context; nsCOMPtr<nsISupports> context;
rv = GetContext(NS_LITERAL_STRING("2d"), JSVAL_VOID, rv = GetContext(NS_LITERAL_STRING("2d"), getter_AddRefs(context));
getter_AddRefs(context));
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
} }
mPrintState = new HTMLCanvasPrintState(this, mCurrentContext, aCallback); mPrintState = new HTMLCanvasPrintState(this, mCurrentContext, aCallback);
@ -286,14 +285,13 @@ HTMLCanvasElement::CopyInnerTo(Element* aDest)
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (aDest->OwnerDoc()->IsStaticDocument()) { if (aDest->OwnerDoc()->IsStaticDocument()) {
HTMLCanvasElement* dest = static_cast<HTMLCanvasElement*>(aDest); HTMLCanvasElement* dest = static_cast<HTMLCanvasElement*>(aDest);
HTMLCanvasElement* self = const_cast<HTMLCanvasElement*>(this); dest->mOriginalCanvas = this;
dest->mOriginalCanvas = self;
nsCOMPtr<nsISupports> cxt; nsCOMPtr<nsISupports> cxt;
dest->GetContext(NS_LITERAL_STRING("2d"), JSVAL_VOID, getter_AddRefs(cxt)); dest->GetContext(NS_LITERAL_STRING("2d"), getter_AddRefs(cxt));
nsRefPtr<CanvasRenderingContext2D> context2d = nsRefPtr<CanvasRenderingContext2D> context2d =
static_cast<CanvasRenderingContext2D*>(cxt.get()); static_cast<CanvasRenderingContext2D*>(cxt.get());
if (context2d && !self->mPrintCallback) { if (context2d && !mPrintCallback) {
HTMLImageOrCanvasOrVideoElement element; HTMLImageOrCanvasOrVideoElement element;
element.SetAsHTMLCanvasElement() = this; element.SetAsHTMLCanvasElement() = this;
ErrorResult err; ErrorResult err;
@ -702,11 +700,21 @@ HTMLCanvasElement::GetContextHelper(const nsAString& aContextId,
return NS_OK; return NS_OK;
} }
nsresult
HTMLCanvasElement::GetContext(const nsAString& aContextId,
nsISupports** aContext)
{
return GetContext(aContextId, JS::UndefinedValue(), nullptr, aContext);
}
NS_IMETHODIMP NS_IMETHODIMP
HTMLCanvasElement::GetContext(const nsAString& aContextId, HTMLCanvasElement::GetContext(const nsAString& aContextId,
const JS::Value& aContextOptions, const JS::Value& aContextOptions,
JSContext* aCx,
nsISupports **aContext) nsISupports **aContext)
{ {
MOZ_ASSERT_IF(!aCx, aContextOptions.isUndefined());
nsresult rv; nsresult rv;
if (mCurrentContextId.IsEmpty()) { if (mCurrentContextId.IsEmpty()) {
@ -731,23 +739,22 @@ HTMLCanvasElement::GetContext(const nsAString& aContextId,
nsCOMPtr<nsIWritablePropertyBag2> contextProps; nsCOMPtr<nsIWritablePropertyBag2> contextProps;
if (aContextOptions.isObject()) { if (aContextOptions.isObject()) {
JSContext* cx = nsContentUtils::GetCurrentJSContext(); MOZ_ASSERT(aCx);
contextProps = do_CreateInstance("@mozilla.org/hash-property-bag;1"); contextProps = do_CreateInstance("@mozilla.org/hash-property-bag;1");
JSObject& opts = aContextOptions.toObject(); JSObject& opts = aContextOptions.toObject();
JS::AutoIdArray props(cx, JS_Enumerate(cx, &opts)); JS::AutoIdArray props(aCx, JS_Enumerate(aCx, &opts));
for (size_t i = 0; !!props && i < props.length(); ++i) { for (size_t i = 0; !!props && i < props.length(); ++i) {
jsid propid = props[i]; jsid propid = props[i];
JS::Value propname, propval; JS::Value propname, propval;
if (!JS_IdToValue(cx, propid, &propname) || if (!JS_IdToValue(aCx, propid, &propname) ||
!JS_GetPropertyById(cx, &opts, propid, &propval)) { !JS_GetPropertyById(aCx, &opts, propid, &propval)) {
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
JSString *propnameString = JS_ValueToString(cx, propname); JSString *propnameString = JS_ValueToString(aCx, propname);
nsDependentJSString pstr; nsDependentJSString pstr;
if (!propnameString || !pstr.init(cx, propnameString)) { if (!propnameString || !pstr.init(aCx, propnameString)) {
mCurrentContext = nullptr; mCurrentContext = nullptr;
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }
@ -759,9 +766,9 @@ HTMLCanvasElement::GetContext(const nsAString& aContextId,
} else if (JSVAL_IS_DOUBLE(propval)) { } else if (JSVAL_IS_DOUBLE(propval)) {
contextProps->SetPropertyAsDouble(pstr, JSVAL_TO_DOUBLE(propval)); contextProps->SetPropertyAsDouble(pstr, JSVAL_TO_DOUBLE(propval));
} else if (JSVAL_IS_STRING(propval)) { } else if (JSVAL_IS_STRING(propval)) {
JSString *propvalString = JS_ValueToString(cx, propval); JSString *propvalString = JS_ValueToString(aCx, propval);
nsDependentJSString vstr; nsDependentJSString vstr;
if (!propvalString || !vstr.init(cx, propvalString)) { if (!propvalString || !vstr.init(aCx, propvalString)) {
mCurrentContext = nullptr; mCurrentContext = nullptr;
return NS_ERROR_FAILURE; return NS_ERROR_FAILURE;
} }

Просмотреть файл

@ -46,13 +46,14 @@ interface nsIFileCallback : nsISupports {
void receive(in nsIDOMBlob file); void receive(in nsIDOMBlob file);
}; };
[scriptable, uuid(ba777030-783e-43b6-b85d-0670da81acb8)] [scriptable, uuid(eb5ea539-f177-4276-bd4c-3b49c2dc9b2f)]
interface nsIDOMHTMLCanvasElement : nsIDOMHTMLElement interface nsIDOMHTMLCanvasElement : nsIDOMHTMLElement
{ {
attribute unsigned long width; attribute unsigned long width;
attribute unsigned long height; attribute unsigned long height;
attribute boolean mozOpaque; attribute boolean mozOpaque;
[implicit_jscontext]
nsISupports getContext(in DOMString contextId, nsISupports getContext(in DOMString contextId,
[optional] in jsval contextOptions); [optional] in jsval contextOptions);