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