diff --git a/dom/bindings/BindingUtils.cpp b/dom/bindings/BindingUtils.cpp index ff71e66d944a..de0f48430f57 100644 --- a/dom/bindings/BindingUtils.cpp +++ b/dom/bindings/BindingUtils.cpp @@ -23,6 +23,7 @@ #include "xpcprivate.h" #include "XPCQuickStubs.h" #include "XrayWrapper.h" +#include "nsPrintfCString.h" #include "mozilla/dom/HTMLObjectElement.h" #include "mozilla/dom/HTMLObjectElementBinding.h" @@ -196,6 +197,17 @@ ErrorResult::StealJSException(JSContext* cx, mResult = NS_OK; } +void +ErrorResult::ReportNotEnoughArgsError(JSContext* cx, + const char* ifaceName, + const char* memberName) +{ + MOZ_ASSERT(ErrorCode() == NS_ERROR_XPC_NOT_ENOUGH_ARGS); + + nsPrintfCString errorMessage("%s.%s", ifaceName, memberName); + ThrowErrorMessage(cx, dom::MSG_MISSING_ARGUMENTS, errorMessage.get()); +} + namespace dom { bool diff --git a/dom/bindings/BindingUtils.h b/dom/bindings/BindingUtils.h index 9ac5f3e8d08e..342434c138e5 100644 --- a/dom/bindings/BindingUtils.h +++ b/dom/bindings/BindingUtils.h @@ -84,8 +84,8 @@ Throw(JSContext* cx, nsresult rv) template inline bool ThrowMethodFailedWithDetails(JSContext* cx, ErrorResult& rv, - const char* /* ifaceName */, - const char* /* memberName */) + const char* ifaceName, + const char* memberName) { if (rv.IsTypeError()) { rv.ReportTypeError(cx); @@ -95,6 +95,9 @@ ThrowMethodFailedWithDetails(JSContext* cx, ErrorResult& rv, rv.ReportJSException(cx); return false; } + if (rv.IsNotEnoughArgsError()) { + rv.ReportNotEnoughArgsError(cx, ifaceName, memberName); + } return Throw(cx, rv.ErrorCode()); } diff --git a/dom/bindings/ErrorResult.h b/dom/bindings/ErrorResult.h index 4ceea0850561..d6f42464dc78 100644 --- a/dom/bindings/ErrorResult.h +++ b/dom/bindings/ErrorResult.h @@ -53,6 +53,8 @@ public: MOZ_ASSERT(!IsTypeError(), "Don't overwite TypeError"); MOZ_ASSERT(rv != NS_ERROR_DOM_JS_EXCEPTION, "Use ThrowJSException()"); MOZ_ASSERT(!IsJSException(), "Don't overwrite JS exceptions"); + MOZ_ASSERT(rv != NS_ERROR_XPC_NOT_ENOUGH_ARGS, "Use ThrowNotEnoughArgsError()"); + MOZ_ASSERT(!IsNotEnoughArgsError(), "Don't overwrite not enough args error"); mResult = rv; } @@ -71,6 +73,12 @@ public: void ReportJSException(JSContext* cx); bool IsJSException() const { return ErrorCode() == NS_ERROR_DOM_JS_EXCEPTION; } + void ThrowNotEnoughArgsError() { mResult = NS_ERROR_XPC_NOT_ENOUGH_ARGS; } + void ReportNotEnoughArgsError(JSContext* cx, + const char* ifaceName, + const char* memberName); + bool IsNotEnoughArgsError() const { return ErrorCode() == NS_ERROR_XPC_NOT_ENOUGH_ARGS; } + // StealJSException steals the JS Exception from the object. This method must // be called only if IsJSException() returns true. This method also resets the // ErrorCode() to NS_OK. @@ -101,6 +109,8 @@ public: MOZ_ASSERT(!IsTypeError(), "Don't overwite TypeError"); MOZ_ASSERT(rv != NS_ERROR_DOM_JS_EXCEPTION, "Use ThrowJSException()"); MOZ_ASSERT(!IsJSException(), "Don't overwrite JS exceptions"); + MOZ_ASSERT(rv != NS_ERROR_XPC_NOT_ENOUGH_ARGS, "Use ThrowNotEnoughArgsError()"); + MOZ_ASSERT(!IsNotEnoughArgsError(), "Don't overwrite not enough args error"); mResult = rv; }