Line data Source code
1 : #include "IntlUtils.h"
2 : #include "mozIMozIntl.h"
3 : #include "nsContentUtils.h"
4 :
5 : namespace mozilla {
6 : namespace dom {
7 :
8 0 : NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(IntlUtils, mWindow)
9 0 : NS_IMPL_CYCLE_COLLECTING_ADDREF(IntlUtils)
10 0 : NS_IMPL_CYCLE_COLLECTING_RELEASE(IntlUtils)
11 0 : NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(IntlUtils)
12 0 : NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
13 0 : NS_INTERFACE_MAP_ENTRY(nsISupports)
14 0 : NS_INTERFACE_MAP_END
15 :
16 0 : IntlUtils::IntlUtils(nsPIDOMWindowInner* aWindow)
17 0 : : mWindow(aWindow)
18 : {
19 0 : }
20 :
21 0 : IntlUtils::~IntlUtils()
22 : {
23 0 : }
24 :
25 : JSObject*
26 0 : IntlUtils::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
27 : {
28 0 : return IntlUtilsBinding::Wrap(aCx, this, aGivenProto);
29 : }
30 :
31 : void
32 0 : IntlUtils::GetDisplayNames(const Sequence<nsString>& aLocales,
33 : const DisplayNameOptions& aOptions,
34 : DisplayNameResult& aResult, ErrorResult& aError)
35 : {
36 0 : MOZ_ASSERT(nsContentUtils::IsCallerChrome() ||
37 : nsContentUtils::IsCallerContentXBL());
38 :
39 0 : nsCOMPtr<mozIMozIntl> mozIntl = do_GetService("@mozilla.org/mozintl;1");
40 0 : if (!mozIntl) {
41 0 : aError.Throw(NS_ERROR_UNEXPECTED);
42 0 : return;
43 : }
44 :
45 0 : aError.MightThrowJSException();
46 :
47 : // Need to enter privileged junk scope since mozIntl implementation is in
48 : // chrome JS and passing XBL JS there shouldn't work.
49 0 : AutoJSAPI jsapi;
50 0 : if (!jsapi.Init(xpc::PrivilegedJunkScope())) {
51 0 : aError.Throw(NS_ERROR_FAILURE);
52 0 : return;
53 : }
54 0 : JSContext* cx = jsapi.cx();
55 :
56 : // Prepare parameter for getDisplayNames().
57 0 : JS::Rooted<JS::Value> locales(cx);
58 0 : if (!ToJSValue(cx, aLocales, &locales)) {
59 0 : aError.StealExceptionFromJSContext(cx);
60 0 : return;
61 : }
62 :
63 0 : JS::Rooted<JS::Value> options(cx);
64 0 : if (!ToJSValue(cx, aOptions, &options)) {
65 0 : aError.StealExceptionFromJSContext(cx);
66 0 : return;
67 : }
68 :
69 : // Now call the method.
70 0 : JS::Rooted<JS::Value> retVal(cx);
71 0 : nsresult rv = mozIntl->GetDisplayNames(locales, options, &retVal);
72 0 : if (NS_FAILED(rv)) {
73 0 : aError.Throw(rv);
74 0 : return;
75 : }
76 :
77 0 : if (!retVal.isObject()) {
78 0 : aError.Throw(NS_ERROR_FAILURE);
79 0 : return;
80 : }
81 :
82 : // Return the result as DisplayNameResult.
83 0 : JSAutoCompartment ac(cx, &retVal.toObject());
84 0 : if (!aResult.Init(cx, retVal)) {
85 0 : aError.Throw(NS_ERROR_FAILURE);
86 : }
87 : }
88 :
89 : void
90 0 : IntlUtils::GetLocaleInfo(const Sequence<nsString>& aLocales,
91 : LocaleInfo& aResult, ErrorResult& aError)
92 : {
93 0 : MOZ_ASSERT(nsContentUtils::IsCallerChrome() ||
94 : nsContentUtils::IsCallerContentXBL());
95 :
96 0 : nsCOMPtr<mozIMozIntl> mozIntl = do_GetService("@mozilla.org/mozintl;1");
97 0 : if (!mozIntl) {
98 0 : aError.Throw(NS_ERROR_UNEXPECTED);
99 0 : return;
100 : }
101 :
102 0 : AutoJSAPI jsapi;
103 0 : if (!jsapi.Init(xpc::PrivilegedJunkScope())) {
104 0 : aError.Throw(NS_ERROR_FAILURE);
105 0 : return;
106 : }
107 0 : JSContext* cx = jsapi.cx();
108 :
109 : // Prepare parameter for getLocaleInfo().
110 0 : JS::Rooted<JS::Value> locales(cx);
111 0 : if (!ToJSValue(cx, aLocales, &locales)) {
112 0 : aError.StealExceptionFromJSContext(cx);
113 0 : return;
114 : }
115 :
116 : // Now call the method.
117 0 : JS::Rooted<JS::Value> retVal(cx);
118 0 : nsresult rv = mozIntl->GetLocaleInfo(locales, &retVal);
119 0 : if (NS_FAILED(rv)) {
120 0 : aError.Throw(rv);
121 0 : return;
122 : }
123 :
124 0 : if (!retVal.isObject()) {
125 0 : aError.Throw(NS_ERROR_FAILURE);
126 0 : return;
127 : }
128 :
129 : // Return the result as LocaleInfo.
130 0 : JSAutoCompartment ac(cx, &retVal.toObject());
131 0 : if (!aResult.Init(cx, retVal)) {
132 0 : aError.Throw(NS_ERROR_FAILURE);
133 : }
134 : }
135 :
136 : } // dom namespace
137 : } // mozilla namespace
|