#include "IntlUtils.h" #include "mozIMozIntl.h" #include "nsContentUtils.h" namespace mozilla { namespace dom { NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(IntlUtils, mWindow) NS_IMPL_CYCLE_COLLECTING_ADDREF(IntlUtils) NS_IMPL_CYCLE_COLLECTING_RELEASE(IntlUtils) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(IntlUtils) NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END IntlUtils::IntlUtils(nsPIDOMWindowInner* aWindow) : mWindow(aWindow) { } IntlUtils::~IntlUtils() { } JSObject* IntlUtils::WrapObject(JSContext* aCx, JS::Handle aGivenProto) { return IntlUtilsBinding::Wrap(aCx, this, aGivenProto); } void IntlUtils::GetDisplayNames(const Sequence& aLocales, const DisplayNameOptions& aOptions, DisplayNameResult& aResult, ErrorResult& aError) { MOZ_ASSERT(nsContentUtils::IsCallerChrome() || nsContentUtils::IsCallerContentXBL()); nsCOMPtr mozIntl = do_GetService("@mozilla.org/mozintl;1"); if (!mozIntl) { aError.Throw(NS_ERROR_UNEXPECTED); return; } aError.MightThrowJSException(); // Need to enter privileged junk scope since mozIntl implementation is in // chrome JS and passing XBL JS there shouldn't work. AutoJSAPI jsapi; if (!jsapi.Init(xpc::PrivilegedJunkScope())) { aError.Throw(NS_ERROR_FAILURE); return; } JSContext* cx = jsapi.cx(); // Prepare parameter for getDisplayNames(). JS::Rooted locales(cx); if (!ToJSValue(cx, aLocales, &locales)) { aError.StealExceptionFromJSContext(cx); return; } JS::Rooted options(cx); if (!ToJSValue(cx, aOptions, &options)) { aError.StealExceptionFromJSContext(cx); return; } // Now call the method. JS::Rooted retVal(cx); nsresult rv = mozIntl->GetDisplayNames(locales, options, &retVal); if (NS_FAILED(rv)) { aError.Throw(rv); return; } if (!retVal.isObject()) { aError.Throw(NS_ERROR_FAILURE); return; } // Return the result as DisplayNameResult. JSAutoCompartment ac(cx, &retVal.toObject()); if (!aResult.Init(cx, retVal)) { aError.Throw(NS_ERROR_FAILURE); } } void IntlUtils::GetLocaleInfo(const Sequence& aLocales, LocaleInfo& aResult, ErrorResult& aError) { MOZ_ASSERT(nsContentUtils::IsCallerChrome() || nsContentUtils::IsCallerContentXBL()); nsCOMPtr mozIntl = do_GetService("@mozilla.org/mozintl;1"); if (!mozIntl) { aError.Throw(NS_ERROR_UNEXPECTED); return; } AutoJSAPI jsapi; if (!jsapi.Init(xpc::PrivilegedJunkScope())) { aError.Throw(NS_ERROR_FAILURE); return; } JSContext* cx = jsapi.cx(); // Prepare parameter for getLocaleInfo(). JS::Rooted locales(cx); if (!ToJSValue(cx, aLocales, &locales)) { aError.StealExceptionFromJSContext(cx); return; } // Now call the method. JS::Rooted retVal(cx); nsresult rv = mozIntl->GetLocaleInfo(locales, &retVal); if (NS_FAILED(rv)) { aError.Throw(rv); return; } if (!retVal.isObject()) { aError.Throw(NS_ERROR_FAILURE); return; } // Return the result as LocaleInfo. JSAutoCompartment ac(cx, &retVal.toObject()); if (!aResult.Init(cx, retVal)) { aError.Throw(NS_ERROR_FAILURE); } } } // dom namespace } // mozilla namespace