Line data Source code
1 : /* THIS FILE IS AUTOGENERATED FROM PerformanceResourceTiming.webidl BY Codegen.py - DO NOT EDIT */
2 :
3 : #include "PerformanceEntryBinding.h"
4 : #include "PerformanceResourceTimingBinding.h"
5 : #include "WrapperFactory.h"
6 : #include "mozilla/FloatingPoint.h"
7 : #include "mozilla/OwningNonNull.h"
8 : #include "mozilla/dom/BindingUtils.h"
9 : #include "mozilla/dom/DOMJSClass.h"
10 : #include "mozilla/dom/NonRefcountedDOMObject.h"
11 : #include "mozilla/dom/PerformanceResourceTiming.h"
12 : #include "mozilla/dom/PrimitiveConversions.h"
13 : #include "mozilla/dom/XrayExpandoClass.h"
14 :
15 : namespace mozilla {
16 : namespace dom {
17 :
18 : namespace PerformanceResourceTimingBinding {
19 :
20 : static_assert(IsRefcounted<NativeType>::value == IsRefcounted<PerformanceEntryBinding::NativeType>::value,
21 : "Can't inherit from an interface with a different ownership model.");
22 :
23 : static bool
24 0 : get_initiatorType(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
25 : {
26 0 : DOMString result;
27 0 : self->GetInitiatorType(result);
28 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
29 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
30 0 : return false;
31 : }
32 0 : return true;
33 : }
34 :
35 : static const JSJitInfo initiatorType_getterinfo = {
36 : { (JSJitGetterOp)get_initiatorType },
37 : { prototypes::id::PerformanceResourceTiming },
38 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
39 : JSJitInfo::Getter,
40 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
41 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
42 : false, /* isInfallible. False in setters. */
43 : false, /* isMovable. Not relevant for setters. */
44 : false, /* isEliminatable. Not relevant for setters. */
45 : false, /* isAlwaysInSlot. Only relevant for getters. */
46 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
47 : false, /* isTypedMethod. Only relevant for methods. */
48 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
49 : };
50 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
51 : static_assert(0 < 1, "There is no slot for us");
52 :
53 : static bool
54 0 : get_nextHopProtocol(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
55 : {
56 0 : DOMString result;
57 0 : self->GetNextHopProtocol(result);
58 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
59 0 : if (!xpc::NonVoidStringToJsval(cx, result, args.rval())) {
60 0 : return false;
61 : }
62 0 : return true;
63 : }
64 :
65 : static const JSJitInfo nextHopProtocol_getterinfo = {
66 : { (JSJitGetterOp)get_nextHopProtocol },
67 : { prototypes::id::PerformanceResourceTiming },
68 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
69 : JSJitInfo::Getter,
70 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
71 : JSVAL_TYPE_STRING, /* returnType. Not relevant for setters. */
72 : false, /* isInfallible. False in setters. */
73 : false, /* isMovable. Not relevant for setters. */
74 : false, /* isEliminatable. Not relevant for setters. */
75 : false, /* isAlwaysInSlot. Only relevant for getters. */
76 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
77 : false, /* isTypedMethod. Only relevant for methods. */
78 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
79 : };
80 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
81 : static_assert(0 < 1, "There is no slot for us");
82 :
83 : static bool
84 0 : get_redirectStart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
85 : {
86 0 : double result(self->RedirectStart());
87 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
88 0 : args.rval().set(JS_NumberValue(double(result)));
89 0 : return true;
90 : }
91 :
92 : static const JSJitInfo redirectStart_getterinfo = {
93 : { (JSJitGetterOp)get_redirectStart },
94 : { prototypes::id::PerformanceResourceTiming },
95 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
96 : JSJitInfo::Getter,
97 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
98 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
99 : true, /* isInfallible. False in setters. */
100 : false, /* isMovable. Not relevant for setters. */
101 : false, /* isEliminatable. Not relevant for setters. */
102 : false, /* isAlwaysInSlot. Only relevant for getters. */
103 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
104 : false, /* isTypedMethod. Only relevant for methods. */
105 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
106 : };
107 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
108 : static_assert(0 < 1, "There is no slot for us");
109 :
110 : static bool
111 0 : get_redirectEnd(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
112 : {
113 0 : double result(self->RedirectEnd());
114 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
115 0 : args.rval().set(JS_NumberValue(double(result)));
116 0 : return true;
117 : }
118 :
119 : static const JSJitInfo redirectEnd_getterinfo = {
120 : { (JSJitGetterOp)get_redirectEnd },
121 : { prototypes::id::PerformanceResourceTiming },
122 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
123 : JSJitInfo::Getter,
124 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
125 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
126 : true, /* isInfallible. False in setters. */
127 : false, /* isMovable. Not relevant for setters. */
128 : false, /* isEliminatable. Not relevant for setters. */
129 : false, /* isAlwaysInSlot. Only relevant for getters. */
130 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
131 : false, /* isTypedMethod. Only relevant for methods. */
132 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
133 : };
134 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
135 : static_assert(0 < 1, "There is no slot for us");
136 :
137 : static bool
138 0 : get_fetchStart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
139 : {
140 0 : double result(self->FetchStart());
141 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
142 0 : args.rval().set(JS_NumberValue(double(result)));
143 0 : return true;
144 : }
145 :
146 : static const JSJitInfo fetchStart_getterinfo = {
147 : { (JSJitGetterOp)get_fetchStart },
148 : { prototypes::id::PerformanceResourceTiming },
149 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
150 : JSJitInfo::Getter,
151 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
152 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
153 : true, /* isInfallible. False in setters. */
154 : false, /* isMovable. Not relevant for setters. */
155 : false, /* isEliminatable. Not relevant for setters. */
156 : false, /* isAlwaysInSlot. Only relevant for getters. */
157 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
158 : false, /* isTypedMethod. Only relevant for methods. */
159 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
160 : };
161 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
162 : static_assert(0 < 1, "There is no slot for us");
163 :
164 : static bool
165 0 : get_domainLookupStart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
166 : {
167 0 : double result(self->DomainLookupStart());
168 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
169 0 : args.rval().set(JS_NumberValue(double(result)));
170 0 : return true;
171 : }
172 :
173 : static const JSJitInfo domainLookupStart_getterinfo = {
174 : { (JSJitGetterOp)get_domainLookupStart },
175 : { prototypes::id::PerformanceResourceTiming },
176 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
177 : JSJitInfo::Getter,
178 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
179 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
180 : true, /* isInfallible. False in setters. */
181 : false, /* isMovable. Not relevant for setters. */
182 : false, /* isEliminatable. Not relevant for setters. */
183 : false, /* isAlwaysInSlot. Only relevant for getters. */
184 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
185 : false, /* isTypedMethod. Only relevant for methods. */
186 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
187 : };
188 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
189 : static_assert(0 < 1, "There is no slot for us");
190 :
191 : static bool
192 0 : get_domainLookupEnd(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
193 : {
194 0 : double result(self->DomainLookupEnd());
195 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
196 0 : args.rval().set(JS_NumberValue(double(result)));
197 0 : return true;
198 : }
199 :
200 : static const JSJitInfo domainLookupEnd_getterinfo = {
201 : { (JSJitGetterOp)get_domainLookupEnd },
202 : { prototypes::id::PerformanceResourceTiming },
203 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
204 : JSJitInfo::Getter,
205 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
206 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
207 : true, /* isInfallible. False in setters. */
208 : false, /* isMovable. Not relevant for setters. */
209 : false, /* isEliminatable. Not relevant for setters. */
210 : false, /* isAlwaysInSlot. Only relevant for getters. */
211 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
212 : false, /* isTypedMethod. Only relevant for methods. */
213 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
214 : };
215 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
216 : static_assert(0 < 1, "There is no slot for us");
217 :
218 : static bool
219 0 : get_connectStart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
220 : {
221 0 : double result(self->ConnectStart());
222 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
223 0 : args.rval().set(JS_NumberValue(double(result)));
224 0 : return true;
225 : }
226 :
227 : static const JSJitInfo connectStart_getterinfo = {
228 : { (JSJitGetterOp)get_connectStart },
229 : { prototypes::id::PerformanceResourceTiming },
230 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
231 : JSJitInfo::Getter,
232 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
233 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
234 : true, /* isInfallible. False in setters. */
235 : false, /* isMovable. Not relevant for setters. */
236 : false, /* isEliminatable. Not relevant for setters. */
237 : false, /* isAlwaysInSlot. Only relevant for getters. */
238 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
239 : false, /* isTypedMethod. Only relevant for methods. */
240 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
241 : };
242 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
243 : static_assert(0 < 1, "There is no slot for us");
244 :
245 : static bool
246 0 : get_connectEnd(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
247 : {
248 0 : double result(self->ConnectEnd());
249 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
250 0 : args.rval().set(JS_NumberValue(double(result)));
251 0 : return true;
252 : }
253 :
254 : static const JSJitInfo connectEnd_getterinfo = {
255 : { (JSJitGetterOp)get_connectEnd },
256 : { prototypes::id::PerformanceResourceTiming },
257 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
258 : JSJitInfo::Getter,
259 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
260 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
261 : true, /* isInfallible. False in setters. */
262 : false, /* isMovable. Not relevant for setters. */
263 : false, /* isEliminatable. Not relevant for setters. */
264 : false, /* isAlwaysInSlot. Only relevant for getters. */
265 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
266 : false, /* isTypedMethod. Only relevant for methods. */
267 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
268 : };
269 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
270 : static_assert(0 < 1, "There is no slot for us");
271 :
272 : static bool
273 0 : get_secureConnectionStart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
274 : {
275 0 : double result(self->SecureConnectionStart());
276 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
277 0 : args.rval().set(JS_NumberValue(double(result)));
278 0 : return true;
279 : }
280 :
281 : static const JSJitInfo secureConnectionStart_getterinfo = {
282 : { (JSJitGetterOp)get_secureConnectionStart },
283 : { prototypes::id::PerformanceResourceTiming },
284 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
285 : JSJitInfo::Getter,
286 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
287 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
288 : true, /* isInfallible. False in setters. */
289 : false, /* isMovable. Not relevant for setters. */
290 : false, /* isEliminatable. Not relevant for setters. */
291 : false, /* isAlwaysInSlot. Only relevant for getters. */
292 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
293 : false, /* isTypedMethod. Only relevant for methods. */
294 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
295 : };
296 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
297 : static_assert(0 < 1, "There is no slot for us");
298 :
299 : static bool
300 0 : get_requestStart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
301 : {
302 0 : double result(self->RequestStart());
303 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
304 0 : args.rval().set(JS_NumberValue(double(result)));
305 0 : return true;
306 : }
307 :
308 : static const JSJitInfo requestStart_getterinfo = {
309 : { (JSJitGetterOp)get_requestStart },
310 : { prototypes::id::PerformanceResourceTiming },
311 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
312 : JSJitInfo::Getter,
313 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
314 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
315 : true, /* isInfallible. False in setters. */
316 : false, /* isMovable. Not relevant for setters. */
317 : false, /* isEliminatable. Not relevant for setters. */
318 : false, /* isAlwaysInSlot. Only relevant for getters. */
319 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
320 : false, /* isTypedMethod. Only relevant for methods. */
321 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
322 : };
323 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
324 : static_assert(0 < 1, "There is no slot for us");
325 :
326 : static bool
327 0 : get_responseStart(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
328 : {
329 0 : double result(self->ResponseStart());
330 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
331 0 : args.rval().set(JS_NumberValue(double(result)));
332 0 : return true;
333 : }
334 :
335 : static const JSJitInfo responseStart_getterinfo = {
336 : { (JSJitGetterOp)get_responseStart },
337 : { prototypes::id::PerformanceResourceTiming },
338 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
339 : JSJitInfo::Getter,
340 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
341 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
342 : true, /* isInfallible. False in setters. */
343 : false, /* isMovable. Not relevant for setters. */
344 : false, /* isEliminatable. Not relevant for setters. */
345 : false, /* isAlwaysInSlot. Only relevant for getters. */
346 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
347 : false, /* isTypedMethod. Only relevant for methods. */
348 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
349 : };
350 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
351 : static_assert(0 < 1, "There is no slot for us");
352 :
353 : static bool
354 0 : get_responseEnd(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
355 : {
356 0 : double result(self->ResponseEnd());
357 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
358 0 : args.rval().set(JS_NumberValue(double(result)));
359 0 : return true;
360 : }
361 :
362 : static const JSJitInfo responseEnd_getterinfo = {
363 : { (JSJitGetterOp)get_responseEnd },
364 : { prototypes::id::PerformanceResourceTiming },
365 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
366 : JSJitInfo::Getter,
367 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
368 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
369 : true, /* isInfallible. False in setters. */
370 : false, /* isMovable. Not relevant for setters. */
371 : false, /* isEliminatable. Not relevant for setters. */
372 : false, /* isAlwaysInSlot. Only relevant for getters. */
373 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
374 : false, /* isTypedMethod. Only relevant for methods. */
375 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
376 : };
377 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
378 : static_assert(0 < 1, "There is no slot for us");
379 :
380 : static bool
381 0 : get_transferSize(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
382 : {
383 0 : uint64_t result(self->TransferSize());
384 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
385 0 : args.rval().set(JS_NumberValue(double(result)));
386 0 : return true;
387 : }
388 :
389 : static const JSJitInfo transferSize_getterinfo = {
390 : { (JSJitGetterOp)get_transferSize },
391 : { prototypes::id::PerformanceResourceTiming },
392 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
393 : JSJitInfo::Getter,
394 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
395 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
396 : true, /* isInfallible. False in setters. */
397 : false, /* isMovable. Not relevant for setters. */
398 : false, /* isEliminatable. Not relevant for setters. */
399 : false, /* isAlwaysInSlot. Only relevant for getters. */
400 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
401 : false, /* isTypedMethod. Only relevant for methods. */
402 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
403 : };
404 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
405 : static_assert(0 < 1, "There is no slot for us");
406 :
407 : static bool
408 0 : get_encodedBodySize(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
409 : {
410 0 : uint64_t result(self->EncodedBodySize());
411 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
412 0 : args.rval().set(JS_NumberValue(double(result)));
413 0 : return true;
414 : }
415 :
416 : static const JSJitInfo encodedBodySize_getterinfo = {
417 : { (JSJitGetterOp)get_encodedBodySize },
418 : { prototypes::id::PerformanceResourceTiming },
419 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
420 : JSJitInfo::Getter,
421 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
422 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
423 : true, /* isInfallible. False in setters. */
424 : false, /* isMovable. Not relevant for setters. */
425 : false, /* isEliminatable. Not relevant for setters. */
426 : false, /* isAlwaysInSlot. Only relevant for getters. */
427 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
428 : false, /* isTypedMethod. Only relevant for methods. */
429 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
430 : };
431 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
432 : static_assert(0 < 1, "There is no slot for us");
433 :
434 : static bool
435 0 : get_decodedBodySize(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JSJitGetterCallArgs args)
436 : {
437 0 : uint64_t result(self->DecodedBodySize());
438 0 : MOZ_ASSERT(!JS_IsExceptionPending(cx));
439 0 : args.rval().set(JS_NumberValue(double(result)));
440 0 : return true;
441 : }
442 :
443 : static const JSJitInfo decodedBodySize_getterinfo = {
444 : { (JSJitGetterOp)get_decodedBodySize },
445 : { prototypes::id::PerformanceResourceTiming },
446 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
447 : JSJitInfo::Getter,
448 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
449 : JSVAL_TYPE_DOUBLE, /* returnType. Not relevant for setters. */
450 : true, /* isInfallible. False in setters. */
451 : false, /* isMovable. Not relevant for setters. */
452 : false, /* isEliminatable. Not relevant for setters. */
453 : false, /* isAlwaysInSlot. Only relevant for getters. */
454 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
455 : false, /* isTypedMethod. Only relevant for methods. */
456 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
457 : };
458 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
459 : static_assert(0 < 1, "There is no slot for us");
460 :
461 : bool
462 0 : JsonifyAttributes(JSContext* aCx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, JS::Rooted<JSObject*>& aResult)
463 : {
464 : { // scope for "temp"
465 0 : JS::Rooted<JS::Value> temp(aCx);
466 0 : if (!get_initiatorType(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
467 0 : return false;
468 : }
469 0 : if (!JS_DefineProperty(aCx, aResult, "initiatorType", temp, JSPROP_ENUMERATE)) {
470 0 : return false;
471 : }
472 : }
473 : { // scope for "temp"
474 0 : JS::Rooted<JS::Value> temp(aCx);
475 0 : if (!get_nextHopProtocol(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
476 0 : return false;
477 : }
478 0 : if (!JS_DefineProperty(aCx, aResult, "nextHopProtocol", temp, JSPROP_ENUMERATE)) {
479 0 : return false;
480 : }
481 : }
482 : { // scope for "temp"
483 0 : JS::Rooted<JS::Value> temp(aCx);
484 0 : if (!get_redirectStart(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
485 0 : return false;
486 : }
487 0 : if (!JS_DefineProperty(aCx, aResult, "redirectStart", temp, JSPROP_ENUMERATE)) {
488 0 : return false;
489 : }
490 : }
491 : { // scope for "temp"
492 0 : JS::Rooted<JS::Value> temp(aCx);
493 0 : if (!get_redirectEnd(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
494 0 : return false;
495 : }
496 0 : if (!JS_DefineProperty(aCx, aResult, "redirectEnd", temp, JSPROP_ENUMERATE)) {
497 0 : return false;
498 : }
499 : }
500 : { // scope for "temp"
501 0 : JS::Rooted<JS::Value> temp(aCx);
502 0 : if (!get_fetchStart(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
503 0 : return false;
504 : }
505 0 : if (!JS_DefineProperty(aCx, aResult, "fetchStart", temp, JSPROP_ENUMERATE)) {
506 0 : return false;
507 : }
508 : }
509 : { // scope for "temp"
510 0 : JS::Rooted<JS::Value> temp(aCx);
511 0 : if (!get_domainLookupStart(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
512 0 : return false;
513 : }
514 0 : if (!JS_DefineProperty(aCx, aResult, "domainLookupStart", temp, JSPROP_ENUMERATE)) {
515 0 : return false;
516 : }
517 : }
518 : { // scope for "temp"
519 0 : JS::Rooted<JS::Value> temp(aCx);
520 0 : if (!get_domainLookupEnd(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
521 0 : return false;
522 : }
523 0 : if (!JS_DefineProperty(aCx, aResult, "domainLookupEnd", temp, JSPROP_ENUMERATE)) {
524 0 : return false;
525 : }
526 : }
527 : { // scope for "temp"
528 0 : JS::Rooted<JS::Value> temp(aCx);
529 0 : if (!get_connectStart(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
530 0 : return false;
531 : }
532 0 : if (!JS_DefineProperty(aCx, aResult, "connectStart", temp, JSPROP_ENUMERATE)) {
533 0 : return false;
534 : }
535 : }
536 : { // scope for "temp"
537 0 : JS::Rooted<JS::Value> temp(aCx);
538 0 : if (!get_connectEnd(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
539 0 : return false;
540 : }
541 0 : if (!JS_DefineProperty(aCx, aResult, "connectEnd", temp, JSPROP_ENUMERATE)) {
542 0 : return false;
543 : }
544 : }
545 : { // scope for "temp"
546 0 : JS::Rooted<JS::Value> temp(aCx);
547 0 : if (!get_secureConnectionStart(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
548 0 : return false;
549 : }
550 0 : if (!JS_DefineProperty(aCx, aResult, "secureConnectionStart", temp, JSPROP_ENUMERATE)) {
551 0 : return false;
552 : }
553 : }
554 : { // scope for "temp"
555 0 : JS::Rooted<JS::Value> temp(aCx);
556 0 : if (!get_requestStart(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
557 0 : return false;
558 : }
559 0 : if (!JS_DefineProperty(aCx, aResult, "requestStart", temp, JSPROP_ENUMERATE)) {
560 0 : return false;
561 : }
562 : }
563 : { // scope for "temp"
564 0 : JS::Rooted<JS::Value> temp(aCx);
565 0 : if (!get_responseStart(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
566 0 : return false;
567 : }
568 0 : if (!JS_DefineProperty(aCx, aResult, "responseStart", temp, JSPROP_ENUMERATE)) {
569 0 : return false;
570 : }
571 : }
572 : { // scope for "temp"
573 0 : JS::Rooted<JS::Value> temp(aCx);
574 0 : if (!get_responseEnd(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
575 0 : return false;
576 : }
577 0 : if (!JS_DefineProperty(aCx, aResult, "responseEnd", temp, JSPROP_ENUMERATE)) {
578 0 : return false;
579 : }
580 : }
581 : { // scope for "temp"
582 0 : JS::Rooted<JS::Value> temp(aCx);
583 0 : if (!get_transferSize(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
584 0 : return false;
585 : }
586 0 : if (!JS_DefineProperty(aCx, aResult, "transferSize", temp, JSPROP_ENUMERATE)) {
587 0 : return false;
588 : }
589 : }
590 : { // scope for "temp"
591 0 : JS::Rooted<JS::Value> temp(aCx);
592 0 : if (!get_encodedBodySize(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
593 0 : return false;
594 : }
595 0 : if (!JS_DefineProperty(aCx, aResult, "encodedBodySize", temp, JSPROP_ENUMERATE)) {
596 0 : return false;
597 : }
598 : }
599 : { // scope for "temp"
600 0 : JS::Rooted<JS::Value> temp(aCx);
601 0 : if (!get_decodedBodySize(aCx, obj, self, JSJitGetterCallArgs(&temp))) {
602 0 : return false;
603 : }
604 0 : if (!JS_DefineProperty(aCx, aResult, "decodedBodySize", temp, JSPROP_ENUMERATE)) {
605 0 : return false;
606 : }
607 : }
608 0 : return true;
609 : }
610 :
611 : static bool
612 0 : __jsonifier(JSContext* cx, JS::Handle<JSObject*> obj, mozilla::dom::PerformanceResourceTiming* self, const JSJitMethodCallArgs& args)
613 : {
614 0 : JS::Rooted<JSObject*> result(cx, JS_NewPlainObject(cx));
615 0 : if (!result) {
616 0 : return false;
617 : }
618 0 : if (!PerformanceEntryBinding::JsonifyAttributes(cx, obj, self, result)) {
619 0 : return false;
620 : }
621 0 : if (!PerformanceResourceTimingBinding::JsonifyAttributes(cx, obj, self, result)) {
622 0 : return false;
623 : }
624 0 : args.rval().setObject(*result);
625 0 : return true;
626 : }
627 :
628 : static const JSJitInfo __jsonifier_methodinfo = {
629 : { (JSJitGetterOp)__jsonifier },
630 : { prototypes::id::PerformanceResourceTiming },
631 : { PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth },
632 : JSJitInfo::Method,
633 : JSJitInfo::AliasEverything, /* aliasSet. Not relevant for setters. */
634 : JSVAL_TYPE_OBJECT, /* returnType. Not relevant for setters. */
635 : false, /* isInfallible. False in setters. */
636 : false, /* isMovable. Not relevant for setters. */
637 : false, /* isEliminatable. Not relevant for setters. */
638 : false, /* isAlwaysInSlot. Only relevant for getters. */
639 : false, /* isLazilyCachedInSlot. Only relevant for getters. */
640 : false, /* isTypedMethod. Only relevant for methods. */
641 : 0 /* Reserved slot index, if we're stored in a slot, else 0. */
642 : };
643 : static_assert(0 <= JSJitInfo::maxSlotIndex, "We won't fit");
644 : static_assert(0 < 1, "There is no slot for us");
645 :
646 : static bool
647 0 : _addProperty(JSContext* cx, JS::Handle<JSObject*> obj, JS::Handle<jsid> id, JS::Handle<JS::Value> val)
648 : {
649 0 : mozilla::dom::PerformanceResourceTiming* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::PerformanceResourceTiming>(obj);
650 : // We don't want to preserve if we don't have a wrapper, and we
651 : // obviously can't preserve if we're not initialized.
652 0 : if (self && self->GetWrapperPreserveColor()) {
653 0 : PreserveWrapper(self);
654 : }
655 0 : return true;
656 : }
657 :
658 : static void
659 0 : _finalize(js::FreeOp* fop, JSObject* obj)
660 : {
661 0 : mozilla::dom::PerformanceResourceTiming* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::PerformanceResourceTiming>(obj);
662 0 : if (self) {
663 0 : ClearWrapper(self, self, obj);
664 0 : AddForDeferredFinalization<mozilla::dom::PerformanceResourceTiming>(self);
665 : }
666 0 : }
667 :
668 : static void
669 0 : _objectMoved(JSObject* obj, const JSObject* old)
670 : {
671 0 : mozilla::dom::PerformanceResourceTiming* self = UnwrapPossiblyNotInitializedDOMObject<mozilla::dom::PerformanceResourceTiming>(obj);
672 0 : if (self) {
673 0 : UpdateWrapper(self, self, obj, old);
674 : }
675 0 : }
676 :
677 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
678 : #if defined(__clang__)
679 : #pragma clang diagnostic push
680 : #pragma clang diagnostic ignored "-Wmissing-braces"
681 : #endif
682 : static const JSFunctionSpec sMethods_specs[] = {
683 : JS_FNSPEC("toJSON", GenericBindingMethod, reinterpret_cast<const JSJitInfo*>(&__jsonifier_methodinfo), 0, JSPROP_ENUMERATE, nullptr),
684 : JS_FS_END
685 : };
686 : #if defined(__clang__)
687 : #pragma clang diagnostic pop
688 : #endif
689 :
690 :
691 : // Can't be const because the pref-enabled boolean needs to be writable
692 : static Prefable<const JSFunctionSpec> sMethods[] = {
693 : { nullptr, &sMethods_specs[0] },
694 : { nullptr, nullptr }
695 : };
696 :
697 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
698 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
699 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
700 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
701 :
702 : // We deliberately use brace-elision to make Visual Studio produce better initalization code.
703 : #if defined(__clang__)
704 : #pragma clang diagnostic push
705 : #pragma clang diagnostic ignored "-Wmissing-braces"
706 : #endif
707 : static const JSPropertySpec sAttributes_specs[] = {
708 : { "initiatorType", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &initiatorType_getterinfo, nullptr, nullptr },
709 : { "nextHopProtocol", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &nextHopProtocol_getterinfo, nullptr, nullptr },
710 : { "redirectStart", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &redirectStart_getterinfo, nullptr, nullptr },
711 : { "redirectEnd", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &redirectEnd_getterinfo, nullptr, nullptr },
712 : { "fetchStart", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &fetchStart_getterinfo, nullptr, nullptr },
713 : { "domainLookupStart", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &domainLookupStart_getterinfo, nullptr, nullptr },
714 : { "domainLookupEnd", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &domainLookupEnd_getterinfo, nullptr, nullptr },
715 : { "connectStart", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &connectStart_getterinfo, nullptr, nullptr },
716 : { "connectEnd", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &connectEnd_getterinfo, nullptr, nullptr },
717 : { "secureConnectionStart", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &secureConnectionStart_getterinfo, nullptr, nullptr },
718 : { "requestStart", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &requestStart_getterinfo, nullptr, nullptr },
719 : { "responseStart", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &responseStart_getterinfo, nullptr, nullptr },
720 : { "responseEnd", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &responseEnd_getterinfo, nullptr, nullptr },
721 : { "transferSize", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &transferSize_getterinfo, nullptr, nullptr },
722 : { "encodedBodySize", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &encodedBodySize_getterinfo, nullptr, nullptr },
723 : { "decodedBodySize", JSPROP_SHARED | JSPROP_ENUMERATE, GenericBindingGetter, &decodedBodySize_getterinfo, nullptr, nullptr },
724 : { nullptr, 0, nullptr, nullptr, nullptr, nullptr }
725 : };
726 : #if defined(__clang__)
727 : #pragma clang diagnostic pop
728 : #endif
729 :
730 :
731 : // Can't be const because the pref-enabled boolean needs to be writable
732 : static Prefable<const JSPropertySpec> sAttributes[] = {
733 : { nullptr, &sAttributes_specs[0] },
734 : { nullptr, nullptr }
735 : };
736 :
737 : static_assert(1 <= 1ull << NUM_BITS_PROPERTY_INFO_PREF_INDEX,
738 : "We have a prefable index that is >= (1 << NUM_BITS_PROPERTY_INFO_PREF_INDEX)");
739 : static_assert(16 <= 1ull << NUM_BITS_PROPERTY_INFO_SPEC_INDEX,
740 : "We have a spec index that is >= (1 << NUM_BITS_PROPERTY_INFO_SPEC_INDEX)");
741 :
742 :
743 : static uint16_t sNativeProperties_sortedPropertyIndices[17];
744 : static PropertyInfo sNativeProperties_propertyInfos[17];
745 :
746 : static const NativePropertiesN<2> sNativeProperties = {
747 : false, 0,
748 : false, 0,
749 : true, 0 /* sMethods */,
750 : true, 1 /* sAttributes */,
751 : false, 0,
752 : false, 0,
753 : false, 0,
754 : -1,
755 : 17,
756 : sNativeProperties_sortedPropertyIndices,
757 : {
758 : { sMethods, &sNativeProperties_propertyInfos[0] },
759 : { sAttributes, &sNativeProperties_propertyInfos[1] }
760 : }
761 : };
762 : static_assert(17 < 1ull << CHAR_BIT * sizeof(sNativeProperties.propertyInfoCount),
763 : "We have a property info count that is oversized");
764 :
765 : static const DOMIfaceAndProtoJSClass sInterfaceObjectClass = {
766 : {
767 : "Function",
768 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_SLOTS_BASE),
769 : &sBoringInterfaceObjectClassClassOps,
770 : JS_NULL_CLASS_SPEC,
771 : JS_NULL_CLASS_EXT,
772 : &sInterfaceObjectClassObjectOps
773 : },
774 : eInterface,
775 : true,
776 : prototypes::id::PerformanceResourceTiming,
777 : PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth,
778 : sNativePropertyHooks,
779 : "function PerformanceResourceTiming() {\n [native code]\n}",
780 : PerformanceEntryBinding::GetConstructorObject
781 : };
782 :
783 : static const DOMIfaceAndProtoJSClass sPrototypeClass = {
784 : {
785 : "PerformanceResourceTimingPrototype",
786 : JSCLASS_IS_DOMIFACEANDPROTOJSCLASS | JSCLASS_HAS_RESERVED_SLOTS(DOM_INTERFACE_PROTO_SLOTS_BASE),
787 : JS_NULL_CLASS_OPS,
788 : JS_NULL_CLASS_SPEC,
789 : JS_NULL_CLASS_EXT,
790 : JS_NULL_OBJECT_OPS
791 : },
792 : eInterfacePrototype,
793 : false,
794 : prototypes::id::PerformanceResourceTiming,
795 : PrototypeTraits<prototypes::id::PerformanceResourceTiming>::Depth,
796 : sNativePropertyHooks,
797 : "[object PerformanceResourceTimingPrototype]",
798 : PerformanceEntryBinding::GetProtoObject
799 : };
800 :
801 : JSObject*
802 0 : DefineDOMInterface(JSContext* aCx, JS::Handle<JSObject*> aGlobal, JS::Handle<jsid> id, bool aDefineOnGlobal)
803 : {
804 0 : return GetConstructorObjectHandle(aCx, aDefineOnGlobal);
805 : }
806 :
807 : static const js::ClassOps sClassOps = {
808 : _addProperty, /* addProperty */
809 : nullptr, /* delProperty */
810 : nullptr, /* getProperty */
811 : nullptr, /* setProperty */
812 : nullptr, /* enumerate */
813 : nullptr, /* newEnumerate */
814 : nullptr, /* resolve */
815 : nullptr, /* mayResolve */
816 : _finalize, /* finalize */
817 : nullptr, /* call */
818 : nullptr, /* hasInstance */
819 : nullptr, /* construct */
820 : nullptr, /* trace */
821 : };
822 :
823 : static const js::ClassExtension sClassExtension = {
824 : nullptr, /* weakmapKeyDelegateOp */
825 : _objectMoved /* objectMovedOp */
826 : };
827 :
828 : static const DOMJSClass sClass = {
829 : { "PerformanceResourceTiming",
830 : JSCLASS_IS_DOMJSCLASS | JSCLASS_FOREGROUND_FINALIZE | JSCLASS_HAS_RESERVED_SLOTS(1),
831 : &sClassOps,
832 : JS_NULL_CLASS_SPEC,
833 : &sClassExtension,
834 : JS_NULL_OBJECT_OPS
835 : },
836 : { prototypes::id::PerformanceEntry, prototypes::id::PerformanceResourceTiming, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count, prototypes::id::_ID_Count },
837 : IsBaseOf<nsISupports, mozilla::dom::PerformanceResourceTiming >::value,
838 : sNativePropertyHooks,
839 : FindAssociatedGlobalForNative<mozilla::dom::PerformanceResourceTiming>::Get,
840 : GetProtoObjectHandle,
841 : GetCCParticipant<mozilla::dom::PerformanceResourceTiming>::Get()
842 : };
843 : static_assert(1 == DOM_INSTANCE_RESERVED_SLOTS,
844 : "Must have the right minimal number of reserved slots.");
845 : static_assert(1 >= 1,
846 : "Must have enough reserved slots.");
847 :
848 : const JSClass*
849 0 : GetJSClass()
850 : {
851 0 : return sClass.ToJSClass();
852 : }
853 :
854 : bool
855 0 : Wrap(JSContext* aCx, mozilla::dom::PerformanceResourceTiming* aObject, nsWrapperCache* aCache, JS::Handle<JSObject*> aGivenProto, JS::MutableHandle<JSObject*> aReflector)
856 : {
857 : MOZ_ASSERT(static_cast<mozilla::dom::PerformanceResourceTiming*>(aObject) ==
858 : reinterpret_cast<mozilla::dom::PerformanceResourceTiming*>(aObject),
859 : "Multiple inheritance for mozilla::dom::PerformanceResourceTiming is broken.");
860 : MOZ_ASSERT(static_cast<mozilla::dom::PerformanceEntry*>(aObject) ==
861 : reinterpret_cast<mozilla::dom::PerformanceEntry*>(aObject),
862 : "Multiple inheritance for mozilla::dom::PerformanceEntry is broken.");
863 0 : MOZ_ASSERT(ToSupportsIsCorrect(aObject));
864 0 : MOZ_ASSERT_IF(aGivenProto, js::IsObjectInContextCompartment(aGivenProto, aCx));
865 0 : MOZ_ASSERT(!aCache->GetWrapper(),
866 : "You should probably not be using Wrap() directly; use "
867 : "GetOrCreateDOMReflector instead");
868 :
869 0 : MOZ_ASSERT(ToSupportsIsOnPrimaryInheritanceChain(aObject, aCache),
870 : "nsISupports must be on our primary inheritance chain");
871 :
872 0 : JS::Rooted<JSObject*> global(aCx, FindAssociatedGlobal(aCx, aObject->GetParentObject()));
873 0 : if (!global) {
874 0 : return false;
875 : }
876 0 : MOZ_ASSERT(JS_IsGlobalObject(global));
877 0 : MOZ_ASSERT(JS::ObjectIsNotGray(global));
878 :
879 : // That might have ended up wrapping us already, due to the wonders
880 : // of XBL. Check for that, and bail out as needed.
881 0 : aReflector.set(aCache->GetWrapper());
882 0 : if (aReflector) {
883 : #ifdef DEBUG
884 0 : binding_detail::AssertReflectorHasGivenProto(aCx, aReflector, aGivenProto);
885 : #endif // DEBUG
886 0 : return true;
887 : }
888 :
889 0 : JSAutoCompartment ac(aCx, global);
890 0 : JS::Handle<JSObject*> canonicalProto = GetProtoObjectHandle(aCx);
891 0 : if (!canonicalProto) {
892 0 : return false;
893 : }
894 0 : JS::Rooted<JSObject*> proto(aCx);
895 0 : if (aGivenProto) {
896 0 : proto = aGivenProto;
897 : // Unfortunately, while aGivenProto was in the compartment of aCx
898 : // coming in, we changed compartments to that of "parent" so may need
899 : // to wrap the proto here.
900 0 : if (js::GetContextCompartment(aCx) != js::GetObjectCompartment(proto)) {
901 0 : if (!JS_WrapObject(aCx, &proto)) {
902 0 : return false;
903 : }
904 : }
905 : } else {
906 0 : proto = canonicalProto;
907 : }
908 :
909 0 : BindingJSObjectCreator<mozilla::dom::PerformanceResourceTiming> creator(aCx);
910 0 : creator.CreateObject(aCx, sClass.ToJSClass(), proto, aObject, aReflector);
911 0 : if (!aReflector) {
912 0 : return false;
913 : }
914 :
915 0 : aCache->SetWrapper(aReflector);
916 0 : creator.InitializationSucceeded();
917 :
918 0 : MOZ_ASSERT(aCache->GetWrapperPreserveColor() &&
919 : aCache->GetWrapperPreserveColor() == aReflector);
920 : // If proto != canonicalProto, we have to preserve our wrapper;
921 : // otherwise we won't be able to properly recreate it later, since
922 : // we won't know what proto to use. Note that we don't check
923 : // aGivenProto here, since it's entirely possible (and even
924 : // somewhat common) to have a non-null aGivenProto which is the
925 : // same as canonicalProto.
926 0 : if (proto != canonicalProto) {
927 0 : PreserveWrapper(aObject);
928 : }
929 :
930 0 : return true;
931 : }
932 :
933 : const NativePropertyHooks sNativePropertyHooks[] = { {
934 : nullptr,
935 : nullptr,
936 : nullptr,
937 : { sNativeProperties.Upcast(), nullptr },
938 : prototypes::id::PerformanceResourceTiming,
939 : constructors::id::PerformanceResourceTiming,
940 : PerformanceEntryBinding::sNativePropertyHooks,
941 : &DefaultXrayExpandoObjectClass
942 : } };
943 :
944 : void
945 0 : CreateInterfaceObjects(JSContext* aCx, JS::Handle<JSObject*> aGlobal, ProtoAndIfaceCache& aProtoAndIfaceCache, bool aDefineOnGlobal)
946 : {
947 0 : JS::Handle<JSObject*> parentProto(PerformanceEntryBinding::GetProtoObjectHandle(aCx));
948 0 : if (!parentProto) {
949 0 : return;
950 : }
951 :
952 0 : JS::Handle<JSObject*> constructorProto(PerformanceEntryBinding::GetConstructorObjectHandle(aCx));
953 0 : if (!constructorProto) {
954 0 : return;
955 : }
956 :
957 : static bool sIdsInited = false;
958 0 : if (!sIdsInited && NS_IsMainThread()) {
959 0 : if (!InitIds(aCx, sNativeProperties.Upcast())) {
960 0 : return;
961 : }
962 0 : sIdsInited = true;
963 : }
964 :
965 0 : JS::Heap<JSObject*>* protoCache = &aProtoAndIfaceCache.EntrySlotOrCreate(prototypes::id::PerformanceResourceTiming);
966 0 : JS::Heap<JSObject*>* interfaceCache = &aProtoAndIfaceCache.EntrySlotOrCreate(constructors::id::PerformanceResourceTiming);
967 0 : dom::CreateInterfaceObjects(aCx, aGlobal, parentProto,
968 : &sPrototypeClass.mBase, protoCache,
969 : constructorProto, &sInterfaceObjectClass.mBase, 0, nullptr,
970 : interfaceCache,
971 : sNativeProperties.Upcast(),
972 : nullptr,
973 : "PerformanceResourceTiming", aDefineOnGlobal,
974 : nullptr,
975 0 : false);
976 : }
977 :
978 : JS::Handle<JSObject*>
979 0 : GetProtoObjectHandle(JSContext* aCx)
980 : {
981 : /* Get the interface prototype object for this class. This will create the
982 : object as needed. */
983 0 : bool aDefineOnGlobal = true;
984 :
985 : /* Make sure our global is sane. Hopefully we can remove this sometime */
986 0 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
987 0 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
988 0 : return nullptr;
989 : }
990 :
991 : /* Check to see whether the interface objects are already installed */
992 0 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
993 0 : if (!protoAndIfaceCache.HasEntryInSlot(prototypes::id::PerformanceResourceTiming)) {
994 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
995 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
996 : }
997 :
998 : /*
999 : * The object might _still_ be null, but that's OK.
1000 : *
1001 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
1002 : * traced by TraceProtoAndIfaceCache() and its contents are never
1003 : * changed after they have been set.
1004 : *
1005 : * Calling address() avoids the read read barrier that does gray
1006 : * unmarking, but it's not possible for the object to be gray here.
1007 : */
1008 :
1009 0 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(prototypes::id::PerformanceResourceTiming);
1010 0 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
1011 0 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
1012 : }
1013 :
1014 : JS::Handle<JSObject*>
1015 0 : GetConstructorObjectHandle(JSContext* aCx, bool aDefineOnGlobal)
1016 : {
1017 : /* Get the interface object for this class. This will create the object as
1018 : needed. */
1019 :
1020 : /* Make sure our global is sane. Hopefully we can remove this sometime */
1021 0 : JSObject* global = JS::CurrentGlobalOrNull(aCx);
1022 0 : if (!(js::GetObjectClass(global)->flags & JSCLASS_DOM_GLOBAL)) {
1023 0 : return nullptr;
1024 : }
1025 :
1026 : /* Check to see whether the interface objects are already installed */
1027 0 : ProtoAndIfaceCache& protoAndIfaceCache = *GetProtoAndIfaceCache(global);
1028 0 : if (!protoAndIfaceCache.HasEntryInSlot(constructors::id::PerformanceResourceTiming)) {
1029 0 : JS::Rooted<JSObject*> rootedGlobal(aCx, global);
1030 0 : CreateInterfaceObjects(aCx, rootedGlobal, protoAndIfaceCache, aDefineOnGlobal);
1031 : }
1032 :
1033 : /*
1034 : * The object might _still_ be null, but that's OK.
1035 : *
1036 : * Calling fromMarkedLocation() is safe because protoAndIfaceCache is
1037 : * traced by TraceProtoAndIfaceCache() and its contents are never
1038 : * changed after they have been set.
1039 : *
1040 : * Calling address() avoids the read read barrier that does gray
1041 : * unmarking, but it's not possible for the object to be gray here.
1042 : */
1043 :
1044 0 : const JS::Heap<JSObject*>& entrySlot = protoAndIfaceCache.EntrySlotMustExist(constructors::id::PerformanceResourceTiming);
1045 0 : MOZ_ASSERT(JS::ObjectIsNotGray(entrySlot));
1046 0 : return JS::Handle<JSObject*>::fromMarkedLocation(entrySlot.address());
1047 : }
1048 :
1049 : JSObject*
1050 0 : GetConstructorObject(JSContext* aCx)
1051 : {
1052 0 : return GetConstructorObjectHandle(aCx);
1053 : }
1054 :
1055 : } // namespace PerformanceResourceTimingBinding
1056 :
1057 :
1058 :
1059 : } // namespace dom
1060 : } // namespace mozilla
|