|
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ |
|
2 /* vim: set ts=8 sts=4 et sw=4 tw=99: */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 #include "nsContentUtils.h" |
|
8 #include "BackstagePass.h" |
|
9 #include "nsIProgrammingLanguage.h" |
|
10 #include "nsDOMClassInfo.h" |
|
11 #include "nsIPrincipal.h" |
|
12 |
|
13 #include "mozilla/dom/workers/Workers.h" |
|
14 |
|
15 using mozilla::dom::workers::ResolveWorkerClasses; |
|
16 |
|
17 NS_INTERFACE_MAP_BEGIN(BackstagePass) |
|
18 NS_INTERFACE_MAP_ENTRY(nsIGlobalObject) |
|
19 NS_INTERFACE_MAP_ENTRY(nsIXPCScriptable) |
|
20 NS_INTERFACE_MAP_ENTRY(nsIClassInfo) |
|
21 NS_INTERFACE_MAP_ENTRY(nsIScriptObjectPrincipal) |
|
22 NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference) |
|
23 NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIXPCScriptable) |
|
24 NS_INTERFACE_MAP_END |
|
25 |
|
26 NS_IMPL_ADDREF(BackstagePass) |
|
27 NS_IMPL_RELEASE(BackstagePass) |
|
28 |
|
29 // The nsIXPCScriptable map declaration that will generate stubs for us... |
|
30 #define XPC_MAP_CLASSNAME BackstagePass |
|
31 #define XPC_MAP_QUOTED_CLASSNAME "BackstagePass" |
|
32 #define XPC_MAP_WANT_NEWRESOLVE |
|
33 #define XPC_MAP_WANT_FINALIZE |
|
34 #define XPC_MAP_WANT_PRECREATE |
|
35 |
|
36 #define XPC_MAP_FLAGS nsIXPCScriptable::USE_JSSTUB_FOR_ADDPROPERTY | \ |
|
37 nsIXPCScriptable::USE_JSSTUB_FOR_DELPROPERTY | \ |
|
38 nsIXPCScriptable::USE_JSSTUB_FOR_SETPROPERTY | \ |
|
39 nsIXPCScriptable::DONT_ENUM_STATIC_PROPS | \ |
|
40 nsIXPCScriptable::DONT_ENUM_QUERY_INTERFACE | \ |
|
41 nsIXPCScriptable::IS_GLOBAL_OBJECT | \ |
|
42 nsIXPCScriptable::DONT_REFLECT_INTERFACE_NAMES |
|
43 #include "xpc_map_end.h" /* This will #undef the above */ |
|
44 |
|
45 /* bool newResolve (in nsIXPConnectWrappedNative wrapper, in JSContextPtr cx, in JSObjectPtr obj, in jsval id, out JSObjectPtr objp); */ |
|
46 NS_IMETHODIMP |
|
47 BackstagePass::NewResolve(nsIXPConnectWrappedNative *wrapper, |
|
48 JSContext * cx, JSObject * objArg, |
|
49 jsid idArg, JSObject * *objpArg, |
|
50 bool *_retval) |
|
51 { |
|
52 JS::RootedObject obj(cx, objArg); |
|
53 JS::RootedId id(cx, idArg); |
|
54 |
|
55 bool resolved; |
|
56 *objpArg = nullptr; |
|
57 |
|
58 *_retval = !!JS_ResolveStandardClass(cx, obj, id, &resolved); |
|
59 NS_ENSURE_TRUE(*_retval, NS_ERROR_FAILURE); |
|
60 |
|
61 if (resolved) { |
|
62 *objpArg = obj; |
|
63 return NS_OK; |
|
64 } |
|
65 |
|
66 JS::RootedObject objp(cx, *objpArg); |
|
67 |
|
68 *_retval = ResolveWorkerClasses(cx, obj, id, &objp); |
|
69 NS_ENSURE_TRUE(*_retval, NS_ERROR_FAILURE); |
|
70 |
|
71 if (objp) { |
|
72 *objpArg = objp; |
|
73 return NS_OK; |
|
74 } |
|
75 |
|
76 return NS_OK; |
|
77 } |
|
78 |
|
79 /***************************************************************************/ |
|
80 /* void getInterfaces (out uint32_t count, [array, size_is (count), retval] |
|
81 out nsIIDPtr array); */ |
|
82 NS_IMETHODIMP |
|
83 BackstagePass::GetInterfaces(uint32_t *aCount, nsIID * **aArray) |
|
84 { |
|
85 const uint32_t count = 2; |
|
86 *aCount = count; |
|
87 nsIID **array; |
|
88 *aArray = array = static_cast<nsIID**>(nsMemory::Alloc(count * sizeof(nsIID*))); |
|
89 if (!array) |
|
90 return NS_ERROR_OUT_OF_MEMORY; |
|
91 |
|
92 uint32_t index = 0; |
|
93 nsIID* clone; |
|
94 #define PUSH_IID(id) \ |
|
95 clone = static_cast<nsIID *>(nsMemory::Clone(&NS_GET_IID( id ), \ |
|
96 sizeof(nsIID))); \ |
|
97 if (!clone) \ |
|
98 goto oom; \ |
|
99 array[index++] = clone; |
|
100 |
|
101 PUSH_IID(nsIXPCScriptable) |
|
102 PUSH_IID(nsIScriptObjectPrincipal) |
|
103 #undef PUSH_IID |
|
104 |
|
105 return NS_OK; |
|
106 oom: |
|
107 while (index) |
|
108 nsMemory::Free(array[--index]); |
|
109 nsMemory::Free(array); |
|
110 *aArray = nullptr; |
|
111 return NS_ERROR_OUT_OF_MEMORY; |
|
112 } |
|
113 |
|
114 /* nsISupports getHelperForLanguage (in uint32_t language); */ |
|
115 NS_IMETHODIMP |
|
116 BackstagePass::GetHelperForLanguage(uint32_t language, |
|
117 nsISupports **retval) |
|
118 { |
|
119 nsCOMPtr<nsISupports> supports = |
|
120 do_QueryInterface(static_cast<nsIGlobalObject *>(this)); |
|
121 supports.forget(retval); |
|
122 return NS_OK; |
|
123 } |
|
124 |
|
125 /* readonly attribute string contractID; */ |
|
126 NS_IMETHODIMP |
|
127 BackstagePass::GetContractID(char * *aContractID) |
|
128 { |
|
129 *aContractID = nullptr; |
|
130 return NS_ERROR_NOT_AVAILABLE; |
|
131 } |
|
132 |
|
133 /* readonly attribute string classDescription; */ |
|
134 NS_IMETHODIMP |
|
135 BackstagePass::GetClassDescription(char * *aClassDescription) |
|
136 { |
|
137 static const char classDescription[] = "BackstagePass"; |
|
138 *aClassDescription = (char*)nsMemory::Clone(classDescription, sizeof(classDescription)); |
|
139 return *aClassDescription ? NS_OK : NS_ERROR_OUT_OF_MEMORY; |
|
140 } |
|
141 |
|
142 /* readonly attribute nsCIDPtr classID; */ |
|
143 NS_IMETHODIMP |
|
144 BackstagePass::GetClassID(nsCID * *aClassID) |
|
145 { |
|
146 *aClassID = nullptr; |
|
147 return NS_OK; |
|
148 } |
|
149 |
|
150 /* readonly attribute uint32_t implementationLanguage; */ |
|
151 NS_IMETHODIMP |
|
152 BackstagePass::GetImplementationLanguage(uint32_t *aImplementationLanguage) |
|
153 { |
|
154 *aImplementationLanguage = nsIProgrammingLanguage::CPLUSPLUS; |
|
155 return NS_OK; |
|
156 } |
|
157 |
|
158 /* readonly attribute uint32_t flags; */ |
|
159 NS_IMETHODIMP |
|
160 BackstagePass::GetFlags(uint32_t *aFlags) |
|
161 { |
|
162 *aFlags = nsIClassInfo::MAIN_THREAD_ONLY; |
|
163 return NS_OK; |
|
164 } |
|
165 |
|
166 /* [notxpcom] readonly attribute nsCID classIDNoAlloc; */ |
|
167 NS_IMETHODIMP |
|
168 BackstagePass::GetClassIDNoAlloc(nsCID *aClassIDNoAlloc) |
|
169 { |
|
170 return NS_ERROR_NOT_AVAILABLE; |
|
171 } |
|
172 |
|
173 NS_IMETHODIMP |
|
174 BackstagePass::Finalize(nsIXPConnectWrappedNative *wrapper, JSFreeOp * fop, JSObject * obj) |
|
175 { |
|
176 nsCOMPtr<nsIGlobalObject> bsp(do_QueryWrappedNative(wrapper)); |
|
177 MOZ_ASSERT(bsp); |
|
178 static_cast<BackstagePass*>(bsp.get())->ForgetGlobalObject(); |
|
179 return NS_OK; |
|
180 } |
|
181 |
|
182 NS_IMETHODIMP |
|
183 BackstagePass::PreCreate(nsISupports *nativeObj, JSContext *cx, |
|
184 JSObject *globalObj, JSObject **parentObj) |
|
185 { |
|
186 // We do the same trick here as for WindowSH. Return the js global |
|
187 // as parent, so XPConenct can find the right scope and the wrapper |
|
188 // that already exists. |
|
189 nsCOMPtr<nsIGlobalObject> global(do_QueryInterface(nativeObj)); |
|
190 MOZ_ASSERT(global, "nativeObj not a global object!"); |
|
191 |
|
192 JSObject *jsglobal = global->GetGlobalJSObject(); |
|
193 if (jsglobal) |
|
194 *parentObj = jsglobal; |
|
195 return NS_OK; |
|
196 } |
|
197 |
|
198 nsresult |
|
199 NS_NewBackstagePass(BackstagePass** ret) |
|
200 { |
|
201 nsRefPtr<BackstagePass> bsp = new BackstagePass( |
|
202 nsContentUtils::GetSystemPrincipal()); |
|
203 bsp.forget(ret); |
|
204 return NS_OK; |
|
205 } |